From a7c8ce6f9e07341a8522414de72e9522e6917564 Mon Sep 17 00:00:00 2001 From: fabiodalez-dev Date: Mon, 12 Oct 2026 12:28:06 +0200 Subject: [PATCH 01/20] Document public library showcase and fix desiderata creator credits --- README.md | 23 +- docs/demo/README.md | 51 +++ docs/demo/archivio.jpg | Bin 0 -> 148784 bytes docs/demo/articolo.jpg | Bin 0 -> 85676 bytes docs/demo/audiolibro.jpg | Bin 0 -> 126476 bytes docs/demo/catalogo.jpg | Bin 0 -> 130525 bytes docs/demo/catalogue-sources.json | 350 ++++++++++++++++++ docs/demo/club.jpg | Bin 0 -> 62409 bytes docs/demo/desiderata-mobile.jpg | Bin 0 -> 32163 bytes docs/demo/desiderata.jpg | Bin 0 -> 72698 bytes docs/demo/emeroteca.jpg | Bin 0 -> 107958 bytes docs/demo/home-mobile.jpg | Bin 0 -> 47657 bytes docs/demo/home.jpg | Bin 0 -> 84376 bytes docs/demo/libro.jpg | Bin 0 -> 118538 bytes docs/demo/pdf.jpg | Bin 0 -> 61282 bytes docs/demo/periodical-sources.json | 302 +++++++++++++++ docs/demo/rivista.jpg | Bin 0 -> 74265 bytes docs/demo/verification.md | 28 ++ .../plugins/desiderata/DesiderataPlugin.php | 4 +- 19 files changed, 754 insertions(+), 4 deletions(-) create mode 100644 docs/demo/README.md create mode 100644 docs/demo/archivio.jpg create mode 100644 docs/demo/articolo.jpg create mode 100644 docs/demo/audiolibro.jpg create mode 100644 docs/demo/catalogo.jpg create mode 100644 docs/demo/catalogue-sources.json create mode 100644 docs/demo/club.jpg create mode 100644 docs/demo/desiderata-mobile.jpg create mode 100644 docs/demo/desiderata.jpg create mode 100644 docs/demo/emeroteca.jpg create mode 100644 docs/demo/home-mobile.jpg create mode 100644 docs/demo/home.jpg create mode 100644 docs/demo/libro.jpg create mode 100644 docs/demo/pdf.jpg create mode 100644 docs/demo/periodical-sources.json create mode 100644 docs/demo/rivista.jpg create mode 100644 docs/demo/verification.md diff --git a/README.md b/README.md index 368c74f9b..44a5e2719 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,14 @@ Pinakes is a self-hosted, full-featured ILS for schools, municipalities, and pri --- +## Live demo + +Explore **[Biblioteca delle idee libere](https://biblioteca.fabiodalez.it/)**: real ISBN records, anarchist classics, social ecology and Palestine studies, alongside periodicals, illustrated articles, wanted books, PDFs and complete audiobooks. + +The showcase contains 50 catalogue books, 8 desiderata, 3 periodicals with 10 issues, 22 articles, 11 PDFs and 2 audiobooks across 12 tracks. Holdings and activities are illustrative. [Sources, screenshots and verification notes](docs/demo/README.md). + +--- + ## Requirements - **PHP 8.2 or higher** — matches `composer.json` (`^8.2`); the installer and the in-app updater enforce this floor. @@ -213,8 +221,19 @@ Pinakes provides cataloging, circulation, a self-service public frontend, and RE

- Public Catalog
- Public Catalog (OPAC) — Search, filters, and patron self-service + Public homepage with real book covers
+ Public homepage — a library of free ideas +

+ +| Catalogue | Books and digital reading | +| --- | --- | +| ![Catalogue](docs/demo/catalogo.jpg) | ![Book record](docs/demo/libro.jpg) | +| ![Periodicals](docs/demo/rivista.jpg) | ![Article record](docs/demo/articolo.jpg) | +| ![Wanted books](docs/demo/desiderata.jpg) | ![PDF reader](docs/demo/pdf.jpg) | + +

+ Public homepage on a 390 pixel mobile viewport + Wanted books on a mobile viewport

--- diff --git a/docs/demo/README.md b/docs/demo/README.md new file mode 100644 index 000000000..f3f47878e --- /dev/null +++ b/docs/demo/README.md @@ -0,0 +1,51 @@ +# Biblioteca delle idee libere + +[Open the public showcase](https://biblioteca.fabiodalez.it/). Captured and checked on 12 October 2026, Pinakes 0.8.2. + +The catalogue contains real editions, real periodicals and real articles. Inventory, copies, archive arrangement and activities demonstrate the software; this installation is not an operating lending library. + +| Collection | Records | +| --- | ---: | +| Catalogue books | 50 | +| Desiderata | 8 | +| Periodicals / issues | 3 / 10 | +| Illustrated articles | 22 | +| Complete PDF texts | 11 | +| Audiobooks / tracks | 2 / 12 | +| Reading clubs | 2 | +| Archive units | 4 | + +## Explore + +- [Catalogue](https://biblioteca.fabiodalez.it/catalogo) +- [Wanted books](https://biblioteca.fabiodalez.it/#desiderata-heading) +- [Periodicals](https://biblioteca.fabiodalez.it/emeroteca) +- [Article: La fine del diritto](https://biblioteca.fabiodalez.it/emeroteca/articolo/4) +- [Malatesta: digital editions and audio](https://biblioteca.fabiodalez.it/errico-malatesta/anarchia-il-nostro-programma/144) +- [Reading clubs](https://biblioteca.fabiodalez.it/book-club) +- [Digital archive](https://biblioteca.fabiodalez.it/archivio) + +## Sources and editions + +The installed Scraping Pro plugin supplied bibliographic enrichment. Publisher records resolved conflicting creator roles, dates and pagination; author names were consolidated. Shelf marks use actual shelf/mensola records, for example `E-1-04`, and inventory codes use `2026-00001`. + +[Book sources](catalogue-sources.json) and [periodical/article sources](periodical-sources.json) list the original publications. Covers and article images retain their respective owners’ rights; the code licence does not grant rights to those images. + +Ten PDFs are copyleft editions published by elèuthera. Malatesta’s PDF and Italian recording by Mela Boev come from [Liber Liber](https://liberliber.it/autori/autori-m/errico-malatesta/lanarchia-audiolibro/) under CC BY-NC-SA 4.0. The ISBN record identifies the E-text ebook; the attached Liber Liber version is a distinct edition. Bakunin’s [God and the State](https://librivox.org/god-and-the-state-by-mikhail-bakunin/) is the complete English LibriVox recording by Carl Manchester, not an Italian audiobook. + +## Screenshots + +Desktop and 390 × 844 mobile browser views. Some detailed screenshots were captured with a staff session; management buttons in those images are not offered to anonymous visitors. + +![Home](home.jpg) + +| Catalogue | Book | +| --- | --- | +| ![Catalogue](catalogo.jpg) | ![Book](libro.jpg) | +| ![Periodicals](rivista.jpg) | ![Article](articolo.jpg) | +| ![Desiderata](desiderata.jpg) | ![PDF](pdf.jpg) | +| ![Audio](audiolibro.jpg) | ![Archive](archivio.jpg) | + +## Verification + +[Checks and issues discovered during preparation](verification.md). A full database/upload backup was validated before replacing the old collection and is retained privately outside the public web directory. diff --git a/docs/demo/archivio.jpg b/docs/demo/archivio.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4d941c5cbd02353a265bc12823b1bc0bd9c639b5 GIT binary patch literal 148784 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 ALI3~& literal 0 HcmV?d00001 diff --git a/docs/demo/articolo.jpg b/docs/demo/articolo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c514414ab3641177ad3d01b752b3bc39b3f72fa2 GIT binary patch literal 85676 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 literal 0 HcmV?d00001 diff --git a/docs/demo/catalogo.jpg b/docs/demo/catalogo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..796c1dfa5e615ebd973ccbb287d5b5f9d72b1043 GIT binary patch literal 130525 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 z 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

3B{ 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 Ue&tTo%D?T5{$Cw9?C;V40E46f7ytkO literal 0 HcmV?d00001 diff --git a/docs/demo/emeroteca.jpg b/docs/demo/emeroteca.jpg new file mode 100644 index 0000000000000000000000000000000000000000..568207ec9db29a0fd0f92e7737ec442f29f0f8fc GIT binary patch literal 107958 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

&UKA`HIMS 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

Lum?HLjJ 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 literal 0 HcmV?d00001 diff --git a/docs/demo/home.jpg b/docs/demo/home.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c964542b588c82b59cfc298c28891b5ea3216fbb GIT binary patch literal 84376 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 literal 0 HcmV?d00001 diff --git a/docs/demo/libro.jpg b/docs/demo/libro.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d02e20e4c1697cbbe370a19043407d1c5aeb910e GIT binary patch literal 118538 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≈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 literal 0 HcmV?d00001 diff --git a/docs/demo/verification.md b/docs/demo/verification.md new file mode 100644 index 000000000..39cf969ce --- /dev/null +++ b/docs/demo/verification.md @@ -0,0 +1,28 @@ +# Verifica dell’installazione — 12 ottobre 2026 + +## Controlli superati + +- 58 libri con ISBN reale, copertina valida e fonte bibliografica; 8 desiderata esclusi dalla consistenza ordinaria. +- 22 articoli pubblici, tutti con immagine, crediti, abstract sintetico e collegamento alla fonte originale. +- 3 testate, 10 fascicoli e relative annate; 4 unità archivistiche pubbliche. Vecchi dati di prova rimossi dalle viste pubbliche. +- Nessuna segnatura `DEMO`; scaffali/mensole registrati, inventari ordinari e segnatura digitale `DIG-MAL`. +- Immagini/file presenti e validi sul server. 103 risorse HTTP controllate: nessun errore con le normali intestazioni del browser. Tutte le 12 tracce rispondono con `206 Partial Content` e `audio/mpeg`. +- PDF aperto e renderizzato nel lettore incorporato; audio Malatesta riprodotto e messo in pausa, durata della prima parte 2033,88 secondi, nessun errore del player. +- Ricerca nel catalogo, navigazione testata/fascicolo/articolo, desiderata e club di lettura verificati nel browser. +- Vista mobile 390 × 844: larghezza del documento 390, nessuno scorrimento orizzontale nella sezione desiderata. +- OAI-PMH Identify/ListMetadataFormats, SRU explain/searchRetrieve e ResourceSync: HTTP 200, XML ben formato, namespace attesi, nessun errore nel campione. Controllo operativo, non una certificazione completa dei protocolli. +- Esportazioni MARCXML di un articolo e RIS di libro/articolo: HTTP 200, struttura XML/RIS riconosciuta. + +## Errori trovati e stato + +| Problema | Evidenza | Stato | +| --- | --- | --- | +| Scraping Pro confonde autore e altri crediti | ISBN 9788833020631: Andrea Brizioli è curatore, non l’autore principale. ISBN 9788833021973: Gomez e Senta firmano saggi aggiunti. | Dati della raccolta corretti dalle fonti elèuthera; logica generale del plugin ancora da correggere. | +| Scraping Pro restituisce paginazioni discordanti | ISBN 9788833020679: 329 importate, 392 dall’editore; altre discrepanze in sette schede. | Metadati delle edizioni elèuthera riallineati al catalogo editoriale. | +| Schema Archivi incompleto | Plugin 1.5.2 senza `archival_units.published`. | `ensureSchema()` del plugin eseguito con successo; da approfondire perché la migrazione non era partita durante l’aggiornamento. | +| Traduttore mostrato come autore nei desiderata | Alice Zaffaroni compariva accanto a Tomás Ibáñez pur avendo ruolo `traduttore`. | Corrette `wanted()` e `donationPrefill()`: solo ruoli `principale`/`co-autore`, ordinati. Patch locale e online; sintassi PHP valida e controllo sul caso reale superato. | +| Disponibilità del solo ebook fuorviante | Libro 144, 0 copie fisiche: “Non disponibile oggi” e prenotazione, pur con PDF/audio consultabili. | Ancora aperto: distinguere disponibilità digitale e copie fisiche, senza inventare una copia. | + +Il test locale `desiderata-search-facets.unit.php` non è eseguibile con le credenziali disponibili: il suo database usa e getta non può essere creato. Non è stato forzato su un database di installazione. Verifica della patch effettuata invece con lint PHP e chiamata di sola lettura al metodo reale `wanted()` sul record interessato. + +Il disco locale ha esaurito temporaneamente lo spazio; sono stati rimossi soltanto PDF di ricerca scaricabili di nuovo. L’utente ha successivamente liberato spazio. Nessun contenuto dell’installazione online è stato perso. diff --git a/storage/plugins/desiderata/DesiderataPlugin.php b/storage/plugins/desiderata/DesiderataPlugin.php index a07782f69..54b28c3e3 100644 --- a/storage/plugins/desiderata/DesiderataPlugin.php +++ b/storage/plugins/desiderata/DesiderataPlugin.php @@ -662,7 +662,7 @@ public function wanted(string $term = '', int $limit = 12, int $offset = 0): arr ? " OR EXISTS (SELECT 1 FROM libri_editori le JOIN editori e2 ON e2.id=le.editore_id WHERE le.libro_id=l.id AND e2.nome LIKE ? ESCAPE '!')" : ''; $stmt = $this->db->prepare("SELECT l.id, l.titolo, l.isbn13, l.isbn10, l.copertina_url, e.nome AS editore, - (SELECT GROUP_CONCAT(a.nome SEPARATOR ', ') FROM libri_autori la JOIN autori a ON a.id=la.autore_id WHERE la.libro_id=l.id) AS autore, + (SELECT GROUP_CONCAT(a.nome ORDER BY CASE la.ruolo WHEN 'principale' THEN 0 ELSE 1 END, la.ordine_credito SEPARATOR ', ') FROM libri_autori la JOIN autori a ON a.id=la.autore_id WHERE la.libro_id=l.id AND la.ruolo IN ('principale','co-autore')) AS autore, (SELECT a.nome FROM libri_autori la JOIN autori a ON a.id=la.autore_id WHERE la.libro_id=l.id AND la.ruolo IN ('principale','co-autore') ORDER BY CASE la.ruolo WHEN 'principale' THEN 0 ELSE 1 END, la.ordine_credito LIMIT 1) AS autore_principale_nome @@ -801,7 +801,7 @@ public function bookDetail(mixed $book = null, mixed $id = null): void private function donationPrefill(int $bookId): array { $stmt = $this->db->prepare("SELECT l.isbn13, l.isbn10, e.nome AS editore, - (SELECT GROUP_CONCAT(a.nome SEPARATOR ', ') FROM libri_autori la JOIN autori a ON a.id=la.autore_id WHERE la.libro_id=l.id) AS autore + (SELECT GROUP_CONCAT(a.nome ORDER BY CASE la.ruolo WHEN 'principale' THEN 0 ELSE 1 END, la.ordine_credito SEPARATOR ', ') FROM libri_autori la JOIN autori a ON a.id=la.autore_id WHERE la.libro_id=l.id AND la.ruolo IN ('principale','co-autore')) AS autore FROM libri l LEFT JOIN editori e ON e.id=l.editore_id WHERE l.id = ? AND l.deleted_at IS NULL LIMIT 1"); if ($stmt === false) { return []; } From 48293e18b3586aeaa61153394c4801c995a56f4a Mon Sep 17 00:00:00 2001 From: fabiodalez-dev Date: Mon, 12 Oct 2026 14:40:21 +0200 Subject: [PATCH 02/20] Align mobile desiderata credits and address showcase review findings --- docs/demo/README.md | 1 + docs/demo/verification.md | 6 ++-- .../src/Controllers/CollectionsController.php | 8 +++-- .../src/Controllers/OpenApiController.php | 5 +++- tests/mobile-collections.integration.php | 30 +++++++++++++++++++ 5 files changed, 43 insertions(+), 7 deletions(-) diff --git a/docs/demo/README.md b/docs/demo/README.md index f3f47878e..5ce4f1d84 100644 --- a/docs/demo/README.md +++ b/docs/demo/README.md @@ -45,6 +45,7 @@ Desktop and 390 × 844 mobile browser views. Some detailed screenshots were capt | ![Periodicals](rivista.jpg) | ![Article](articolo.jpg) | | ![Desiderata](desiderata.jpg) | ![PDF](pdf.jpg) | | ![Audio](audiolibro.jpg) | ![Archive](archivio.jpg) | +| ![Periodicals archive](emeroteca.jpg) | ![Reading clubs](club.jpg) | ## Verification diff --git a/docs/demo/verification.md b/docs/demo/verification.md index 39cf969ce..7c7476118 100644 --- a/docs/demo/verification.md +++ b/docs/demo/verification.md @@ -20,9 +20,7 @@ | Scraping Pro confonde autore e altri crediti | ISBN 9788833020631: Andrea Brizioli è curatore, non l’autore principale. ISBN 9788833021973: Gomez e Senta firmano saggi aggiunti. | Dati della raccolta corretti dalle fonti elèuthera; logica generale del plugin ancora da correggere. | | Scraping Pro restituisce paginazioni discordanti | ISBN 9788833020679: 329 importate, 392 dall’editore; altre discrepanze in sette schede. | Metadati delle edizioni elèuthera riallineati al catalogo editoriale. | | Schema Archivi incompleto | Plugin 1.5.2 senza `archival_units.published`. | `ensureSchema()` del plugin eseguito con successo; da approfondire perché la migrazione non era partita durante l’aggiornamento. | -| Traduttore mostrato come autore nei desiderata | Alice Zaffaroni compariva accanto a Tomás Ibáñez pur avendo ruolo `traduttore`. | Corrette `wanted()` e `donationPrefill()`: solo ruoli `principale`/`co-autore`, ordinati. Patch locale e online; sintassi PHP valida e controllo sul caso reale superato. | +| Ruoli appiattiti nel campo autore dei desiderata | Alice Zaffaroni compariva nel campo autore accanto a Tomás Ibáñez pur avendo ruolo `traduttore`. | Allineati lista, precompilazione donazione e dettaglio API: il campo autore contiene solo `principale`/`co-autore`, ordinati. Il dettaglio API conserva tutti i contributori con ruolo distinto, come richiesto dalla [issue #237](https://github.com/fabiodalez-dev/Pinakes/issues/237). Persone e relazioni bibliografiche restano conservate. | | Disponibilità del solo ebook fuorviante | Libro 144, 0 copie fisiche: “Non disponibile oggi” e prenotazione, pur con PDF/audio consultabili. | Ancora aperto: distinguere disponibilità digitale e copie fisiche, senza inventare una copia. | -Il test locale `desiderata-search-facets.unit.php` non è eseguibile con le credenziali disponibili: il suo database usa e getta non può essere creato. Non è stato forzato su un database di installazione. Verifica della patch effettuata invece con lint PHP e chiamata di sola lettura al metodo reale `wanted()` sul record interessato. - -Il disco locale ha esaurito temporaneamente lo spazio; sono stati rimossi soltanto PDF di ricerca scaricabili di nuovo. L’utente ha successivamente liberato spazio. Nessun contenuto dell’installazione online è stato perso. +Verifica della patch: lint PHP, PHPStan livello 5, 57 controlli d’integrazione delle raccolte/API e 5 controlli sui faceti desiderata superati. Le suite sono state eseguite su un server MySQL locale separato con database usa e getta, senza modificare un database di installazione. Il caso bibliografico reale è stato controllato anche online con chiamate di sola lettura: lista e dettaglio riportano Tomás Ibáñez; Alice Zaffaroni è conservata nei contributori con ruolo `traduttore`. Il contratto OpenAPI documenta il nuovo campo. diff --git a/storage/plugins/mobile-api/src/Controllers/CollectionsController.php b/storage/plugins/mobile-api/src/Controllers/CollectionsController.php index 7a71cdfaf..e035976a5 100644 --- a/storage/plugins/mobile-api/src/Controllers/CollectionsController.php +++ b/storage/plugins/mobile-api/src/Controllers/CollectionsController.php @@ -89,9 +89,9 @@ private function wanted(Request $request, Response $response): Response private function wantedDetail(Response $response, int $id): Response { $rows = $this->rows("SELECT l.id, l.titolo, l.sottotitolo, l.descrizione, l.anno_pubblicazione, l.isbn13, l.isbn10, l.copertina_url, e.nome AS editore, - (SELECT GROUP_CONCAT(a.nome SEPARATOR ', ') FROM libri_autori la JOIN autori a ON a.id = la.autore_id WHERE la.libro_id = l.id) AS autore, + (SELECT GROUP_CONCAT(a.nome ORDER BY CASE la.ruolo WHEN 'principale' THEN 0 ELSE 1 END, la.ordine_credito SEPARATOR ', ') FROM libri_autori la JOIN autori a ON a.id = la.autore_id WHERE la.libro_id = l.id AND la.ruolo IN ('principale','co-autore')) AS autore, (SELECT a.nome FROM libri_autori la JOIN autori a ON a.id = la.autore_id WHERE la.libro_id = l.id - ORDER BY CASE la.ruolo WHEN 'principale' THEN 0 ELSE 1 END, la.ordine_credito LIMIT 1) AS autore_principale_nome + AND la.ruolo IN ('principale','co-autore') ORDER BY CASE la.ruolo WHEN 'principale' THEN 0 ELSE 1 END, la.ordine_credito LIMIT 1) AS autore_principale_nome FROM libri l LEFT JOIN editori e ON e.id = l.editore_id WHERE l.id = ? AND l.deleted_at IS NULL AND l.is_desiderata = 1 AND NOT EXISTS (SELECT 1 FROM copie c WHERE c.libro_id = l.id)", [$id]); if ($rows === []) { return ResponseEnvelope::error($response, 'not_found', __('Libro non trovato.'), 404); } @@ -100,6 +100,10 @@ private function wantedDetail(Response $response, int $id): Response 'subtitle' => $this->text($row['sottotitolo'] ?? null), 'description' => $this->text($row['descrizione'] ?? null), 'year' => isset($row['anno_pubblicazione']) ? (int) $row['anno_pubblicazione'] : null, + 'contributors' => array_map(static fn(array $credit): array => [ + 'id' => (int) $credit['id'], 'name' => \App\Support\AuthorName::display($credit), 'role' => (string) $credit['ruolo'], + ], $this->rows("SELECT a.id, a.nome, a.pseudonimo, la.ruolo FROM libri_autori la JOIN autori a ON a.id = la.autore_id + WHERE la.libro_id = ? ORDER BY CASE la.ruolo WHEN 'principale' THEN 0 WHEN 'co-autore' THEN 1 ELSE 2 END, la.ordine_credito, a.id", [$id])), ])->withHeader('Cache-Control', 'no-store'); } diff --git a/storage/plugins/mobile-api/src/Controllers/OpenApiController.php b/storage/plugins/mobile-api/src/Controllers/OpenApiController.php index 668efbb76..a71debccc 100644 --- a/storage/plugins/mobile-api/src/Controllers/OpenApiController.php +++ b/storage/plugins/mobile-api/src/Controllers/OpenApiController.php @@ -124,7 +124,10 @@ private function collectionsDocument(array $doc): array $doc['components']['schemas']['WantedBook'] = ['type' => 'object', 'required' => ['id', 'title', 'wanted'], 'properties' => [ 'id' => ['type' => 'integer'], 'title' => ['type' => 'string'], 'wanted' => ['type' => 'boolean', 'const' => true], 'subtitle' => $string, 'description' => $string, 'author' => $string, 'publisher' => $string, 'isbn' => $string, - 'year' => ['type' => ['integer', 'null']], 'cover_url' => $string, 'web_url' => $string]]; + 'year' => ['type' => ['integer', 'null']], 'cover_url' => $string, 'web_url' => $string, + 'contributors' => ['type' => 'array', 'description' => 'Detail-only contributor credits; author remains the principal/co-author summary.', + 'items' => ['type' => 'object', 'required' => ['id', 'name', 'role'], 'properties' => [ + 'id' => ['type' => 'integer'], 'name' => ['type' => 'string'], 'role' => ['type' => 'string']]]]]]; $doc['components']['schemas']['ArchiveRecord'] = ['type' => 'object', 'required' => ['id', 'title', 'reference_code', 'level'], 'properties' => [ 'id' => ['type' => 'integer'], 'parent_id' => ['type' => ['integer', 'null']], 'title' => ['type' => 'string'], 'formal_title' => $string, 'reference_code' => ['type' => 'string'], 'level' => ['type' => 'string', 'enum' => ['fonds', 'series', 'file', 'item']], diff --git a/tests/mobile-collections.integration.php b/tests/mobile-collections.integration.php index 6c5b9372f..25faa74d4 100644 --- a/tests/mobile-collections.integration.php +++ b/tests/mobile-collections.integration.php @@ -49,6 +49,36 @@ public function sendEmail(string $to, string $subject, string $body, string $toN $check(!in_array($normal, array_column([...$data['data'], ...$page2['data']], 'id'), true), 'ordinary zero-copy books are not desiderata'); $detail = $payload($controller->handle('desiderata', $request('GET'), new Slim\Psr7\Response(), 'wanted_detail', $bookIds[0])); $check($detail['data']['wanted'] && !isset($detail['data']['availability']), 'wanted detail does not invent lending availability'); + // Contributor entities are intentional (#237); only the author summary is role-filtered. + $credits = [ + ['principale', "$prefix principal", null, 2], + ['co-autore', "$prefix coauthor", null, 1], + ['traduttore', "$prefix translator", null, 0], + ['illustratore', "$prefix illustrator", "$prefix pen-name", 3], + ]; + foreach ($credits as [$role, $name, $pseudonym, $order]) { + $stmt = $db->prepare('INSERT INTO autori (nome, pseudonimo) VALUES (?, ?)'); + $stmt->bind_param('ss', $name, $pseudonym); $stmt->execute(); $creditId = (int) $db->insert_id; + $authorIds[] = $creditId; $stmt->close(); + $stmt = $db->prepare('INSERT INTO libri_autori (libro_id, autore_id, ruolo, ordine_credito) VALUES (?, ?, ?, ?)'); + $stmt->bind_param('iisi', $bookIds[0], $creditId, $role, $order); $stmt->execute(); $stmt->close(); + } + $creditedList = $payload($controller->handle('desiderata', $request('GET', query: ['q' => "$prefix translator"]), new Slim\Psr7\Response(), 'wanted')); + $creditedDetail = $payload($controller->handle('desiderata', $request('GET'), new Slim\Psr7\Response(), 'wanted_detail', $bookIds[0])); + $expectedAuthors = "$prefix principal, $prefix coauthor"; + $check($creditedList['data'][0]['author'] === $expectedAuthors && $creditedDetail['data']['author'] === $expectedAuthors, + 'wanted list and detail agree on authors while translator search still finds the book'); + $contributors = $creditedDetail['data']['contributors']; + $check(count($contributors) === 4 && array_column($contributors, 'role') === ['principale', 'co-autore', 'traduttore', 'illustratore'], + 'wanted detail preserves every contributor with a distinct role'); + $check($contributors[3]['name'] === "$prefix pen-name ($prefix illustrator)", 'wanted contributor display preserves pseudonyms'); + $prefill = (new ReflectionMethod($plugin, 'donationPrefill'))->invoke($plugin, $bookIds[0]); + $check($prefill['author'] === $expectedAuthors, 'donation prefill agrees with wanted list and detail'); + $translatorId = (int) $contributors[2]['id']; + $db->query("INSERT INTO libri_autori (libro_id, autore_id, ruolo) VALUES ({$bookIds[1]}, $translatorId, 'traduttore')"); + $translatorOnly = $payload($controller->handle('desiderata', $request('GET'), new Slim\Psr7\Response(), 'wanted_detail', $bookIds[1])); + $check($translatorOnly['data']['author'] === null && $translatorOnly['data']['contributors'][0]['role'] === 'traduttore', + 'translator-only credits remain visible without being promoted to authors'); $check($controller->handle('desiderata', $request('GET'), new Slim\Psr7\Response(), 'wanted_detail', $normal)->getStatusCode() === 404, 'ordinary book cannot be opened as a library request'); $db->query('UPDATE libri SET deleted_at = NOW() WHERE id = ' . $bookIds[2]); $check($controller->handle('desiderata', $request('GET'), new Slim\Psr7\Response(), 'wanted_detail', $bookIds[2])->getStatusCode() === 404, 'deleted wanted book is hidden'); From 93d33dcce16538c9538608d59d61158d382108c8 Mon Sep 17 00:00:00 2001 From: fabiodalez-dev Date: Mon, 12 Oct 2026 14:57:16 +0200 Subject: [PATCH 03/20] Prioritize showcase books and move card controls below covers --- app/Services/UnifiedCatalogService.php | 8 +++++ docs/demo/README.md | 2 ++ docs/demo/catalogo.jpg | Bin 130525 -> 115628 bytes docs/demo/verification.md | 4 ++- public/assets/pinakes-2026.css | 11 +++--- tests/mobile-collections.integration.php | 41 ++++++++++++++++++++++- 6 files changed, 60 insertions(+), 6 deletions(-) diff --git a/app/Services/UnifiedCatalogService.php b/app/Services/UnifiedCatalogService.php index a72f43126..6f74bbb57 100644 --- a/app/Services/UnifiedCatalogService.php +++ b/app/Services/UnifiedCatalogService.php @@ -100,6 +100,14 @@ public function page(string $bookFrom, string $authorSelect, string $bookTypes, 'author_desc' => 'author_sort IS NULL, author_sort DESC', default => 'created_at DESC', }; + // An installation can foreground its book holdings in the recent view. + // Apply this to the UNION before LIMIT: sorting the rendered page would + // still put newer articles on the first pages. Alphabetical and other + // explicit sort orders keep their unified-catalogue semantics (#412). + if (($filters['sort'] ?? 'newest') === 'newest' + && (new \App\Models\SettingsRepository($this->db))->get('catalog', 'books_first', '0') === '1') { + $order = "CASE WHEN kind = 'book' THEN 0 ELSE 1 END, $order"; + } $keys = $this->rows("SELECT * FROM ($union) results ORDER BY $order, kind ASC, id ASC LIMIT ? OFFSET ?", $bookTypes . $types . 'ii', array_merge($bookParams, $params, [$limit, $offset])); $records = []; diff --git a/docs/demo/README.md b/docs/demo/README.md index 5ce4f1d84..349b82441 100644 --- a/docs/demo/README.md +++ b/docs/demo/README.md @@ -50,3 +50,5 @@ Desktop and 390 × 844 mobile browser views. Some detailed screenshots were capt ## Verification [Checks and issues discovered during preparation](verification.md). A full database/upload backup was validated before replacing the old collection and is retained privately outside the public web directory. + +Il catalogo della demo dà precedenza ai libri nella vista recente tramite la preferenza `catalog.books_first=1` in `system_settings`. La precedenza viene applicata prima della paginazione; gli articoli rimangono nel catalogo e gli ordinamenti alfabetici restano condivisi. Le altre installazioni mantengono l’ordine recente misto se la preferenza è assente o disabilitata. diff --git a/docs/demo/catalogo.jpg b/docs/demo/catalogo.jpg index 796c1dfa5e615ebd973ccbb287d5b5f9d72b1043..22ae7f185140938af2d2cc2fce75136e9532818c 100644 GIT binary patch literal 115628 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 literal 130525 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"SELECT id, is_active FROM plugins WHERE name IN ('archives', 'desiderata')")->fetch_all(MYSQLI_ASSOC); +$pluginStates = $db->query("SELECT id, is_active FROM plugins WHERE name IN ('archives', 'desiderata', 'emeroteca')")->fetch_all(MYSQLI_ASSOC); +$settings = new App\Models\SettingsRepository($db); +$booksFirstSetting = $settings->get('catalog', 'books_first'); $check = static function (bool $ok, string $label) use (&$passed): void { if (!$ok) { throw new RuntimeException($label); } $passed++; echo "PASS $label\n"; @@ -166,6 +168,36 @@ public function sendEmail(string $to, string $subject, string $body, string $toN $check(array_column($localizedLanguage['data'], 'id') === [$articleId], 'real Danish book-language facets also find analytic records stored as dan'); $noMatch = $payload($module->articles($request('GET', query: ['q' => $prefix, 'language' => 'deu']), new Slim\Psr7\Response())); $check($noMatch['data'] === [], 'article language facet does not silently return unfiltered records'); + // A newer article must not consume the first page when this installation + // foregrounds its books. Other installations and explicit sorts stay mixed. + $laterBook = $repo->createBasic(['titolo' => "$prefix normal later", 'copie_totali' => 0]); + $bookIds[] = $laterBook; + $db->query("UPDATE plugins SET is_active = 1 WHERE name = 'emeroteca'"); + $db->query("UPDATE libri SET created_at = '2024-01-01 00:00:00' WHERE id = $normal"); + $db->query("UPDATE libri SET created_at = '2024-02-01 00:00:00' WHERE id = $laterBook"); + $db->query("UPDATE emeroteca_contributi SET created_at = '2025-01-01 00:00:00' WHERE id = $articleId"); + $catalog = new App\Services\UnifiedCatalogService($db); + $catalogPage = static fn(string $sort, int $limit = 3, int $offset = 0): array => $catalog->page( + "FROM libri l WHERE l.deleted_at IS NULL AND l.id IN ($normal, $laterBook)", + 'CAST(NULL AS CHAR CHARACTER SET utf8mb4) AS autore, CAST(NULL AS CHAR CHARACTER SET utf8mb4) AS autore_cognome', + '', [], ['search' => $prefix, 'sort' => $sort], 2, $limit, $offset); + $settings->set('catalog', 'books_first', '0'); + $check(array_column($catalogPage('newest')['rows'], 'id') === [$articleId, $laterBook, $normal], + 'mixed recent ordering is unchanged when books-first is disabled'); + $settings->set('catalog', 'books_first', '1'); + $ordered = $catalogPage('newest'); + $check(array_column($ordered['rows'], 'id') === [$laterBook, $normal, $articleId], + 'books-first keeps recent books ahead of a newer article'); + $check($ordered['total'] === 3 && $ordered['articles'] === 1, + 'books-first retains article records and the full catalogue count'); + $check(array_column($catalogPage('newest', 1, 0)['rows'], 'id') === [$laterBook] + && array_column($catalogPage('newest', 1, 1)['rows'], 'id') === [$normal] + && array_column($catalogPage('newest', 1, 2)['rows'], 'id') === [$articleId], + 'book priority is applied before pagination across the book-article boundary'); + $check(array_column($catalogPage('title_asc')['rows'], 'id') === [$articleId, $normal, $laterBook], + 'explicit alphabetical ordering stays unified with books-first enabled'); + $check(array_column($catalogPage('oldest')['rows'], 'id') === [$normal, $laterBook, $articleId], + 'explicit oldest ordering is not overridden by books-first'); $db->query('UPDATE emeroteca_contributi SET pubblico = 0 WHERE id = ' . $articleId); $check($module->articles($request('GET'), new Slim\Psr7\Response(), $articleId)->getStatusCode() === 404, 'unpublished article cannot be opened through the native API'); @@ -224,6 +256,13 @@ public function handle(Psr\Http\Message\ServerRequestInterface $request): Psr\Ht $cleanup = static function (string $sql) use ($db, &$failure): void { try { $db->query($sql); } catch (Throwable $e) { $failure ??= $e; fwrite(STDERR, 'Cleanup failed: ' . $e->getMessage() . "\n"); } }; + try { + if ($booksFirstSetting === null) { + $cleanup("DELETE FROM system_settings WHERE category = 'catalog' AND setting_key = 'books_first'"); + } else { + $settings->set('catalog', 'books_first', $booksFirstSetting); + } + } catch (Throwable $e) { $failure ??= $e; } if ($userId) { $cleanup('DELETE FROM desiderata_offers WHERE mobile_user_id = ' . $userId); $cleanup('DELETE FROM utenti WHERE id = ' . $userId); } foreach ($articleIds as $id) { $cleanup('DELETE FROM emeroteca_contributi WHERE id = ' . $id); } if ($bookIds) { $list = implode(',', $bookIds); $cleanup("DELETE FROM log_modifiche WHERE tabella = 'libri' AND record_id IN ($list)"); $cleanup("DELETE FROM libri WHERE id IN ($list)"); } From 4f6b88f84db4d65e7015594b64aa68242c180be0 Mon Sep 17 00:00:00 2001 From: fabiodalez-dev Date: Mon, 12 Oct 2026 15:14:30 +0200 Subject: [PATCH 04/20] Keep card titles close to covers and compact footer controls --- app/Views/frontend/partials/pk-book-card.php | 4 +-- docs/demo/README.md | 2 +- docs/demo/catalogo.jpg | Bin 115628 -> 116387 bytes docs/demo/verification.md | 6 ++-- public/assets/pinakes-2026.css | 36 +++++++++---------- 5 files changed, 25 insertions(+), 23 deletions(-) diff --git a/app/Views/frontend/partials/pk-book-card.php b/app/Views/frontend/partials/pk-book-card.php index 50161b617..9fe369fa1 100644 --- a/app/Views/frontend/partials/pk-book-card.php +++ b/app/Views/frontend/partials/pk-book-card.php @@ -1,8 +1,8 @@ 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%0Ai00M4~| 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 diff --git a/docs/demo/verification.md b/docs/demo/verification.md index 9adfcadfe..7c8bb7f4b 100644 --- a/docs/demo/verification.md +++ b/docs/demo/verification.md @@ -9,7 +9,7 @@ - Immagini/file presenti e validi sul server. 103 risorse HTTP controllate: nessun errore con le normali intestazioni del browser. Tutte le 12 tracce rispondono con `206 Partial Content` e `audio/mpeg`. - PDF aperto e renderizzato nel lettore incorporato; audio Malatesta riprodotto e messo in pausa, durata della prima parte 2033,88 secondi, nessun errore del player. - Catalogo recente: 50 libri prima dei 22 articoli, ordinati prima della paginazione. Preferenza di questa installazione (`catalog.books_first=1`); gli ordinamenti espliciti per titolo, autore e data crescente restano misti. -- Badge di disponibilità e wishlist in una riga sotto la copertina, senza sovrapporsi all’immagine o al titolo; verificati a 1512 px e a 390 px. +- Titoli a 10 px dalla copertina; badge di disponibilità e wishlist nella riga Dettagli in fondo alla scheda. Nessuna sovrapposizione con immagini, titoli o comandi; verificati a 1512 px e a 390 px. - Ricerca nel catalogo, navigazione testata/fascicolo/articolo, desiderata e club di lettura verificati nel browser. - Vista mobile 390 × 844: larghezza del documento 390, nessuno scorrimento orizzontale nella sezione desiderata. - OAI-PMH Identify/ListMetadataFormats, SRU explain/searchRetrieve e ResourceSync: HTTP 200, XML ben formato, namespace attesi, nessun errore nel campione. Controllo operativo, non una certificazione completa dei protocolli. @@ -23,6 +23,8 @@ | Scraping Pro restituisce paginazioni discordanti | ISBN 9788833020679: 329 importate, 392 dall’editore; altre discrepanze in sette schede. | Metadati delle edizioni elèuthera riallineati al catalogo editoriale. | | Schema Archivi incompleto | Plugin 1.5.2 senza `archival_units.published`. | `ensureSchema()` del plugin eseguito con successo; da approfondire perché la migrazione non era partita durante l’aggiornamento. | | Ruoli appiattiti nel campo autore dei desiderata | Alice Zaffaroni compariva nel campo autore accanto a Tomás Ibáñez pur avendo ruolo `traduttore`. | Allineati lista, precompilazione donazione e dettaglio API: il campo autore contiene solo `principale`/`co-autore`, ordinati. Il dettaglio API conserva tutti i contributori con ruolo distinto, come richiesto dalla [issue #237](https://github.com/fabiodalez-dev/Pinakes/issues/237). Persone e relazioni bibliografiche restano conservate. | -| Disponibilità del solo ebook fuorviante | Libro 144, 0 copie fisiche: “Non disponibile oggi” e prenotazione, pur con PDF/audio consultabili. | Ancora aperto: distinguere disponibilità digitale e copie fisiche, senza inventare una copia. | +| Disponibilità del solo ebook fuorviante | Libro 144, 0 copie fisiche: “Non disponibile oggi” e prenotazione, pur con PDF/audio consultabili. | Corretto nell’app Android nella [PR #44](https://github.com/fabiodalez-dev/Pinakes-Android/pull/44), con azioni digitali mantenute e nessun prestito fisico per zero copie. La vista web del dettaglio resta da allineare. | Verifica della patch: lint PHP, PHPStan livello 5, 63 controlli d’integrazione delle raccolte/API e 5 controlli sui faceti desiderata superati. Le suite sono state eseguite su un server MySQL locale separato con database usa e getta, senza modificare un database di installazione. Il caso bibliografico reale è stato controllato anche online con chiamate di sola lettura: lista e dettaglio riportano Tomás Ibáñez; Alice Zaffaroni è conservata nei contributori con ruolo `traduttore`. Il contratto OpenAPI documenta il nuovo campo. + +Le correzioni Android sono raccolte nella [PR #44](https://github.com/fabiodalez-dev/Pinakes-Android/pull/44): disponibilità digitale, pulizia PDF in errore/cancellazione/chiusura, trasporto audio e PDF con verifica della policy HTTP anche sui redirect, e ruoli dei contributori localizzati. Superati 198 test unitari debug, 198 release e 22 test su un emulatore Android 15 dedicato; lint senza errori (101 avvisi) e build release con R8 riuscita. Nessun rilascio o merge eseguito. diff --git a/public/assets/pinakes-2026.css b/public/assets/pinakes-2026.css index 7628027f5..9816e6a82 100644 --- a/public/assets/pinakes-2026.css +++ b/public/assets/pinakes-2026.css @@ -267,15 +267,14 @@ body.pk .pk-footer__bottom a.pk-footer__rss { color: var(--pk-faint); } :root { --pk-card-panel-bg: transparent; --pk-card-panel-pad: 0; } /* Declared on the panel: --pk-tone is set per panel by pinakes-2026.js. */ body.pk-cards-tinted :is(.pk-card__panel, .book-card .book-image-container) { --pk-card-panel-bg: var(--pk-tone, #eeeaec); --pk-card-panel-pad: 18px 22px 22px; } -.pk-card { position: relative; display: flex; flex-direction: column; gap: 14px; min-width: 0; color: inherit; } +.pk-card { position: relative; display: flex; flex-direction: column; gap: 10px; min-width: 0; color: inherit; } .pk-card__link { position: absolute; inset: 0; z-index: 1; border-radius: 16px; } .pk-card__link:focus-visible { outline: 2px solid var(--pk-accent); outline-offset: 4px; } .pk-card__panel { - position: relative; background: var(--pk-card-panel-bg); padding: var(--pk-card-panel-pad); border-radius: 16px; - padding-bottom: 48px; /* A separate row for status and wishlist, outside the artwork. */ + position: static; background: var(--pk-card-panel-bg); padding: var(--pk-card-panel-pad); border-radius: 16px; transition: transform .3s var(--pk-ease); } -.pk-card:hover .pk-card__panel { transform: translateY(-4px); } +.pk-card:hover .pk-card__panel { transform: none; } .pk-book { position: relative; aspect-ratio: 2 / 3; perspective: 900px; } .pk-book__pages { position: absolute; top: 3px; bottom: 3px; right: -5px; width: 12px; border-radius: 0 3px 3px 0; @@ -325,10 +324,10 @@ body.pk-cards-tinted :is(.pk-card__panel, .book-card .book-image-container) { -- .pk-book__gloss { position: absolute; inset: 0; pointer-events: none; background: linear-gradient(115deg, rgba(255,255,255,.22) 0%, rgba(255,255,255,0) 32%, rgba(255,255,255,0) 70%, rgba(0,0,0,.12) 100%); } .pk-book__edge { position: absolute; inset: 0; border-radius: inherit; pointer-events: none; box-shadow: inset 0 0 0 1px rgba(0,0,0,.08), inset 0 1px 0 rgba(255,255,255,.2); } .pk-card__status { - position: absolute; top: auto; bottom: 14px; left: 10px; z-index: 2; display: flex; align-items: center; gap: 6px; + position: absolute; top: auto; bottom: 5px; left: 64px; z-index: 2; display: flex; align-items: center; gap: 6px; padding: 4px 9px 4px 8px; border-radius: 999px; background: rgba(255,255,255,.94); font-size: 11px; font-weight: 600; color: var(--pk-ink); box-shadow: 0 2px 6px rgba(0,0,0,.08); - max-width: calc(100% - 56px); line-height: 1.3; letter-spacing: normal; text-transform: none; border: 0; + max-width: calc(100% - 104px); line-height: 1.3; letter-spacing: normal; text-transform: none; border: 0; } .pk-card__status::before { content: ''; flex: none; width: 6px; height: 6px; border-radius: 50%; background: var(--pk-dot, var(--pk-neutral)); } .pk-card__status > span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } @@ -343,7 +342,7 @@ body.pk-cards-tinted :is(.pk-card__panel, .book-card .book-image-container) { -- box-shadow: 0 2px 6px rgba(0,0,0,.08); } .pk-heart { - position: absolute; top: auto; bottom: 8px; right: 8px; z-index: 2; width: 32px; height: 32px; border-radius: 50%; + position: absolute; top: auto; bottom: 0; right: 0; z-index: 2; width: 32px; height: 32px; border-radius: 50%; display: grid; place-items: center; background: rgba(255,255,255,.94); border: 0; padding: 0; cursor: pointer; box-shadow: 0 2px 6px rgba(0,0,0,.08); transition: transform .2s; color: var(--pk-accent-ink); } @@ -550,19 +549,21 @@ body.pk .book-card.pk-card:hover { transform: none; box-shadow: none; } body.pk .pk-card .book-image-container.pk-card__panel { aspect-ratio: auto; height: auto; overflow: visible; margin: 0; display: block; background: var(--pk-card-panel-bg); padding: var(--pk-card-panel-pad); border-radius: 16px; border: 0; box-shadow: none; - padding-bottom: 48px; + position: static; } -body.pk .pk-card:hover .book-image-container.pk-card__panel { transform: translateY(-4px); box-shadow: none; } +body.pk .pk-card:hover .book-image-container.pk-card__panel { transform: none; box-shadow: none; } body.pk .pk-card .book-image-container::after { display: none; } body.pk .pk-card .book-image { transform: none; } body.pk .pk-card .book-status-badge.pk-card__status { - position: absolute; top: auto; left: 10px; right: auto; bottom: 14px; transform: none; - display: flex; align-items: center; gap: 6px; padding: 4px 9px 4px 8px; border-radius: 999px; + position: absolute; top: auto; left: 64px; right: auto; bottom: 5px; transform: none; + display: flex; align-items: center; gap: 4px; padding: 4px; border-radius: 999px; background: rgba(255, 255, 255, .94); color: var(--pk-ink); box-shadow: 0 2px 6px rgba(0, 0, 0, .08); - font: 600 11px/1.3 var(--pk-sans); letter-spacing: normal; text-transform: none; border: 0; width: auto; + font: 600 10px/1.3 var(--pk-sans); letter-spacing: normal; text-transform: none; border: 0; width: auto; } -body.pk .pk-card .book-media-badge.pk-card__media { position: absolute; bottom: 10px; left: 10px; top: auto; right: auto; } -body.pk .pk-card__panel:has(.pk-card__media) .book-status-badge.pk-card__status { left: 44px; max-width: calc(100% - 92px); } +/* Grid controls share the Details row at the foot of the whole card. The + static panel keeps their containing block off the cover, including hover. */ +body.pk .pk-card .book-media-badge.pk-card__media { position: absolute; bottom: 3px; left: 64px; top: auto; right: auto; } +body.pk .pk-card__panel:has(.pk-card__media) .book-status-badge.pk-card__status { left: 98px; max-width: calc(100% - 138px); } body.pk .pk-card .book-content.pk-card__body { padding: 0 2px; gap: 4px; display: flex; flex-direction: column; background: none; } /* Grid: the title always takes its two lines, so a one-line title does not lift the author, publisher and Details of its card above its neighbours. */ @@ -570,12 +571,13 @@ body.pk .pk-card .book-title.pk-card__title { min-height: 2.4em; margin: 0; font body.pk .pk-card .book-author.pk-card__author { margin: 0; font-size: 13px; line-height: 1.35; color: var(--pk-muted); } body.pk .pk-card .book-meta.pk-card__meta { margin: 0; font-size: 12px; line-height: 1.35; color: var(--pk-faint); } body.pk .pk-card .book-subtitle.pk-card__subtitle { margin: 0; font-size: 13px; color: var(--pk-faint); } -body.pk .pk-card .book-actions.pk-card__actions { margin: auto 0 0; padding: 6px 0 0; display: block; } +body.pk .pk-card .book-actions.pk-card__actions { margin: auto 0 0; padding: 0; min-height: 32px; display: flex; flex-direction: row; align-items: center; justify-content: flex-start; } body.pk .pk-card .book-actions a.pk-card__details, body.pk .pk-card .book-actions a.pk-card__details:hover { width: auto; min-height: 0; padding: 0; border: 0; border-radius: 0; background: none; box-shadow: none; - color: var(--pk-accent-ink); font: 600 13px/1.4 var(--pk-sans); letter-spacing: normal; text-transform: none; justify-content: flex-start; + color: var(--pk-accent-ink); font: 600 11px/1.4 var(--pk-sans); letter-spacing: normal; text-transform: none; justify-content: flex-start; } +body.pk .pk-card .book-actions a.pk-card__details i { font-size: 10px; margin-right: 0; } body.pk .pk-card .book-actions a.pk-card__details:hover { color: var(--pk-accent-strong); } /* Hero: the old .hero-content centred everything. */ @@ -1486,8 +1488,6 @@ body.pk #book-share-card .card-body > div { display: flex; flex-wrap: wrap; gap: body.pk .pk-bookhero .pk-authors, body.pk .pk-bookhero .genre-tags { justify-content: flex-start; } } body.pk #book-share-card .card-body { padding: 0 !important; } -/* "Classica" cards: the status badge sits on the book itself, so a blank book's title starts below it. */ -body:not(.pk-cards-tinted) .pk-card .pk-book__blank { padding-top: 40px; } /* No fade-in on cards or sections anywhere: content is there when the page is. (catalog.php still toggles .fade-in on the grid after an AJAX refresh.) */ body.pk .fade-in, body.pk .reveal { animation: none !important; opacity: 1 !important; transform: none !important; transition: none !important; } From db65dae70d8e191478cc0a4fbba72016fd810fb7 Mon Sep 17 00:00:00 2001 From: fabiodalez-dev Date: Mon, 12 Oct 2026 15:17:48 +0200 Subject: [PATCH 05/20] Record Android review fixes and final validation --- docs/demo/verification.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/demo/verification.md b/docs/demo/verification.md index 7c8bb7f4b..cf9867e2a 100644 --- a/docs/demo/verification.md +++ b/docs/demo/verification.md @@ -27,4 +27,4 @@ Verifica della patch: lint PHP, PHPStan livello 5, 63 controlli d’integrazione delle raccolte/API e 5 controlli sui faceti desiderata superati. Le suite sono state eseguite su un server MySQL locale separato con database usa e getta, senza modificare un database di installazione. Il caso bibliografico reale è stato controllato anche online con chiamate di sola lettura: lista e dettaglio riportano Tomás Ibáñez; Alice Zaffaroni è conservata nei contributori con ruolo `traduttore`. Il contratto OpenAPI documenta il nuovo campo. -Le correzioni Android sono raccolte nella [PR #44](https://github.com/fabiodalez-dev/Pinakes-Android/pull/44): disponibilità digitale, pulizia PDF in errore/cancellazione/chiusura, trasporto audio e PDF con verifica della policy HTTP anche sui redirect, e ruoli dei contributori localizzati. Superati 198 test unitari debug, 198 release e 22 test su un emulatore Android 15 dedicato; lint senza errori (101 avvisi) e build release con R8 riuscita. Nessun rilascio o merge eseguito. +Le correzioni Android sono raccolte nella [PR #44](https://github.com/fabiodalez-dev/Pinakes-Android/pull/44): disponibilità digitale, pulizia PDF in errore/cancellazione/chiusura, trasporto audio e PDF con verifica della policy HTTP anche sui redirect, e ruoli dei contributori localizzati. Superati 200 test unitari debug, 200 release e 22 test su un emulatore Android 15 dedicato; lint senza errori (101 avvisi) e build release con R8 riuscita. Nessun rilascio o merge eseguito. From c22ce5f53fb71448fa017270c06f23eb768b8acd Mon Sep 17 00:00:00 2001 From: fabiodalez-dev Date: Mon, 12 Oct 2026 15:37:13 +0200 Subject: [PATCH 06/20] Overlay status and wishlist inside the bottom of covers --- app/Views/frontend/partials/pk-book-card.php | 2 +- docs/demo/catalogo.jpg | Bin 116387 -> 117465 bytes docs/demo/verification.md | 2 +- public/assets/pinakes-2026.css | 40 ++++++++++--------- 4 files changed, 24 insertions(+), 20 deletions(-) diff --git a/app/Views/frontend/partials/pk-book-card.php b/app/Views/frontend/partials/pk-book-card.php index 9fe369fa1..21a1780d6 100644 --- a/app/Views/frontend/partials/pk-book-card.php +++ b/app/Views/frontend/partials/pk-book-card.php @@ -2,7 +2,7 @@ /** * One book as a card (2026 design): the cover as a 3D book on a panel tinted * from the cover's own colour, then title, subtitle, author and publisher. - * Availability and wishlist share the "Details" row at the foot of the card. + * Availability and wishlist overlay the bottom of the cover. * * Shared by the home, the catalogue grid and the book page's related books, * so every list of books looks the same. Keeps every element the previous diff --git a/docs/demo/catalogo.jpg b/docs/demo/catalogo.jpg index 2302c54334d950a558c60ec95013136f5b0e6569..c3627fe24b17c449e6b9775814f314e4e3808ac6 100644 GIT binary patch literal 117465 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%0Ai00M4~| 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 span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } @@ -342,7 +342,7 @@ body.pk-cards-tinted :is(.pk-card__panel, .book-card .book-image-container) { -- box-shadow: 0 2px 6px rgba(0,0,0,.08); } .pk-heart { - position: absolute; top: auto; bottom: 0; right: 0; z-index: 2; width: 32px; height: 32px; border-radius: 50%; + position: absolute; top: auto; bottom: 8px; right: 8px; z-index: 2; width: 32px; height: 32px; border-radius: 50%; display: grid; place-items: center; background: rgba(255,255,255,.94); border: 0; padding: 0; cursor: pointer; box-shadow: 0 2px 6px rgba(0,0,0,.08); transition: transform .2s; color: var(--pk-accent-ink); } @@ -549,21 +549,26 @@ body.pk .book-card.pk-card:hover { transform: none; box-shadow: none; } body.pk .pk-card .book-image-container.pk-card__panel { aspect-ratio: auto; height: auto; overflow: visible; margin: 0; display: block; background: var(--pk-card-panel-bg); padding: var(--pk-card-panel-pad); border-radius: 16px; border: 0; box-shadow: none; - position: static; + position: relative; } -body.pk .pk-card:hover .book-image-container.pk-card__panel { transform: none; box-shadow: none; } +body.pk .pk-card:hover .book-image-container.pk-card__panel { transform: translateY(-4px); box-shadow: none; } body.pk .pk-card .book-image-container::after { display: none; } body.pk .pk-card .book-image { transform: none; } body.pk .pk-card .book-status-badge.pk-card__status { - position: absolute; top: auto; left: 64px; right: auto; bottom: 5px; transform: none; - display: flex; align-items: center; gap: 4px; padding: 4px; border-radius: 999px; + position: absolute; top: auto; left: 10px; right: auto; bottom: 10px; transform: none; + display: flex; align-items: center; gap: 6px; padding: 4px 9px 4px 8px; border-radius: 999px; background: rgba(255, 255, 255, .94); color: var(--pk-ink); box-shadow: 0 2px 6px rgba(0, 0, 0, .08); - font: 600 10px/1.3 var(--pk-sans); letter-spacing: normal; text-transform: none; border: 0; width: auto; -} -/* Grid controls share the Details row at the foot of the whole card. The - static panel keeps their containing block off the cover, including hover. */ -body.pk .pk-card .book-media-badge.pk-card__media { position: absolute; bottom: 3px; left: 64px; top: auto; right: auto; } -body.pk .pk-card__panel:has(.pk-card__media) .book-status-badge.pk-card__status { left: 98px; max-width: calc(100% - 138px); } + font: 600 11px/1.3 var(--pk-sans); letter-spacing: normal; text-transform: none; border: 0; width: auto; +} +/* Overlay controls at the bottom of the cover, without adding space below it. */ +body.pk .pk-card .book-media-badge.pk-card__media { position: absolute; bottom: 10px; left: 10px; top: auto; right: auto; } +body.pk .pk-card__panel:has(.pk-card__media) .book-status-badge.pk-card__status { left: 44px; max-width: calc(100% - 90px); } +/* Tinted panels include 22px of padding around the cover. Keep overlays inside + the artwork rather than in that padding. List view overrides these below. */ +body.pk-cards-tinted .pk-card .book-status-badge.pk-card__status { bottom: 32px; left: 32px; max-width: calc(100% - 100px); } +body.pk-cards-tinted .pk-card .pk-heart { bottom: 30px; right: 30px; } +body.pk-cards-tinted .pk-card .book-media-badge.pk-card__media { bottom: 32px; left: 32px; } +body.pk-cards-tinted .pk-card__panel:has(.pk-card__media) .book-status-badge.pk-card__status { left: 66px; max-width: calc(100% - 134px); } body.pk .pk-card .book-content.pk-card__body { padding: 0 2px; gap: 4px; display: flex; flex-direction: column; background: none; } /* Grid: the title always takes its two lines, so a one-line title does not lift the author, publisher and Details of its card above its neighbours. */ @@ -571,13 +576,12 @@ body.pk .pk-card .book-title.pk-card__title { min-height: 2.4em; margin: 0; font body.pk .pk-card .book-author.pk-card__author { margin: 0; font-size: 13px; line-height: 1.35; color: var(--pk-muted); } body.pk .pk-card .book-meta.pk-card__meta { margin: 0; font-size: 12px; line-height: 1.35; color: var(--pk-faint); } body.pk .pk-card .book-subtitle.pk-card__subtitle { margin: 0; font-size: 13px; color: var(--pk-faint); } -body.pk .pk-card .book-actions.pk-card__actions { margin: auto 0 0; padding: 0; min-height: 32px; display: flex; flex-direction: row; align-items: center; justify-content: flex-start; } +body.pk .pk-card .book-actions.pk-card__actions { margin: auto 0 0; padding: 6px 0 0; display: block; } body.pk .pk-card .book-actions a.pk-card__details, body.pk .pk-card .book-actions a.pk-card__details:hover { width: auto; min-height: 0; padding: 0; border: 0; border-radius: 0; background: none; box-shadow: none; - color: var(--pk-accent-ink); font: 600 11px/1.4 var(--pk-sans); letter-spacing: normal; text-transform: none; justify-content: flex-start; + color: var(--pk-accent-ink); font: 600 13px/1.4 var(--pk-sans); letter-spacing: normal; text-transform: none; justify-content: flex-start; } -body.pk .pk-card .book-actions a.pk-card__details i { font-size: 10px; margin-right: 0; } body.pk .pk-card .book-actions a.pk-card__details:hover { color: var(--pk-accent-strong); } /* Hero: the old .hero-content centred everything. */ From 1c96e123b5e69305bbb0a109b3ace56a8ce13c2d Mon Sep 17 00:00:00 2001 From: fabiodalez-dev Date: Mon, 12 Oct 2026 15:49:27 +0200 Subject: [PATCH 07/20] Give book titles space below the cover shadow --- docs/demo/verification.md | 2 +- public/assets/pinakes-2026.css | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/demo/verification.md b/docs/demo/verification.md index d443e523f..a4ebfb5a8 100644 --- a/docs/demo/verification.md +++ b/docs/demo/verification.md @@ -9,7 +9,7 @@ - Immagini/file presenti e validi sul server. 103 risorse HTTP controllate: nessun errore con le normali intestazioni del browser. Tutte le 12 tracce rispondono con `206 Partial Content` e `audio/mpeg`. - PDF aperto e renderizzato nel lettore incorporato; audio Malatesta riprodotto e messo in pausa, durata della prima parte 2033,88 secondi, nessun errore del player. - Catalogo recente: 50 libri prima dei 22 articoli, ordinati prima della paginazione. Preferenza di questa installazione (`catalog.books_first=1`); gli ordinamenti espliciti per titolo, autore e data crescente restano misti. -- Titoli a 10 px dalla copertina; badge di disponibilità e wishlist sovrapposti in basso dentro la copertina. Nessuno spazio aggiunto tra immagine e titolo; verificati a 1512 px e a 390 px. +- Titoli a 18 px dalla copertina, sotto l’ombra del libro; badge di disponibilità e wishlist sovrapposti in basso dentro la copertina. Nessuno spazio aggiunto tra immagine e titolo; verificati a 1512 px e a 390 px. - Ricerca nel catalogo, navigazione testata/fascicolo/articolo, desiderata e club di lettura verificati nel browser. - Vista mobile 390 × 844: larghezza del documento 390, nessuno scorrimento orizzontale nella sezione desiderata. - OAI-PMH Identify/ListMetadataFormats, SRU explain/searchRetrieve e ResourceSync: HTTP 200, XML ben formato, namespace attesi, nessun errore nel campione. Controllo operativo, non una certificazione completa dei protocolli. diff --git a/public/assets/pinakes-2026.css b/public/assets/pinakes-2026.css index 768d15653..fa4377365 100644 --- a/public/assets/pinakes-2026.css +++ b/public/assets/pinakes-2026.css @@ -267,7 +267,7 @@ body.pk .pk-footer__bottom a.pk-footer__rss { color: var(--pk-faint); } :root { --pk-card-panel-bg: transparent; --pk-card-panel-pad: 0; } /* Declared on the panel: --pk-tone is set per panel by pinakes-2026.js. */ body.pk-cards-tinted :is(.pk-card__panel, .book-card .book-image-container) { --pk-card-panel-bg: var(--pk-tone, #eeeaec); --pk-card-panel-pad: 18px 22px 22px; } -.pk-card { position: relative; display: flex; flex-direction: column; gap: 10px; min-width: 0; color: inherit; } +.pk-card { position: relative; display: flex; flex-direction: column; gap: 18px; min-width: 0; color: inherit; } .pk-card__link { position: absolute; inset: 0; z-index: 1; border-radius: 16px; } .pk-card__link:focus-visible { outline: 2px solid var(--pk-accent); outline-offset: 4px; } .pk-card__panel { From 92e0b1aed4bc40d1add4010fd9722588cc4f3e3d Mon Sep 17 00:00:00 2001 From: fabiodalez-dev Date: Mon, 12 Oct 2026 15:51:10 +0200 Subject: [PATCH 08/20] Refresh catalog screenshot with title shadow spacing --- docs/demo/catalogo.jpg | Bin 117465 -> 115226 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/demo/catalogo.jpg b/docs/demo/catalogo.jpg index c3627fe24b17c449e6b9775814f314e4e3808ac6..650e6b4195566dca59444d3159de9af746ca23fb 100644 GIT binary patch literal 115226 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

RR(LF7qf%F0 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 Ks7mGk-vj__8*MlM literal 117465 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 Date: Mon, 12 Oct 2026 16:12:43 +0200 Subject: [PATCH 09/20] Open PDF attachments in a responsive fullscreen lightbox --- docs/demo/verification.md | 2 +- .../digital-library/DigitalLibraryPlugin.php | 2 +- storage/plugins/digital-library/README.md | 2 + .../assets/css/digital-library.css | 87 +++++++------ .../views/frontend-attachments.php | 36 ++---- .../views/frontend-buttons.php | 50 +------ .../views/frontend-pdf-lightbox.php | 14 ++ .../views/frontend-pdf-script.php | 54 ++++++++ .../views/frontend-pdf-viewer.php | 122 ++---------------- tests/digital-attachments-445.spec.js | 13 ++ tests/digital-attachments-445.unit.php | 11 +- 11 files changed, 159 insertions(+), 234 deletions(-) create mode 100644 storage/plugins/digital-library/views/frontend-pdf-lightbox.php create mode 100644 storage/plugins/digital-library/views/frontend-pdf-script.php diff --git a/docs/demo/verification.md b/docs/demo/verification.md index a4ebfb5a8..6a263e181 100644 --- a/docs/demo/verification.md +++ b/docs/demo/verification.md @@ -7,7 +7,7 @@ - 3 testate, 10 fascicoli e relative annate; 4 unità archivistiche pubbliche. Vecchi dati di prova rimossi dalle viste pubbliche. - Nessuna segnatura `DEMO`; scaffali/mensole registrati, inventari ordinari e segnatura digitale `DIG-MAL`. - Immagini/file presenti e validi sul server. 103 risorse HTTP controllate: nessun errore con le normali intestazioni del browser. Tutte le 12 tracce rispondono con `206 Partial Content` e `audio/mpeg`. -- PDF aperto e renderizzato nel lettore incorporato; audio Malatesta riprodotto e messo in pausa, durata della prima parte 2033,88 secondi, nessun errore del player. +- PDF aperto nel lightbox a tutto schermo con sfondo chiaro, semitrasparente e sfocato; verificati desktop, telefono (390 × 844) e orientamento orizzontale (844 × 390), chiusura con pulsante/Esc e ripristino del focus; audio Malatesta riprodotto e messo in pausa, durata della prima parte 2033,88 secondi, nessun errore del player. - Catalogo recente: 50 libri prima dei 22 articoli, ordinati prima della paginazione. Preferenza di questa installazione (`catalog.books_first=1`); gli ordinamenti espliciti per titolo, autore e data crescente restano misti. - Titoli a 18 px dalla copertina, sotto l’ombra del libro; badge di disponibilità e wishlist sovrapposti in basso dentro la copertina. Nessuno spazio aggiunto tra immagine e titolo; verificati a 1512 px e a 390 px. - Ricerca nel catalogo, navigazione testata/fascicolo/articolo, desiderata e club di lettura verificati nel browser. diff --git a/storage/plugins/digital-library/DigitalLibraryPlugin.php b/storage/plugins/digital-library/DigitalLibraryPlugin.php index 4db95e52d..ff6369f36 100644 --- a/storage/plugins/digital-library/DigitalLibraryPlugin.php +++ b/storage/plugins/digital-library/DigitalLibraryPlugin.php @@ -536,7 +536,7 @@ public function renderAudioPlayer(array $book): void } /** - * Render inline PDF viewer + * Render fullscreen PDF reader * Hook: book.detail.digital_player (priority 20, after audio player) */ public function renderPdfViewer(array $book): void diff --git a/storage/plugins/digital-library/README.md b/storage/plugins/digital-library/README.md index 107c2279b..ee120fc48 100644 --- a/storage/plugins/digital-library/README.md +++ b/storage/plugins/digital-library/README.md @@ -102,6 +102,8 @@ Una volta caricati i contenuti: #### Nella Scheda Libro +- **Bottone "Leggi PDF"**: Apre un lightbox a tutto schermo, adattato a telefono e tablet, con chiusura tramite pulsante o Esc. La chiusura restituisce il focus al pulsante di lettura. +- **Link "Apri in una nuova scheda"**: Consente di usare il lettore del browser in una scheda separata. - **Bottone "Scarica eBook"**: Download diretto del file PDF/ePub - **Bottone "Ascolta Audiobook"**: Apre il player audio - **Player Green Audio**: Interfaccia moderna con: diff --git a/storage/plugins/digital-library/assets/css/digital-library.css b/storage/plugins/digital-library/assets/css/digital-library.css index 3d69d71c8..cf7651821 100644 --- a/storage/plugins/digital-library/assets/css/digital-library.css +++ b/storage/plugins/digital-library/assets/css/digital-library.css @@ -80,16 +80,14 @@ } } -#audiobook-player-container .card, -#pdf-viewer-container .card { +#audiobook-player-container .card { border: 2px solid #e5e7eb; border-radius: 16px; transition: box-shadow 0.3s ease, transform 0.3s ease; background: linear-gradient(135deg, #ffffff 0%, #f9fafb 100%); } -#audiobook-player-container .card:hover, -#pdf-viewer-container .card:hover { +#audiobook-player-container .card:hover { box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12); transform: translateY(-2px); } @@ -205,34 +203,6 @@ transform: translateY(0); } -/* ========================================================================== - PDF Viewer Container - ========================================================================== */ - -#pdf-viewer-container { - animation: slideDown 0.3s ease-out; -} - -.pdf-viewer-frame { - width: 100%; - height: 80vh; - border: none; - border-radius: 8px; - background: #f1f5f9; -} - -#pdf-viewer-container .btn-danger { - background-color: #dc2626 !important; - border-color: #dc2626 !important; - color: #fff; -} - -#pdf-viewer-container .btn-danger:hover, -#pdf-viewer-container .btn-danger:focus { - background-color: #b91c1c !important; - border-color: #b91c1c !important; -} - /* ========================================================================== Responsive Design ========================================================================== */ @@ -255,13 +225,6 @@ height: 36px; } - .pdf-viewer-frame { - height: 60vh; - } - - #pdf-viewer-container .card-body { - padding: 1rem; - } } /* ========================================================================== @@ -310,8 +273,7 @@ transform: none; } - #audiobook-player-container .card:hover, - #pdf-viewer-container .card:hover { + #audiobook-player-container .card:hover { transform: none; } } @@ -347,8 +309,6 @@ .digital-attachments-list .digital-attachment__download:hover { border-color: var(--pk-ink, #1b1720); color: var(--pk-ink, #1b1720); } .digital-attachments-list .digital-attachment__download i { font-size: 12px; margin: 0; } .digital-attachments-list audio { display: block; width: 100%; height: 34px; margin: 0; } -.digital-attachment__viewer { margin: 0; } -.digital-attachments-list iframe { width: 100%; height: 65vh; border: 0; border-radius: 10px; } @media (max-width: 767px) { .digital-attachment-row, .digital-attachment-uploaders { grid-template-columns: minmax(0, 1fr); } } /* Phones: the two actions share the row at equal width. */ @media (max-width: 480px) { @@ -359,3 +319,44 @@ } /* "Leggi PDF" is a link (the PDF itself without JavaScript) styled as its button. */ .digital-attachments-list a.digital-attachment__read, .digital-attachments-list a.digital-attachment__read:hover { text-decoration: none; } + +/* A top-layer reader uses the entire viewport, including narrow/landscape screens. */ +html.digital-pdf-open, body.digital-pdf-open { overflow: hidden; } +dialog.digital-pdf-lightbox { + position: fixed; inset: 0; width: 100%; max-width: none; + height: 100vh; height: 100dvh; max-height: none; margin: 0; padding: 0; + border: 0; border-radius: 0; overflow: hidden; + background: transparent; color: var(--pk-ink, #1b1720); +} +dialog.digital-pdf-lightbox:not([open]) { display: none; } +dialog.digital-pdf-lightbox[open] { display: flex; flex-direction: column; } +dialog.digital-pdf-lightbox::backdrop { + background: rgba(250, 248, 249, .8); + -webkit-backdrop-filter: blur(12px); + backdrop-filter: blur(12px); +} +.digital-pdf-lightbox__toolbar { + flex: none; display: flex; align-items: center; gap: 12px; + padding: max(8px, env(safe-area-inset-top)) max(12px, env(safe-area-inset-right)) 8px max(12px, env(safe-area-inset-left)); + border-bottom: 1px solid var(--pk-line, #ece8ea); background: rgba(255, 253, 254, .86); +} +.digital-pdf-lightbox__toolbar h2 { + flex: 1; min-width: 0; margin: 0; overflow: hidden; text-overflow: ellipsis; + white-space: nowrap; font: 600 14px/1.4 var(--pk-font-body, sans-serif); +} +.digital-pdf-lightbox__action { + flex: none; display: inline-flex; align-items: center; justify-content: center; + min-height: 44px; padding: 8px 12px; border: 1px solid var(--pk-line-2, #e2dce0); + border-radius: 8px; background: var(--pk-surface, #fff); color: var(--pk-ink, #1b1720); + font: 600 13px/1.3 var(--pk-font-body, sans-serif); text-decoration: none; cursor: pointer; +} +.digital-pdf-lightbox__action:hover { background: var(--pk-accent-soft, #fdeaf2); } +.digital-pdf-lightbox__action:focus-visible { outline: 2px solid var(--pk-accent, #d70161); outline-offset: 2px; } +.digital-pdf-lightbox__frame { flex: 1; min-height: 0; width: calc(100% - 24px); margin: 12px 12px max(12px, env(safe-area-inset-bottom)); border: 0; border-radius: 8px; background: rgba(250, 248, 249, .8); } +@media (max-width: 600px) { + .digital-pdf-lightbox__frame { width: calc(100% - 16px); margin: 8px 8px max(8px, env(safe-area-inset-bottom)); border-radius: 6px; } + .digital-pdf-lightbox__toolbar { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 4px 8px; } + .digital-pdf-lightbox__toolbar h2 { grid-column: 1; grid-row: 1; } + .digital-pdf-lightbox__toolbar a { grid-column: 1; grid-row: 2; justify-self: start; padding: 4px 0; border: 0; background: transparent; } + .digital-pdf-lightbox__toolbar button { grid-column: 2; grid-row: 1 / span 2; } +} diff --git a/storage/plugins/digital-library/views/frontend-attachments.php b/storage/plugins/digital-library/views/frontend-attachments.php index 6d23a5907..913aae755 100644 --- a/storage/plugins/digital-library/views/frontend-attachments.php +++ b/storage/plugins/digital-library/views/frontend-attachments.php @@ -2,7 +2,7 @@ /** * Digital files of a book, one card each: the file type, its name and kind, * then what can be done with it. An audiobook plays in its card; a PDF opens - * below its card ("Leggi PDF"); every file can be downloaded. + * in a fullscreen lightbox ("Leggi PDF"); every file can be downloaded. * * @var list $attachments */ @@ -25,7 +25,7 @@

- + : : @@ -34,7 +34,11 @@ - + @@ -43,11 +47,6 @@ + diff --git a/storage/plugins/digital-library/views/frontend-buttons.php b/storage/plugins/digital-library/views/frontend-buttons.php index 21697f0b6..0a6fbeda4 100644 --- a/storage/plugins/digital-library/views/frontend-buttons.php +++ b/storage/plugins/digital-library/views/frontend-buttons.php @@ -3,7 +3,7 @@ * Digital Library Plugin - Frontend Buttons * * Renders download buttons for eBooks and audiobooks in the book detail page. - * PDF files get an inline viewer toggle; ePub/other files get a direct download/open link. + * PDF files open a fullscreen lightbox; ePub/other files get a direct download/open link. * * @var array $book */ @@ -21,16 +21,16 @@
- - ; - var closeLabel = ; - var openContent = '' + openLabel; - var closeContent = '' + closeLabel; - - var setButtonState = function(isOpen) { - toggleBtn.innerHTML = isOpen ? closeContent : openContent; - toggleBtn.setAttribute('aria-expanded', isOpen ? 'true' : 'false'); - }; - - toggleBtn.addEventListener('click', function() { - var isHidden = viewerContainer.style.display === 'none' || viewerContainer.style.display === ''; - - if (isHidden) { - viewerContainer.style.display = 'block'; - setButtonState(true); - } else { - viewerContainer.style.display = 'none'; - setButtonState(false); - } - }); - - // Ensure initial state reflects closed viewer - viewerContainer.style.display = 'none'; - setButtonState(false); -}); - - - diff --git a/storage/plugins/digital-library/views/frontend-pdf-viewer.php b/storage/plugins/digital-library/views/frontend-pdf-viewer.php index 107956ef8..7ec8d0fa2 100644 --- a/storage/plugins/digital-library/views/frontend-pdf-viewer.php +++ b/storage/plugins/digital-library/views/frontend-pdf-viewer.php @@ -1,114 +1,10 @@ $book - */ - -$fileUrl = $book['file_url'] ?? ''; -$urlPath = parse_url($fileUrl, PHP_URL_PATH) ?: $fileUrl; -if (empty($fileUrl) || strtolower(pathinfo($urlPath, PATHINFO_EXTENSION)) !== 'pdf') { - return; -} - -$pdfUrl = htmlspecialchars(url($fileUrl), ENT_QUOTES, 'UTF-8'); -$bookTitle = htmlspecialchars($book['titolo'] ?? 'PDF', ENT_QUOTES, 'UTF-8'); -?> - - - - +/** Fullscreen reader for the legacy single-PDF attachment. */ +$fileUrl = (string) ($book['file_url'] ?? ''); +$urlPath = (string) (parse_url($fileUrl, PHP_URL_PATH) ?? ''); +if ($fileUrl === '' || strtolower(pathinfo($urlPath, PATHINFO_EXTENSION)) !== 'pdf') return; +$viewerId = 'pdf-viewer-container'; +$pdfHref = url($fileUrl); +$pdfLabel = (string) ($book['titolo'] ?? 'PDF'); +include __DIR__ . '/frontend-pdf-lightbox.php'; +include __DIR__ . '/frontend-pdf-script.php'; diff --git a/tests/digital-attachments-445.spec.js b/tests/digital-attachments-445.spec.js index 135418721..bf47c8b3f 100644 --- a/tests/digital-attachments-445.spec.js +++ b/tests/digital-attachments-445.spec.js @@ -113,6 +113,19 @@ test.describe.serial('Multiple digital contents (#445)', () => { await expect(page.locator('.digital-attachments-list a[href$=".epub"]')).toBeVisible(); await expect(page.locator('.digital-attachments-list')).toContainText('A review <&>'); await expect(page.locator('#audiobook-player-container')).toHaveCount(0); + const read = page.locator('[data-digital-pdf-toggle]').first(); + await read.click(); + const reader = page.locator('dialog.digital-pdf-lightbox[open]'); + await expect(reader).toBeVisible(); + const bounds = await reader.boundingBox(); + expect(bounds.x).toBe(0); + expect(bounds.y).toBe(0); + expect(bounds.width).toBe(page.viewportSize().width); + expect(bounds.height).toBe(page.viewportSize().height); + await reader.getByRole('button', { name: 'Chiudi', exact: true }).press('Escape'); + await expect(reader).toHaveCount(0); + await expect(read).toBeFocused(); + await expect(page.locator('dialog.digital-pdf-lightbox iframe[src]')).toHaveCount(0); }); test('invalid attachment URLs reject the complete save without changing the book', async ({ page }) => { await login(page); diff --git a/tests/digital-attachments-445.unit.php b/tests/digital-attachments-445.unit.php index d345749dd..2efb74bb7 100644 --- a/tests/digital-attachments-445.unit.php +++ b/tests/digital-attachments-445.unit.php @@ -38,11 +38,16 @@ function check(bool $ok, string $message): void { global $checks; if (!$ok) thro $plugin=new DigitalLibraryPlugin(); ob_start();$plugin->renderFrontendButtons($saved);$html=(string)ob_get_clean(); check(substr_count($html,'
+ + + + +
+ +
+ + diff --git a/public/assets/vendor/pdfjs-6.4.299/web/viewer.mjs b/public/assets/vendor/pdfjs-6.4.299/web/viewer.mjs new file mode 100644 index 000000000..0d0d62fc9 --- /dev/null +++ b/public/assets/vendor/pdfjs-6.4.299/web/viewer.mjs @@ -0,0 +1,26437 @@ +/** + * @licstart The following is the entire license notice for the + * JavaScript code in this page + * + * 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * @licend The above is the entire license notice for the + * JavaScript code in this page + */ + +/** + * pdfjsVersion = 6.4.299 + * pdfjsBuild = d0991a0d5 + */ +/******/ var __webpack_modules__ = ({ + +/***/ 463 +(module) { + + +var $TypeError = TypeError; + +module.exports = function (argument) { + if (typeof argument == 'string') return argument; + throw new $TypeError('Argument is not a string'); +}; + + +/***/ }, + +/***/ 529 +(module) { + + +// `CreateIterResultObject` abstract operation +// https://tc39.es/ecma262/#sec-createiterresultobject +module.exports = function (value, done) { + return { value: value, done: done }; +}; + + +/***/ }, + +/***/ 837 +(module) { + + +var $TypeError = TypeError; +var MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF; // 2 ** 53 - 1 == 9007199254740991 + +module.exports = function (it) { + if (it > MAX_SAFE_INTEGER) throw new $TypeError('Maximum allowed index exceeded'); + return it; +}; + + +/***/ }, + +/***/ 767 +(module) { + + +// `GetIteratorDirect(obj)` abstract operation +// https://tc39.es/ecma262/#sec-getiteratordirect +module.exports = function (obj) { + return { + iterator: obj, + next: obj.next, + done: false + }; +}; + + +/***/ }, + +/***/ 117 +(module) { + + +// we can't use just `it == null` since of `document.all` special case +// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot-aec +module.exports = function (it) { + return it === null || it === undefined; +}; + + +/***/ }, + +/***/ 859 +(module) { + + +// release references held by exhausted / closed iterator helpers to allow GC of the source chain +module.exports = function (state) { + state.iterator = state.next = state.nextHandler = state.mapper = state.predicate = state.inner = + state.iterables = state.iters = state.openIters = state.padding = state.finishResults = state.buffer = null; +}; + + +/***/ }, + +/***/ 684 +(module) { + + +// Should throw an error on invalid iterator +// https://issues.chromium.org/issues/336839115 +module.exports = function (methodName, argument) { + // eslint-disable-next-line es/no-iterator -- required for testing + var method = typeof Iterator == 'function' && Iterator.prototype[methodName]; + if (method) try { + method.call({ next: null }, argument).next(); + } catch (error) { + return true; + } +}; + + +/***/ }, + +/***/ 269 +(module) { + + +module.exports = Object.create ? Object.create(null) : {}; + + +/***/ }, + +/***/ 741 +(module) { + + +var ceil = Math.ceil; +var floor = Math.floor; + +// `Math.trunc` method +// https://tc39.es/ecma262/#sec-math.trunc +// eslint-disable-next-line es/no-math-trunc -- safe +module.exports = Math.trunc || function trunc(x) { + var n = +x; + return (n > 0 ? floor : ceil)(n); +}; + + +/***/ }, + +/***/ 717 +(__unused_webpack_module, exports) { + + +// eslint-disable-next-line es/no-object-getownpropertysymbols -- safe +exports.f = Object.getOwnPropertySymbols; + + +/***/ }, + +/***/ 835 +(module) { + + +// Should get iterator record of a set-like object before cloning this +// https://bugs.webkit.org/show_bug.cgi?id=289430 +module.exports = function (METHOD_NAME) { + try { + // eslint-disable-next-line es/no-set -- needed for test + var baseSet = new Set(); + var setLike = { + size: 0, + has: function () { return true; }, + keys: function () { + // eslint-disable-next-line es/no-object-defineproperty -- needed for test + return Object.defineProperty({}, 'next', { + get: function () { + baseSet.clear(); + baseSet.add(4); + return function () { + return { done: true }; + }; + } + }); + } + }; + var result = baseSet[METHOD_NAME](setLike); + + return result.size === 1 && result.values().next().value === 4; + } catch (error) { + return false; + } +}; + + +/***/ }, + +/***/ 291 +(module, __unused_webpack_exports, __webpack_require__) { + + +var trunc = __webpack_require__(741); + +// `ToIntegerOrInfinity` abstract operation +// https://tc39.es/ecma262/#sec-tointegerorinfinity +module.exports = function (argument) { + var number = +argument; + // eslint-disable-next-line no-self-compare -- NaN check + return number !== number || number === 0 ? 0 : trunc(number); +}; + + +/***/ }, + +/***/ 812 +(module) { + + +var $TypeError = TypeError; + +module.exports = function (passed, required) { + if (passed < required) throw new $TypeError('Not enough arguments'); + return passed; +}; + + +/***/ }, + +/***/ 452 +(module) { + + +// a string of all valid unicode whitespaces +module.exports = '\u0009\u000A\u000B\u000C\u000D\u0020\u00A0\u1680\u2000\u2001\u2002' + + '\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF'; + + +/***/ } + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ const __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ const cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ const module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/concatenation wrap */ +/******/ // wrap a concatenated module body as a lazy, memoized accessor; mod is +/******/ // set before the body runs so re-entrant calls (require cycles) observe +/******/ // the partial exports like Node.js +/******/ __webpack_require__.cw = (body) => { +/******/ var mod; +/******/ return () => { +/******/ if (body) { +/******/ var fn = body; +/******/ body = 0; +/******/ mod = { exports: {} }; +/******/ fn.call(mod.exports, mod, mod.exports); +/******/ } +/******/ return mod.exports; +/******/ }; +/******/ }; +/******/ +/******/ /* webpack/runtime/define property getters */ +/******/ // define getter/value 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] }); +/******/ } +/******/ } +/******/ }; +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)); +/******/ +/************************************************************************/ + +// MODULE: ./node_modules/core-js/internals/a-callable.js +var a_callable_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var isCallable = (is_callable_namespaceFn()); +var tryToString = (try_to_string_namespaceFn()); + +var $TypeError = TypeError; + +// `Assert: IsCallable(argument) is true` +module.exports = function (argument) { + if (isCallable(argument)) return argument; + throw new $TypeError(tryToString(argument) + ' is not a function'); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/a-possible-prototype.js +var a_possible_prototype_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var isPossiblePrototype = (is_possible_prototype_namespaceFn()); + +var $String = String; +var $TypeError = TypeError; + +module.exports = function (argument) { + if (isPossiblePrototype(argument)) return argument; + throw new $TypeError("Can't set " + $String(argument) + ' as a prototype'); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/a-set.js +var a_set_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var has = (set_helpers_namespaceFn().has); + +// Perform ? RequireInternalSlot(M, [[SetData]]) +module.exports = function (it) { + has(it); + return it; +}; + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/a-string.js +var a_string_namespaceFn = () => { + return __webpack_require__(463); +}; + +// MODULE: ./node_modules/core-js/internals/a-weak-key.js +var a_weak_key_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var WeakMapHelpers = (weak_map_helpers_namespaceFn()); + +var weakmap = new WeakMapHelpers.WeakMap(); +var set = WeakMapHelpers.set; +var remove = WeakMapHelpers.remove; + +module.exports = function (key) { + set(weakmap, key, 1); + remove(weakmap, key); + return key; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/a-weak-map.js +var a_weak_map_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var has = (weak_map_helpers_namespaceFn().has); + +// Perform ? RequireInternalSlot(M, [[WeakMapData]]) +module.exports = function (it) { + has(it); + return it; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/add-to-unscopables.js +var add_to_unscopables_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var wellKnownSymbol = (well_known_symbol_namespaceFn()); +var create = (object_create_namespaceFn()); +var defineProperty = (object_define_property_namespaceFn().f); + +var UNSCOPABLES = wellKnownSymbol('unscopables'); +var ArrayPrototype = Array.prototype; + +// Array.prototype[@@unscopables] +// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables +if (ArrayPrototype[UNSCOPABLES] === undefined) { + defineProperty(ArrayPrototype, UNSCOPABLES, { + configurable: true, + value: create(null) + }); +} + +// add a key to Array.prototype[@@unscopables] +module.exports = function (key) { + ArrayPrototype[UNSCOPABLES][key] = true; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/an-instance.js +var an_instance_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var isPrototypeOf = (object_is_prototype_of_namespaceFn()); + +var $TypeError = TypeError; + +module.exports = function (it, Prototype) { + if (isPrototypeOf(Prototype, it)) return it; + throw new $TypeError('Incorrect invocation'); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/an-object.js +var an_object_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var isObject = (is_object_namespaceFn()); + +var $String = String; +var $TypeError = TypeError; + +// `Assert: Type(argument) is Object` +module.exports = function (argument) { + if (isObject(argument)) return argument; + throw new $TypeError($String(argument) + ' is not an object'); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/array-buffer-basic-detection.js +var array_buffer_basic_detection_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +// eslint-disable-next-line es/no-typed-arrays -- safe +module.exports = typeof ArrayBuffer != 'undefined' && typeof DataView != 'undefined'; + +}); + +// MODULE: ./node_modules/core-js/internals/array-buffer-view-core.js +var array_buffer_view_core_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var NATIVE_ARRAY_BUFFER = (array_buffer_basic_detection_namespaceFn()); +var DESCRIPTORS = (descriptors_namespaceFn()); +var globalThis = (global_this_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); +var isObject = (is_object_namespaceFn()); +var hasOwn = (has_own_property_namespaceFn()); +var classof = (classof_namespaceFn()); +var tryToString = (try_to_string_namespaceFn()); +var createNonEnumerableProperty = (create_non_enumerable_property_namespaceFn()); +var defineBuiltIn = (define_built_in_namespaceFn()); +var defineBuiltInAccessor = (define_built_in_accessor_namespaceFn()); +var isPrototypeOf = (object_is_prototype_of_namespaceFn()); +var getPrototypeOf = (object_get_prototype_of_namespaceFn()); +var setPrototypeOf = (object_set_prototype_of_namespaceFn()); +var wellKnownSymbol = (well_known_symbol_namespaceFn()); +var uid = (uid_namespaceFn()); +var InternalStateModule = (internal_state_namespaceFn()); + +var enforceInternalState = InternalStateModule.enforce; +var getInternalState = InternalStateModule.get; +var Int8Array = globalThis.Int8Array; +var Int8ArrayPrototype = Int8Array && Int8Array.prototype; +var Uint8ClampedArray = globalThis.Uint8ClampedArray; +var Uint8ClampedArrayPrototype = Uint8ClampedArray && Uint8ClampedArray.prototype; +var TypedArray = Int8Array && getPrototypeOf(Int8Array); +var TypedArrayPrototype = Int8ArrayPrototype && getPrototypeOf(Int8ArrayPrototype); +var ObjectPrototype = Object.prototype; +var TypeError = globalThis.TypeError; + +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); +var TYPED_ARRAY_TAG = uid('TYPED_ARRAY_TAG'); +var TYPED_ARRAY_CONSTRUCTOR = 'TypedArrayConstructor'; +// Fixing native typed arrays in Opera Presto crashes the browser, see #595 +var NATIVE_ARRAY_BUFFER_VIEWS = NATIVE_ARRAY_BUFFER && !!setPrototypeOf && classof(globalThis.opera) !== 'Opera'; +var TYPED_ARRAY_TAG_REQUIRED = false; +var NAME, Constructor, Prototype; + +var TypedArrayConstructorsList = { + Int8Array: 1, + Uint8Array: 1, + Uint8ClampedArray: 1, + Int16Array: 2, + Uint16Array: 2, + Int32Array: 4, + Uint32Array: 4, + Float32Array: 4, + Float64Array: 8 +}; + +var BigIntArrayConstructorsList = { + BigInt64Array: 8, + BigUint64Array: 8 +}; + +var isView = function isView(it) { + if (!isObject(it)) return false; + var klass = classof(it); + return klass === 'DataView' + || hasOwn(TypedArrayConstructorsList, klass) + || hasOwn(BigIntArrayConstructorsList, klass); +}; + +var getTypedArrayConstructor = function (it) { + var proto = getPrototypeOf(it); + if (!isObject(proto)) return; + var state = getInternalState(proto); + return (state && hasOwn(state, TYPED_ARRAY_CONSTRUCTOR)) ? state[TYPED_ARRAY_CONSTRUCTOR] : getTypedArrayConstructor(proto); +}; + +var isTypedArray = function (it) { + if (!isObject(it)) return false; + var klass = classof(it); + return hasOwn(TypedArrayConstructorsList, klass) + || hasOwn(BigIntArrayConstructorsList, klass); +}; + +var aTypedArray = function (it) { + if (isTypedArray(it)) return it; + throw new TypeError('Target is not a typed array'); +}; + +var aTypedArrayConstructor = function (C) { + if (isCallable(C) && (!setPrototypeOf || isPrototypeOf(TypedArray, C))) return C; + throw new TypeError(tryToString(C) + ' is not a typed array constructor'); +}; + +var exportTypedArrayMethod = function (KEY, property, forced, options) { + if (!DESCRIPTORS) return; + if (forced) for (var ARRAY in TypedArrayConstructorsList) { + var TypedArrayConstructor = globalThis[ARRAY]; + if (TypedArrayConstructor && hasOwn(TypedArrayConstructor.prototype, KEY)) try { + delete TypedArrayConstructor.prototype[KEY]; + } catch (error) { + // old WebKit bug - some methods are non-configurable + try { + TypedArrayConstructor.prototype[KEY] = property; + } catch (error2) { /* empty */ } + } + } + if (!TypedArrayPrototype[KEY] || forced) { + defineBuiltIn(TypedArrayPrototype, KEY, forced ? property + : NATIVE_ARRAY_BUFFER_VIEWS && Int8ArrayPrototype[KEY] || property, options); + } +}; + +var exportTypedArrayStaticMethod = function (KEY, property, forced) { + var ARRAY, TypedArrayConstructor; + if (!DESCRIPTORS) return; + if (setPrototypeOf) { + if (forced) for (ARRAY in TypedArrayConstructorsList) { + TypedArrayConstructor = globalThis[ARRAY]; + if (TypedArrayConstructor && hasOwn(TypedArrayConstructor, KEY)) try { + delete TypedArrayConstructor[KEY]; + } catch (error) { /* empty */ } + } + if (!TypedArray[KEY] || forced) { + // V8 ~ Chrome 49-50 `%TypedArray%` methods are non-writable non-configurable + try { + return defineBuiltIn(TypedArray, KEY, forced ? property : NATIVE_ARRAY_BUFFER_VIEWS && TypedArray[KEY] || property); + } catch (error) { /* empty */ } + } else return; + } + for (ARRAY in TypedArrayConstructorsList) { + TypedArrayConstructor = globalThis[ARRAY]; + if (TypedArrayConstructor && (!TypedArrayConstructor[KEY] || forced)) { + defineBuiltIn(TypedArrayConstructor, KEY, property); + } + } +}; + +for (NAME in TypedArrayConstructorsList) { + Constructor = globalThis[NAME]; + Prototype = Constructor && Constructor.prototype; + if (Prototype) enforceInternalState(Prototype)[TYPED_ARRAY_CONSTRUCTOR] = Constructor; + else NATIVE_ARRAY_BUFFER_VIEWS = false; +} + +for (NAME in BigIntArrayConstructorsList) { + Constructor = globalThis[NAME]; + Prototype = Constructor && Constructor.prototype; + if (Prototype) enforceInternalState(Prototype)[TYPED_ARRAY_CONSTRUCTOR] = Constructor; +} + +// WebKit bug - typed arrays constructors prototype is Object.prototype +if (!NATIVE_ARRAY_BUFFER_VIEWS || !isCallable(TypedArray) || TypedArray === Function.prototype) { + // eslint-disable-next-line no-shadow -- safe + TypedArray = function TypedArray() { + throw new TypeError('Incorrect invocation'); + }; + if (NATIVE_ARRAY_BUFFER_VIEWS) for (NAME in TypedArrayConstructorsList) { + if (globalThis[NAME]) setPrototypeOf(globalThis[NAME], TypedArray); + } +} + +if (!NATIVE_ARRAY_BUFFER_VIEWS || !TypedArrayPrototype || TypedArrayPrototype === ObjectPrototype) { + TypedArrayPrototype = TypedArray.prototype; + if (NATIVE_ARRAY_BUFFER_VIEWS) for (NAME in TypedArrayConstructorsList) { + if (globalThis[NAME]) setPrototypeOf(globalThis[NAME].prototype, TypedArrayPrototype); + } +} + +// WebKit bug - one more object in Uint8ClampedArray prototype chain +if (NATIVE_ARRAY_BUFFER_VIEWS && getPrototypeOf(Uint8ClampedArrayPrototype) !== TypedArrayPrototype) { + setPrototypeOf(Uint8ClampedArrayPrototype, TypedArrayPrototype); +} + +if (DESCRIPTORS && !hasOwn(TypedArrayPrototype, TO_STRING_TAG)) { + TYPED_ARRAY_TAG_REQUIRED = true; + defineBuiltInAccessor(TypedArrayPrototype, TO_STRING_TAG, { + configurable: true, + get: function () { + return isObject(this) ? this[TYPED_ARRAY_TAG] : undefined; + } + }); + for (NAME in TypedArrayConstructorsList) if (globalThis[NAME]) { + createNonEnumerableProperty(globalThis[NAME].prototype, TYPED_ARRAY_TAG, NAME); + } +} + +module.exports = { + NATIVE_ARRAY_BUFFER_VIEWS: NATIVE_ARRAY_BUFFER_VIEWS, + TYPED_ARRAY_TAG: TYPED_ARRAY_TAG_REQUIRED && TYPED_ARRAY_TAG, + aTypedArray: aTypedArray, + aTypedArrayConstructor: aTypedArrayConstructor, + exportTypedArrayMethod: exportTypedArrayMethod, + exportTypedArrayStaticMethod: exportTypedArrayStaticMethod, + getTypedArrayConstructor: getTypedArrayConstructor, + isView: isView, + isTypedArray: isTypedArray, + TypedArray: TypedArray, + TypedArrayPrototype: TypedArrayPrototype +}; + +}); + +// MODULE: ./node_modules/core-js/internals/array-includes.js +var array_includes_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var toIndexedObject = (to_indexed_object_namespaceFn()); +var toAbsoluteIndex = (to_absolute_index_namespaceFn()); +var lengthOfArrayLike = (length_of_array_like_namespaceFn()); + +// `Array.prototype.{ indexOf, includes }` methods implementation +var createMethod = function (IS_INCLUDES) { + return function ($this, el, fromIndex) { + var O = toIndexedObject($this); + var length = lengthOfArrayLike(O); + if (length === 0) return !IS_INCLUDES && -1; + var index = toAbsoluteIndex(fromIndex, length); + var value; + // Array#includes uses SameValueZero equality algorithm + // eslint-disable-next-line no-self-compare -- NaN check + if (IS_INCLUDES && el !== el) while (length > index) { + value = O[index++]; + // eslint-disable-next-line no-self-compare -- NaN check + if (value !== value) return true; + // Array#indexOf ignores holes, Array#includes - not + } else for (;length > index; index++) { + if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0; + } return !IS_INCLUDES && -1; + }; +}; + +module.exports = { + // `Array.prototype.includes` method + // https://tc39.es/ecma262/#sec-array.prototype.includes + includes: createMethod(true), + // `Array.prototype.indexOf` method + // https://tc39.es/ecma262/#sec-array.prototype.indexof + indexOf: createMethod(false) +}; + +}); + +// MODULE: ./node_modules/core-js/internals/array-set-length.js +var array_set_length_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var DESCRIPTORS = (descriptors_namespaceFn()); +var isArray = (is_array_namespaceFn()); + +var $TypeError = TypeError; +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; + +// Safari < 13 does not throw an error in this case +var SILENT_ON_NON_WRITABLE_LENGTH_SET = DESCRIPTORS && !function () { + // makes no sense without proper strict mode support + if (this !== undefined) return true; + try { + // eslint-disable-next-line es/no-object-defineproperty -- safe + Object.defineProperty([], 'length', { writable: false }).length = 1; + } catch (error) { + return error instanceof TypeError; + } +}(); + +module.exports = SILENT_ON_NON_WRITABLE_LENGTH_SET ? function (O, length) { + if (isArray(O) && !getOwnPropertyDescriptor(O, 'length').writable) { + throw new $TypeError('Cannot set read only .length'); + } return O.length = length; +} : function (O, length) { + return O.length = length; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/call-with-safe-iteration-closing.js +var call_with_safe_iteration_closing_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var anObject = (an_object_namespaceFn()); +var iteratorClose = (iterator_close_namespaceFn()); + +// call something on iterator step with safe closing on error +module.exports = function (iterator, fn, value, ENTRIES) { + try { + return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value); + } catch (error) { + iteratorClose(iterator, 'throw', error); + } +}; + +}); + +// MODULE: ./node_modules/core-js/internals/classof-raw.js +var classof_raw_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); + +var toString = uncurryThis({}.toString); +var stringSlice = uncurryThis(''.slice); + +module.exports = function (it) { + return stringSlice(toString(it), 8, -1); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/classof.js +var classof_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var TO_STRING_TAG_SUPPORT = (to_string_tag_support_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); +var classofRaw = (classof_raw_namespaceFn()); +var wellKnownSymbol = (well_known_symbol_namespaceFn()); + +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); +var $Object = Object; + +// ES3 wrong here +var CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) === 'Arguments'; + +// fallback for IE11 Script Access Denied error +var tryGet = function (it, key) { + try { + return it[key]; + } catch (error) { /* empty */ } +}; + +// getting tag from ES6+ `Object.prototype.toString` +module.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) { + var O, tag, result; + return it === undefined ? 'Undefined' : it === null ? 'Null' + // @@toStringTag case + : typeof (tag = tryGet(O = $Object(it), TO_STRING_TAG)) == 'string' ? tag + // builtinTag case + : CORRECT_ARGUMENTS ? classofRaw(O) + // ES3 arguments fallback + : (result = classofRaw(O)) === 'Object' && isCallable(O.callee) ? 'Arguments' : result; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/copy-constructor-properties.js +var copy_constructor_properties_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var hasOwn = (has_own_property_namespaceFn()); +var ownKeys = (own_keys_namespaceFn()); +var getOwnPropertyDescriptorModule = (object_get_own_property_descriptor_namespaceFn()); +var definePropertyModule = (object_define_property_namespaceFn()); + +module.exports = function (target, source, exceptions) { + var keys = ownKeys(source); + var defineProperty = definePropertyModule.f; + var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f; + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + if (!hasOwn(target, key) && !(exceptions && hasOwn(exceptions, key))) { + defineProperty(target, key, getOwnPropertyDescriptor(source, key)); + } + } +}; + +}); + +// MODULE: ./node_modules/core-js/internals/correct-prototype-getter.js +var correct_prototype_getter_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var fails = (fails_namespaceFn()); + +module.exports = !fails(function () { + function F() { /* empty */ } + F.prototype.constructor = null; + // eslint-disable-next-line es/no-object-getprototypeof -- required for testing + return Object.getPrototypeOf(new F()) !== F.prototype; +}); + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/create-iter-result-object.js +var create_iter_result_object_namespaceFn = () => { + return __webpack_require__(529); +}; + +// MODULE: ./node_modules/core-js/internals/create-non-enumerable-property.js +var create_non_enumerable_property_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var DESCRIPTORS = (descriptors_namespaceFn()); +var definePropertyModule = (object_define_property_namespaceFn()); +var createPropertyDescriptor = (create_property_descriptor_namespaceFn()); + +module.exports = DESCRIPTORS ? function (object, key, value) { + return definePropertyModule.f(object, key, createPropertyDescriptor(1, value)); +} : function (object, key, value) { + object[key] = value; + return object; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/create-property-descriptor.js +var create_property_descriptor_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +module.exports = function (bitmap, value) { + return { + enumerable: !(bitmap & 1), + configurable: !(bitmap & 2), + writable: !(bitmap & 4), + value: value + }; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/create-property.js +var create_property_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var DESCRIPTORS = (descriptors_namespaceFn()); +var definePropertyModule = (object_define_property_namespaceFn()); +var createPropertyDescriptor = (create_property_descriptor_namespaceFn()); + +module.exports = function (object, key, value) { + if (DESCRIPTORS) definePropertyModule.f(object, key, createPropertyDescriptor(0, value)); + else object[key] = value; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/define-built-in-accessor.js +var define_built_in_accessor_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var makeBuiltIn = (make_built_in_namespaceFn()); +var defineProperty = (object_define_property_namespaceFn()); + +module.exports = function (target, name, descriptor) { + if (descriptor.get) makeBuiltIn(descriptor.get, name, { getter: true }); + if (descriptor.set) makeBuiltIn(descriptor.set, name, { setter: true }); + return defineProperty.f(target, name, descriptor); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/define-built-in.js +var define_built_in_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var isCallable = (is_callable_namespaceFn()); +var definePropertyModule = (object_define_property_namespaceFn()); +var makeBuiltIn = (make_built_in_namespaceFn()); +var defineGlobalProperty = (define_global_property_namespaceFn()); + +module.exports = function (O, key, value, options) { + if (!options) options = {}; + var simple = options.enumerable; + var name = options.name !== undefined ? options.name : key; + if (isCallable(value)) makeBuiltIn(value, name, options); + if (options.global) { + if (simple) O[key] = value; + else defineGlobalProperty(key, value); + } else { + try { + if (!options.unsafe) delete O[key]; + else if (O[key]) simple = true; + } catch (error) { /* empty */ } + if (simple) O[key] = value; + else definePropertyModule.f(O, key, { + value: value, + enumerable: false, + configurable: !options.nonConfigurable, + writable: !options.nonWritable + }); + } return O; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/define-built-ins.js +var define_built_ins_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var defineBuiltIn = (define_built_in_namespaceFn()); + +module.exports = function (target, src, options) { + for (var key in src) defineBuiltIn(target, key, src[key], options); + return target; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/define-global-property.js +var define_global_property_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var globalThis = (global_this_namespaceFn()); + +// eslint-disable-next-line es/no-object-defineproperty -- safe +var defineProperty = Object.defineProperty; + +module.exports = function (key, value) { + try { + defineProperty(globalThis, key, { value: value, configurable: true, writable: true }); + } catch (error) { + globalThis[key] = value; + } return value; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/descriptors.js +var descriptors_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var fails = (fails_namespaceFn()); + +// Detect IE8's incomplete defineProperty implementation +module.exports = !fails(function () { + // eslint-disable-next-line es/no-object-defineproperty -- required for testing + return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] !== 7; +}); + +}); + +// MODULE: ./node_modules/core-js/internals/document-create-element.js +var document_create_element_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var globalThis = (global_this_namespaceFn()); +var isObject = (is_object_namespaceFn()); + +var document = globalThis.document; +// typeof document.createElement is 'object' in old IE +var EXISTS = isObject(document) && isObject(document.createElement); + +module.exports = function (it) { + return EXISTS ? document.createElement(it) : {}; +}; + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/does-not-exceed-safe-integer.js +var does_not_exceed_safe_integer_namespaceFn = () => { + return __webpack_require__(837); +}; + +// MODULE: ./node_modules/core-js/internals/enum-bug-keys.js +var enum_bug_keys_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +// IE8- don't enum bug keys +module.exports = [ + 'constructor', + 'hasOwnProperty', + 'isPrototypeOf', + 'propertyIsEnumerable', + 'toLocaleString', + 'toString', + 'valueOf' +]; + +}); + +// MODULE: ./node_modules/core-js/internals/environment-user-agent.js +var environment_user_agent_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var globalThis = (global_this_namespaceFn()); + +var navigator = globalThis.navigator; +var userAgent = navigator && navigator.userAgent; + +module.exports = userAgent ? String(userAgent) : ''; + +}); + +// MODULE: ./node_modules/core-js/internals/environment-v8-version.js +var environment_v8_version_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var globalThis = (global_this_namespaceFn()); +var userAgent = (environment_user_agent_namespaceFn()); + +var process = globalThis.process; +var Deno = globalThis.Deno; +var versions = process && process.versions || Deno && Deno.version; +var v8 = versions && versions.v8; +var match, version; + +if (v8) { + match = v8.split('.'); + // in old Chrome, versions of V8 isn't V8 = Chrome / 10 + // but their correct versions are not interesting for us + version = match[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1]); +} + +// BrowserFS NodeJS `process` polyfill incorrectly set `.v8` to `0.0` +// so check `userAgent` even if `.v8` exists, but 0 +if (!version && userAgent) { + match = userAgent.match(/Edge\/(\d+)/); + if (!match || match[1] >= 74) { + match = userAgent.match(/Chrome\/(\d+)/); + if (match) version = +match[1]; + } +} + +module.exports = version; + +}); + +// MODULE: ./node_modules/core-js/internals/export.js +var export_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var globalThis = (global_this_namespaceFn()); +var getOwnPropertyDescriptor = (object_get_own_property_descriptor_namespaceFn().f); +var createNonEnumerableProperty = (create_non_enumerable_property_namespaceFn()); +var defineBuiltIn = (define_built_in_namespaceFn()); +var defineGlobalProperty = (define_global_property_namespaceFn()); +var copyConstructorProperties = (copy_constructor_properties_namespaceFn()); +var isForced = (is_forced_namespaceFn()); + +/* + options.target - name of the target object + options.global - target is the global object + options.stat - export as static methods of target + options.proto - export as prototype methods of target + options.real - real prototype method for the `pure` version + options.forced - export even if the native feature is available + options.bind - bind methods to the target, required for the `pure` version + options.wrap - wrap constructors to preventing global pollution, required for the `pure` version + options.unsafe - use the simple assignment of property instead of delete + defineProperty + options.sham - add a flag to not completely full polyfills + options.enumerable - export as enumerable property + options.dontCallGetSet - prevent calling a getter on target + options.name - the .name of the function if it does not match the key +*/ +module.exports = function (options, source) { + var TARGET = options.target; + var GLOBAL = options.global; + var STATIC = options.stat; + var FORCED, target, key, targetProperty, sourceProperty, descriptor; + if (GLOBAL) { + target = globalThis; + } else if (STATIC) { + target = globalThis[TARGET] || defineGlobalProperty(TARGET, {}); + } else { + target = globalThis[TARGET] && globalThis[TARGET].prototype; + } + if (target) for (key in source) { + sourceProperty = source[key]; + if (options.dontCallGetSet) { + descriptor = getOwnPropertyDescriptor(target, key); + targetProperty = descriptor && descriptor.value; + } else targetProperty = target[key]; + FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced); + // contained in target + if (!FORCED && targetProperty !== undefined) { + if (typeof sourceProperty == typeof targetProperty) continue; + copyConstructorProperties(sourceProperty, targetProperty); + } + // add a flag to not completely full polyfills + if (options.sham || (targetProperty && targetProperty.sham)) { + createNonEnumerableProperty(sourceProperty, 'sham', true); + } + defineBuiltIn(target, key, sourceProperty, options); + } +}; + +}); + +// MODULE: ./node_modules/core-js/internals/fails.js +var fails_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +module.exports = function (exec) { + try { + return !!exec(); + } catch (error) { + return true; + } +}; + +}); + +// MODULE: ./node_modules/core-js/internals/function-bind-context.js +var function_bind_context_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_clause_namespaceFn()); +var aCallable = (a_callable_namespaceFn()); +var NATIVE_BIND = (function_bind_native_namespaceFn()); + +var bind = uncurryThis(uncurryThis.bind); + +// optional / simple context binding +module.exports = function (fn, that) { + aCallable(fn); + return that === undefined ? fn : NATIVE_BIND ? bind(fn, that) : function (/* ...args */) { + return fn.apply(that, arguments); + }; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/function-bind-native.js +var function_bind_native_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var fails = (fails_namespaceFn()); + +module.exports = !fails(function () { + // eslint-disable-next-line es/no-function-prototype-bind -- safe + var test = function () { /* empty */ }.bind(); + // eslint-disable-next-line no-prototype-builtins -- safe + return typeof test != 'function' || test.hasOwnProperty('prototype'); +}); + +}); + +// MODULE: ./node_modules/core-js/internals/function-call.js +var function_call_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var NATIVE_BIND = (function_bind_native_namespaceFn()); + +var call = Function.prototype.call; +// eslint-disable-next-line es/no-function-prototype-bind -- safe +module.exports = NATIVE_BIND ? call.bind(call) : function () { + return call.apply(call, arguments); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/function-name.js +var function_name_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var DESCRIPTORS = (descriptors_namespaceFn()); +var hasOwn = (has_own_property_namespaceFn()); + +var FunctionPrototype = Function.prototype; +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var getDescriptor = DESCRIPTORS && Object.getOwnPropertyDescriptor; + +var EXISTS = hasOwn(FunctionPrototype, 'name'); +// additional protection from minified / mangled / dropped function names +var PROPER = EXISTS && function something() { /* empty */ }.name === 'something'; +var CONFIGURABLE = EXISTS && (!DESCRIPTORS || (DESCRIPTORS && getDescriptor(FunctionPrototype, 'name').configurable)); + +module.exports = { + ...(/* unused pure expression */ null && (EXISTS)), + ...(/* unused pure expression */ null && (PROPER)), + CONFIGURABLE: CONFIGURABLE +}; + +}); + +// MODULE: ./node_modules/core-js/internals/function-uncurry-this-accessor.js +var function_uncurry_this_accessor_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); +var aCallable = (a_callable_namespaceFn()); + +module.exports = function (object, key, method) { + try { + // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe + return uncurryThis(aCallable(Object.getOwnPropertyDescriptor(object, key)[method])); + } catch (error) { /* empty */ } +}; + +}); + +// MODULE: ./node_modules/core-js/internals/function-uncurry-this-clause.js +var function_uncurry_this_clause_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var classofRaw = (classof_raw_namespaceFn()); +var uncurryThis = (function_uncurry_this_namespaceFn()); + +module.exports = function (fn) { + // Nashorn bug: + // https://github.com/zloirock/core-js/issues/1128 + // https://github.com/zloirock/core-js/issues/1130 + if (classofRaw(fn) === 'Function') return uncurryThis(fn); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/function-uncurry-this.js +var function_uncurry_this_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var NATIVE_BIND = (function_bind_native_namespaceFn()); + +var FunctionPrototype = Function.prototype; +var call = FunctionPrototype.call; +// eslint-disable-next-line es/no-function-prototype-bind -- safe +var uncurryThisWithBind = NATIVE_BIND && FunctionPrototype.bind.bind(call, call); + +module.exports = NATIVE_BIND ? uncurryThisWithBind : function (fn) { + return function () { + return call.apply(fn, arguments); + }; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/get-built-in.js +var get_built_in_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var globalThis = (global_this_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); + +var aFunction = function (argument) { + return isCallable(argument) ? argument : undefined; +}; + +module.exports = function (namespace, method) { + return arguments.length < 2 ? aFunction(globalThis[namespace]) : globalThis[namespace] && globalThis[namespace][method]; +}; + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/get-iterator-direct.js +var get_iterator_direct_namespaceFn = () => { + return __webpack_require__(767); +}; + +// MODULE: ./node_modules/core-js/internals/get-iterator-internal.js +var get_iterator_internal_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var call = (function_call_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); +var anObject = (an_object_namespaceFn()); +var tryToString = (try_to_string_namespaceFn()); +var getIteratorMethod = (get_iterator_method_internal_namespaceFn()); + +var $TypeError = TypeError; + +module.exports = function (argument, usingIterator) { + var iteratorMethod = arguments.length < 2 ? getIteratorMethod(argument) : usingIterator; + if (isCallable(iteratorMethod)) return anObject(call(iteratorMethod, argument)); + throw new $TypeError(tryToString(argument) + ' is not iterable'); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/get-iterator-method-internal.js +var get_iterator_method_internal_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var classof = (classof_raw_namespaceFn()); +var isNullOrUndefined = (is_null_or_undefined_namespaceFn()); +var getMethod = (get_method_namespaceFn()); +var wellKnownSymbol = (well_known_symbol_namespaceFn()); + +var ITERATOR = wellKnownSymbol('iterator'); +var ArrayPrototype = Array.prototype; + +module.exports = function (it) { + if (!isNullOrUndefined(it)) return getMethod(it, ITERATOR) + || getMethod(it, '@@iterator') + || (classof(it) === 'Arguments' ? ArrayPrototype[ITERATOR] : undefined); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/get-method.js +var get_method_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var aCallable = (a_callable_namespaceFn()); +var isNullOrUndefined = (is_null_or_undefined_namespaceFn()); + +// `GetMethod` abstract operation +// https://tc39.es/ecma262/#sec-getmethod +module.exports = function (V, P) { + var func = V[P]; + return isNullOrUndefined(func) ? undefined : aCallable(func); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/get-set-record.js +var get_set_record_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var aCallable = (a_callable_namespaceFn()); +var anObject = (an_object_namespaceFn()); +var call = (function_call_namespaceFn()); +var toIntegerOrInfinity = (to_integer_or_infinity_namespaceFn()); +var getIteratorDirect = (get_iterator_direct_namespaceFn()); + +var INVALID_SIZE = 'Invalid size'; +var $RangeError = RangeError; +var $TypeError = TypeError; +var max = Math.max; + +var SetRecord = function (set, intSize) { + this.set = set; + this.size = max(intSize, 0); + this.has = aCallable(set.has); + this.keys = aCallable(set.keys); +}; + +SetRecord.prototype = { + getIterator: function () { + return getIteratorDirect(anObject(call(this.keys, this.set))); + }, + includes: function (it) { + return call(this.has, this.set, it); + } +}; + +// `GetSetRecord` abstract operation +// https://tc39.es/proposal-set-methods/#sec-getsetrecord +module.exports = function (obj) { + anObject(obj); + var numSize = +obj.size; + // NOTE: If size is undefined, then numSize will be NaN + // eslint-disable-next-line no-self-compare -- NaN check + if (numSize !== numSize) throw new $TypeError(INVALID_SIZE); + var intSize = toIntegerOrInfinity(numSize); + if (intSize < 0) throw new $RangeError(INVALID_SIZE); + return new SetRecord(obj, intSize); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/global-this.js +var global_this_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var check = function (it) { + return it && it.Math === Math && it; +}; + +// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 +module.exports = + // eslint-disable-next-line es/no-global-this -- safe + check(typeof globalThis == 'object' && globalThis) || + check(typeof window == 'object' && window) || + // eslint-disable-next-line no-restricted-globals -- safe + check(typeof self == 'object' && self) || + check(typeof global == 'object' && global) || + check(typeof this == 'object' && this) || + // eslint-disable-next-line no-new-func -- fallback + (function () { return this; })() || Function('return this')(); + +}); + +// MODULE: ./node_modules/core-js/internals/has-own-property.js +var has_own_property_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); +var toObject = (to_object_namespaceFn()); + +var hasOwnProperty = uncurryThis({}.hasOwnProperty); + +// `HasOwnProperty` abstract operation +// https://tc39.es/ecma262/#sec-hasownproperty +// eslint-disable-next-line es/no-object-hasown -- safe +module.exports = Object.hasOwn || function hasOwn(it, key) { + return hasOwnProperty(toObject(it), key); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/hidden-keys.js +var hidden_keys_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +module.exports = {}; + +}); + +// MODULE: ./node_modules/core-js/internals/html.js +var html_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var getBuiltIn = (get_built_in_namespaceFn()); + +module.exports = getBuiltIn('document', 'documentElement'); + +}); + +// MODULE: ./node_modules/core-js/internals/ie8-dom-define.js +var ie8_dom_define_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var DESCRIPTORS = (descriptors_namespaceFn()); +var fails = (fails_namespaceFn()); +var createElement = (document_create_element_namespaceFn()); + +// Thanks to IE8 for its funny defineProperty +module.exports = !DESCRIPTORS && !fails(function () { + // eslint-disable-next-line es/no-object-defineproperty -- required for testing + return Object.defineProperty(createElement('div'), 'a', { + get: function () { return 7; } + }).a !== 7; +}); + +}); + +// MODULE: ./node_modules/core-js/internals/indexed-object.js +var indexed_object_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); +var fails = (fails_namespaceFn()); +var classof = (classof_raw_namespaceFn()); + +var $Object = Object; +var split = uncurryThis(''.split); + +// fallback for non-array-like ES3 and non-enumerable old V8 strings +module.exports = fails(function () { + // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346 + // eslint-disable-next-line no-prototype-builtins -- safe + return !$Object('z').propertyIsEnumerable(0); +}) ? function (it) { + return classof(it) === 'String' ? split(it, '') : $Object(it); +} : $Object; + +}); + +// MODULE: ./node_modules/core-js/internals/inspect-source.js +var inspect_source_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); +var store = (shared_store_namespaceFn()); + +var functionToString = uncurryThis(Function.toString); + +// this helper broken in `core-js@3.4.1-3.4.4`, so we can't use `shared` helper +if (!isCallable(store.inspectSource)) { + store.inspectSource = function (it) { + return functionToString(it); + }; +} + +module.exports = store.inspectSource; + +}); + +// MODULE: ./node_modules/core-js/internals/internal-state.js +var internal_state_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var NATIVE_WEAK_MAP = (weak_map_basic_detection_namespaceFn()); +var globalThis = (global_this_namespaceFn()); +var isObject = (is_object_namespaceFn()); +var createNonEnumerableProperty = (create_non_enumerable_property_namespaceFn()); +var hasOwn = (has_own_property_namespaceFn()); +var shared = (shared_store_namespaceFn()); +var sharedKey = (shared_key_namespaceFn()); +var hiddenKeys = (hidden_keys_namespaceFn()); + +var OBJECT_ALREADY_INITIALIZED = 'Object already initialized'; +var TypeError = globalThis.TypeError; +var WeakMap = globalThis.WeakMap; +var set, get, has; + +var enforce = function (it) { + return has(it) ? get(it) : set(it, {}); +}; + +var getterFor = function (TYPE) { + return function (it) { + var state; + if (!isObject(it) || (state = get(it)).type !== TYPE) { + throw new TypeError('Incompatible receiver, ' + TYPE + ' required'); + } return state; + }; +}; + +if (NATIVE_WEAK_MAP || shared.state) { + var store = shared.state || (shared.state = new WeakMap()); + /* eslint-disable no-self-assign -- prototype methods protection */ + store.get = store.get; + store.has = store.has; + store.set = store.set; + /* eslint-enable no-self-assign -- prototype methods protection */ + set = function (it, metadata) { + if (store.has(it)) throw new TypeError(OBJECT_ALREADY_INITIALIZED); + metadata.facade = it; + store.set(it, metadata); + return metadata; + }; + get = function (it) { + return store.get(it) || {}; + }; + has = function (it) { + return store.has(it); + }; +} else { + var STATE = sharedKey('state'); + hiddenKeys[STATE] = true; + set = function (it, metadata) { + if (hasOwn(it, STATE)) throw new TypeError(OBJECT_ALREADY_INITIALIZED); + metadata.facade = it; + createNonEnumerableProperty(it, STATE, metadata); + return metadata; + }; + get = function (it) { + return hasOwn(it, STATE) ? it[STATE] : {}; + }; + has = function (it) { + return hasOwn(it, STATE); + }; +} + +module.exports = { + set: set, + get: get, + has: has, + enforce: enforce, + getterFor: getterFor +}; + +}); + +// MODULE: ./node_modules/core-js/internals/is-array-iterator-method.js +var is_array_iterator_method_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var wellKnownSymbol = (well_known_symbol_namespaceFn()); +var Iterators = (iterators_namespaceFn()); + +var ITERATOR = wellKnownSymbol('iterator'); +var ArrayPrototype = Array.prototype; + +// check on default Array iterator +module.exports = function (it) { + return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/is-array.js +var is_array_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var classof = (classof_raw_namespaceFn()); + +// `IsArray` abstract operation +// https://tc39.es/ecma262/#sec-isarray +// eslint-disable-next-line es/no-array-isarray -- safe +module.exports = Array.isArray || function isArray(argument) { + return classof(argument) === 'Array'; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/is-big-int-array.js +var is_big_int_array_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var classof = (classof_namespaceFn()); + +module.exports = function (it) { + var klass = classof(it); + return klass === 'BigInt64Array' || klass === 'BigUint64Array'; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/is-callable.js +var is_callable_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot +var documentAll = typeof document == 'object' && document.all; + +// `IsCallable` abstract operation +// https://tc39.es/ecma262/#sec-iscallable +// eslint-disable-next-line unicorn/no-typeof-undefined -- required for testing +module.exports = typeof documentAll == 'undefined' && documentAll !== undefined ? function (argument) { + return typeof argument == 'function' || argument === documentAll; +} : function (argument) { + return typeof argument == 'function'; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/is-forced.js +var is_forced_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var fails = (fails_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); + +var replacement = /#|\.prototype\./; + +var isForced = function (feature, detection) { + var value = data[normalize(feature)]; + return value === POLYFILL ? true + : value === NATIVE ? false + : isCallable(detection) ? fails(detection) + : !!detection; +}; + +var normalize = isForced.normalize = function (string) { + return String(string).replace(replacement, '.').toLowerCase(); +}; + +var data = isForced.data = {}; +var NATIVE = isForced.NATIVE = 'N'; +var POLYFILL = isForced.POLYFILL = 'P'; + +module.exports = isForced; + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/is-null-or-undefined.js +var is_null_or_undefined_namespaceFn = () => { + return __webpack_require__(117); +}; + +// MODULE: ./node_modules/core-js/internals/is-object.js +var is_object_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var isCallable = (is_callable_namespaceFn()); + +module.exports = function (it) { + return typeof it == 'object' ? it !== null : isCallable(it); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/is-possible-prototype.js +var is_possible_prototype_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var isObject = (is_object_namespaceFn()); + +module.exports = function (argument) { + return isObject(argument) || argument === null; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/is-pure.js +var is_pure_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +module.exports = false; + +}); + +// MODULE: ./node_modules/core-js/internals/is-raw-json.js +var is_raw_json_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var isObject = (is_object_namespaceFn()); +var getInternalState = (internal_state_namespaceFn().get); + +module.exports = function isRawJSON(O) { + if (!isObject(O)) return false; + var state = getInternalState(O); + return !!state && state.type === 'RawJSON'; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/is-symbol.js +var is_symbol_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var getBuiltIn = (get_built_in_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); +var isPrototypeOf = (object_is_prototype_of_namespaceFn()); +var USE_SYMBOL_AS_UID = (use_symbol_as_uid_namespaceFn()); + +var $Object = Object; + +module.exports = USE_SYMBOL_AS_UID ? function (it) { + return typeof it == 'symbol'; +} : function (it) { + var $Symbol = getBuiltIn('Symbol'); + return isCallable($Symbol) && isPrototypeOf($Symbol.prototype, $Object(it)); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/iterate-simple.js +var iterate_simple_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var call = (function_call_namespaceFn()); + +module.exports = function (record, fn, ITERATOR_INSTEAD_OF_RECORD) { + var iterator = ITERATOR_INSTEAD_OF_RECORD ? record : record.iterator; + var next = record.next; + var step, result; + while (!(step = call(next, iterator)).done) { + result = fn(step.value); + if (result !== undefined) return result; + } +}; + +}); + +// MODULE: ./node_modules/core-js/internals/iterate.js +var iterate_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var bind = (function_bind_context_namespaceFn()); +var call = (function_call_namespaceFn()); +var anObject = (an_object_namespaceFn()); +var tryToString = (try_to_string_namespaceFn()); +var isArrayIteratorMethod = (is_array_iterator_method_namespaceFn()); +var lengthOfArrayLike = (length_of_array_like_namespaceFn()); +var isPrototypeOf = (object_is_prototype_of_namespaceFn()); +var getIterator = (get_iterator_internal_namespaceFn()); +var getIteratorMethod = (get_iterator_method_internal_namespaceFn()); +var iteratorClose = (iterator_close_namespaceFn()); + +var $TypeError = TypeError; + +var Result = function (stopped, result) { + this.stopped = stopped; + this.result = result; +}; + +var ResultPrototype = Result.prototype; + +module.exports = function (iterable, unboundFunction, options) { + var that = options && options.that; + var AS_ENTRIES = !!(options && options.AS_ENTRIES); + var IS_RECORD = !!(options && options.IS_RECORD); + var IS_ITERATOR = !!(options && options.IS_ITERATOR); + var INTERRUPTED = !!(options && options.INTERRUPTED); + var fn = bind(unboundFunction, that); + var iterator, iterFn, index, length, result, next, step; + + var stop = function (condition) { + var $iterator = iterator; + iterator = undefined; + if ($iterator) iteratorClose($iterator, 'normal'); + return new Result(true, condition); + }; + + var callFn = function (value) { + if (AS_ENTRIES) { + anObject(value); + return INTERRUPTED ? fn(value[0], value[1], stop) : fn(value[0], value[1]); + } return INTERRUPTED ? fn(value, stop) : fn(value); + }; + + if (IS_RECORD) { + iterator = iterable.iterator; + } else if (IS_ITERATOR) { + iterator = iterable; + } else { + iterFn = getIteratorMethod(iterable); + if (!iterFn) throw new $TypeError(tryToString(iterable) + ' is not iterable'); + // optimisation for array iterators + if (isArrayIteratorMethod(iterFn)) { + for (index = 0, length = lengthOfArrayLike(iterable); length > index; index++) { + result = callFn(iterable[index]); + if (result && isPrototypeOf(ResultPrototype, result)) return result; + } return new Result(false); + } + iterator = getIterator(iterable, iterFn); + } + + next = IS_RECORD ? iterable.next : iterator.next; + while (!(step = call(next, iterator)).done) { + // `IteratorValue` errors should propagate without closing the iterator + var value = step.value; + try { + result = callFn(value); + } catch (error) { + if (iterator) iteratorClose(iterator, 'throw', error); + else throw error; + } + if (typeof result == 'object' && result && isPrototypeOf(ResultPrototype, result)) return result; + } return new Result(false); +}; + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/iterator-cleanup-state.js +var iterator_cleanup_state_namespaceFn = () => { + return __webpack_require__(859); +}; + +// MODULE: ./node_modules/core-js/internals/iterator-close-all.js +var iterator_close_all_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var iteratorClose = (iterator_close_namespaceFn()); + +module.exports = function (iters, kind, value) { + for (var i = iters.length - 1; i >= 0; i--) { + if (iters[i] === undefined) continue; + try { + value = iteratorClose(iters[i].iterator, kind, value); + } catch (error) { + kind = 'throw'; + value = error; + } + } + if (kind === 'throw') throw value; + return value; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/iterator-close.js +var iterator_close_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var call = (function_call_namespaceFn()); +var anObject = (an_object_namespaceFn()); +var getMethod = (get_method_namespaceFn()); + +module.exports = function (iterator, kind, value) { + var innerResult, innerError; + anObject(iterator); + try { + innerResult = getMethod(iterator, 'return'); + if (!innerResult) { + if (kind === 'throw') throw value; + return value; + } + innerResult = call(innerResult, iterator); + } catch (error) { + innerError = true; + innerResult = error; + } + if (kind === 'throw') throw value; + if (innerError) throw innerResult; + anObject(innerResult); + return value; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/iterator-create-proxy.js +var iterator_create_proxy_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var call = (function_call_namespaceFn()); +var create = (object_create_namespaceFn()); +var createNonEnumerableProperty = (create_non_enumerable_property_namespaceFn()); +var defineBuiltIns = (define_built_ins_namespaceFn()); +var wellKnownSymbol = (well_known_symbol_namespaceFn()); +var InternalStateModule = (internal_state_namespaceFn()); +var getMethod = (get_method_namespaceFn()); +var IteratorPrototype = (iterators_core_namespaceFn().IteratorPrototype); +var createIterResultObject = (create_iter_result_object_namespaceFn()); +var iteratorClose = (iterator_close_namespaceFn()); +var iteratorCloseAll = (iterator_close_all_namespaceFn()); +var cleanupState = (iterator_cleanup_state_namespaceFn()); + +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); +var ITERATOR_HELPER = 'IteratorHelper'; +var WRAP_FOR_VALID_ITERATOR = 'WrapForValidIterator'; +var NORMAL = 'normal'; +var THROW = 'throw'; +var setInternalState = InternalStateModule.set; + +var createIteratorProxyPrototype = function (IS_ITERATOR) { + var getInternalState = InternalStateModule.getterFor(IS_ITERATOR ? WRAP_FOR_VALID_ITERATOR : ITERATOR_HELPER); + + return defineBuiltIns(create(IteratorPrototype), { + next: function next() { + var state = getInternalState(this); + // for simplification: + // for `%WrapForValidIteratorPrototype%.next` or with `state.returnHandlerResult` our `nextHandler` returns `IterResultObject` + // for `%IteratorHelperPrototype%.next` - just a value + if (IS_ITERATOR) return state.nextHandler(); + if (state.done) return createIterResultObject(undefined, true); + try { + var result = state.nextHandler(); + if (state.done) cleanupState(state); + return state.returnHandlerResult ? result : createIterResultObject(result, state.done); + } catch (error) { + state.done = true; + cleanupState(state); + throw error; + } + }, + 'return': function () { + var state = getInternalState(this); + var iterator = state.iterator; + var inner = state.inner; + var openIters = state.openIters; + var done = state.done; + state.done = true; + if (IS_ITERATOR) { + var returnMethod = getMethod(iterator, 'return'); + return returnMethod ? call(returnMethod, iterator) : createIterResultObject(undefined, true); + } + cleanupState(state); + if (done) return createIterResultObject(undefined, true); + if (inner) try { + iteratorClose(inner.iterator, NORMAL); + } catch (error) { + return iteratorClose(iterator, THROW, error); + } + if (openIters) try { + iteratorCloseAll(openIters, NORMAL); + } catch (error) { + if (iterator) return iteratorClose(iterator, THROW, error); + throw error; + } + if (iterator) iteratorClose(iterator, NORMAL); + return createIterResultObject(undefined, true); + } + }); +}; + +var WrapForValidIteratorPrototype = createIteratorProxyPrototype(true); +var IteratorHelperPrototype = createIteratorProxyPrototype(false); + +createNonEnumerableProperty(IteratorHelperPrototype, TO_STRING_TAG, 'Iterator Helper'); + +module.exports = function (nextHandler, IS_ITERATOR, RETURN_HANDLER_RESULT) { + var IteratorProxy = function Iterator(record, state) { + if (state) { + state.iterator = record.iterator; + state.next = record.next; + } else state = record; + state.type = IS_ITERATOR ? WRAP_FOR_VALID_ITERATOR : ITERATOR_HELPER; + state.returnHandlerResult = !!RETURN_HANDLER_RESULT; + state.nextHandler = nextHandler; + state.counter = 0; + state.done = false; + setInternalState(this, state); + }; + + IteratorProxy.prototype = IS_ITERATOR ? WrapForValidIteratorPrototype : IteratorHelperPrototype; + + return IteratorProxy; +}; + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/iterator-helper-throws-on-invalid-iterator.js +var iterator_helper_throws_on_invalid_iterator_namespaceFn = () => { + return __webpack_require__(684); +}; + +// MODULE: ./node_modules/core-js/internals/iterator-helper-without-closing-on-early-error.js +var iterator_helper_without_closing_on_early_error_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var globalThis = (global_this_namespaceFn()); + +// https://github.com/tc39/ecma262/pull/3467 +module.exports = function (METHOD_NAME, ExpectedError) { + var Iterator = globalThis.Iterator; + var IteratorPrototype = Iterator && Iterator.prototype; + var method = IteratorPrototype && IteratorPrototype[METHOD_NAME]; + + var CLOSED = false; + + if (method) try { + method.call({ + next: function () { return { done: true }; }, + 'return': function () { CLOSED = true; } + }, -1); + } catch (error) { + // https://bugs.webkit.org/show_bug.cgi?id=291195 + if (!(error instanceof ExpectedError)) CLOSED = false; + } + + if (!CLOSED) return method; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/iterators-core.js +var iterators_core_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var fails = (fails_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); +var isObject = (is_object_namespaceFn()); +var create = (object_create_namespaceFn()); +var getPrototypeOf = (object_get_prototype_of_namespaceFn()); +var defineBuiltIn = (define_built_in_namespaceFn()); +var wellKnownSymbol = (well_known_symbol_namespaceFn()); +var IS_PURE = (is_pure_namespaceFn()); + +var ITERATOR = wellKnownSymbol('iterator'); +var BUGGY_SAFARI_ITERATORS = false; + +// `%IteratorPrototype%` object +// https://tc39.es/ecma262/#sec-%iteratorprototype%-object +var IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator; + +/* eslint-disable es/no-array-prototype-keys -- safe */ +if ([].keys) { + arrayIterator = [].keys(); + // Safari 8 has buggy iterators w/o `next` + if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true; + else { + PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator)); + if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype; + } +} + +var NEW_ITERATOR_PROTOTYPE = !isObject(IteratorPrototype) || fails(function () { + var test = {}; + // FF44- legacy iterators case + return IteratorPrototype[ITERATOR].call(test) !== test; +}); + +if (NEW_ITERATOR_PROTOTYPE) IteratorPrototype = {}; +else if (IS_PURE) IteratorPrototype = create(IteratorPrototype); + +// `%IteratorPrototype%[@@iterator]()` method +// https://tc39.es/ecma262/#sec-%iteratorprototype%-@@iterator +if (!isCallable(IteratorPrototype[ITERATOR])) { + defineBuiltIn(IteratorPrototype, ITERATOR, function () { + return this; + }); +} + +module.exports = { + IteratorPrototype: IteratorPrototype, + ...(/* unused pure expression */ null && (BUGGY_SAFARI_ITERATORS)) +}; + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/iterators.js +var iterators_namespaceFn = () => { + return __webpack_require__(269); +}; + +// MODULE: ./node_modules/core-js/internals/length-of-array-like.js +var length_of_array_like_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var toLength = (to_length_namespaceFn()); + +// `LengthOfArrayLike` abstract operation +// https://tc39.es/ecma262/#sec-lengthofarraylike +module.exports = function (obj) { + return toLength(obj.length); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/make-built-in.js +var make_built_in_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); +var fails = (fails_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); +var hasOwn = (has_own_property_namespaceFn()); +var DESCRIPTORS = (descriptors_namespaceFn()); +var CONFIGURABLE_FUNCTION_NAME = (function_name_namespaceFn().CONFIGURABLE); +var inspectSource = (inspect_source_namespaceFn()); +var InternalStateModule = (internal_state_namespaceFn()); + +var enforceInternalState = InternalStateModule.enforce; +var getInternalState = InternalStateModule.get; +var $String = String; +// eslint-disable-next-line es/no-object-defineproperty -- safe +var defineProperty = Object.defineProperty; +var stringSlice = uncurryThis(''.slice); +var replace = uncurryThis(''.replace); +var join = uncurryThis([].join); + +var CONFIGURABLE_LENGTH = DESCRIPTORS && !fails(function () { + return defineProperty(function () { /* empty */ }, 'length', { value: 8 }).length !== 8; +}); + +var TEMPLATE = String(String).split('String'); + +var makeBuiltIn = module.exports = function (value, name, options) { + if (stringSlice($String(name), 0, 7) === 'Symbol(') { + name = '[' + replace($String(name), /^Symbol\(([^)]*)\).*$/, '$1') + ']'; + } + if (options && options.getter) name = 'get ' + name; + if (options && options.setter) name = 'set ' + name; + if (!hasOwn(value, 'name') || (CONFIGURABLE_FUNCTION_NAME && value.name !== name)) { + if (DESCRIPTORS) defineProperty(value, 'name', { value: name, configurable: true }); + else value.name = name; + } + if (CONFIGURABLE_LENGTH && options && hasOwn(options, 'arity') && value.length !== options.arity) { + defineProperty(value, 'length', { value: options.arity }); + } + try { + if (options && hasOwn(options, 'constructor') && options.constructor) { + if (DESCRIPTORS) defineProperty(value, 'prototype', { writable: false }); + // in V8 ~ Chrome 53, prototypes of some methods, like `Array.prototype.values`, are non-writable + } else if (value.prototype) value.prototype = undefined; + } catch (error) { /* empty */ } + var state = enforceInternalState(value); + if (!hasOwn(state, 'source')) { + state.source = join(TEMPLATE, typeof name == 'string' ? name : ''); + } return value; +}; + +// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative +// eslint-disable-next-line no-extend-native -- required +Function.prototype.toString = makeBuiltIn(function toString() { + return isCallable(this) && getInternalState(this).source || inspectSource(this); +}, 'toString'); + +}); + +// MODULE: ./node_modules/core-js/internals/map-helpers.js +var map_helpers_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); + +// eslint-disable-next-line es/no-map -- safe +var MapPrototype = Map.prototype; + +module.exports = { + // eslint-disable-next-line es/no-map -- safe + Map: Map, + set: uncurryThis(MapPrototype.set), + get: uncurryThis(MapPrototype.get), + has: uncurryThis(MapPrototype.has), + remove: uncurryThis(MapPrototype['delete']), + proto: MapPrototype +}; + +}); + +// MODULE: ./node_modules/core-js/internals/native-raw-json.js +var native_raw_json_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +/* eslint-disable es/no-json -- safe */ +var fails = (fails_namespaceFn()); + +module.exports = !fails(function () { + var unsafeInt = '9007199254740993'; + // eslint-disable-next-line es/no-json-rawjson -- feature detection + var raw = JSON.rawJSON(unsafeInt); + // eslint-disable-next-line es/no-json-israwjson -- feature detection + return !JSON.isRawJSON(raw) || JSON.stringify(raw) !== unsafeInt; +}); + +}); + +// MODULE: ./node_modules/core-js/internals/object-create.js +var object_create_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +/* global ActiveXObject -- old IE, WSH */ +var anObject = (an_object_namespaceFn()); +var definePropertiesModule = (object_define_properties_namespaceFn()); +var enumBugKeys = (enum_bug_keys_namespaceFn()); +var hiddenKeys = (hidden_keys_namespaceFn()); +var html = (html_namespaceFn()); +var documentCreateElement = (document_create_element_namespaceFn()); +var sharedKey = (shared_key_namespaceFn()); + +var GT = '>'; +var LT = '<'; +var PROTOTYPE = 'prototype'; +var SCRIPT = 'script'; +var IE_PROTO = sharedKey('IE_PROTO'); + +var EmptyConstructor = function () { /* empty */ }; + +var scriptTag = function (content) { + return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT; +}; + +// Create object with fake `null` prototype: use ActiveX Object with cleared prototype +var NullProtoObjectViaActiveX = function (activeXDocument) { + activeXDocument.write(scriptTag('')); + activeXDocument.close(); + var temp = activeXDocument.parentWindow.Object; + // eslint-disable-next-line no-useless-assignment -- avoid memory leak + activeXDocument = null; + return temp; +}; + +// Create object with fake `null` prototype: use iframe Object with cleared prototype +var NullProtoObjectViaIFrame = function () { + // Thrash, waste and sodomy: IE GC bug + var iframe = documentCreateElement('iframe'); + var JS = 'java' + SCRIPT + ':'; + var iframeDocument; + iframe.style.display = 'none'; + html.appendChild(iframe); + // https://github.com/zloirock/core-js/issues/475 + iframe.src = String(JS); + iframeDocument = iframe.contentWindow.document; + iframeDocument.open(); + iframeDocument.write(scriptTag('document.F=Object')); + iframeDocument.close(); + return iframeDocument.F; +}; + +// Check for document.domain and active x support +// No need to use active x approach when document.domain is not set +// see https://github.com/es-shims/es5-shim/issues/150 +// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346 +// avoid IE GC bug +var activeXDocument; +var NullProtoObject = function () { + try { + activeXDocument = new ActiveXObject('htmlfile'); + } catch (error) { /* ignore */ } + NullProtoObject = typeof document != 'undefined' + ? document.domain && activeXDocument + ? NullProtoObjectViaActiveX(activeXDocument) // old IE + : NullProtoObjectViaIFrame() + : NullProtoObjectViaActiveX(activeXDocument); // WSH + var length = enumBugKeys.length; + while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]]; + return NullProtoObject(); +}; + +hiddenKeys[IE_PROTO] = true; + +// `Object.create` method +// https://tc39.es/ecma262/#sec-object.create +// eslint-disable-next-line es/no-object-create -- safe +module.exports = Object.create || function create(O, Properties) { + var result; + if (O !== null) { + EmptyConstructor[PROTOTYPE] = anObject(O); + result = new EmptyConstructor(); + EmptyConstructor[PROTOTYPE] = null; + // add "__proto__" for Object.getPrototypeOf polyfill + result[IE_PROTO] = O; + } else result = NullProtoObject(); + return Properties === undefined ? result : definePropertiesModule.f(result, Properties); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/object-define-properties.js +var object_define_properties_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var DESCRIPTORS = (descriptors_namespaceFn()); +var V8_PROTOTYPE_DEFINE_BUG = (v8_prototype_define_bug_namespaceFn()); +var definePropertyModule = (object_define_property_namespaceFn()); +var anObject = (an_object_namespaceFn()); +var toIndexedObject = (to_indexed_object_namespaceFn()); +var objectKeys = (object_keys_namespaceFn()); + +// `Object.defineProperties` method +// https://tc39.es/ecma262/#sec-object.defineproperties +// eslint-disable-next-line es/no-object-defineproperties -- safe +exports.f = DESCRIPTORS && !V8_PROTOTYPE_DEFINE_BUG ? Object.defineProperties : function defineProperties(O, Properties) { + anObject(O); + var props = toIndexedObject(Properties); + var keys = objectKeys(Properties); + var length = keys.length; + var index = 0; + var key; + while (length > index) definePropertyModule.f(O, key = keys[index++], props[key]); + return O; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/object-define-property.js +var object_define_property_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var DESCRIPTORS = (descriptors_namespaceFn()); +var IE8_DOM_DEFINE = (ie8_dom_define_namespaceFn()); +var V8_PROTOTYPE_DEFINE_BUG = (v8_prototype_define_bug_namespaceFn()); +var anObject = (an_object_namespaceFn()); +var toPropertyKey = (to_property_key_namespaceFn()); + +var $TypeError = TypeError; +// eslint-disable-next-line es/no-object-defineproperty -- safe +var $defineProperty = Object.defineProperty; +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; +var ENUMERABLE = 'enumerable'; +var CONFIGURABLE = 'configurable'; +var WRITABLE = 'writable'; + +// `Object.defineProperty` method +// https://tc39.es/ecma262/#sec-object.defineproperty +exports.f = DESCRIPTORS ? V8_PROTOTYPE_DEFINE_BUG ? function defineProperty(O, P, Attributes) { + anObject(O); + P = toPropertyKey(P); + anObject(Attributes); + if (typeof O === 'function' && P === 'prototype' && 'value' in Attributes && WRITABLE in Attributes && !Attributes[WRITABLE]) { + var current = $getOwnPropertyDescriptor(O, P); + if (current && current[WRITABLE]) { + O[P] = Attributes.value; + Attributes = { + configurable: CONFIGURABLE in Attributes ? Attributes[CONFIGURABLE] : current[CONFIGURABLE], + enumerable: ENUMERABLE in Attributes ? Attributes[ENUMERABLE] : current[ENUMERABLE], + writable: false + }; + } + } return $defineProperty(O, P, Attributes); +} : $defineProperty : function defineProperty(O, P, Attributes) { + anObject(O); + P = toPropertyKey(P); + anObject(Attributes); + if (IE8_DOM_DEFINE) try { + return $defineProperty(O, P, Attributes); + } catch (error) { /* empty */ } + if ('get' in Attributes || 'set' in Attributes) throw new $TypeError('Accessors not supported'); + if ('value' in Attributes) O[P] = Attributes.value; + return O; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/object-get-own-property-descriptor.js +var object_get_own_property_descriptor_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var DESCRIPTORS = (descriptors_namespaceFn()); +var call = (function_call_namespaceFn()); +var propertyIsEnumerableModule = (object_property_is_enumerable_namespaceFn()); +var createPropertyDescriptor = (create_property_descriptor_namespaceFn()); +var toIndexedObject = (to_indexed_object_namespaceFn()); +var toPropertyKey = (to_property_key_namespaceFn()); +var hasOwn = (has_own_property_namespaceFn()); +var IE8_DOM_DEFINE = (ie8_dom_define_namespaceFn()); + +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; + +// `Object.getOwnPropertyDescriptor` method +// https://tc39.es/ecma262/#sec-object.getownpropertydescriptor +exports.f = DESCRIPTORS ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) { + O = toIndexedObject(O); + P = toPropertyKey(P); + if (IE8_DOM_DEFINE) try { + return $getOwnPropertyDescriptor(O, P); + } catch (error) { /* empty */ } + if (hasOwn(O, P)) return createPropertyDescriptor(!call(propertyIsEnumerableModule.f, O, P), O[P]); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/object-get-own-property-names.js +var object_get_own_property_names_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var internalObjectKeys = (object_keys_internal_namespaceFn()); +var enumBugKeys = (enum_bug_keys_namespaceFn()); + +var hiddenKeys = enumBugKeys.concat('length', 'prototype'); + +// `Object.getOwnPropertyNames` method +// https://tc39.es/ecma262/#sec-object.getownpropertynames +// eslint-disable-next-line es/no-object-getownpropertynames -- safe +exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) { + return internalObjectKeys(O, hiddenKeys); +}; + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/object-get-own-property-symbols.js +var object_get_own_property_symbols_namespaceFn = () => { + return __webpack_require__(717); +}; + +// MODULE: ./node_modules/core-js/internals/object-get-prototype-of.js +var object_get_prototype_of_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var hasOwn = (has_own_property_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); +var toObject = (to_object_namespaceFn()); +var sharedKey = (shared_key_namespaceFn()); +var CORRECT_PROTOTYPE_GETTER = (correct_prototype_getter_namespaceFn()); + +var IE_PROTO = sharedKey('IE_PROTO'); +var $Object = Object; +var ObjectPrototype = $Object.prototype; + +// `Object.getPrototypeOf` method +// https://tc39.es/ecma262/#sec-object.getprototypeof +// eslint-disable-next-line es/no-object-getprototypeof -- safe +module.exports = CORRECT_PROTOTYPE_GETTER ? $Object.getPrototypeOf : function (O) { + var object = toObject(O); + if (hasOwn(object, IE_PROTO)) return object[IE_PROTO]; + var constructor = object.constructor; + if (isCallable(constructor) && object instanceof constructor) { + return constructor.prototype; + } return object instanceof $Object ? ObjectPrototype : null; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/object-is-prototype-of.js +var object_is_prototype_of_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); + +module.exports = uncurryThis({}.isPrototypeOf); + +}); + +// MODULE: ./node_modules/core-js/internals/object-keys-internal.js +var object_keys_internal_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); +var hasOwn = (has_own_property_namespaceFn()); +var toIndexedObject = (to_indexed_object_namespaceFn()); +var indexOf = (array_includes_namespaceFn().indexOf); +var hiddenKeys = (hidden_keys_namespaceFn()); + +var push = uncurryThis([].push); + +module.exports = function (object, names) { + var O = toIndexedObject(object); + var i = 0; + var result = []; + var key; + for (key in O) !hasOwn(hiddenKeys, key) && hasOwn(O, key) && push(result, key); + // Don't enum bug & hidden keys + while (names.length > i) if (hasOwn(O, key = names[i++])) { + ~indexOf(result, key) || push(result, key); + } + return result; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/object-keys.js +var object_keys_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var internalObjectKeys = (object_keys_internal_namespaceFn()); +var enumBugKeys = (enum_bug_keys_namespaceFn()); + +// `Object.keys` method +// https://tc39.es/ecma262/#sec-object.keys +// eslint-disable-next-line es/no-object-keys -- safe +module.exports = Object.keys || function keys(O) { + return internalObjectKeys(O, enumBugKeys); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/object-property-is-enumerable.js +var object_property_is_enumerable_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $propertyIsEnumerable = {}.propertyIsEnumerable; +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; + +// Nashorn ~ JDK8 bug +var NASHORN_BUG = getOwnPropertyDescriptor && !$propertyIsEnumerable.call({ 1: 2 }, 1); + +// `Object.prototype.propertyIsEnumerable` method implementation +// https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable +exports.f = NASHORN_BUG ? function propertyIsEnumerable(V) { + var descriptor = getOwnPropertyDescriptor(this, V); + return !!descriptor && descriptor.enumerable; +} : $propertyIsEnumerable; + +}); + +// MODULE: ./node_modules/core-js/internals/object-set-prototype-of.js +var object_set_prototype_of_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +/* eslint-disable no-proto -- safe */ +var uncurryThisAccessor = (function_uncurry_this_accessor_namespaceFn()); +var isObject = (is_object_namespaceFn()); +var requireObjectCoercible = (require_object_coercible_namespaceFn()); +var aPossiblePrototype = (a_possible_prototype_namespaceFn()); + +// `Object.setPrototypeOf` method +// https://tc39.es/ecma262/#sec-object.setprototypeof +// Works with __proto__ only. Old v8 can't work with null proto objects. +// eslint-disable-next-line es/no-object-setprototypeof -- safe +module.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () { + var CORRECT_SETTER = false; + var test = {}; + var setter; + try { + setter = uncurryThisAccessor(Object.prototype, '__proto__', 'set'); + setter(test, []); + CORRECT_SETTER = test instanceof Array; + } catch (error) { /* empty */ } + return function setPrototypeOf(O, proto) { + requireObjectCoercible(O); + aPossiblePrototype(proto); + if (!isObject(O)) return O; + if (CORRECT_SETTER) setter(O, proto); + else O.__proto__ = proto; + return O; + }; +}() : undefined); + +}); + +// MODULE: ./node_modules/core-js/internals/ordinary-to-primitive.js +var ordinary_to_primitive_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var call = (function_call_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); +var isObject = (is_object_namespaceFn()); + +var $TypeError = TypeError; + +// `OrdinaryToPrimitive` abstract operation +// https://tc39.es/ecma262/#sec-ordinarytoprimitive +module.exports = function (input, pref) { + var fn, val; + if (pref === 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val; + if (isCallable(fn = input.valueOf) && !isObject(val = call(fn, input))) return val; + if (pref !== 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val; + throw new $TypeError("Can't convert object to primitive value"); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/own-keys.js +var own_keys_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var getBuiltIn = (get_built_in_namespaceFn()); +var uncurryThis = (function_uncurry_this_namespaceFn()); +var getOwnPropertyNamesModule = (object_get_own_property_names_namespaceFn()); +var getOwnPropertySymbolsModule = (object_get_own_property_symbols_namespaceFn()); +var anObject = (an_object_namespaceFn()); + +var concat = uncurryThis([].concat); + +// all object keys, includes non-enumerable and symbols +module.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) { + var keys = getOwnPropertyNamesModule.f(anObject(it)); + var getOwnPropertySymbols = getOwnPropertySymbolsModule.f; + return getOwnPropertySymbols ? concat(keys, getOwnPropertySymbols(it)) : keys; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/parse-json-string.js +var parse_json_string_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); +var hasOwn = (has_own_property_namespaceFn()); + +var $SyntaxError = SyntaxError; +var $parseInt = parseInt; +var fromCharCode = String.fromCharCode; +var at = uncurryThis(''.charAt); +var slice = uncurryThis(''.slice); +var exec = uncurryThis(/./.exec); + +var codePoints = { + '\\"': '"', + '\\\\': '\\', + '\\/': '/', + '\\b': '\b', + '\\f': '\f', + '\\n': '\n', + '\\r': '\r', + '\\t': '\t' +}; + +var IS_4_HEX_DIGITS = /^[\da-f]{4}$/i; +// eslint-disable-next-line regexp/no-control-character -- safe +var IS_C0_CONTROL_CODE = /^[\u0000-\u001F]$/; + +module.exports = function (source, i) { + var unterminated = true; + var value = ''; + while (i < source.length) { + var chr = at(source, i); + if (chr === '\\') { + var twoChars = slice(source, i, i + 2); + if (hasOwn(codePoints, twoChars)) { + value += codePoints[twoChars]; + i += 2; + } else if (twoChars === '\\u') { + i += 2; + var fourHexDigits = slice(source, i, i + 4); + if (!exec(IS_4_HEX_DIGITS, fourHexDigits)) throw new $SyntaxError('Bad Unicode escape at: ' + i); + value += fromCharCode($parseInt(fourHexDigits, 16)); + i += 4; + } else throw new $SyntaxError('Unknown escape sequence: "' + twoChars + '"'); + } else if (chr === '"') { + unterminated = false; + i++; + break; + } else { + if (exec(IS_C0_CONTROL_CODE, chr)) throw new $SyntaxError('Bad control character in string literal at: ' + i); + value += chr; + i++; + } + } + if (unterminated) throw new $SyntaxError('Unterminated string at: ' + i); + return { value: value, end: i }; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/require-object-coercible.js +var require_object_coercible_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var isNullOrUndefined = (is_null_or_undefined_namespaceFn()); + +var $TypeError = TypeError; + +// `RequireObjectCoercible` abstract operation +// https://tc39.es/ecma262/#sec-requireobjectcoercible +module.exports = function (it) { + if (isNullOrUndefined(it)) throw new $TypeError("Can't call method on " + it); + return it; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/set-clone.js +var set_clone_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var SetHelpers = (set_helpers_namespaceFn()); +var iterate = (set_iterate_namespaceFn()); + +var Set = SetHelpers.Set; +var add = SetHelpers.add; + +module.exports = function (set) { + var result = new Set(); + iterate(set, function (it) { + add(result, it); + }); + return result; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/set-difference.js +var set_difference_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var aSet = (a_set_namespaceFn()); +var SetHelpers = (set_helpers_namespaceFn()); +var clone = (set_clone_namespaceFn()); +var size = (set_size_namespaceFn()); +var getSetRecord = (get_set_record_namespaceFn()); +var iterateSet = (set_iterate_namespaceFn()); +var iterateSimple = (iterate_simple_namespaceFn()); + +var has = SetHelpers.has; +var remove = SetHelpers.remove; + +// `Set.prototype.difference` method +// https://tc39.es/ecma262/#sec-set.prototype.difference +module.exports = function difference(other) { + var O = aSet(this); + var otherRec = getSetRecord(other); + var result = clone(O); + if (size(result) <= otherRec.size) iterateSet(result, function (e) { + if (otherRec.includes(e)) remove(result, e); + }); + else iterateSimple(otherRec.getIterator(), function (e) { + if (has(result, e)) remove(result, e); + }); + return result; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/set-helpers.js +var set_helpers_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); + +// eslint-disable-next-line es/no-set -- safe +var SetPrototype = Set.prototype; + +module.exports = { + // eslint-disable-next-line es/no-set -- safe + Set: Set, + add: uncurryThis(SetPrototype.add), + has: uncurryThis(SetPrototype.has), + remove: uncurryThis(SetPrototype['delete']), + proto: SetPrototype +}; + +}); + +// MODULE: ./node_modules/core-js/internals/set-intersection.js +var set_intersection_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var aSet = (a_set_namespaceFn()); +var SetHelpers = (set_helpers_namespaceFn()); +var size = (set_size_namespaceFn()); +var getSetRecord = (get_set_record_namespaceFn()); +var iterateSet = (set_iterate_namespaceFn()); +var iterateSimple = (iterate_simple_namespaceFn()); + +var Set = SetHelpers.Set; +var add = SetHelpers.add; +var has = SetHelpers.has; + +// `Set.prototype.intersection` method +// https://tc39.es/ecma262/#sec-set.prototype.intersection +module.exports = function intersection(other) { + var O = aSet(this); + var otherRec = getSetRecord(other); + var result = new Set(); + + if (size(O) > otherRec.size) { + iterateSimple(otherRec.getIterator(), function (e) { + if (has(O, e)) add(result, e); + }); + } else { + iterateSet(O, function (e) { + if (otherRec.includes(e)) add(result, e); + }); + } + + return result; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/set-is-disjoint-from.js +var set_is_disjoint_from_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var aSet = (a_set_namespaceFn()); +var has = (set_helpers_namespaceFn().has); +var size = (set_size_namespaceFn()); +var getSetRecord = (get_set_record_namespaceFn()); +var iterateSet = (set_iterate_namespaceFn()); +var iterateSimple = (iterate_simple_namespaceFn()); +var iteratorClose = (iterator_close_namespaceFn()); + +// `Set.prototype.isDisjointFrom` method +// https://tc39.es/ecma262/#sec-set.prototype.isdisjointfrom +module.exports = function isDisjointFrom(other) { + var O = aSet(this); + var otherRec = getSetRecord(other); + if (size(O) <= otherRec.size) return iterateSet(O, function (e) { + if (otherRec.includes(e)) return false; + }, true) !== false; + var iterator = otherRec.getIterator(); + return iterateSimple(iterator, function (e) { + if (has(O, e)) return iteratorClose(iterator.iterator, 'normal', false); + }) !== false; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/set-is-subset-of.js +var set_is_subset_of_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var aSet = (a_set_namespaceFn()); +var size = (set_size_namespaceFn()); +var iterate = (set_iterate_namespaceFn()); +var getSetRecord = (get_set_record_namespaceFn()); + +// `Set.prototype.isSubsetOf` method +// https://tc39.es/ecma262/#sec-set.prototype.issubsetof +module.exports = function isSubsetOf(other) { + var O = aSet(this); + var otherRec = getSetRecord(other); + if (size(O) > otherRec.size) return false; + return iterate(O, function (e) { + if (!otherRec.includes(e)) return false; + }, true) !== false; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/set-is-superset-of.js +var set_is_superset_of_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var aSet = (a_set_namespaceFn()); +var has = (set_helpers_namespaceFn().has); +var size = (set_size_namespaceFn()); +var getSetRecord = (get_set_record_namespaceFn()); +var iterateSimple = (iterate_simple_namespaceFn()); +var iteratorClose = (iterator_close_namespaceFn()); + +// `Set.prototype.isSupersetOf` method +// https://tc39.es/ecma262/#sec-set.prototype.issupersetof +module.exports = function isSupersetOf(other) { + var O = aSet(this); + var otherRec = getSetRecord(other); + if (size(O) < otherRec.size) return false; + var iterator = otherRec.getIterator(); + return iterateSimple(iterator, function (e) { + if (!has(O, e)) return iteratorClose(iterator.iterator, 'normal', false); + }) !== false; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/set-iterate.js +var set_iterate_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); +var iterateSimple = (iterate_simple_namespaceFn()); +var SetHelpers = (set_helpers_namespaceFn()); + +var Set = SetHelpers.Set; +var SetPrototype = SetHelpers.proto; +var forEach = uncurryThis(SetPrototype.forEach); +var keys = uncurryThis(SetPrototype.keys); +var next = keys(new Set()).next; + +module.exports = function (set, fn, interruptible) { + return interruptible ? iterateSimple({ iterator: keys(set), next: next }, fn) : forEach(set, fn); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/set-method-accept-set-like.js +var set_method_accept_set_like_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var getBuiltIn = (get_built_in_namespaceFn()); + +var createSetLike = function (size) { + return { + size: size, + has: function () { + return false; + }, + keys: function () { + return { + next: function () { + return { done: true }; + } + }; + } + }; +}; + +var createSetLikeWithInfinitySize = function (size) { + return { + size: size, + has: function () { + return true; + }, + keys: function () { + throw new Error('e'); + } + }; +}; + +module.exports = function (name, callback) { + var Set = getBuiltIn('Set'); + try { + new Set()[name](createSetLike(0)); + try { + // late spec change, early WebKit ~ Safari 17 implementation does not pass it + // https://github.com/tc39/proposal-set-methods/pull/88 + // also covered engines with + // https://bugs.webkit.org/show_bug.cgi?id=272679 + new Set()[name](createSetLike(-1)); + return false; + } catch (error2) { + if (!callback) return true; + // early V8 implementation bug + // https://issues.chromium.org/issues/351332634 + try { + new Set()[name](createSetLikeWithInfinitySize(-Infinity)); + return false; + } catch (error) { + var set = new Set([1, 2]); + return callback(set[name](createSetLikeWithInfinitySize(Infinity))); + } + } + } catch (error) { + return false; + } +}; + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/set-method-get-keys-before-cloning-detection.js +var set_method_get_keys_before_cloning_detection_namespaceFn = () => { + return __webpack_require__(835); +}; + +// MODULE: ./node_modules/core-js/internals/set-size.js +var set_size_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThisAccessor = (function_uncurry_this_accessor_namespaceFn()); +var SetHelpers = (set_helpers_namespaceFn()); + +module.exports = uncurryThisAccessor(SetHelpers.proto, 'size', 'get') || function (set) { + return set.size; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/set-symmetric-difference.js +var set_symmetric_difference_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var aSet = (a_set_namespaceFn()); +var SetHelpers = (set_helpers_namespaceFn()); +var clone = (set_clone_namespaceFn()); +var getSetRecord = (get_set_record_namespaceFn()); +var iterateSimple = (iterate_simple_namespaceFn()); + +var add = SetHelpers.add; +var has = SetHelpers.has; +var remove = SetHelpers.remove; + +// `Set.prototype.symmetricDifference` method +// https://tc39.es/ecma262/#sec-set.prototype.symmetricdifference +module.exports = function symmetricDifference(other) { + var O = aSet(this); + var keysIter = getSetRecord(other).getIterator(); + var result = clone(O); + iterateSimple(keysIter, function (e) { + if (has(O, e)) remove(result, e); + else add(result, e); + }); + return result; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/set-union.js +var set_union_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var aSet = (a_set_namespaceFn()); +var add = (set_helpers_namespaceFn().add); +var clone = (set_clone_namespaceFn()); +var getSetRecord = (get_set_record_namespaceFn()); +var iterateSimple = (iterate_simple_namespaceFn()); + +// `Set.prototype.union` method +// https://tc39.es/ecma262/#sec-set.prototype.union +module.exports = function union(other) { + var O = aSet(this); + var keysIter = getSetRecord(other).getIterator(); + var result = clone(O); + iterateSimple(keysIter, function (it) { + add(result, it); + }); + return result; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/shared-key.js +var shared_key_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var shared = (shared_namespaceFn()); +var uid = (uid_namespaceFn()); + +var keys = shared('keys'); + +module.exports = function (key) { + return keys[key] || (keys[key] = uid(key)); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/shared-store.js +var shared_store_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var IS_PURE = (is_pure_namespaceFn()); +var globalThis = (global_this_namespaceFn()); +var defineGlobalProperty = (define_global_property_namespaceFn()); + +var SHARED = '__core-js_shared__'; +var store = module.exports = globalThis[SHARED] || defineGlobalProperty(SHARED, {}); + +(store.versions || (store.versions = [])).push({ + version: '3.50.0', + mode: IS_PURE ? 'pure' : 'global', + copyright: '© 2013–2025 Denis Pushkarev (zloirock.ru), 2025–2026 CoreJS Company (core-js.io). All rights reserved.', + license: 'https://github.com/zloirock/core-js/blob/v3.50.0/LICENSE', + source: 'https://github.com/zloirock/core-js' +}); + +}); + +// MODULE: ./node_modules/core-js/internals/shared.js +var shared_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var store = (shared_store_namespaceFn()); +// eslint-disable-next-line es/no-object-create -- safe +var create = Object.create || Object; + +module.exports = function (key, value) { + return store[key] || (store[key] = value || create(null)); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/string-pad.js +var string_pad_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); +var toLength = (to_length_namespaceFn()); +var toString = (to_string_namespaceFn()); +var $repeat = (string_repeat_namespaceFn()); +var requireObjectCoercible = (require_object_coercible_namespaceFn()); + +var repeat = uncurryThis($repeat); +var stringSlice = uncurryThis(''.slice); +var ceil = Math.ceil; + +// `String.prototype.{ padStart, padEnd }` methods implementation +var createMethod = function (IS_END) { + return function ($this, maxLength, fillString) { + var S = toString(requireObjectCoercible($this)); + var intMaxLength = toLength(maxLength); + var stringLength = S.length; + if (intMaxLength <= stringLength) return S; + var fillStr = fillString === undefined ? ' ' : toString(fillString); + var fillLen, stringFiller; + if (fillStr === '') return S; + fillLen = intMaxLength - stringLength; + stringFiller = repeat(fillStr, ceil(fillLen / fillStr.length)); + if (stringFiller.length > fillLen) stringFiller = stringSlice(stringFiller, 0, fillLen); + return IS_END ? S + stringFiller : stringFiller + S; + }; +}; + +module.exports = { + // `String.prototype.padStart` method + // https://tc39.es/ecma262/#sec-string.prototype.padstart + start: createMethod(false), + // `String.prototype.padEnd` method + // https://tc39.es/ecma262/#sec-string.prototype.padend + ...void (createMethod(true)) +}; + +}); + +// MODULE: ./node_modules/core-js/internals/string-repeat.js +var string_repeat_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var toIntegerOrInfinity = (to_integer_or_infinity_namespaceFn()); +var toString = (to_string_namespaceFn()); +var requireObjectCoercible = (require_object_coercible_namespaceFn()); + +var $RangeError = RangeError; +var floor = Math.floor; + +// `String.prototype.repeat` method implementation +// https://tc39.es/ecma262/#sec-string.prototype.repeat +module.exports = function repeat(count) { + var str = toString(requireObjectCoercible(this)); + var result = ''; + var n = toIntegerOrInfinity(count); + if (n < 0 || n === Infinity) throw new $RangeError('Wrong number of repetitions'); + for (;n > 0; (n = floor(n / 2)) && (str += str)) if (n % 2) result += str; + return result; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/symbol-constructor-detection.js +var symbol_constructor_detection_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +/* eslint-disable es/no-symbol -- required for testing */ +var V8_VERSION = (environment_v8_version_namespaceFn()); +var fails = (fails_namespaceFn()); +var globalThis = (global_this_namespaceFn()); + +var $String = globalThis.String; + +// eslint-disable-next-line es/no-object-getownpropertysymbols -- required for testing +module.exports = !!Object.getOwnPropertySymbols && !fails(function () { + var symbol = Symbol('symbol detection'); + // Chrome 38 Symbol has incorrect toString conversion + // `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances + // nb: Do not call `String` directly to avoid this being optimized out to `symbol+''` which will, + // of course, fail. + return !$String(symbol) || !(Object(symbol) instanceof Symbol) || + // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances + !Symbol.sham && V8_VERSION && V8_VERSION < 41; +}); + +}); + +// MODULE: ./node_modules/core-js/internals/this-number-value.js +var this_number_value_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); + +// `thisNumberValue` abstract operation +// https://tc39.es/ecma262/#sec-thisnumbervalue +module.exports = uncurryThis(1.1.valueOf); + +}); + +// MODULE: ./node_modules/core-js/internals/to-absolute-index.js +var to_absolute_index_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var toIntegerOrInfinity = (to_integer_or_infinity_namespaceFn()); + +var max = Math.max; +var min = Math.min; + +// Helper for a popular repeating case of the spec: +// Let integer be ? ToInteger(index). +// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length). +module.exports = function (index, length) { + var integer = toIntegerOrInfinity(index); + return integer < 0 ? max(integer + length, 0) : min(integer, length); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/to-big-int.js +var to_big_int_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var toPrimitive = (to_primitive_namespaceFn()); + +var $TypeError = TypeError; + +// `ToBigInt` abstract operation +// https://tc39.es/ecma262/#sec-tobigint +module.exports = function (argument) { + var prim = toPrimitive(argument, 'number'); + if (typeof prim == 'number') throw new $TypeError("Can't convert number to bigint"); + // eslint-disable-next-line es/no-bigint -- safe + return BigInt(prim); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/to-indexed-object.js +var to_indexed_object_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +// toObject with fallback for non-array-like ES3 strings +var IndexedObject = (indexed_object_namespaceFn()); +var requireObjectCoercible = (require_object_coercible_namespaceFn()); + +module.exports = function (it) { + return IndexedObject(requireObjectCoercible(it)); +}; + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/to-integer-or-infinity.js +var to_integer_or_infinity_namespaceFn = () => { + return __webpack_require__(291); +}; + +// MODULE: ./node_modules/core-js/internals/to-length.js +var to_length_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var toIntegerOrInfinity = (to_integer_or_infinity_namespaceFn()); + +var min = Math.min; + +// `ToLength` abstract operation +// https://tc39.es/ecma262/#sec-tolength +module.exports = function (argument) { + var len = toIntegerOrInfinity(argument); + return len > 0 ? min(len, 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991 +}; + +}); + +// MODULE: ./node_modules/core-js/internals/to-object.js +var to_object_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var requireObjectCoercible = (require_object_coercible_namespaceFn()); + +var $Object = Object; + +// `ToObject` abstract operation +// https://tc39.es/ecma262/#sec-toobject +module.exports = function (argument) { + return $Object(requireObjectCoercible(argument)); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/to-primitive.js +var to_primitive_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var call = (function_call_namespaceFn()); +var isObject = (is_object_namespaceFn()); +var isSymbol = (is_symbol_namespaceFn()); +var getMethod = (get_method_namespaceFn()); +var ordinaryToPrimitive = (ordinary_to_primitive_namespaceFn()); +var wellKnownSymbol = (well_known_symbol_namespaceFn()); + +var $TypeError = TypeError; +var TO_PRIMITIVE = wellKnownSymbol('toPrimitive'); + +// `ToPrimitive` abstract operation +// https://tc39.es/ecma262/#sec-toprimitive +module.exports = function (input, pref) { + if (!isObject(input) || isSymbol(input)) return input; + var exoticToPrim = getMethod(input, TO_PRIMITIVE); + var result; + if (exoticToPrim) { + if (pref === undefined) pref = 'default'; + result = call(exoticToPrim, input, pref); + if (!isObject(result) || isSymbol(result)) return result; + throw new $TypeError("Can't convert object to primitive value"); + } + if (pref === undefined) pref = 'number'; + return ordinaryToPrimitive(input, pref); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/to-property-key.js +var to_property_key_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var toPrimitive = (to_primitive_namespaceFn()); +var isSymbol = (is_symbol_namespaceFn()); + +// `ToPropertyKey` abstract operation +// https://tc39.es/ecma262/#sec-topropertykey +module.exports = function (argument) { + var key = toPrimitive(argument, 'string'); + return isSymbol(key) ? key : key + ''; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/to-string-tag-support.js +var to_string_tag_support_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var wellKnownSymbol = (well_known_symbol_namespaceFn()); + +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); +var test = {}; +// eslint-disable-next-line unicorn/no-immediate-mutation -- ES3 syntax limitation +test[TO_STRING_TAG] = 'z'; + +module.exports = String(test) === '[object z]'; + +}); + +// MODULE: ./node_modules/core-js/internals/to-string.js +var to_string_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var classof = (classof_namespaceFn()); + +var $String = String; + +module.exports = function (argument) { + if (classof(argument) === 'Symbol') throw new TypeError('Cannot convert a Symbol value to a string'); + return $String(argument); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/try-to-string.js +var try_to_string_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $String = String; + +module.exports = function (argument) { + try { + return $String(argument); + } catch (error) { + return 'Object'; + } +}; + +}); + +// MODULE: ./node_modules/core-js/internals/uid.js +var uid_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); + +var id = 0; +var postfix = Math.random(); +var toString = uncurryThis(1.1.toString); + +module.exports = function (key) { + return 'Symbol(' + (key === undefined ? '' : key) + ')_' + toString(++id + postfix, 36); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/url-constructor-detection.js +var url_constructor_detection_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var fails = (fails_namespaceFn()); +var wellKnownSymbol = (well_known_symbol_namespaceFn()); +var DESCRIPTORS = (descriptors_namespaceFn()); +var IS_PURE = (is_pure_namespaceFn()); + +var ITERATOR = wellKnownSymbol('iterator'); + +module.exports = !fails(function () { + // eslint-disable-next-line unicorn/relative-url-style -- required for testing + var url = new URL('b?a=1&b=2&c=3', 'https://a'); + var params = url.searchParams; + var params2 = new URLSearchParams('a=1&a=2&b=3'); + var result = ''; + url.pathname = 'c%20d'; + params.forEach(function (value, key) { + params['delete']('b'); + result += key + value; + }); + params2['delete']('a', 2); + // `undefined` case is a Chromium 117 bug + // https://bugs.chromium.org/p/v8/issues/detail?id=14222 + params2['delete']('b', undefined); + return (IS_PURE && (!url.toJSON || !params2.has('a', 1) || params2.has('a', 2) || !params2.has('a', undefined) || params2.has('b'))) + || (!params.size && (IS_PURE || !DESCRIPTORS)) + || !params.sort + || url.href !== 'https://a/c%20d?a=1&c=3' + || params.get('c') !== '3' + || String(new URLSearchParams('?a=1')) !== 'a=1' + || !params[ITERATOR] + // throws in Edge + || new URL('https://a@b').username !== 'a' + || new URLSearchParams(new URLSearchParams('a=b')).get('a') !== 'b' + // not punycoded in Edge + || new URL('https://тест').host !== 'xn--e1aybc' + // not escaped in Chrome 62- + || new URL('https://a#б').hash !== '#%D0%B1' + // fails in Chrome 66- + || result !== 'a1c3' + // throws in Safari + || new URL('https://x', undefined).host !== 'x'; +}); + +}); + +// MODULE: ./node_modules/core-js/internals/use-symbol-as-uid.js +var use_symbol_as_uid_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +/* eslint-disable es/no-symbol -- required for testing */ +var NATIVE_SYMBOL = (symbol_constructor_detection_namespaceFn()); + +module.exports = NATIVE_SYMBOL && + !Symbol.sham && + typeof Symbol.iterator == 'symbol'; + +}); + +// MODULE: ./node_modules/core-js/internals/v8-prototype-define-bug.js +var v8_prototype_define_bug_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var DESCRIPTORS = (descriptors_namespaceFn()); +var fails = (fails_namespaceFn()); + +// V8 ~ Chrome 36- +// https://bugs.chromium.org/p/v8/issues/detail?id=3334 +module.exports = DESCRIPTORS && fails(function () { + // eslint-disable-next-line es/no-object-defineproperty -- required for testing + return Object.defineProperty(function () { /* empty */ }, 'prototype', { + value: 42, + writable: false + }).prototype !== 42; +}); + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/validate-arguments-length.js +var validate_arguments_length_namespaceFn = () => { + return __webpack_require__(812); +}; + +// MODULE: ./node_modules/core-js/internals/weak-map-basic-detection.js +var weak_map_basic_detection_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var globalThis = (global_this_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); + +var WeakMap = globalThis.WeakMap; + +module.exports = isCallable(WeakMap) && /native code/.test(String(WeakMap)); + +}); + +// MODULE: ./node_modules/core-js/internals/weak-map-helpers.js +var weak_map_helpers_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); + +// eslint-disable-next-line es/no-weak-map -- safe +var WeakMapPrototype = WeakMap.prototype; + +module.exports = { + // eslint-disable-next-line es/no-weak-map -- safe + WeakMap: WeakMap, + set: uncurryThis(WeakMapPrototype.set), + get: uncurryThis(WeakMapPrototype.get), + has: uncurryThis(WeakMapPrototype.has), + remove: uncurryThis(WeakMapPrototype['delete']) +}; + +}); + +// MODULE: ./node_modules/core-js/internals/well-known-symbol.js +var well_known_symbol_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var globalThis = (global_this_namespaceFn()); +var shared = (shared_namespaceFn()); +var hasOwn = (has_own_property_namespaceFn()); +var uid = (uid_namespaceFn()); +var NATIVE_SYMBOL = (symbol_constructor_detection_namespaceFn()); +var USE_SYMBOL_AS_UID = (use_symbol_as_uid_namespaceFn()); + +var Symbol = globalThis.Symbol; +var WellKnownSymbolsStore = shared('wks'); +var createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol['for'] || Symbol : Symbol && Symbol.withoutSetter || uid; + +module.exports = function (name) { + if (!hasOwn(WellKnownSymbolsStore, name)) { + WellKnownSymbolsStore[name] = NATIVE_SYMBOL && hasOwn(Symbol, name) + ? Symbol[name] + : createWellKnownSymbol('Symbol.' + name); + } return WellKnownSymbolsStore[name]; +}; + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/whitespaces.js +var whitespaces_namespaceFn = () => { + return __webpack_require__(452); +}; + +// MODULE: ./node_modules/core-js/modules/es.array.includes.js +var es_array_includes_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var $includes = (array_includes_namespaceFn().includes); +var fails = (fails_namespaceFn()); +var addToUnscopables = (add_to_unscopables_namespaceFn()); + +// FF99+ bug +var BROKEN_ON_SPARSE = fails(function () { + // eslint-disable-next-line es/no-array-prototype-includes -- detection + return !Array(1).includes(); +}); + +// Safari 26.4- bug +var BROKEN_ON_SPARSE_WITH_FROM_INDEX = fails(function () { + // eslint-disable-next-line no-sparse-arrays, es/no-array-prototype-includes -- detection + return [, 1].includes(undefined, 1); +}); + +// `Array.prototype.includes` method +// https://tc39.es/ecma262/#sec-array.prototype.includes +$({ target: 'Array', proto: true, forced: BROKEN_ON_SPARSE || BROKEN_ON_SPARSE_WITH_FROM_INDEX }, { + includes: function includes(el /* , fromIndex = 0 */) { + return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined); + } +}); + +// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables +addToUnscopables('includes'); + +}); + +// MODULE: ./node_modules/core-js/modules/es.array.push.js +var es_array_push_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var toObject = (to_object_namespaceFn()); +var lengthOfArrayLike = (length_of_array_like_namespaceFn()); +var setArrayLength = (array_set_length_namespaceFn()); +var doesNotExceedSafeInteger = (does_not_exceed_safe_integer_namespaceFn()); +var fails = (fails_namespaceFn()); + +var INCORRECT_TO_LENGTH = fails(function () { + return [].push.call({ length: 0x100000000 }, 1) !== 4294967297; +}); + +// V8 <= 121 and Safari <= 15.4; FF < 23 throws InternalError +// https://bugs.chromium.org/p/v8/issues/detail?id=12681 +var properErrorOnNonWritableLength = function () { + try { + // eslint-disable-next-line es/no-object-defineproperty -- safe + Object.defineProperty([], 'length', { writable: false }).push(); + } catch (error) { + return error instanceof TypeError; + } +}; + +var FORCED = INCORRECT_TO_LENGTH || !properErrorOnNonWritableLength(); + +// `Array.prototype.push` method +// https://tc39.es/ecma262/#sec-array.prototype.push +$({ target: 'Array', proto: true, arity: 1, forced: FORCED }, { + // eslint-disable-next-line no-unused-vars -- required for `.length` + push: function push(item) { + var O = toObject(this); + var len = lengthOfArrayLike(O); + var argCount = arguments.length; + doesNotExceedSafeInteger(len + argCount); + for (var i = 0; i < argCount; i++) { + O[len] = arguments[i]; + len++; + } + setArrayLength(O, len); + return len; + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.iterator.constructor.js +var es_iterator_constructor_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var globalThis = (global_this_namespaceFn()); +var anInstance = (an_instance_namespaceFn()); +var anObject = (an_object_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); +var getPrototypeOf = (object_get_prototype_of_namespaceFn()); +var defineBuiltInAccessor = (define_built_in_accessor_namespaceFn()); +var createProperty = (create_property_namespaceFn()); +var fails = (fails_namespaceFn()); +var hasOwn = (has_own_property_namespaceFn()); +var wellKnownSymbol = (well_known_symbol_namespaceFn()); +var IteratorPrototype = (iterators_core_namespaceFn().IteratorPrototype); +var DESCRIPTORS = (descriptors_namespaceFn()); +var IS_PURE = (is_pure_namespaceFn()); + +var CONSTRUCTOR = 'constructor'; +var ITERATOR = 'Iterator'; +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); + +var $TypeError = TypeError; +var NativeIterator = globalThis[ITERATOR]; + +// FF56- have non-standard global helper `Iterator` +var FORCED = IS_PURE + || !isCallable(NativeIterator) + || NativeIterator.prototype !== IteratorPrototype + // FF44- non-standard `Iterator` passes previous tests + || !fails(function () { NativeIterator({}); }); + +var IteratorConstructor = function Iterator() { + anInstance(this, IteratorPrototype); + if (getPrototypeOf(this) === IteratorPrototype) throw new $TypeError('Abstract class Iterator not directly constructable'); +}; + +var defineIteratorPrototypeAccessor = function (key, value) { + if (DESCRIPTORS) { + defineBuiltInAccessor(IteratorPrototype, key, { + configurable: true, + get: function () { + return value; + }, + set: function (replacement) { + anObject(this); + if (this === IteratorPrototype) throw new $TypeError("You can't redefine this property"); + if (hasOwn(this, key)) this[key] = replacement; + else createProperty(this, key, replacement); + } + }); + } else IteratorPrototype[key] = value; +}; + +if (!hasOwn(IteratorPrototype, TO_STRING_TAG)) defineIteratorPrototypeAccessor(TO_STRING_TAG, ITERATOR); + +if (FORCED || !hasOwn(IteratorPrototype, CONSTRUCTOR) || IteratorPrototype[CONSTRUCTOR] === Object) { + defineIteratorPrototypeAccessor(CONSTRUCTOR, IteratorConstructor); +} + +IteratorConstructor.prototype = IteratorPrototype; + +// `Iterator` constructor +// https://tc39.es/ecma262/#sec-iterator +$({ global: true, constructor: true, forced: FORCED }, { + Iterator: IteratorConstructor +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.iterator.every.js +var es_iterator_every_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var call = (function_call_namespaceFn()); +var iterate = (iterate_namespaceFn()); +var aCallable = (a_callable_namespaceFn()); +var anObject = (an_object_namespaceFn()); +var getIteratorDirect = (get_iterator_direct_namespaceFn()); +var iteratorClose = (iterator_close_namespaceFn()); +var iteratorHelperWithoutClosingOnEarlyError = (iterator_helper_without_closing_on_early_error_namespaceFn()); + +var everyWithoutClosingOnEarlyError = iteratorHelperWithoutClosingOnEarlyError('every', TypeError); + +// `Iterator.prototype.every` method +// https://tc39.es/ecma262/#sec-iterator.prototype.every +$({ target: 'Iterator', proto: true, real: true, forced: everyWithoutClosingOnEarlyError }, { + every: function every(predicate) { + anObject(this); + try { + aCallable(predicate); + } catch (error) { + iteratorClose(this, 'throw', error); + } + + if (everyWithoutClosingOnEarlyError) return call(everyWithoutClosingOnEarlyError, this, predicate); + + var record = getIteratorDirect(this); + var counter = 0; + return !iterate(record, function (value, stop) { + if (!predicate(value, counter++)) return stop(); + }, { IS_RECORD: true, INTERRUPTED: true }).stopped; + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.iterator.filter.js +var es_iterator_filter_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var call = (function_call_namespaceFn()); +var aCallable = (a_callable_namespaceFn()); +var anObject = (an_object_namespaceFn()); +var getIteratorDirect = (get_iterator_direct_namespaceFn()); +var createIteratorProxy = (iterator_create_proxy_namespaceFn()); +var callWithSafeIterationClosing = (call_with_safe_iteration_closing_namespaceFn()); +var IS_PURE = (is_pure_namespaceFn()); +var iteratorClose = (iterator_close_namespaceFn()); +var iteratorHelperThrowsOnInvalidIterator = (iterator_helper_throws_on_invalid_iterator_namespaceFn()); +var iteratorHelperWithoutClosingOnEarlyError = (iterator_helper_without_closing_on_early_error_namespaceFn()); + +var FILTER_WITHOUT_THROWING_ON_INVALID_ITERATOR = !IS_PURE && !iteratorHelperThrowsOnInvalidIterator('filter', function () { /* empty */ }); +var filterWithoutClosingOnEarlyError = !IS_PURE && !FILTER_WITHOUT_THROWING_ON_INVALID_ITERATOR + && iteratorHelperWithoutClosingOnEarlyError('filter', TypeError); + +var FORCED = IS_PURE || FILTER_WITHOUT_THROWING_ON_INVALID_ITERATOR || filterWithoutClosingOnEarlyError; + +var IteratorProxy = createIteratorProxy(function () { + var iterator = this.iterator; + var predicate = this.predicate; + var next = this.next; + var result, done, value; + while (true) { + result = anObject(call(next, iterator)); + done = this.done = !!result.done; + if (done) return; + value = result.value; + if (callWithSafeIterationClosing(iterator, predicate, [value, this.counter++], true)) return value; + } +}); + +// `Iterator.prototype.filter` method +// https://tc39.es/ecma262/#sec-iterator.prototype.filter +$({ target: 'Iterator', proto: true, real: true, forced: FORCED }, { + filter: function filter(predicate) { + anObject(this); + try { + aCallable(predicate); + } catch (error) { + iteratorClose(this, 'throw', error); + } + + if (filterWithoutClosingOnEarlyError) return call(filterWithoutClosingOnEarlyError, this, predicate); + + return new IteratorProxy(getIteratorDirect(this), { + predicate: predicate + }); + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.iterator.find.js +var es_iterator_find_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var call = (function_call_namespaceFn()); +var iterate = (iterate_namespaceFn()); +var aCallable = (a_callable_namespaceFn()); +var anObject = (an_object_namespaceFn()); +var getIteratorDirect = (get_iterator_direct_namespaceFn()); +var iteratorClose = (iterator_close_namespaceFn()); +var iteratorHelperWithoutClosingOnEarlyError = (iterator_helper_without_closing_on_early_error_namespaceFn()); + +var findWithoutClosingOnEarlyError = iteratorHelperWithoutClosingOnEarlyError('find', TypeError); + +// `Iterator.prototype.find` method +// https://tc39.es/ecma262/#sec-iterator.prototype.find +$({ target: 'Iterator', proto: true, real: true, forced: findWithoutClosingOnEarlyError }, { + find: function find(predicate) { + anObject(this); + try { + aCallable(predicate); + } catch (error) { + iteratorClose(this, 'throw', error); + } + + if (findWithoutClosingOnEarlyError) return call(findWithoutClosingOnEarlyError, this, predicate); + + var record = getIteratorDirect(this); + var counter = 0; + return iterate(record, function (value, stop) { + if (predicate(value, counter++)) return stop(value); + }, { IS_RECORD: true, INTERRUPTED: true }).result; + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.iterator.for-each.js +var es_iterator_for_each_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var call = (function_call_namespaceFn()); +var iterate = (iterate_namespaceFn()); +var aCallable = (a_callable_namespaceFn()); +var anObject = (an_object_namespaceFn()); +var getIteratorDirect = (get_iterator_direct_namespaceFn()); +var iteratorClose = (iterator_close_namespaceFn()); +var iteratorHelperWithoutClosingOnEarlyError = (iterator_helper_without_closing_on_early_error_namespaceFn()); + +var forEachWithoutClosingOnEarlyError = iteratorHelperWithoutClosingOnEarlyError('forEach', TypeError); + +// `Iterator.prototype.forEach` method +// https://tc39.es/ecma262/#sec-iterator.prototype.foreach +$({ target: 'Iterator', proto: true, real: true, forced: forEachWithoutClosingOnEarlyError }, { + forEach: function forEach(fn) { + anObject(this); + try { + aCallable(fn); + } catch (error) { + iteratorClose(this, 'throw', error); + } + + if (forEachWithoutClosingOnEarlyError) return call(forEachWithoutClosingOnEarlyError, this, fn); + + var record = getIteratorDirect(this); + var counter = 0; + iterate(record, function (value) { + fn(value, counter++); + }, { IS_RECORD: true }); + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.iterator.map.js +var es_iterator_map_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var call = (function_call_namespaceFn()); +var aCallable = (a_callable_namespaceFn()); +var anObject = (an_object_namespaceFn()); +var getIteratorDirect = (get_iterator_direct_namespaceFn()); +var createIteratorProxy = (iterator_create_proxy_namespaceFn()); +var callWithSafeIterationClosing = (call_with_safe_iteration_closing_namespaceFn()); +var iteratorClose = (iterator_close_namespaceFn()); +var iteratorHelperThrowsOnInvalidIterator = (iterator_helper_throws_on_invalid_iterator_namespaceFn()); +var iteratorHelperWithoutClosingOnEarlyError = (iterator_helper_without_closing_on_early_error_namespaceFn()); +var IS_PURE = (is_pure_namespaceFn()); + +var MAP_WITHOUT_THROWING_ON_INVALID_ITERATOR = !IS_PURE && !iteratorHelperThrowsOnInvalidIterator('map', function () { /* empty */ }); +var mapWithoutClosingOnEarlyError = !IS_PURE && !MAP_WITHOUT_THROWING_ON_INVALID_ITERATOR + && iteratorHelperWithoutClosingOnEarlyError('map', TypeError); + +var FORCED = IS_PURE || MAP_WITHOUT_THROWING_ON_INVALID_ITERATOR || mapWithoutClosingOnEarlyError; + +var IteratorProxy = createIteratorProxy(function () { + var iterator = this.iterator; + var result = anObject(call(this.next, iterator)); + var done = this.done = !!result.done; + if (!done) return callWithSafeIterationClosing(iterator, this.mapper, [result.value, this.counter++], true); +}); + +// `Iterator.prototype.map` method +// https://tc39.es/ecma262/#sec-iterator.prototype.map +$({ target: 'Iterator', proto: true, real: true, forced: FORCED }, { + map: function map(mapper) { + anObject(this); + try { + aCallable(mapper); + } catch (error) { + iteratorClose(this, 'throw', error); + } + + if (mapWithoutClosingOnEarlyError) return call(mapWithoutClosingOnEarlyError, this, mapper); + + return new IteratorProxy(getIteratorDirect(this), { + mapper: mapper + }); + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.iterator.some.js +var es_iterator_some_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var call = (function_call_namespaceFn()); +var iterate = (iterate_namespaceFn()); +var aCallable = (a_callable_namespaceFn()); +var anObject = (an_object_namespaceFn()); +var getIteratorDirect = (get_iterator_direct_namespaceFn()); +var iteratorClose = (iterator_close_namespaceFn()); +var iteratorHelperWithoutClosingOnEarlyError = (iterator_helper_without_closing_on_early_error_namespaceFn()); + +var someWithoutClosingOnEarlyError = iteratorHelperWithoutClosingOnEarlyError('some', TypeError); + +// `Iterator.prototype.some` method +// https://tc39.es/ecma262/#sec-iterator.prototype.some +$({ target: 'Iterator', proto: true, real: true, forced: someWithoutClosingOnEarlyError }, { + some: function some(predicate) { + anObject(this); + try { + aCallable(predicate); + } catch (error) { + iteratorClose(this, 'throw', error); + } + + if (someWithoutClosingOnEarlyError) return call(someWithoutClosingOnEarlyError, this, predicate); + + var record = getIteratorDirect(this); + var counter = 0; + return iterate(record, function (value, stop) { + if (predicate(value, counter++)) return stop(); + }, { IS_RECORD: true, INTERRUPTED: true }).stopped; + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.json.parse.js +var es_json_parse_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var DESCRIPTORS = (descriptors_namespaceFn()); +var globalThis = (global_this_namespaceFn()); +var getBuiltIn = (get_built_in_namespaceFn()); +var uncurryThis = (function_uncurry_this_namespaceFn()); +var call = (function_call_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); +var isObject = (is_object_namespaceFn()); +var isArray = (is_array_namespaceFn()); +var hasOwn = (has_own_property_namespaceFn()); +var toString = (to_string_namespaceFn()); +var lengthOfArrayLike = (length_of_array_like_namespaceFn()); +var createProperty = (create_property_namespaceFn()); +var fails = (fails_namespaceFn()); +var parseJSONString = (parse_json_string_namespaceFn()); +var NATIVE_SYMBOL = (symbol_constructor_detection_namespaceFn()); + +var JSON = globalThis.JSON; +var Number = globalThis.Number; +var SyntaxError = globalThis.SyntaxError; +var nativeParse = JSON && JSON.parse; +var enumerableOwnProperties = getBuiltIn('Object', 'keys'); +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; +var at = uncurryThis(''.charAt); +var slice = uncurryThis(''.slice); +var exec = uncurryThis(/./.exec); +var push = uncurryThis([].push); + +var IS_DIGIT = /^\d$/; +var IS_NON_ZERO_DIGIT = /^[1-9]$/; +var IS_NUMBER_START = /^[\d-]$/; +var IS_WHITESPACE = /^[\t\n\r ]$/; + +var PRIMITIVE = 0; +var OBJECT = 1; + +var $parse = function (source, reviver) { + source = toString(source); + var context = new Context(source, 0); + var root = context.parse(); + var value = root.value; + var endIndex = context.skip(IS_WHITESPACE, root.end); + if (endIndex < source.length) { + throw new SyntaxError('Unexpected extra character: "' + at(source, endIndex) + '" after the parsed data at: ' + endIndex); + } + return isCallable(reviver) ? internalize({ '': value }, '', reviver, root) : value; +}; + +var internalize = function (holder, name, reviver, node) { + var val = holder[name]; + var unmodified = node && val === node.value; + var context = unmodified && typeof node.source == 'string' ? { source: node.source } : {}; + var elementRecordsLen, keys, len, i, P; + if (isObject(val)) { + var nodeIsArray = isArray(val); + var nodes = unmodified ? node.nodes : nodeIsArray ? [] : {}; + if (nodeIsArray) { + elementRecordsLen = nodes.length; + len = lengthOfArrayLike(val); + for (i = 0; i < len; i++) { + internalizeProperty(val, i, internalize(val, '' + i, reviver, i < elementRecordsLen ? nodes[i] : undefined)); + } + } else { + keys = enumerableOwnProperties(val); + len = lengthOfArrayLike(keys); + for (i = 0; i < len; i++) { + P = keys[i]; + internalizeProperty(val, P, internalize(val, P, reviver, hasOwn(nodes, P) ? nodes[P] : undefined)); + } + } + } + return call(reviver, holder, name, val, context); +}; + +var internalizeProperty = function (object, key, value) { + if (DESCRIPTORS) { + var descriptor = getOwnPropertyDescriptor(object, key); + if (descriptor && !descriptor.configurable) return; + } + if (value === undefined) delete object[key]; + else createProperty(object, key, value); +}; + +var Node = function (value, end, source, nodes) { + this.value = value; + this.end = end; + this.source = source; + this.nodes = nodes; +}; + +var Context = function (source, index) { + this.source = source; + this.index = index; +}; + +// https://www.json.org/json-en.html +Context.prototype = { + fork: function (nextIndex) { + return new Context(this.source, nextIndex); + }, + parse: function () { + var source = this.source; + var i = this.skip(IS_WHITESPACE, this.index); + var fork = this.fork(i); + var chr = at(source, i); + if (exec(IS_NUMBER_START, chr)) return fork.number(); + switch (chr) { + case '{': + return fork.object(); + case '[': + return fork.array(); + case '"': + return fork.string(); + case 't': + return fork.keyword(true); + case 'f': + return fork.keyword(false); + case 'n': + return fork.keyword(null); + } throw new SyntaxError('Unexpected character: "' + chr + '" at: ' + i); + }, + node: function (type, value, start, end, nodes) { + return new Node(value, end, type ? null : slice(this.source, start, end), nodes); + }, + object: function () { + var source = this.source; + var i = this.index + 1; + var expectKeypair = false; + var object = {}; + var nodes = {}; + var closed = false; + while (i < source.length) { + i = this.until(['"', '}'], i); + if (at(source, i) === '}' && !expectKeypair) { + i++; + closed = true; + break; + } + // Parsing the key + var result = this.fork(i).string(); + var key = result.value; + i = result.end; + i = this.until([':'], i) + 1; + // Parsing value + i = this.skip(IS_WHITESPACE, i); + result = this.fork(i).parse(); + createProperty(nodes, key, result); + createProperty(object, key, result.value); + i = this.until([',', '}'], result.end); + var chr = at(source, i); + if (chr === ',') { + expectKeypair = true; + i++; + } else if (chr === '}') { + i++; + closed = true; + break; + } + } + if (!closed) throw new SyntaxError('Unterminated object at: ' + i); + return this.node(OBJECT, object, this.index, i, nodes); + }, + array: function () { + var source = this.source; + var i = this.index + 1; + var expectElement = false; + var array = []; + var nodes = []; + var closed = false; + while (i < source.length) { + i = this.skip(IS_WHITESPACE, i); + if (at(source, i) === ']' && !expectElement) { + i++; + closed = true; + break; + } + var result = this.fork(i).parse(); + push(nodes, result); + push(array, result.value); + i = this.until([',', ']'], result.end); + if (at(source, i) === ',') { + expectElement = true; + i++; + } else if (at(source, i) === ']') { + i++; + closed = true; + break; + } + } + if (!closed) throw new SyntaxError('Unterminated array at: ' + i); + return this.node(OBJECT, array, this.index, i, nodes); + }, + string: function () { + var index = this.index; + var parsed = parseJSONString(this.source, this.index + 1); + return this.node(PRIMITIVE, parsed.value, index, parsed.end); + }, + number: function () { + var source = this.source; + var startIndex = this.index; + var i = startIndex; + if (at(source, i) === '-') i++; + if (at(source, i) === '0') i++; + else if (exec(IS_NON_ZERO_DIGIT, at(source, i))) i = this.skip(IS_DIGIT, i + 1); + else throw new SyntaxError('Failed to parse number at: ' + i); + if (at(source, i) === '.') { + var fractionStartIndex = i + 1; + i = this.skip(IS_DIGIT, fractionStartIndex); + if (fractionStartIndex === i) throw new SyntaxError("Failed to parse number's fraction at: " + i); + } + if (at(source, i) === 'e' || at(source, i) === 'E') { + i++; + if (at(source, i) === '+' || at(source, i) === '-') i++; + var exponentStartIndex = i; + i = this.skip(IS_DIGIT, i); + if (exponentStartIndex === i) throw new SyntaxError("Failed to parse number's exponent value at: " + i); + } + return this.node(PRIMITIVE, Number(slice(source, startIndex, i)), startIndex, i); + }, + keyword: function (value) { + var keyword = '' + value; + var index = this.index; + var endIndex = index + keyword.length; + if (slice(this.source, index, endIndex) !== keyword) throw new SyntaxError('Failed to parse value at: ' + index); + return this.node(PRIMITIVE, value, index, endIndex); + }, + skip: function (regex, i) { + var source = this.source; + for (; i < source.length; i++) if (!exec(regex, at(source, i))) break; + return i; + }, + until: function (array, i) { + i = this.skip(IS_WHITESPACE, i); + var chr = at(this.source, i); + for (var j = 0; j < array.length; j++) if (array[j] === chr) return i; + throw new SyntaxError('Unexpected character: "' + chr + '" at: ' + i); + } +}; + +var NO_SOURCE_SUPPORT = fails(function () { + var unsafeInt = '9007199254740993'; + var source; + nativeParse(unsafeInt, function (key, value, context) { + source = context.source; + }); + return source !== unsafeInt; +}); + +var PROPER_BASE_PARSE = NATIVE_SYMBOL && !fails(function () { + // Safari 9 bug + return 1 / nativeParse('-0 \t') !== -Infinity; +}); + +// `JSON.parse` method +// https://tc39.es/ecma262/#sec-json.parse +// https://github.com/tc39/proposal-json-parse-with-source +$({ target: 'JSON', stat: true, forced: NO_SOURCE_SUPPORT }, { + parse: function parse(text, reviver) { + return PROPER_BASE_PARSE && !isCallable(reviver) ? nativeParse(text) : $parse(text, reviver); + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.json.stringify.js +var es_json_stringify_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var getBuiltIn = (get_built_in_namespaceFn()); +var call = (function_call_namespaceFn()); +var uncurryThis = (function_uncurry_this_namespaceFn()); +var fails = (fails_namespaceFn()); +var isArray = (is_array_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); +var isObject = (is_object_namespaceFn()); +var create = (object_create_namespaceFn()); +var isRawJSON = (is_raw_json_namespaceFn()); +var isSymbol = (is_symbol_namespaceFn()); +var classof = (classof_raw_namespaceFn()); +var thisNumberValue = (this_number_value_namespaceFn()); +var includes = (array_includes_namespaceFn().includes); +var hasOwn = (has_own_property_namespaceFn()); +var toString = (to_string_namespaceFn()); +var parseJSONString = (parse_json_string_namespaceFn()); +var uid = (uid_namespaceFn()); +var NATIVE_SYMBOL = (symbol_constructor_detection_namespaceFn()); +var NATIVE_RAW_JSON = (native_raw_json_namespaceFn()); + +var $String = String; +var $TypeError = TypeError; +var $stringify = getBuiltIn('JSON', 'stringify'); +var $BigInt = getBuiltIn('BigInt'); +var stringValueOf = uncurryThis(''.valueOf); +var booleanValueOf = uncurryThis(true.valueOf); +var bigIntValueOf = $BigInt && uncurryThis($BigInt.prototype.valueOf); +var exec = uncurryThis(/./.exec); +var charAt = uncurryThis(''.charAt); +var charCodeAt = uncurryThis(''.charCodeAt); +var replace = uncurryThis(''.replace); +var slice = uncurryThis(''.slice); +var push = uncurryThis([].push); +var pop = uncurryThis([].pop); +var numberToString = uncurryThis(1.1.toString); + +var surrogates = /[\uD800-\uDFFF]/g; +var leadingSurrogates = /^[\uD800-\uDBFF]$/; +var trailingSurrogates = /^[\uDC00-\uDFFF]$/; +var digits = /^\d+$/; + +// a placeholder of a raw JSON value +var RAW_MARK = uid(); +// a prefix of keys of a reordered object, see `createOrderedObject` +var KEY_MARK = uid(); +// the last key of a reordered object, marks the end of its serialization +var END_MARK = uid(); +var RAW_MARK_LENGTH = RAW_MARK.length; +var KEY_MARK_LENGTH = KEY_MARK.length; + +var WRONG_SYMBOLS_CONVERSION = !NATIVE_SYMBOL || fails(function () { + var symbol = getBuiltIn('Symbol')('stringify detection'); + // MS Edge converts symbol values to JSON as {} + return $stringify([symbol]) !== '[null]' + // WebKit converts symbol values to JSON as null + || $stringify({ a: symbol }) !== '{}' + // V8 throws on boxed symbols + || $stringify(Object(symbol)) !== '{}'; +}); + +// https://github.com/tc39/proposal-well-formed-stringify +var ILL_FORMED_UNICODE = fails(function () { + return $stringify('\uDF06\uD834') !== '"\\udf06\\ud834"' + || $stringify('\uDEAD') !== '"\\udead"'; +}); + +var isRawJSONValue = NATIVE_RAW_JSON ? getBuiltIn('JSON', 'isRawJSON') : isRawJSON; + +var stringifyWithProperSymbolsConversion = WRONG_SYMBOLS_CONVERSION ? function (it, replacer, space) { + return $stringify(it, function (key, value) { + var replaced = call(replacer, this, key, value); + if (!isSymbol(replaced)) return replaced; + }, space); +} : $stringify; + +var fixIllFormedJSON = function (match, offset, string) { + var prev = charAt(string, offset - 1); + var next = charAt(string, offset + 1); + if ( + (exec(leadingSurrogates, match) && !exec(trailingSurrogates, next)) || + (exec(trailingSurrogates, match) && !exec(leadingSurrogates, prev)) + ) { + return '\\u' + numberToString(charCodeAt(match, 0), 16); + } return match; +}; + +// `PropertyList` of `JSON.stringify` +// https://tc39.es/ecma262/#sec-json.stringify +var getPropertyList = function (replacer) { + if (!isArray(replacer)) return; + var rawLength = replacer.length; + var propertyList = []; + // a null prototype object is used as a set of already added keys to keep the deduplication linear + var addedKeys = create(null); + for (var i = 0; i < rawLength; i++) { + var element = replacer[i]; + var key; + if (typeof element == 'string') key = element; + else if (typeof element == 'number' || classof(element) === 'Number' || classof(element) === 'String') key = toString(element); + else continue; + if (!hasOwn(addedKeys, key)) { + addedKeys[key] = true; + push(propertyList, key); + } + } + return propertyList; +}; + +// values with such an internal slot are unwrapped by `SerializeJSONProperty` instead of being serialized as objects +var hasInternalSlot = function (valueOf, it) { + try { + valueOf(it); + return true; + } catch (error) { + return false; + } +}; + +// the slot check is expensive, so it's performed only for the kind reported by the value itself - +// a value lying about its kind via `Symbol.toStringTag` is serialized as an ordinary object +var isBoxedPrimitive = function (it) { + var kind = classof(it); + return (kind === 'Number' && hasInternalSlot(thisNumberValue, it)) + || (kind === 'String' && hasInternalSlot(stringValueOf, it)) + || (kind === 'Boolean' && hasInternalSlot(booleanValueOf, it)) + || (!!bigIntValueOf && kind === 'BigInt' && hasInternalSlot(bigIntValueOf, it)); +}; + +// only objects serialized by `SerializeJSONObject` are affected by the property list +var isSerializedAsObject = function (it) { + if (!isObject(it) || isCallable(it) || isArray(it)) return false; + try { + return !isBoxedPrimitive(it); + // `classof` reads `Symbol.toStringTag`, so a proxy could throw - it has no internal slots anyway + } catch (error) { + return true; + } +}; + +// the engine unwraps it in the same order as it would read the original property, +// so the property is read lazily and `toJSON` is called once and with the original key +var createElementHolder = function (holder, key) { + return { + toJSON: function () { + var element = holder[key]; + if (isObject(element) || typeof element == 'bigint') { + var elementToJSON = element.toJSON; + if (isCallable(elementToJSON)) element = call(elementToJSON, element, key); + } return element; + } + }; +}; + +// own keys of objects are sorted - integer-like keys are moved to the beginning, +// so such keys should be marked and restored in the serialized string +var getKeyPrefix = function (propertyList) { + for (var i = 0, length = propertyList.length; i < length; i++) { + if (exec(digits, propertyList[i])) return KEY_MARK; + } return ''; +}; + +// `SerializeJSONObject` iterates the property list, so the value is replaced with an object with keys in this order +var createOrderedObject = function (value, propertyList, keyPrefix) { + // keys are not marked if the property list has no integer-like keys, so `Object.prototype` + // with a setter, a non-writable property or `__proto__` should not intercept the assignment + var ordered = create(null); + for (var i = 0, length = propertyList.length; i < length; i++) { + var key = propertyList[i]; + ordered[keyPrefix + key] = createElementHolder(value, key); + } + ordered[END_MARK] = null; + return ordered; +}; + +// `JSON.stringify` method +// https://tc39.es/ecma262/#sec-json.stringify +// https://github.com/tc39/proposal-json-parse-with-source +if ($stringify) $({ target: 'JSON', stat: true, arity: 3, forced: WRONG_SYMBOLS_CONVERSION || ILL_FORMED_UNICODE || !NATIVE_RAW_JSON }, { + stringify: function stringify(text, replacer, space) { + var replacerFunction = isCallable(replacer) ? replacer : undefined; + var propertyList = replacerFunction ? undefined : getPropertyList(replacer); + var keyPrefix = propertyList && getKeyPrefix(propertyList); + var rawStrings = []; + var openObjects = []; + var parentOrdered = []; + var currentOrdered; + var marked = false; + var root = true; + + var json = stringifyWithProperSymbolsConversion(text, function (key, value) { + // some old implementations (like WebKit) could pass numbers as keys + key = $String(key); + + if (propertyList) { + if (key === END_MARK) { + pop(openObjects); + currentOrdered = pop(parentOrdered); + return; + } + if (root) root = false; + // the innermost reordered object already contains only keys of the property list and arrays are not + // affected by it, the rest of objects (like objects with a fake `Symbol.toStringTag`) are filtered here + else if (this !== currentOrdered && !isArray(this) && !includes(propertyList, key)) return; + } else if (replacerFunction) value = call(replacerFunction, this, key, value); + + if (isRawJSONValue(value)) { + if (NATIVE_RAW_JSON) return value; + marked = true; + return RAW_MARK + (push(rawStrings, value.rawJSON) - 1); + } + + if (propertyList && isSerializedAsObject(value)) { + // reordered objects are new each time, so cycles should be detected before the engine does it + if (includes(openObjects, value)) throw new $TypeError('Converting circular structure to JSON'); + var ordered = createOrderedObject(value, propertyList, keyPrefix); + push(openObjects, value); + push(parentOrdered, currentOrdered); + currentOrdered = ordered; + if (keyPrefix) marked = true; + return ordered; + } + + return value; + }, space); + + if (typeof json != 'string') return json; + + if (ILL_FORMED_UNICODE) json = replace(json, surrogates, fixIllFormedJSON); + + if (!marked) return json; + + var result = ''; + var length = json.length; + + for (var i = 0; i < length; i++) { + var chr = charAt(json, i); + if (chr === '"') { + var end = parseJSONString(json, ++i).end - 1; + var string = slice(json, i, end); + if (slice(string, 0, RAW_MARK_LENGTH) === RAW_MARK) result += rawStrings[slice(string, RAW_MARK_LENGTH)]; + else if (slice(string, 0, KEY_MARK_LENGTH) === KEY_MARK) result += '"' + slice(string, KEY_MARK_LENGTH) + '"'; + else result += '"' + string + '"'; + i = end; + } else result += chr; + } + + return result; + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.map.get-or-insert-computed.js +var es_map_get_or_insert_computed_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var aCallable = (a_callable_namespaceFn()); +var MapHelpers = (map_helpers_namespaceFn()); +var IS_PURE = (is_pure_namespaceFn()); + +var get = MapHelpers.get; +var has = MapHelpers.has; +var set = MapHelpers.set; + +// `Map.prototype.getOrInsertComputed` method +// https://tc39.es/ecma262/#sec-map.prototype.getorinsertcomputed +$({ target: 'Map', proto: true, real: true, forced: IS_PURE }, { + getOrInsertComputed: function getOrInsertComputed(key, callbackfn) { + var hasKey = has(this, key); + aCallable(callbackfn); + if (hasKey) return get(this, key); + // CanonicalizeKeyedCollectionKey + if (key === 0 && 1 / key === -Infinity) key = 0; + var value = callbackfn(key); + set(this, key, value); + return value; + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.map.get-or-insert.js +var es_map_get_or_insert_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var MapHelpers = (map_helpers_namespaceFn()); +var IS_PURE = (is_pure_namespaceFn()); + +var get = MapHelpers.get; +var has = MapHelpers.has; +var set = MapHelpers.set; + +// `Map.prototype.getOrInsert` method +// https://tc39.es/ecma262/#sec-map.prototype.getorinsert +$({ target: 'Map', proto: true, real: true, forced: IS_PURE }, { + getOrInsert: function getOrInsert(key, value) { + if (has(this, key)) return get(this, key); + set(this, key, value); + return value; + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.regexp.escape.js +var es_regexp_escape_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var uncurryThis = (function_uncurry_this_namespaceFn()); +var aString = (a_string_namespaceFn()); +var hasOwn = (has_own_property_namespaceFn()); +var padStart = (string_pad_namespaceFn().start); +var WHITESPACES = (whitespaces_namespaceFn()); + +var $Array = Array; +var $escape = RegExp.escape; +var charAt = uncurryThis(''.charAt); +var charCodeAt = uncurryThis(''.charCodeAt); +var numberToString = uncurryThis(1.1.toString); +var join = uncurryThis([].join); +var FIRST_DIGIT_OR_ASCII = /^[0-9a-z]/i; +var SYNTAX_SOLIDUS = /^[$()*+./?[\\\]^{|}]/; +var OTHER_PUNCTUATORS_AND_WHITESPACES = RegExp('^[!"#%&\',\\-:;<=>@`~' + WHITESPACES + ']'); +var exec = uncurryThis(FIRST_DIGIT_OR_ASCII.exec); + +var ControlEscape = { + '\u0009': 't', + '\u000A': 'n', + '\u000B': 'v', + '\u000C': 'f', + '\u000D': 'r' +}; + +var escapeChar = function (chr) { + var hex = numberToString(charCodeAt(chr, 0), 16); + return hex.length < 3 ? '\\x' + padStart(hex, 2, '0') : '\\u' + padStart(hex, 4, '0'); +}; + +// Avoiding the use of polyfills of the previous iteration of this proposal +var FORCED = !$escape || $escape('ab') !== '\\x61b'; + +// `RegExp.escape` method +// https://tc39.es/ecma262/#sec-regexp.escape +$({ target: 'RegExp', stat: true, forced: FORCED }, { + escape: function escape(S) { + aString(S); + var length = S.length; + var result = $Array(length); + + for (var i = 0; i < length; i++) { + var chr = charAt(S, i); + if (i === 0 && exec(FIRST_DIGIT_OR_ASCII, chr)) { + result[i] = escapeChar(chr); + } else if (hasOwn(ControlEscape, chr)) { + result[i] = '\\' + ControlEscape[chr]; + } else if (exec(SYNTAX_SOLIDUS, chr)) { + result[i] = '\\' + chr; + } else if (exec(OTHER_PUNCTUATORS_AND_WHITESPACES, chr)) { + result[i] = escapeChar(chr); + } else { + var charCode = charCodeAt(chr, 0); + // single UTF-16 code unit + if ((charCode & 0xF800) !== 0xD800) result[i] = chr; + // unpaired surrogate + else if (charCode >= 0xDC00 || i + 1 >= length || (charCodeAt(S, i + 1) & 0xFC00) !== 0xDC00) result[i] = escapeChar(chr); + // surrogate pair + else { + result[i] = chr; + result[++i] = charAt(S, i); + } + } + } + + return join(result, ''); + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.set.difference.v2.js +var es_set_difference_v2_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var difference = (set_difference_namespaceFn()); +var fails = (fails_namespaceFn()); +var setMethodAcceptSetLike = (set_method_accept_set_like_namespaceFn()); + +var SET_LIKE_INCORRECT_BEHAVIOR = !setMethodAcceptSetLike('difference', function (result) { + return result.size === 0; +}); + +var FORCED = SET_LIKE_INCORRECT_BEHAVIOR || fails(function () { + // https://bugs.webkit.org/show_bug.cgi?id=288595 + var setLike = { + size: 1, + has: function () { return true; }, + keys: function () { + var index = 0; + return { + next: function () { + var done = index++ > 1; + if (baseSet.has(1)) baseSet.clear(); + return { done: done, value: 2 }; + } + }; + } + }; + // eslint-disable-next-line es/no-set -- testing + var baseSet = new Set([1, 2, 3, 4]); + // eslint-disable-next-line es/no-set-prototype-difference -- testing + return baseSet.difference(setLike).size !== 3; +}); + +// `Set.prototype.difference` method +// https://tc39.es/ecma262/#sec-set.prototype.difference +$({ target: 'Set', proto: true, real: true, forced: FORCED }, { + difference: difference +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.set.intersection.v2.js +var es_set_intersection_v2_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var fails = (fails_namespaceFn()); +var intersection = (set_intersection_namespaceFn()); +var setMethodAcceptSetLike = (set_method_accept_set_like_namespaceFn()); + +var INCORRECT = !setMethodAcceptSetLike('intersection', function (result) { + return result.size === 2 && result.has(1) && result.has(2); +}) || fails(function () { + // eslint-disable-next-line es/no-array-from, es/no-set, es/no-set-prototype-intersection -- testing + return String(Array.from(new Set([1, 2, 3]).intersection(new Set([3, 2])))) !== '3,2'; +}); + +// `Set.prototype.intersection` method +// https://tc39.es/ecma262/#sec-set.prototype.intersection +$({ target: 'Set', proto: true, real: true, forced: INCORRECT }, { + intersection: intersection +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.set.is-disjoint-from.v2.js +var es_set_is_disjoint_from_v2_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var isDisjointFrom = (set_is_disjoint_from_namespaceFn()); +var setMethodAcceptSetLike = (set_method_accept_set_like_namespaceFn()); + +var INCORRECT = !setMethodAcceptSetLike('isDisjointFrom', function (result) { + return !result; +}); + +// `Set.prototype.isDisjointFrom` method +// https://tc39.es/ecma262/#sec-set.prototype.isdisjointfrom +$({ target: 'Set', proto: true, real: true, forced: INCORRECT }, { + isDisjointFrom: isDisjointFrom +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.set.is-subset-of.v2.js +var es_set_is_subset_of_v2_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var isSubsetOf = (set_is_subset_of_namespaceFn()); +var setMethodAcceptSetLike = (set_method_accept_set_like_namespaceFn()); + +var INCORRECT = !setMethodAcceptSetLike('isSubsetOf', function (result) { + return result; +}); + +// `Set.prototype.isSubsetOf` method +// https://tc39.es/ecma262/#sec-set.prototype.issubsetof +$({ target: 'Set', proto: true, real: true, forced: INCORRECT }, { + isSubsetOf: isSubsetOf +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.set.is-superset-of.v2.js +var es_set_is_superset_of_v2_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var isSupersetOf = (set_is_superset_of_namespaceFn()); +var setMethodAcceptSetLike = (set_method_accept_set_like_namespaceFn()); + +var INCORRECT = !setMethodAcceptSetLike('isSupersetOf', function (result) { + return !result; +}); + +// `Set.prototype.isSupersetOf` method +// https://tc39.es/ecma262/#sec-set.prototype.issupersetof +$({ target: 'Set', proto: true, real: true, forced: INCORRECT }, { + isSupersetOf: isSupersetOf +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.set.symmetric-difference.v2.js +var es_set_symmetric_difference_v2_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var symmetricDifference = (set_symmetric_difference_namespaceFn()); +var setMethodGetKeysBeforeCloning = (set_method_get_keys_before_cloning_detection_namespaceFn()); +var setMethodAcceptSetLike = (set_method_accept_set_like_namespaceFn()); + +var FORCED = !setMethodAcceptSetLike('symmetricDifference') || !setMethodGetKeysBeforeCloning('symmetricDifference'); + +// `Set.prototype.symmetricDifference` method +// https://tc39.es/ecma262/#sec-set.prototype.symmetricdifference +$({ target: 'Set', proto: true, real: true, forced: FORCED }, { + symmetricDifference: symmetricDifference +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.set.union.v2.js +var es_set_union_v2_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var union = (set_union_namespaceFn()); +var setMethodGetKeysBeforeCloning = (set_method_get_keys_before_cloning_detection_namespaceFn()); +var setMethodAcceptSetLike = (set_method_accept_set_like_namespaceFn()); + +var FORCED = !setMethodAcceptSetLike('union') || !setMethodGetKeysBeforeCloning('union'); + +// `Set.prototype.union` method +// https://tc39.es/ecma262/#sec-set.prototype.union +$({ target: 'Set', proto: true, real: true, forced: FORCED }, { + union: union +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.typed-array.with.js +var es_typed_array_with_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var ArrayBufferViewCore = (array_buffer_view_core_namespaceFn()); +var isBigIntArray = (is_big_int_array_namespaceFn()); +var lengthOfArrayLike = (length_of_array_like_namespaceFn()); +var toIntegerOrInfinity = (to_integer_or_infinity_namespaceFn()); +var toBigInt = (to_big_int_namespaceFn()); + +var aTypedArray = ArrayBufferViewCore.aTypedArray; +var getTypedArrayConstructor = ArrayBufferViewCore.getTypedArrayConstructor; +var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod; + +var $RangeError = RangeError; + +var PROPER_ORDER = function () { + try { + // eslint-disable-next-line no-throw-literal, es/no-typed-arrays, es/no-array-prototype-with -- required for testing + new Int8Array(1)['with'](2, { valueOf: function () { throw 8; } }); + } catch (error) { + // some early implementations, like WebKit, does not follow the final semantic + // https://github.com/tc39/proposal-change-array-by-copy/pull/86 + return error === 8; + } +}(); + +// Bug in WebKit. It should truncate a negative fractional index to zero, but instead throws an error +var THROW_ON_NEGATIVE_FRACTIONAL_INDEX = PROPER_ORDER && function () { + try { + // eslint-disable-next-line es/no-typed-arrays, es/no-array-prototype-with -- required for testing + new Int8Array(1)['with'](-0.5, 1); + } catch (error) { + return true; + } +}(); + +// `%TypedArray%.prototype.with` method +// https://tc39.es/ecma262/#sec-%typedarray%.prototype.with +exportTypedArrayMethod('with', { 'with': function (index, value) { + var O = aTypedArray(this); + var len = lengthOfArrayLike(O); + var relativeIndex = toIntegerOrInfinity(index); + var actualIndex = relativeIndex < 0 ? len + relativeIndex : relativeIndex; + var numericValue = isBigIntArray(O) ? toBigInt(value) : +value; + if (actualIndex >= len || actualIndex < 0) throw new $RangeError('Incorrect index'); + var A = new (getTypedArrayConstructor(O))(len); + var k = 0; + for (; k < len; k++) A[k] = k === actualIndex ? numericValue : O[k]; + return A; +} }['with'], !PROPER_ORDER || THROW_ON_NEGATIVE_FRACTIONAL_INDEX); + +}); + +// MODULE: ./node_modules/core-js/modules/es.weak-map.get-or-insert-computed.js +var es_weak_map_get_or_insert_computed_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var aCallable = (a_callable_namespaceFn()); +var aWeakMap = (a_weak_map_namespaceFn()); +var aWeakKey = (a_weak_key_namespaceFn()); +var WeakMapHelpers = (weak_map_helpers_namespaceFn()); +var IS_PURE = (is_pure_namespaceFn()); + +var get = WeakMapHelpers.get; +var has = WeakMapHelpers.has; +var set = WeakMapHelpers.set; + +var FORCED = IS_PURE || !function () { + try { + // eslint-disable-next-line es/no-weak-map, no-throw-literal -- testing + if (WeakMap.prototype.getOrInsertComputed) new WeakMap().getOrInsertComputed(1, function () { throw 1; }); + } catch (error) { + // FF144 Nightly - Beta 3 bug + // https://bugzilla.mozilla.org/show_bug.cgi?id=1988369 + return error instanceof TypeError; + } +}(); + +// `WeakMap.prototype.getOrInsertComputed` method +// https://tc39.es/ecma262/#sec-weakmap.prototype.getorinsertcomputed +$({ target: 'WeakMap', proto: true, real: true, forced: FORCED }, { + getOrInsertComputed: function getOrInsertComputed(key, callbackfn) { + if (!IS_PURE) aWeakMap(this); + aWeakKey(key); + aCallable(callbackfn); + if (has(this, key)) return get(this, key); + var value = callbackfn(key); + set(this, key, value); + return value; + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.weak-map.get-or-insert.js +var es_weak_map_get_or_insert_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var WeakMapHelpers = (weak_map_helpers_namespaceFn()); +var IS_PURE = (is_pure_namespaceFn()); + +var get = WeakMapHelpers.get; +var has = WeakMapHelpers.has; +var set = WeakMapHelpers.set; + +// `WeakMap.prototype.getOrInsert` method +// https://tc39.es/ecma262/#sec-weakmap.prototype.getorinsert +$({ target: 'WeakMap', proto: true, real: true, forced: IS_PURE }, { + getOrInsert: function getOrInsert(key, value) { + if (has(this, key)) return get(this, key); + set(this, key, value); + return value; + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/web.url.parse.js +var web_url_parse_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var getBuiltIn = (get_built_in_namespaceFn()); +var validateArgumentsLength = (validate_arguments_length_namespaceFn()); +var toString = (to_string_namespaceFn()); +var USE_NATIVE_URL = (url_constructor_detection_namespaceFn()); + +var URL = getBuiltIn('URL'); + +// `URL.parse` method +// https://url.spec.whatwg.org/#dom-url-parse +$({ target: 'URL', stat: true, forced: !USE_NATIVE_URL }, { + parse: function parse(url) { + var length = validateArgumentsLength(arguments.length, 1); + var urlString = toString(url); + var base = length < 2 || arguments[1] === undefined ? undefined : toString(arguments[1]); + try { + return new URL(urlString, base); + } catch (error) { + return null; + } + } +}); + +}); + +;// ./node_modules/core-js/modules/es.array.includes.js +es_array_includes_namespaceFn(); + +;// ./node_modules/core-js/modules/es.array.push.js +es_array_push_namespaceFn(); + +;// ./node_modules/core-js/modules/es.map.get-or-insert.js +es_map_get_or_insert_namespaceFn(); + +;// ./node_modules/core-js/modules/es.map.get-or-insert-computed.js +es_map_get_or_insert_computed_namespaceFn(); + +;// ./node_modules/core-js/modules/es.set.difference.v2.js +es_set_difference_v2_namespaceFn(); + +;// ./node_modules/core-js/modules/es.set.intersection.v2.js +es_set_intersection_v2_namespaceFn(); + +;// ./node_modules/core-js/modules/es.set.is-disjoint-from.v2.js +es_set_is_disjoint_from_v2_namespaceFn(); + +;// ./node_modules/core-js/modules/es.set.is-subset-of.v2.js +es_set_is_subset_of_v2_namespaceFn(); + +;// ./node_modules/core-js/modules/es.set.is-superset-of.v2.js +es_set_is_superset_of_v2_namespaceFn(); + +;// ./node_modules/core-js/modules/es.set.symmetric-difference.v2.js +es_set_symmetric_difference_v2_namespaceFn(); + +;// ./node_modules/core-js/modules/es.set.union.v2.js +es_set_union_v2_namespaceFn(); + +;// ./web/ui_utils.js + + + + + + + + + + + +const DEFAULT_SCALE_VALUE = "auto"; +const DEFAULT_SCALE = 1.0; +const DEFAULT_SCALE_DELTA = 1.1; +const MIN_SCALE = 0.1; +const MAX_SCALE = 25.0; +const UNKNOWN_SCALE = 0; +const MAX_AUTO_SCALE = 1.25; +const SCROLLBAR_PADDING = 40; +const VERTICAL_PADDING = 5; +const PresentationModeState = { + UNKNOWN: 0, + NORMAL: 1, + CHANGING: 2, + FULLSCREEN: 3 +}; +const SidebarView = { + UNKNOWN: -1, + NONE: 0, + THUMBS: 1, + OUTLINE: 2, + ATTACHMENTS: 3, + LAYERS: 4 +}; +const TextLayerMode = { + DISABLE: 0, + ENABLE: 1, + ENABLE_PERMISSIONS: 2 +}; +const ScrollMode = { + UNKNOWN: -1, + VERTICAL: 0, + HORIZONTAL: 1, + WRAPPED: 2, + PAGE: 3 +}; +const SpreadMode = { + UNKNOWN: -1, + NONE: 0, + ODD: 1, + EVEN: 2 +}; +const CursorTool = { + SELECT: 0, + HAND: 1, + ZOOM: 2 +}; +const AutoPrintRegExp = /\bprint\s*\(/; +function scrollIntoView(element, spot) { + let parent = element.offsetParent; + if (!parent) { + console.error("offsetParent is not set -- cannot scroll"); + return; + } + let offsetY = element.offsetTop + element.clientTop; + let offsetX = element.offsetLeft + element.clientLeft; + while (parent.clientHeight === parent.scrollHeight && parent.clientWidth === parent.scrollWidth) { + offsetY += parent.offsetTop; + offsetX += parent.offsetLeft; + parent = parent.offsetParent; + if (!parent) { + return; + } + } + if (spot) { + if (spot.top !== undefined) { + offsetY += spot.top; + } + if (spot.left !== undefined) { + offsetX += spot.left; + parent.scrollLeft = offsetX; + } + } + parent.scrollTop = offsetY; +} +function watchScroll(viewAreaElement, callback, abortSignal = undefined) { + function onRAF() { + rAF = null; + const currentX = viewAreaElement.scrollLeft; + const lastX = state.lastX; + if (currentX !== lastX) { + state.right = currentX > lastX; + } + state.lastX = currentX; + const currentY = viewAreaElement.scrollTop; + const lastY = state.lastY; + if (currentY !== lastY) { + state.down = currentY > lastY; + } + state.lastY = currentY; + callback(state); + } + const state = { + right: true, + down: true, + lastX: viewAreaElement.scrollLeft, + lastY: viewAreaElement.scrollTop + }; + let rAF = null; + viewAreaElement.addEventListener("scroll", () => { + rAF ??= window.requestAnimationFrame(onRAF); + }, { + useCapture: true, + signal: abortSignal + }); + abortSignal?.addEventListener("abort", () => window.cancelAnimationFrame(rAF), { + once: true + }); + return state; +} +function parseQueryString(query) { + const params = new Map(); + for (const [key, value] of new URLSearchParams(query)) { + params.set(key.toLowerCase(), value); + } + return params; +} +const InvisibleCharsRegExp = /[\x00-\x1F]/g; +function removeNullCharacters(str, replaceInvisible = false) { + if (!InvisibleCharsRegExp.test(str)) { + return str; + } + return replaceInvisible ? str.replaceAll(InvisibleCharsRegExp, m => m === "\x00" ? "" : " ") : str.replaceAll("\x00", ""); +} +function binarySearchFirstItem(items, condition, start = 0) { + let minIndex = start; + let maxIndex = items.length - 1; + if (maxIndex < 0 || !condition(items[maxIndex])) { + return items.length; + } + if (condition(items[minIndex])) { + return minIndex; + } + while (minIndex < maxIndex) { + const currentIndex = minIndex + maxIndex >> 1; + const currentItem = items[currentIndex]; + if (condition(currentItem)) { + maxIndex = currentIndex; + } else { + minIndex = currentIndex + 1; + } + } + return minIndex; +} +function approximateFraction(x) { + if (Math.floor(x) === x) { + return [x, 1]; + } + const xinv = 1 / x; + const limit = 8; + if (xinv > limit) { + return [1, limit]; + } else if (Math.floor(xinv) === xinv) { + return [1, xinv]; + } + const x_ = x > 1 ? xinv : x; + let a = 0, + b = 1, + c = 1, + d = 1; + while (true) { + const p = a + c, + q = b + d; + if (q > limit) { + break; + } + if (x_ <= p / q) { + c = p; + d = q; + } else { + a = p; + b = q; + } + } + if (x_ - a / b < c / d - x_) { + return x_ === x ? [a, b] : [b, a]; + } + return x_ === x ? [c, d] : [d, c]; +} +function floorToDivide(x, div) { + return x - x % div; +} +function getPageSizeInches({ + view, + userUnit, + rotate +}) { + const [x1, y1, x2, y2] = view; + const changeOrientation = rotate % 180 !== 0; + const width = (x2 - x1) / 72 * userUnit; + const height = (y2 - y1) / 72 * userUnit; + return { + width: changeOrientation ? height : width, + height: changeOrientation ? width : height + }; +} +function backtrackBeforeAllVisibleElements(index, views, top) { + if (index < 2) { + return index; + } + let elt = views[index].div; + let pageTop = elt.offsetTop + elt.clientTop; + if (pageTop >= top) { + elt = views[index - 1].div; + pageTop = elt.offsetTop + elt.clientTop; + } + for (let i = index - 2; i >= 0; --i) { + elt = views[i].div; + if (elt.offsetTop + elt.clientTop + elt.clientHeight <= pageTop) { + break; + } + index = i; + } + return index; +} +function visibleSort(a, b) { + const pc = a.percent - b.percent; + return Math.abs(pc) > 0.001 ? -pc : a.id - b.id; +} +function getVisibleElements({ + scrollEl, + views, + sortByVisibility = false, + horizontal = false, + rtl = false +}) { + const top = scrollEl.scrollTop, + bottom = top + scrollEl.clientHeight; + const left = scrollEl.scrollLeft, + right = left + scrollEl.clientWidth; + function isElementBottomAfterViewTop(view) { + const element = view.div; + const elementBottom = element.offsetTop + element.clientTop + element.clientHeight; + return elementBottom > top; + } + function isElementNextAfterViewHorizontally(view) { + const element = view.div; + const elementLeft = element.offsetLeft + element.clientLeft; + const elementRight = elementLeft + element.clientWidth; + return rtl ? elementLeft < right : elementRight > left; + } + const visible = [], + ids = new Set(), + numViews = views.length; + let firstVisibleElementInd = binarySearchFirstItem(views, horizontal ? isElementNextAfterViewHorizontally : isElementBottomAfterViewTop); + if (firstVisibleElementInd > 0 && firstVisibleElementInd < numViews && !horizontal) { + firstVisibleElementInd = backtrackBeforeAllVisibleElements(firstVisibleElementInd, views, top); + } + let lastEdge = horizontal ? right : -1; + for (let i = firstVisibleElementInd; i < numViews; i++) { + const view = views[i], + element = view.div; + const currentWidth = element.offsetLeft + element.clientLeft; + const currentHeight = element.offsetTop + element.clientTop; + const viewWidth = element.clientWidth, + viewHeight = element.clientHeight; + const viewRight = currentWidth + viewWidth; + const viewBottom = currentHeight + viewHeight; + if (lastEdge === -1) { + if (viewBottom >= bottom) { + lastEdge = viewBottom; + } + } else if ((horizontal ? currentWidth : currentHeight) > lastEdge) { + break; + } + if (viewBottom <= top || currentHeight >= bottom || viewRight <= left || currentWidth >= right) { + continue; + } + const minY = Math.max(0, top - currentHeight); + const minX = Math.max(0, left - currentWidth); + const hiddenHeight = minY + Math.max(0, viewBottom - bottom); + const hiddenWidth = minX + Math.max(0, viewRight - right); + const fractionHeight = (viewHeight - hiddenHeight) / viewHeight, + fractionWidth = (viewWidth - hiddenWidth) / viewWidth; + const percent = fractionHeight * fractionWidth * 100 | 0; + visible.push({ + id: view.id, + x: currentWidth, + y: currentHeight, + visibleArea: percent === 100 ? null : { + minX, + minY, + maxX: Math.min(viewRight, right) - currentWidth, + maxY: Math.min(viewBottom, bottom) - currentHeight + }, + view, + percent, + widthPercent: fractionWidth * 100 | 0 + }); + ids.add(view.id); + } + const first = visible[0], + last = visible.at(-1); + if (sortByVisibility) { + visible.sort(visibleSort); + } + return { + first, + last, + views: visible, + ids + }; +} +function normalizeWheelEventDirection(evt) { + let delta = Math.hypot(evt.deltaX, evt.deltaY); + const angle = Math.atan2(evt.deltaY, evt.deltaX); + if (-0.25 * Math.PI < angle && angle < 0.75 * Math.PI) { + delta = -delta; + } + return delta; +} +function normalizeWheelEventDelta(evt) { + const deltaMode = evt.deltaMode; + let delta = normalizeWheelEventDirection(evt); + const MOUSE_PIXELS_PER_LINE = 30; + const MOUSE_LINES_PER_PAGE = 30; + if (deltaMode === WheelEvent.DOM_DELTA_PIXEL) { + delta /= MOUSE_PIXELS_PER_LINE * MOUSE_LINES_PER_PAGE; + } else if (deltaMode === WheelEvent.DOM_DELTA_LINE) { + delta /= MOUSE_LINES_PER_PAGE; + } + return delta; +} +function isValidRotation(angle) { + return Number.isInteger(angle) && angle % 90 === 0; +} +function isValidScrollMode(mode) { + return Number.isInteger(mode) && Object.values(ScrollMode).includes(mode) && mode !== ScrollMode.UNKNOWN; +} +function isValidSpreadMode(mode) { + return Number.isInteger(mode) && Object.values(SpreadMode).includes(mode) && mode !== SpreadMode.UNKNOWN; +} +function isPortraitOrientation(size) { + return size.width <= size.height; +} +const animationStarted = new Promise(function (resolve) { + window.requestAnimationFrame(resolve); +}); +const docStyle = document.documentElement.style; +class ProgressBar { + #classList = null; + #disableAutoFetchTimeout = null; + #percent = 0; + #style = null; + #visible = true; + constructor(bar) { + this.#classList = bar.classList; + this.#style = bar.style; + } + get percent() { + return this.#percent; + } + set percent(val) { + this.#percent = val; + if (isNaN(val)) { + this.#classList.add("indeterminate"); + return; + } + this.#classList.remove("indeterminate"); + this.#style.setProperty("--progressBar-percent", `${this.#percent}%`); + } + setWidth(viewer) { + if (!viewer) { + return; + } + const container = viewer.parentNode; + const scrollbarWidth = container.offsetWidth - viewer.offsetWidth; + if (scrollbarWidth > 0) { + this.#style.setProperty("--progressBar-end-offset", `${scrollbarWidth}px`); + } + } + setDisableAutoFetch(delay = 5000) { + if (this.#percent === 100 || isNaN(this.#percent)) { + return; + } + if (this.#disableAutoFetchTimeout) { + clearTimeout(this.#disableAutoFetchTimeout); + } + this.show(); + this.#disableAutoFetchTimeout = setTimeout(() => { + this.#disableAutoFetchTimeout = null; + this.hide(); + }, delay); + } + hide() { + if (!this.#visible) { + return; + } + this.#visible = false; + this.#classList.add("hidden"); + } + show() { + if (this.#visible) { + return; + } + this.#visible = true; + this.#classList.remove("hidden"); + } +} +function getActiveOrFocusedElement() { + let curRoot = document; + let curActiveOrFocused = curRoot.activeElement || curRoot.querySelector(":focus"); + while (curActiveOrFocused?.shadowRoot) { + curRoot = curActiveOrFocused.shadowRoot; + curActiveOrFocused = curRoot.activeElement || curRoot.querySelector(":focus"); + } + return curActiveOrFocused; +} +function apiPageLayoutToViewerModes(layout) { + let scrollMode = ScrollMode.VERTICAL, + spreadMode = SpreadMode.NONE; + switch (layout) { + case "SinglePage": + scrollMode = ScrollMode.PAGE; + break; + case "OneColumn": + break; + case "TwoPageLeft": + scrollMode = ScrollMode.PAGE; + case "TwoColumnLeft": + spreadMode = SpreadMode.ODD; + break; + case "TwoPageRight": + scrollMode = ScrollMode.PAGE; + case "TwoColumnRight": + spreadMode = SpreadMode.EVEN; + break; + } + return { + scrollMode, + spreadMode + }; +} +function apiPageModeToSidebarView(mode) { + switch (mode) { + case "UseNone": + return SidebarView.NONE; + case "UseThumbs": + return SidebarView.THUMBS; + case "UseOutlines": + return SidebarView.OUTLINE; + case "UseAttachments": + return SidebarView.ATTACHMENTS; + case "UseOC": + return SidebarView.LAYERS; + } + return SidebarView.NONE; +} +function toggleCheckedBtn(button, toggle, view = null) { + button.classList.toggle("toggled", toggle); + button.setAttribute("aria-checked", toggle); + view?.classList.toggle("hidden", !toggle); +} +function toggleSelectedBtn(button, toggle, view = null) { + button.classList.toggle("selected", toggle); + button.setAttribute("aria-selected", toggle); + view?.classList.toggle("hidden", !toggle); +} +function toggleExpandedBtn(button, toggle, view = null) { + button.classList.toggle("toggled", toggle); + button.setAttribute("aria-expanded", toggle); + view?.classList.toggle("hidden", !toggle); +} +const calcRound = function () { + const e = document.createElement("div"); + e.style.width = "round(down, calc(1.6666666666666665 * 792px), 1px)"; + return e.style.width === "calc(1320px)" ? Math.fround : x => x; +}(); + +;// ./node_modules/core-js/modules/es.iterator.constructor.js +es_iterator_constructor_namespaceFn(); + +;// ./node_modules/core-js/modules/es.iterator.for-each.js +es_iterator_for_each_namespaceFn(); + +;// ./web/app_options.js + + + + +{ + var compatParams = new Map(); + const { + maxTouchPoints, + platform, + userAgent + } = navigator; + const isAndroid = /Android/.test(userAgent); + const isIOS = /\b(?:iPad|iPhone|iPod)(?=;)/.test(userAgent) || platform === "MacIntel" && maxTouchPoints > 1; + if (isIOS || isAndroid) { + compatParams.set("maxCanvasPixels", 5242880); + } + if (isAndroid) { + compatParams.set("useSystemFonts", false); + } +} +const OptionKind = { + BROWSER: 0x01, + VIEWER: 0x02, + API: 0x04, + WORKER: 0x08, + EVENT_DISPATCH: 0x10, + PREFERENCE: 0x80 +}; +const app_options_Type = { + BOOLEAN: 0x01, + NUMBER: 0x02, + OBJECT: 0x04, + STRING: 0x08, + UNDEFINED: 0x10 +}; +const defaultOptions = new Map([["allowedGlobalEvents", { + value: null, + kind: OptionKind.BROWSER +}], ["canvasMaxAreaInBytes", { + value: -1, + kind: OptionKind.BROWSER + OptionKind.API +}], ["isInAutomation", { + value: false, + kind: OptionKind.BROWSER +}], ["localeProperties", { + value: { + lang: navigator.language || "en-US" + }, + kind: OptionKind.BROWSER +}], ["maxCanvasDim", { + value: 32767, + kind: OptionKind.BROWSER + OptionKind.VIEWER +}], ["nimbusDataStr", { + value: "", + kind: OptionKind.BROWSER +}], ["supportsCaretBrowsingMode", { + value: false, + kind: OptionKind.BROWSER +}], ["supportsDocumentFonts", { + value: true, + kind: OptionKind.BROWSER +}], ["supportsDownloading", { + value: true, + kind: OptionKind.BROWSER +}], ["supportsIntegratedFind", { + value: false, + kind: OptionKind.BROWSER +}], ["supportsMouseWheelZoomCtrlKey", { + value: true, + kind: OptionKind.BROWSER +}], ["supportsMouseWheelZoomMetaKey", { + value: true, + kind: OptionKind.BROWSER +}], ["supportsPinchToZoom", { + value: true, + kind: OptionKind.BROWSER +}], ["supportsPrinting", { + value: true, + kind: OptionKind.BROWSER +}], ["toolbarDensity", { + value: 0, + kind: OptionKind.BROWSER + OptionKind.EVENT_DISPATCH +}], ["altTextLearnMoreUrl", { + value: "", + kind: OptionKind.VIEWER + OptionKind.PREFERENCE +}], ["annotationEditorMode", { + value: 0, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE +}], ["annotationMode", { + value: 2, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE +}], ["capCanvasAreaFactor", { + value: 200, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE +}], ["commentLearnMoreUrl", { + value: "", + kind: OptionKind.VIEWER + OptionKind.PREFERENCE +}], ["cursorToolOnLoad", { + value: 0, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE +}], ["debuggerSrc", { + value: "./debugger.mjs", + kind: OptionKind.VIEWER +}], ...[["defaultUrl", { + value: "compressed.tracemonkey-pldi-09.pdf", + kind: OptionKind.VIEWER +}]], ["defaultZoomDelay", { + value: 400, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE +}], ["defaultZoomValue", { + value: "", + kind: OptionKind.VIEWER + OptionKind.PREFERENCE +}], ["disableHistory", { + value: false, + kind: OptionKind.VIEWER +}], ["disablePageLabels", { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE +}], ...[["disablePreferences", { + value: false, + kind: OptionKind.VIEWER +}]], ...[], ["enableAltText", { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE +}], ["enableAltTextModelDownload", { + value: true, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + OptionKind.EVENT_DISPATCH +}], ["enableAutoLinking", { + value: true, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE +}], ["enableComment", { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE +}], ["enableDetailCanvas", { + value: true, + kind: OptionKind.VIEWER +}], ...[], ["enableGuessAltText", { + value: true, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + OptionKind.EVENT_DISPATCH +}], ["enableHighlightFloatingButton", { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE +}], ["enableMerge", { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE +}], ["enableNewAltTextWhenAddingImage", { + value: true, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE +}], ["enableNewBadge", { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE +}], ["enableNova", { + value: true, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE +}], ["enableOptimizedPartialRendering", { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE +}], ["enablePermissions", { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE +}], ["enablePrintAutoRotate", { + value: true, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE +}], ["enableScripting", { + value: true, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE +}], ["enableSelectionRendering", { + value: true, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE +}], ["enableSignatureEditor", { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE +}], ["enableSignatureVerification", { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE +}], ["enableSplitMerge", { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE +}], ["enableUpdatedAddImage", { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE +}], ["externalLinkRel", { + value: "noopener noreferrer nofollow", + kind: OptionKind.VIEWER +}], ["externalLinkTarget", { + value: 0, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE +}], ...[], ["highlightEditorColors", { + value: "yellow=#FFFF98,green=#53FFBC,blue=#80EBFF,pink=#FFCBE6,red=#FF4F5F," + "yellow_HCM=#FFFFCC,green_HCM=#53FFBC,blue_HCM=#80EBFF,pink_HCM=#F6B8FF,red_HCM=#C50043", + kind: OptionKind.VIEWER + OptionKind.PREFERENCE +}], ["historyUpdateUrl", { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE +}], ["ignoreDestinationZoom", { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE +}], ["imageResourcesPath", { + value: "./images/", + kind: OptionKind.VIEWER +}], ["imagesRightClickMinSize", { + value: -1, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE +}], ["maxCanvasPixels", { + value: 2 ** 25, + kind: OptionKind.VIEWER +}], ["minDurationToUpdateCanvas", { + value: 500, + kind: OptionKind.VIEWER +}], ["forcePageColors", { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE +}], ["pageColorsBackground", { + value: "Canvas", + kind: OptionKind.VIEWER + OptionKind.PREFERENCE +}], ["pageColorsForeground", { + value: "CanvasText", + kind: OptionKind.VIEWER + OptionKind.PREFERENCE +}], ["pdfBugEnabled", { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE +}], ["postMessageAfterPrintCallback", { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE +}], ["printResolution", { + value: 150, + kind: OptionKind.VIEWER +}], ...[["sandboxBundleSrc", { + value: "../build/pdf.sandbox.mjs", + kind: OptionKind.VIEWER +}]], ["sidebarViewOnLoad", { + value: -1, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE +}], ["scrollModeOnLoad", { + value: -1, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE +}], ["spreadModeOnLoad", { + value: -1, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE +}], ["textLayerMode", { + value: 1, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE +}], ["viewerCssTheme", { + value: 0, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE +}], ["viewOnLoad", { + value: 0, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE +}], ["cMapPacked", { + value: true, + kind: OptionKind.API +}], ["cMapUrl", { + value: "../web/cmaps/", + kind: OptionKind.API +}], ["disableAutoFetch", { + value: false, + kind: OptionKind.API + OptionKind.PREFERENCE +}], ["disableFontFace", { + value: false, + kind: OptionKind.API + OptionKind.PREFERENCE +}], ["disableRange", { + value: false, + kind: OptionKind.API + OptionKind.PREFERENCE +}], ["disableStream", { + value: false, + kind: OptionKind.API + OptionKind.PREFERENCE +}], ["docBaseUrl", { + value: "", + kind: OptionKind.API +}], ["enableHWA", { + value: true, + kind: OptionKind.API + OptionKind.PREFERENCE +}], ["enableWebGPU", { + value: true, + kind: OptionKind.API + OptionKind.PREFERENCE +}], ["enableXfa", { + value: true, + kind: OptionKind.API + OptionKind.PREFERENCE +}], ["fontExtraProperties", { + value: false, + kind: OptionKind.API +}], ["iccUrl", { + value: "../web/iccs/", + kind: OptionKind.API +}], ["isOffscreenCanvasSupported", { + value: true, + kind: OptionKind.API +}], ["maxImageSize", { + value: -1, + kind: OptionKind.API +}], ["pdfBug", { + value: false, + kind: OptionKind.API +}], ["standardFontDataUrl", { + value: "../web/standard_fonts/", + kind: OptionKind.API +}], ["useSystemFonts", { + value: undefined, + kind: OptionKind.API, + type: app_options_Type.BOOLEAN + app_options_Type.UNDEFINED +}], ["verbosity", { + value: 1, + kind: OptionKind.API +}], ["wasmUrl", { + value: "../web/wasm/", + kind: OptionKind.API +}], ["workerPort", { + value: null, + kind: OptionKind.WORKER +}], ["workerSrc", { + value: "../build/pdf.worker.mjs", + kind: OptionKind.WORKER +}]]); +class AppOptions { + static eventBus; + static #opts = new Map(); + static { + for (const [name, defaultOpt] of defaultOptions) { + this.#opts.set(name, defaultOpt.value); + } + for (const [name, value] of compatParams) { + this.#opts.set(name, value); + } + this._hasInvokedSet = false; + this._checkDisablePreferences = () => { + if (this.get("disablePreferences")) { + return true; + } + if (this._hasInvokedSet) { + console.warn("The Preferences may override manually set AppOptions; " + 'please use the "disablePreferences"-option to prevent that.'); + } + return false; + }; + } + static get(name) { + return this.#opts.get(name); + } + static getAll(kind = null, defaultOnly = false) { + const options = Object.create(null); + for (const [name, defaultOpt] of defaultOptions) { + if (kind && !(kind & defaultOpt.kind)) { + continue; + } + options[name] = !defaultOnly ? this.#opts.get(name) : defaultOpt.value; + } + return options; + } + static set(name, value) { + this.setAll({ + [name]: value + }); + } + static setAll(options, prefs = false) { + this._hasInvokedSet ||= true; + let events; + for (const name in options) { + const defaultOpt = defaultOptions.get(name), + userOpt = options[name]; + if (!defaultOpt || !(typeof userOpt === typeof defaultOpt.value || app_options_Type[(typeof userOpt).toUpperCase()] & defaultOpt.type)) { + continue; + } + const { + kind + } = defaultOpt; + if (prefs && !(kind & OptionKind.BROWSER || kind & OptionKind.PREFERENCE)) { + continue; + } + if (this.eventBus && kind & OptionKind.EVENT_DISPATCH) { + (events ??= new Map()).set(name, userOpt); + } + this.#opts.set(name, userOpt); + } + events?.forEach((value, name) => { + this.eventBus.dispatch(name.toLowerCase(), { + source: this, + value + }); + }); + } +} + +;// ./node_modules/core-js/modules/es.json.parse.js +es_json_parse_namespaceFn(); + +;// ./node_modules/core-js/modules/es.json.stringify.js +es_json_stringify_namespaceFn(); + +;// ./node_modules/core-js/modules/web.url.parse.js +web_url_parse_namespaceFn(); + +;// ./web/pdfjs.js +const { + AbortException, + AnnotationEditorLayer, + AnnotationEditorParamsType, + AnnotationEditorType, + AnnotationEditorUIManager, + AnnotationLayer, + AnnotationMode, + AnnotationType, + applyOpacity, + build, + ColorPicker, + createValidAbsoluteUrl, + CSSConstants, + DOMSVGFactory, + DrawLayer, + FeatureTest, + fetchData, + findContrastColor, + getDocument, + getFilenameFromUrl, + getPdfFilenameFromUrl, + getRGB, + getRGBA, + getUuid, + GlobalWorkerOptions, + ImageKind, + InvalidPDFException, + isDataScheme, + isPdfFile, + isValidExplicitDest, + makeArr, + makeMap, + makeObj, + makeSet, + MathClamp, + noContextMenu, + normalizeUnicode, + OPS, + OutputScale, + PasswordException, + PasswordResponses, + PDFDataRangeTransport, + PDFDateString, + PDFWorker, + PermissionFlag, + PixelsPerInch, + RenderingCancelledException, + renderRichText, + ResponseException, + setLayerDimensions, + shadow: pdfjs_shadow, + SignatureExtractor, + stopEvent, + SupportedImageMimeTypes, + TextLayer, + TextLayerImages, + TouchManager, + updateUrlHash, + Util, + VerbosityLevel, + version: pdfjs_version, + XfaLayer +} = globalThis.pdfjsLib; + +;// ./web/internal_evt.js +const INTERNAL_EVT = "fed9040f-f139-41a7-bcf0-3bcfcca89c08"; +const internalOpt = Object.freeze({ + internal: INTERNAL_EVT +}); + +;// ./web/pdf_link_service.js + + + + + + + + +const DEFAULT_LINK_REL = "noopener noreferrer nofollow"; +const LinkTarget = { + NONE: 0, + SELF: 1, + BLANK: 2, + PARENT: 3, + TOP: 4 +}; +class PDFLinkService { + externalLinkEnabled = true; + constructor({ + eventBus, + externalLinkTarget = null, + externalLinkRel = null, + ignoreDestinationZoom = false + } = {}) { + this.eventBus = eventBus; + this.externalLinkTarget = externalLinkTarget; + this.externalLinkRel = externalLinkRel; + this._ignoreDestinationZoom = ignoreDestinationZoom; + this.baseUrl = null; + this.pdfDocument = null; + this.pdfViewer = null; + this.pdfHistory = null; + } + setDocument(pdfDocument, baseUrl = null) { + this.baseUrl = baseUrl; + this.pdfDocument = pdfDocument; + } + setViewer(pdfViewer) { + this.pdfViewer = pdfViewer; + } + setHistory(pdfHistory) { + this.pdfHistory = pdfHistory; + } + get pagesCount() { + return this.pdfDocument?.pagesMapper.pagesNumber || 0; + } + get page() { + return this.pdfDocument ? this.pdfViewer.currentPageNumber : 1; + } + set page(value) { + if (this.pdfDocument) { + this.pdfViewer.currentPageNumber = value; + } + } + get rotation() { + return this.pdfDocument ? this.pdfViewer.pagesRotation : 0; + } + set rotation(value) { + if (this.pdfDocument) { + this.pdfViewer.pagesRotation = value; + } + } + get isInPresentationMode() { + return this.pdfDocument ? this.pdfViewer.isInPresentationMode : false; + } + async goToDestination(dest) { + if (!this.pdfDocument) { + return; + } + let namedDest, explicitDest, pageNumber; + if (typeof dest === "string") { + namedDest = dest; + explicitDest = await this.pdfDocument.getDestination(dest); + } else { + namedDest = null; + explicitDest = await dest; + } + if (!Array.isArray(explicitDest)) { + console.error(`goToDestination: "${explicitDest}" is not a valid destination array, for dest="${dest}".`); + return; + } + const [destRef] = explicitDest; + if (destRef && typeof destRef === "object") { + pageNumber = this.pdfDocument.cachedPageNumber(destRef); + if (!pageNumber) { + try { + pageNumber = (await this.pdfDocument.getPageIndex(destRef)) + 1; + } catch { + console.error(`goToDestination: "${destRef}" is not a valid page reference, for dest="${dest}".`); + return; + } + } + } else if (Number.isInteger(destRef)) { + pageNumber = destRef + 1; + } + if (!pageNumber || pageNumber < 1 || pageNumber > this.pagesCount) { + console.error(`goToDestination: "${pageNumber}" is not a valid page number, for dest="${dest}".`); + return; + } + if (this.pdfHistory) { + this.pdfHistory.pushCurrentPosition(); + this.pdfHistory.push({ + namedDest, + explicitDest, + pageNumber + }); + } + this.pdfViewer.scrollPageIntoView({ + pageNumber, + destArray: explicitDest, + ignoreDestinationZoom: this._ignoreDestinationZoom + }); + const ac = new AbortController(); + this.eventBus.on("textlayerrendered", evt => { + if (evt.pageNumber === pageNumber) { + evt.source.textLayer.div.focus(); + ac.abort(); + } + }, { + signal: ac.signal, + ...internalOpt + }); + } + goToPage(val) { + if (!this.pdfDocument) { + return; + } + const pageNumber = typeof val === "string" && this.pdfViewer.pageLabelToPageNumber(val) || val | 0; + if (!(Number.isInteger(pageNumber) && pageNumber > 0 && pageNumber <= this.pagesCount)) { + console.error(`PDFLinkService.goToPage: "${val}" is not a valid page.`); + return; + } + if (this.pdfHistory) { + this.pdfHistory.pushCurrentPosition(); + this.pdfHistory.pushPage(pageNumber); + } + this.pdfViewer.scrollPageIntoView({ + pageNumber + }); + } + goToXY(pageNumber, x, y, options = {}) { + this.pdfViewer.scrollPageIntoView({ + pageNumber, + destArray: [null, { + name: "XYZ" + }, x, y], + ignoreDestinationZoom: true, + ...options + }); + } + async getAttachmentContent(id) { + try { + return await this.pdfDocument?.getAttachmentContent(id); + } catch (error) { + if (!(error instanceof PasswordException)) { + console.warn(`Unable to load attachment content: ${error}`); + } + } + return null; + } + addLinkAttributes(link, url, newWindow = false) { + if (!url || typeof url !== "string") { + throw new Error('A valid "url" parameter must provided.'); + } + const target = newWindow ? LinkTarget.BLANK : this.externalLinkTarget, + rel = this.externalLinkRel; + let displayUrl = url; + const parsedUrl = URL.parse(url); + if (parsedUrl?.username || parsedUrl?.password) { + parsedUrl.username = parsedUrl.password = ""; + displayUrl = parsedUrl.href; + } + if (this.externalLinkEnabled) { + link.href = url; + link.title = displayUrl; + } else { + link.href = ""; + link.title = `Disabled: ${displayUrl}`; + link.onclick = () => false; + } + let targetStr = ""; + switch (target) { + case LinkTarget.NONE: + break; + case LinkTarget.SELF: + targetStr = "_self"; + break; + case LinkTarget.BLANK: + targetStr = "_blank"; + break; + case LinkTarget.PARENT: + targetStr = "_parent"; + break; + case LinkTarget.TOP: + targetStr = "_top"; + break; + } + link.target = targetStr; + link.rel = typeof rel === "string" ? rel : DEFAULT_LINK_REL; + } + getDestinationHash(dest) { + if (typeof dest === "string") { + if (dest.length > 0) { + return this.getAnchorUrl("#" + escape(dest)); + } + } else if (Array.isArray(dest)) { + const str = JSON.stringify(dest); + if (str.length > 0) { + return this.getAnchorUrl("#" + escape(str)); + } + } + return this.getAnchorUrl(""); + } + getAnchorUrl(anchor) { + return this.baseUrl ? this.baseUrl + anchor : anchor; + } + setHash(hash) { + if (!this.pdfDocument) { + return; + } + let pageNumber, dest; + if (hash.includes("=")) { + const params = parseQueryString(hash); + if (params.has("search")) { + const query = params.get("search").replaceAll('"', ""), + phrase = params.get("phrase") === "true"; + this.eventBus.dispatch("findfromurlhash", { + source: this, + query: phrase ? query : query.match(/\S+/g) + }); + } + if (params.has("page")) { + pageNumber = params.get("page") | 0 || 1; + } + if (params.has("zoom")) { + const zoomArgs = params.get("zoom").split(","); + const zoomArg = zoomArgs[0]; + const zoomArgNumber = parseFloat(zoomArg); + if (!zoomArg.includes("Fit")) { + dest = [null, { + name: "XYZ" + }, zoomArgs.length > 1 ? zoomArgs[1] | 0 : null, zoomArgs.length > 2 ? zoomArgs[2] | 0 : null, zoomArgNumber ? zoomArgNumber / 100 : zoomArg]; + } else if (zoomArg === "Fit" || zoomArg === "FitB") { + dest = [null, { + name: zoomArg + }]; + } else if (zoomArg === "FitH" || zoomArg === "FitBH" || zoomArg === "FitV" || zoomArg === "FitBV") { + dest = [null, { + name: zoomArg + }, zoomArgs.length > 1 ? zoomArgs[1] | 0 : null]; + } else if (zoomArg === "FitR") { + if (zoomArgs.length !== 5) { + console.error('PDFLinkService.setHash: Not enough parameters for "FitR".'); + } else { + dest = [null, { + name: zoomArg + }, zoomArgs[1] | 0, zoomArgs[2] | 0, zoomArgs[3] | 0, zoomArgs[4] | 0]; + } + } else { + console.error(`PDFLinkService.setHash: "${zoomArg}" is not a valid zoom value.`); + } + } + if (dest) { + this.pdfViewer.scrollPageIntoView({ + pageNumber: pageNumber || this.page, + destArray: dest, + allowNegativeOffset: true + }); + } else if (pageNumber) { + this.page = pageNumber; + } + if (params.has("pagemode")) { + this.eventBus.dispatch("pagemode", { + source: this, + mode: params.get("pagemode") + }); + } + if (params.has("nameddest")) { + this.goToDestination(params.get("nameddest")); + } + return; + } + dest = unescape(hash); + try { + dest = JSON.parse(dest); + if (!Array.isArray(dest)) { + dest = dest.toString(); + } + } catch {} + if (typeof dest === "string" || isValidExplicitDest(dest)) { + this.goToDestination(dest); + return; + } + console.error(`PDFLinkService.setHash: "${unescape(hash)}" is not a valid destination.`); + } + executeNamedAction(action) { + if (!this.pdfDocument) { + return; + } + switch (action) { + case "GoBack": + this.pdfHistory?.back(); + break; + case "GoForward": + this.pdfHistory?.forward(); + break; + case "NextPage": + this.pdfViewer.nextPage(); + break; + case "PrevPage": + this.pdfViewer.previousPage(); + break; + case "LastPage": + this.page = this.pagesCount; + break; + case "FirstPage": + this.page = 1; + break; + default: + break; + } + this.eventBus.dispatch("namedaction", { + source: this, + action + }); + } + async executeSetOCGState(action) { + if (!this.pdfDocument) { + return; + } + const pdfDocument = this.pdfDocument, + optionalContentConfig = await this.pdfViewer.optionalContentConfigPromise; + if (pdfDocument !== this.pdfDocument) { + return; + } + optionalContentConfig.setOCGState(action); + this.pdfViewer.optionalContentConfigPromise = Promise.resolve(optionalContentConfig); + } +} +class SimpleLinkService extends PDFLinkService { + setDocument(pdfDocument, baseUrl = null) {} +} + +;// ./node_modules/core-js/modules/es.iterator.some.js +es_iterator_some_namespaceFn(); + +;// ./node_modules/core-js/modules/es.iterator.find.js +es_iterator_find_namespaceFn(); + +;// ./web/event_utils.js + + + + + + + + + + + + + + +const WaitOnType = { + EVENT: "event", + TIMEOUT: "timeout" +}; +async function waitOnEventOrTimeout({ + target, + name, + delay = 0 +}) { + if (typeof target !== "object" || !(name && typeof name === "string") || !(Number.isInteger(delay) && delay >= 0)) { + throw new Error("waitOnEventOrTimeout - invalid parameters."); + } + const { + promise, + resolve + } = Promise.withResolvers(); + const ac = new AbortController(); + function handler(type) { + ac.abort(); + clearTimeout(timeout); + resolve(type); + } + const evtMethod = target instanceof EventBus ? "on" : "addEventListener"; + const evtOpts = target instanceof EventBus ? { + signal: ac.signal, + ...internalOpt + } : { + signal: ac.signal + }; + target[evtMethod](name, handler.bind(null, WaitOnType.EVENT), evtOpts); + const timeout = setTimeout(handler.bind(null, WaitOnType.TIMEOUT), delay); + return promise; +} +class EventBus { + #listeners = new Map(); + constructor() { + Object.seal(this); + } + on(eventName, listener, options = null) { + let rmAbort = null; + if (options?.signal instanceof AbortSignal) { + const { + signal + } = options; + if (signal.aborted) { + console.error("Cannot use an `aborted` signal."); + return; + } + const onAbort = () => this.off(eventName, listener); + rmAbort = () => signal.removeEventListener("abort", onAbort); + signal.addEventListener("abort", onAbort); + } + this.#listeners.getOrInsertComputed(eventName, makeSet).add({ + listener, + internal: options?.internal === INTERNAL_EVT, + once: options?.once === true, + rmAbort + }); + } + off(eventName, listener, options = null) { + const eventListeners = this.#listeners.get(eventName); + const evt = eventListeners?.keys().find(e => e.listener === listener); + if (evt) { + evt.rmAbort?.(); + eventListeners.delete(evt); + } + } + dispatch(eventName, data) { + const eventListeners = this.#listeners.get(eventName); + if (!eventListeners?.size) { + return; + } + let extListeners; + for (const { + listener, + internal, + once + } of new Set(eventListeners)) { + if (once) { + this.off(eventName, listener); + } + if (!internal) { + (extListeners ??= []).push(listener); + continue; + } + listener(data); + } + if (extListeners) { + for (const listener of extListeners) { + listener(data); + } + } + } +} +class FirefoxEventBus extends EventBus { + #externalServices; + #globalEventNames; + #isInAutomation; + constructor(globalEventNames, externalServices, isInAutomation) { + super(); + this.#globalEventNames = globalEventNames; + this.#externalServices = externalServices; + this.#isInAutomation = isInAutomation; + } + dispatch(eventName, data) { + throw new Error("Not implemented: FirefoxEventBus.dispatch"); + } +} + +;// ./web/external_services.js +class BaseExternalServices { + updateFindControlState(data) {} + updateFindMatchesCount(data) {} + initPassiveLoading() {} + reportTelemetry(data) {} + reportText(data) {} + async createL10n() { + throw new Error("Not implemented: createL10n"); + } + createScripting() { + throw new Error("Not implemented: createScripting"); + } + createSignatureStorage() { + throw new Error("Not implemented: createSignatureStorage"); + } + createSignatureVerifier() { + return null; + } + printToPDF = null; + updateEditorStates(data) { + throw new Error("Not implemented: updateEditorStates"); + } + dispatchGlobalEvent(_event) {} +} + +;// ./web/preferences.js + +class BasePreferences { + #defaults = Object.freeze(AppOptions.getAll(OptionKind.PREFERENCE, true)); + #initializedPromise = null; + constructor() { + this.#initializedPromise = this._readFromStorage(this.#defaults).then(({ + browserPrefs, + prefs + }) => { + if (AppOptions._checkDisablePreferences()) { + return; + } + AppOptions.setAll({ + ...browserPrefs, + ...prefs + }, true); + }); + } + async _writeToStorage(prefObj) { + throw new Error("Not implemented: _writeToStorage"); + } + async _readFromStorage(prefObj) { + throw new Error("Not implemented: _readFromStorage"); + } + async reset() { + await this.#initializedPromise; + AppOptions.setAll(this.#defaults, true); + await this._writeToStorage(this.#defaults); + } + async set(name, value) { + await this.#initializedPromise; + AppOptions.setAll({ + [name]: value + }, true); + await this._writeToStorage(AppOptions.getAll(OptionKind.PREFERENCE)); + } + async get(name) { + await this.#initializedPromise; + return AppOptions.get(name); + } + get defaults() { + return this.#defaults; + } + get initializedPromise() { + return this.#initializedPromise; + } +} + +;// ./node_modules/@fluent/bundle/esm/types.js +class FluentType { + constructor(value) { + this.value = value; + } + valueOf() { + return this.value; + } +} +class FluentNone extends FluentType { + constructor(value = "???") { + super(value); + } + toString(scope) { + return `{${this.value}}`; + } +} +class FluentNumber extends FluentType { + constructor(value, opts = {}) { + super(value); + this.opts = opts; + } + toString(scope) { + if (scope) { + try { + const nf = scope.memoizeIntlObject(Intl.NumberFormat, this.opts); + return nf.format(this.value); + } catch (err) { + scope.reportError(err); + } + } + return this.value.toString(10); + } +} +class FluentDateTime extends FluentType { + static supportsValue(value) { + if (typeof value === "number") return true; + if (value instanceof Date) return true; + if (value instanceof FluentType) return FluentDateTime.supportsValue(value.valueOf()); + if ("Temporal" in globalThis) { + const _Temporal = globalThis.Temporal; + if (value instanceof _Temporal.Instant || value instanceof _Temporal.PlainDateTime || value instanceof _Temporal.PlainDate || value instanceof _Temporal.PlainMonthDay || value instanceof _Temporal.PlainTime || value instanceof _Temporal.PlainYearMonth) { + return true; + } + } + return false; + } + constructor(value, opts = {}) { + if (value instanceof FluentDateTime) { + opts = { + ...value.opts, + ...opts + }; + value = value.value; + } else if (value instanceof FluentType) { + value = value.valueOf(); + } + if (typeof value === "object" && "calendarId" in value && opts.calendar === undefined) { + opts = { + ...opts, + calendar: value.calendarId + }; + } + super(value); + this.opts = opts; + } + [Symbol.toPrimitive](hint) { + return hint === "string" ? this.toString() : this.toNumber(); + } + toNumber() { + const value = this.value; + if (typeof value === "number") return value; + if (value instanceof Date) return value.getTime(); + if ("epochMilliseconds" in value) { + return value.epochMilliseconds; + } + if ("toZonedDateTime" in value) { + return value.toZonedDateTime("UTC").epochMilliseconds; + } + throw new TypeError("Unwrapping a non-number value as a number"); + } + toString(scope) { + if (scope) { + try { + const dtf = scope.memoizeIntlObject(Intl.DateTimeFormat, this.opts); + return dtf.format(this.value); + } catch (err) { + scope.reportError(err); + } + } + if (typeof this.value === "number" || this.value instanceof Date) { + return new Date(this.value).toISOString(); + } + return this.value.toString(); + } +} +;// ./node_modules/@fluent/bundle/esm/resolver.js + + +const MAX_PLACEABLES = 100; +const FSI = "\u2068"; +const PDI = "\u2069"; +function resolver_match(scope, selector, key) { + if (key === selector) { + return true; + } + if (key instanceof FluentNumber && selector instanceof FluentNumber && key.value === selector.value) { + return true; + } + if (selector instanceof FluentNumber && typeof key === "string") { + let category = scope.memoizeIntlObject(Intl.PluralRules, selector.opts).select(selector.value); + if (key === category) { + return true; + } + } + return false; +} +function getDefault(scope, variants, star) { + if (variants[star]) { + return resolvePattern(scope, variants[star].value); + } + scope.reportError(new RangeError("No default")); + return new FluentNone(); +} +function getArguments(scope, args) { + const positional = []; + const named = Object.create(null); + for (const arg of args) { + if (arg.type === "narg") { + named[arg.name] = resolveExpression(scope, arg.value); + } else { + positional.push(resolveExpression(scope, arg)); + } + } + return { + positional, + named + }; +} +function resolveExpression(scope, expr) { + switch (expr.type) { + case "str": + return expr.value; + case "num": + return new FluentNumber(expr.value, { + minimumFractionDigits: expr.precision + }); + case "var": + return resolveVariableReference(scope, expr); + case "mesg": + return resolveMessageReference(scope, expr); + case "term": + return resolveTermReference(scope, expr); + case "func": + return resolveFunctionReference(scope, expr); + case "select": + return resolveSelectExpression(scope, expr); + default: + return new FluentNone(); + } +} +function resolveVariableReference(scope, { + name +}) { + let arg; + if (scope.params) { + if (Object.prototype.hasOwnProperty.call(scope.params, name)) { + arg = scope.params[name]; + } else { + return new FluentNone(`$${name}`); + } + } else if (scope.args && Object.prototype.hasOwnProperty.call(scope.args, name)) { + arg = scope.args[name]; + } else { + scope.reportError(new ReferenceError(`Unknown variable: $${name}`)); + return new FluentNone(`$${name}`); + } + if (arg instanceof FluentType) { + return arg; + } + switch (typeof arg) { + case "string": + return arg; + case "number": + return new FluentNumber(arg); + case "object": + if (FluentDateTime.supportsValue(arg)) { + return new FluentDateTime(arg); + } + default: + scope.reportError(new TypeError(`Variable type not supported: $${name}, ${typeof arg}`)); + return new FluentNone(`$${name}`); + } +} +function resolveMessageReference(scope, { + name, + attr +}) { + const message = scope.bundle._messages.get(name); + if (!message) { + scope.reportError(new ReferenceError(`Unknown message: ${name}`)); + return new FluentNone(name); + } + if (attr) { + const attribute = message.attributes[attr]; + if (attribute) { + return resolvePattern(scope, attribute); + } + scope.reportError(new ReferenceError(`Unknown attribute: ${attr}`)); + return new FluentNone(`${name}.${attr}`); + } + if (message.value) { + return resolvePattern(scope, message.value); + } + scope.reportError(new ReferenceError(`No value: ${name}`)); + return new FluentNone(name); +} +function resolveTermReference(scope, { + name, + attr, + args +}) { + const id = `-${name}`; + const term = scope.bundle._terms.get(id); + if (!term) { + scope.reportError(new ReferenceError(`Unknown term: ${id}`)); + return new FluentNone(id); + } + if (attr) { + const attribute = term.attributes[attr]; + if (attribute) { + scope.params = getArguments(scope, args).named; + const resolved = resolvePattern(scope, attribute); + scope.params = null; + return resolved; + } + scope.reportError(new ReferenceError(`Unknown attribute: ${attr}`)); + return new FluentNone(`${id}.${attr}`); + } + scope.params = getArguments(scope, args).named; + const resolved = resolvePattern(scope, term.value); + scope.params = null; + return resolved; +} +function resolveFunctionReference(scope, { + name, + args +}) { + let func = scope.bundle._functions[name]; + if (!func) { + scope.reportError(new ReferenceError(`Unknown function: ${name}()`)); + return new FluentNone(`${name}()`); + } + if (typeof func !== "function") { + scope.reportError(new TypeError(`Function ${name}() is not callable`)); + return new FluentNone(`${name}()`); + } + try { + let resolved = getArguments(scope, args); + return func(resolved.positional, resolved.named); + } catch (err) { + scope.reportError(err); + return new FluentNone(`${name}()`); + } +} +function resolveSelectExpression(scope, { + selector, + variants, + star +}) { + let sel = resolveExpression(scope, selector); + if (sel instanceof FluentNone) { + return getDefault(scope, variants, star); + } + for (const variant of variants) { + const key = resolveExpression(scope, variant.key); + if (resolver_match(scope, sel, key)) { + return resolvePattern(scope, variant.value); + } + } + return getDefault(scope, variants, star); +} +function resolveComplexPattern(scope, ptn) { + if (scope.dirty.has(ptn)) { + scope.reportError(new RangeError("Cyclic reference")); + return new FluentNone(); + } + scope.dirty.add(ptn); + const result = []; + const useIsolating = scope.bundle._useIsolating && ptn.length > 1; + for (const elem of ptn) { + if (typeof elem === "string") { + result.push(scope.bundle._transform(elem)); + continue; + } + scope.placeables++; + if (scope.placeables > MAX_PLACEABLES) { + scope.dirty.delete(ptn); + throw new RangeError(`Too many placeables expanded: ${scope.placeables}, ` + `max allowed is ${MAX_PLACEABLES}`); + } + if (useIsolating) { + result.push(FSI); + } + result.push(resolveExpression(scope, elem).toString(scope)); + if (useIsolating) { + result.push(PDI); + } + } + scope.dirty.delete(ptn); + return result.join(""); +} +function resolvePattern(scope, value) { + if (typeof value === "string") { + return scope.bundle._transform(value); + } + return resolveComplexPattern(scope, value); +} +;// ./node_modules/@fluent/bundle/esm/scope.js + + +class Scope { + constructor(bundle, errors, args) { + this.dirty = new WeakSet(); + this.params = null; + this.placeables = 0; + this.bundle = bundle; + this.errors = errors; + this.args = args; + } + reportError(error) { + if (!this.errors || !(error instanceof Error)) { + throw error; + } + this.errors.push(error); + } + memoizeIntlObject(ctor, opts) { + let cache = this.bundle._intls.get(ctor); + if (!cache) { + cache = {}; + this.bundle._intls.set(ctor, cache); + } + let id = JSON.stringify(opts); + if (!cache[id]) { + cache[id] = new ctor(this.bundle.locales, opts); + } + return cache[id]; + } +} +;// ./node_modules/@fluent/bundle/esm/builtins.js + + +function builtins_values(opts, allowed) { + const unwrapped = Object.create(null); + for (const [name, opt] of Object.entries(opts)) { + if (allowed.includes(name)) { + unwrapped[name] = opt.valueOf(); + } + } + return unwrapped; +} +const NUMBER_ALLOWED = ["unitDisplay", "currencyDisplay", "useGrouping", "minimumIntegerDigits", "minimumFractionDigits", "maximumFractionDigits", "minimumSignificantDigits", "maximumSignificantDigits"]; +function NUMBER(args, opts) { + let arg = args[0]; + if (arg instanceof FluentNone) { + return new FluentNone(`NUMBER(${arg.valueOf()})`); + } + if (arg instanceof FluentNumber) { + return new FluentNumber(arg.valueOf(), { + ...arg.opts, + ...builtins_values(opts, NUMBER_ALLOWED) + }); + } + if (arg instanceof FluentDateTime) { + return new FluentNumber(arg.toNumber(), { + ...builtins_values(opts, NUMBER_ALLOWED) + }); + } + throw new TypeError("Invalid argument to NUMBER"); +} +const DATETIME_ALLOWED = ["dateStyle", "timeStyle", "fractionalSecondDigits", "dayPeriod", "hour12", "weekday", "era", "year", "month", "day", "hour", "minute", "second", "timeZoneName"]; +function DATETIME(args, opts) { + let arg = args[0]; + if (arg instanceof FluentNone) { + return new FluentNone(`DATETIME(${arg.valueOf()})`); + } + if (arg instanceof FluentDateTime || arg instanceof FluentNumber) { + return new FluentDateTime(arg, builtins_values(opts, DATETIME_ALLOWED)); + } + throw new TypeError("Invalid argument to DATETIME"); +} +;// ./node_modules/@fluent/bundle/esm/memoizer.js + + +const cache = new Map(); +function getMemoizerForLocale(locales) { + const stringLocale = Array.isArray(locales) ? locales.join(" ") : locales; + let memoizer = cache.get(stringLocale); + if (memoizer === undefined) { + memoizer = new Map(); + cache.set(stringLocale, memoizer); + } + return memoizer; +} +;// ./node_modules/@fluent/bundle/esm/bundle.js + + + + + + + + +class FluentBundle { + constructor(locales, { + functions, + useIsolating = true, + transform = v => v + } = {}) { + this._terms = new Map(); + this._messages = new Map(); + this.locales = Array.isArray(locales) ? locales : [locales]; + this._functions = { + NUMBER: NUMBER, + DATETIME: DATETIME, + ...functions + }; + this._useIsolating = useIsolating; + this._transform = transform; + this._intls = getMemoizerForLocale(locales); + } + hasMessage(id) { + return this._messages.has(id); + } + getMessage(id) { + return this._messages.get(id); + } + addResource(res, { + allowOverrides = false + } = {}) { + const errors = []; + for (let i = 0; i < res.body.length; i++) { + let entry = res.body[i]; + if (entry.id.startsWith("-")) { + if (allowOverrides === false && this._terms.has(entry.id)) { + errors.push(new Error(`Attempt to override an existing term: "${entry.id}"`)); + continue; + } + this._terms.set(entry.id, entry); + } else { + if (allowOverrides === false && this._messages.has(entry.id)) { + errors.push(new Error(`Attempt to override an existing message: "${entry.id}"`)); + continue; + } + this._messages.set(entry.id, entry); + } + } + return errors; + } + formatPattern(pattern, args = null, errors = null) { + if (typeof pattern === "string") { + return this._transform(pattern); + } + let scope = new Scope(this, errors, args); + try { + let value = resolveComplexPattern(scope, pattern); + return value.toString(scope); + } catch (err) { + if (scope.errors && err instanceof Error) { + scope.errors.push(err); + return new FluentNone().toString(scope); + } + throw err; + } + } +} +;// ./node_modules/@fluent/bundle/esm/resource.js + +const RE_MESSAGE_START = /^(-?[a-zA-Z][\w-]*) *= */gm; +const RE_ATTRIBUTE_START = /\.([a-zA-Z][\w-]*) *= */y; +const RE_VARIANT_START = /\*?\[/y; +const RE_NUMBER_LITERAL = /(-?[0-9]+(?:\.([0-9]+))?)/y; +const RE_IDENTIFIER = /([a-zA-Z][\w-]*)/y; +const RE_REFERENCE = /([$-])?([a-zA-Z][\w-]*)(?:\.([a-zA-Z][\w-]*))?/y; +const RE_FUNCTION_NAME = /^[A-Z][A-Z0-9_-]*$/; +const RE_TEXT_RUN = /([^{}\n\r]+)/y; +const RE_STRING_RUN = /([^\\"\n\r]*)/y; +const RE_STRING_ESCAPE = /\\([\\"])/y; +const RE_UNICODE_ESCAPE = /\\u([a-fA-F0-9]{4})|\\U([a-fA-F0-9]{6})/y; +const RE_LEADING_NEWLINES = /^\n+/; +const RE_TRAILING_SPACES = / +$/; +const RE_BLANK_LINES = / *\r?\n/g; +const RE_INDENT = /( *)$/; +const TOKEN_BRACE_OPEN = /{\s*/y; +const TOKEN_BRACE_CLOSE = /\s*}/y; +const TOKEN_BRACKET_OPEN = /\[\s*/y; +const TOKEN_BRACKET_CLOSE = /\s*] */y; +const TOKEN_PAREN_OPEN = /\s*\(\s*/y; +const TOKEN_ARROW = /\s*->\s*/y; +const TOKEN_COLON = /\s*:\s*/y; +const TOKEN_COMMA = /\s*,?\s*/y; +const TOKEN_BLANK = /\s+/y; +class FluentResource { + constructor(source) { + this.body = []; + RE_MESSAGE_START.lastIndex = 0; + let cursor = 0; + while (true) { + let next = RE_MESSAGE_START.exec(source); + if (next === null) { + break; + } + cursor = RE_MESSAGE_START.lastIndex; + try { + this.body.push(parseMessage(next[1])); + } catch (err) { + if (err instanceof SyntaxError) { + continue; + } + throw err; + } + } + function test(re) { + re.lastIndex = cursor; + return re.test(source); + } + function consumeChar(char, errorClass) { + if (source[cursor] === char) { + cursor++; + return true; + } + if (errorClass) { + throw new errorClass(`Expected ${char}`); + } + return false; + } + function consumeToken(re, errorClass) { + if (test(re)) { + cursor = re.lastIndex; + return true; + } + if (errorClass) { + throw new errorClass(`Expected ${re.toString()}`); + } + return false; + } + function match(re) { + re.lastIndex = cursor; + let result = re.exec(source); + if (result === null) { + throw new SyntaxError(`Expected ${re.toString()}`); + } + cursor = re.lastIndex; + return result; + } + function match1(re) { + return match(re)[1]; + } + function parseMessage(id) { + let value = parsePattern(); + let attributes = parseAttributes(); + if (value === null && Object.keys(attributes).length === 0) { + throw new SyntaxError("Expected message value or attributes"); + } + return { + id, + value, + attributes + }; + } + function parseAttributes() { + let attrs = Object.create(null); + while (test(RE_ATTRIBUTE_START)) { + let name = match1(RE_ATTRIBUTE_START); + let value = parsePattern(); + if (value === null) { + throw new SyntaxError("Expected attribute value"); + } + attrs[name] = value; + } + return attrs; + } + function parsePattern() { + let first; + if (test(RE_TEXT_RUN)) { + first = match1(RE_TEXT_RUN); + } + if (source[cursor] === "{" || source[cursor] === "}") { + return parsePatternElements(first ? [first] : [], Infinity); + } + let indent = parseIndent(); + if (indent) { + if (first) { + return parsePatternElements([first, indent], indent.length); + } + indent.value = trim(indent.value, RE_LEADING_NEWLINES); + return parsePatternElements([indent], indent.length); + } + if (first) { + return trim(first, RE_TRAILING_SPACES); + } + return null; + } + function parsePatternElements(elements = [], commonIndent) { + while (true) { + if (test(RE_TEXT_RUN)) { + elements.push(match1(RE_TEXT_RUN)); + continue; + } + if (source[cursor] === "{") { + elements.push(parsePlaceable()); + continue; + } + if (source[cursor] === "}") { + throw new SyntaxError("Unbalanced closing brace"); + } + let indent = parseIndent(); + if (indent) { + elements.push(indent); + commonIndent = Math.min(commonIndent, indent.length); + continue; + } + break; + } + let lastIndex = elements.length - 1; + let lastElement = elements[lastIndex]; + if (typeof lastElement === "string") { + elements[lastIndex] = trim(lastElement, RE_TRAILING_SPACES); + } + let baked = []; + for (let element of elements) { + if (element instanceof Indent) { + element = element.value.slice(0, element.value.length - commonIndent); + } + if (element) { + baked.push(element); + } + } + return baked; + } + function parsePlaceable() { + consumeToken(TOKEN_BRACE_OPEN, SyntaxError); + let selector = parseInlineExpression(); + if (consumeToken(TOKEN_BRACE_CLOSE)) { + return selector; + } + if (consumeToken(TOKEN_ARROW)) { + let variants = parseVariants(); + consumeToken(TOKEN_BRACE_CLOSE, SyntaxError); + return { + type: "select", + selector, + ...variants + }; + } + throw new SyntaxError("Unclosed placeable"); + } + function parseInlineExpression() { + if (source[cursor] === "{") { + return parsePlaceable(); + } + if (test(RE_REFERENCE)) { + let [, sigil, name, attr = null] = match(RE_REFERENCE); + if (sigil === "$") { + return { + type: "var", + name + }; + } + if (consumeToken(TOKEN_PAREN_OPEN)) { + let args = parseArguments(); + if (sigil === "-") { + return { + type: "term", + name, + attr, + args + }; + } + if (RE_FUNCTION_NAME.test(name)) { + return { + type: "func", + name, + args + }; + } + throw new SyntaxError("Function names must be all upper-case"); + } + if (sigil === "-") { + return { + type: "term", + name, + attr, + args: [] + }; + } + return { + type: "mesg", + name, + attr + }; + } + return parseLiteral(); + } + function parseArguments() { + let args = []; + while (true) { + switch (source[cursor]) { + case ")": + cursor++; + return args; + case undefined: + throw new SyntaxError("Unclosed argument list"); + } + args.push(parseArgument()); + consumeToken(TOKEN_COMMA); + } + } + function parseArgument() { + let expr = parseInlineExpression(); + if (expr.type !== "mesg") { + return expr; + } + if (consumeToken(TOKEN_COLON)) { + return { + type: "narg", + name: expr.name, + value: parseLiteral() + }; + } + return expr; + } + function parseVariants() { + let variants = []; + let count = 0; + let star; + while (test(RE_VARIANT_START)) { + if (consumeChar("*")) { + star = count; + } + let key = parseVariantKey(); + let value = parsePattern(); + if (value === null) { + throw new SyntaxError("Expected variant value"); + } + variants[count++] = { + key, + value + }; + } + if (count === 0) { + return null; + } + if (star === undefined) { + throw new SyntaxError("Expected default variant"); + } + return { + variants, + star + }; + } + function parseVariantKey() { + consumeToken(TOKEN_BRACKET_OPEN, SyntaxError); + let key; + if (test(RE_NUMBER_LITERAL)) { + key = parseNumberLiteral(); + } else { + key = { + type: "str", + value: match1(RE_IDENTIFIER) + }; + } + consumeToken(TOKEN_BRACKET_CLOSE, SyntaxError); + return key; + } + function parseLiteral() { + if (test(RE_NUMBER_LITERAL)) { + return parseNumberLiteral(); + } + if (source[cursor] === '"') { + return parseStringLiteral(); + } + throw new SyntaxError("Invalid expression"); + } + function parseNumberLiteral() { + let [, value, fraction = ""] = match(RE_NUMBER_LITERAL); + let precision = fraction.length; + return { + type: "num", + value: parseFloat(value), + precision + }; + } + function parseStringLiteral() { + consumeChar('"', SyntaxError); + let value = ""; + while (true) { + value += match1(RE_STRING_RUN); + if (source[cursor] === "\\") { + value += parseEscapeSequence(); + continue; + } + if (consumeChar('"')) { + return { + type: "str", + value + }; + } + throw new SyntaxError("Unclosed string literal"); + } + } + function parseEscapeSequence() { + if (test(RE_STRING_ESCAPE)) { + return match1(RE_STRING_ESCAPE); + } + if (test(RE_UNICODE_ESCAPE)) { + let [, codepoint4, codepoint6] = match(RE_UNICODE_ESCAPE); + let codepoint = parseInt(codepoint4 || codepoint6, 16); + return codepoint <= 0xd7ff || 0xe000 <= codepoint ? String.fromCodePoint(codepoint) : "�"; + } + throw new SyntaxError("Unknown escape sequence"); + } + function parseIndent() { + let start = cursor; + consumeToken(TOKEN_BLANK); + switch (source[cursor]) { + case ".": + case "[": + case "*": + case "}": + case undefined: + return false; + case "{": + return makeIndent(source.slice(start, cursor)); + } + if (source[cursor - 1] === " ") { + return makeIndent(source.slice(start, cursor)); + } + return false; + } + function trim(text, re) { + return text.replace(re, ""); + } + function makeIndent(blank) { + let value = blank.replace(RE_BLANK_LINES, "\n"); + let length = RE_INDENT.exec(blank)[1].length; + return new Indent(value, length); + } + } +} +class Indent { + constructor(value, length) { + this.value = value; + this.length = length; + } +} +;// ./node_modules/@fluent/bundle/esm/index.js + + + +;// ./node_modules/core-js/modules/es.iterator.map.js +es_iterator_map_namespaceFn(); + +;// ./node_modules/@fluent/dom/esm/overlay.js + + + +const reOverlay = /<|&#?\w+;/; +const TEXT_LEVEL_ELEMENTS = { + "http://www.w3.org/1999/xhtml": ["em", "strong", "small", "s", "cite", "q", "dfn", "abbr", "data", "time", "code", "var", "samp", "kbd", "sub", "sup", "i", "b", "u", "mark", "bdi", "bdo", "span", "br", "wbr"] +}; +const LOCALIZABLE_ATTRIBUTES = { + "http://www.w3.org/1999/xhtml": { + global: ["title", "aria-description", "aria-label", "aria-valuetext"], + a: ["download"], + area: ["download", "alt"], + input: ["alt", "placeholder"], + menuitem: ["label"], + menu: ["label"], + optgroup: ["label"], + option: ["label"], + track: ["label"], + img: ["alt"], + textarea: ["placeholder"], + th: ["abbr"] + }, + "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul": { + global: ["accesskey", "aria-label", "aria-valuetext", "label", "title", "tooltiptext"], + description: ["value"], + key: ["key", "keycode"], + label: ["value"], + textbox: ["placeholder", "value"] + } +}; +function translateElement(element, translation) { + const { + value + } = translation; + if (typeof value === "string") { + if (element.localName === "title" && element.namespaceURI === "http://www.w3.org/1999/xhtml") { + element.textContent = value; + } else if (!reOverlay.test(value)) { + element.textContent = value; + } else { + const templateElement = element.ownerDocument.createElementNS("http://www.w3.org/1999/xhtml", "template"); + templateElement.innerHTML = value; + overlayChildNodes(templateElement.content, element); + } + } + overlayAttributes(translation, element); +} +function overlayChildNodes(fromFragment, toElement) { + for (const childNode of fromFragment.childNodes) { + if (childNode.nodeType === childNode.TEXT_NODE) { + continue; + } + if (childNode.hasAttribute("data-l10n-name")) { + const sanitized = getNodeForNamedElement(toElement, childNode); + fromFragment.replaceChild(sanitized, childNode); + continue; + } + if (isElementAllowed(childNode)) { + const sanitized = createSanitizedElement(childNode); + fromFragment.replaceChild(sanitized, childNode); + continue; + } + console.warn(`An element of forbidden type "${childNode.localName}" was found in ` + "the translation. Only safe text-level elements and elements with " + "data-l10n-name are allowed."); + fromFragment.replaceChild(createTextNodeFromTextContent(childNode), childNode); + } + toElement.textContent = ""; + toElement.appendChild(fromFragment); +} +function hasAttribute(attributes, name) { + if (!attributes) { + return false; + } + for (let attr of attributes) { + if (attr.name === name) { + return true; + } + } + return false; +} +function overlayAttributes(fromElement, toElement) { + const explicitlyAllowed = toElement.hasAttribute("data-l10n-attrs") ? toElement.getAttribute("data-l10n-attrs").split(",").map(i => i.trim()) : null; + for (const attr of Array.from(toElement.attributes)) { + if (isAttrNameLocalizable(attr.name, toElement, explicitlyAllowed) && !hasAttribute(fromElement.attributes, attr.name)) { + toElement.removeAttribute(attr.name); + } + } + if (!fromElement.attributes) { + return; + } + for (const attr of Array.from(fromElement.attributes)) { + if (isAttrNameLocalizable(attr.name, toElement, explicitlyAllowed) && toElement.getAttribute(attr.name) !== attr.value) { + toElement.setAttribute(attr.name, attr.value); + } + } +} +function getNodeForNamedElement(sourceElement, translatedChild) { + const childName = translatedChild.getAttribute("data-l10n-name"); + const sourceChild = sourceElement.querySelector(`[data-l10n-name="${childName}"]`); + if (!sourceChild) { + console.warn(`An element named "${childName}" wasn't found in the source.`); + return createTextNodeFromTextContent(translatedChild); + } + if (sourceChild.localName !== translatedChild.localName) { + console.warn(`An element named "${childName}" was found in the translation ` + `but its type ${translatedChild.localName} didn't match the ` + `element found in the source (${sourceChild.localName}).`); + return createTextNodeFromTextContent(translatedChild); + } + sourceElement.removeChild(sourceChild); + const clone = sourceChild.cloneNode(false); + return shallowPopulateUsing(translatedChild, clone); +} +function createSanitizedElement(element) { + const clone = element.ownerDocument.createElement(element.localName); + return shallowPopulateUsing(element, clone); +} +function createTextNodeFromTextContent(element) { + return element.ownerDocument.createTextNode(element.textContent); +} +function isElementAllowed(element) { + const allowed = TEXT_LEVEL_ELEMENTS[element.namespaceURI]; + return allowed && allowed.includes(element.localName); +} +function isAttrNameLocalizable(name, element, explicitlyAllowed = null) { + if (explicitlyAllowed && explicitlyAllowed.includes(name)) { + return true; + } + const allowed = LOCALIZABLE_ATTRIBUTES[element.namespaceURI]; + if (!allowed) { + return false; + } + const attrName = name.toLowerCase(); + const elemName = element.localName; + if (allowed.global.includes(attrName)) { + return true; + } + if (!allowed[elemName]) { + return false; + } + if (allowed[elemName].includes(attrName)) { + return true; + } + if (element.namespaceURI === "http://www.w3.org/1999/xhtml" && elemName === "input" && attrName === "value") { + const type = element.type.toLowerCase(); + if (type === "submit" || type === "button" || type === "reset") { + return true; + } + } + return false; +} +function shallowPopulateUsing(fromElement, toElement) { + toElement.textContent = fromElement.textContent; + overlayAttributes(fromElement, toElement); + return toElement; +} +;// ./node_modules/core-js/modules/es.iterator.filter.js +es_iterator_filter_namespaceFn(); + +;// ./node_modules/cached-iterable/src/cached_iterable.mjs +class CachedIterable extends Array { + static from(iterable) { + if (iterable instanceof this) { + return iterable; + } + return new this(iterable); + } +} +;// ./node_modules/cached-iterable/src/cached_sync_iterable.mjs + + +class CachedSyncIterable extends CachedIterable { + constructor(iterable) { + super(); + if (Symbol.iterator in Object(iterable)) { + this.iterator = iterable[Symbol.iterator](); + } else { + throw new TypeError("Argument must implement the iteration protocol."); + } + } + [Symbol.iterator]() { + const cached = this; + let cur = 0; + return { + next() { + if (cached.length <= cur) { + cached.push(cached.iterator.next()); + } + return cached[cur++]; + } + }; + } + touchNext(count = 1) { + let idx = 0; + while (idx++ < count) { + const last = this[this.length - 1]; + if (last && last.done) { + break; + } + this.push(this.iterator.next()); + } + return this[this.length - 1]; + } +} +;// ./node_modules/cached-iterable/src/cached_async_iterable.mjs + + +class CachedAsyncIterable extends CachedIterable { + constructor(iterable) { + super(); + if (Symbol.asyncIterator in Object(iterable)) { + this.iterator = iterable[Symbol.asyncIterator](); + } else if (Symbol.iterator in Object(iterable)) { + this.iterator = iterable[Symbol.iterator](); + } else { + throw new TypeError("Argument must implement the iteration protocol."); + } + } + [Symbol.asyncIterator]() { + const cached = this; + let cur = 0; + return { + async next() { + if (cached.length <= cur) { + cached.push(cached.iterator.next()); + } + return cached[cur++]; + } + }; + } + async touchNext(count = 1) { + let idx = 0; + while (idx++ < count) { + const last = this[this.length - 1]; + if (last && (await last).done) { + break; + } + this.push(this.iterator.next()); + } + return this[this.length - 1]; + } +} +;// ./node_modules/cached-iterable/src/index.mjs + + +;// ./node_modules/@fluent/dom/esm/localization.js + + + + + + + + + + + + + + +class Localization { + constructor(resourceIds = [], generateBundles) { + this.resourceIds = resourceIds; + this.generateBundles = generateBundles; + this.onChange(true); + } + addResourceIds(resourceIds, eager = false) { + this.resourceIds.push(...resourceIds); + this.onChange(eager); + return this.resourceIds.length; + } + removeResourceIds(resourceIds) { + this.resourceIds = this.resourceIds.filter(r => !resourceIds.includes(r)); + this.onChange(); + return this.resourceIds.length; + } + async formatWithFallback(keys, method) { + const translations = []; + let hasAtLeastOneBundle = false; + for await (const bundle of this.bundles) { + hasAtLeastOneBundle = true; + const missingIds = keysFromBundle(method, bundle, keys, translations); + if (missingIds.size === 0) { + break; + } + if (typeof console !== "undefined") { + const locale = bundle.locales[0]; + const ids = Array.from(missingIds).join(", "); + console.warn(`[fluent] Missing translations in ${locale}: ${ids}`); + } + } + if (!hasAtLeastOneBundle && typeof console !== "undefined") { + console.warn(`[fluent] Request for keys failed because no resource bundles got generated. + keys: ${JSON.stringify(keys)}. + resourceIds: ${JSON.stringify(this.resourceIds)}.`); + } + return translations; + } + formatMessages(keys) { + return this.formatWithFallback(keys, messageFromBundle); + } + formatValues(keys) { + return this.formatWithFallback(keys, valueFromBundle); + } + async formatValue(id, args) { + const [val] = await this.formatValues([{ + id, + args + }]); + return val; + } + handleEvent() { + this.onChange(); + } + onChange(eager = false) { + this.bundles = CachedAsyncIterable.from(this.generateBundles(this.resourceIds)); + if (eager) { + this.bundles.touchNext(2); + } + } +} +function valueFromBundle(bundle, errors, message, args) { + if (message.value) { + return bundle.formatPattern(message.value, args, errors); + } + return null; +} +function messageFromBundle(bundle, errors, message, args) { + const formatted = { + value: null, + attributes: null + }; + if (message.value) { + formatted.value = bundle.formatPattern(message.value, args, errors); + } + let attrNames = Object.keys(message.attributes); + if (attrNames.length > 0) { + formatted.attributes = new Array(attrNames.length); + for (let [i, name] of attrNames.entries()) { + let value = bundle.formatPattern(message.attributes[name], args, errors); + formatted.attributes[i] = { + name, + value + }; + } + } + return formatted; +} +function keysFromBundle(method, bundle, keys, translations) { + const messageErrors = []; + const missingIds = new Set(); + keys.forEach(({ + id, + args + }, i) => { + if (translations[i] !== undefined) { + return; + } + let message = bundle.getMessage(id); + if (message) { + messageErrors.length = 0; + translations[i] = method(bundle, messageErrors, message, args); + if (messageErrors.length > 0 && typeof console !== "undefined") { + const locale = bundle.locales[0]; + const errors = messageErrors.join(", "); + console.warn(`[fluent][resolver] errors in ${locale}/${id}: ${errors}.`); + } + } else { + missingIds.add(id); + } + }); + return missingIds; +} +;// ./node_modules/@fluent/dom/esm/dom_localization.js + + + + + + + + + + + + + + +const L10NID_ATTR_NAME = "data-l10n-id"; +const L10NARGS_ATTR_NAME = "data-l10n-args"; +const L10N_ELEMENT_QUERY = `[${L10NID_ATTR_NAME}]`; +class DOMLocalization extends Localization { + constructor(resourceIds, generateBundles) { + super(resourceIds, generateBundles); + this.roots = new Set(); + this.pendingrAF = null; + this.pendingElements = new Set(); + this.windowElement = null; + this.mutationObserver = null; + this.observerConfig = { + attributes: true, + characterData: false, + childList: true, + subtree: true, + attributeFilter: [L10NID_ATTR_NAME, L10NARGS_ATTR_NAME] + }; + } + onChange(eager = false) { + super.onChange(eager); + if (this.roots) { + this.translateRoots(); + } + } + setAttributes(element, id, args) { + element.setAttribute(L10NID_ATTR_NAME, id); + if (args) { + element.setAttribute(L10NARGS_ATTR_NAME, JSON.stringify(args)); + } else { + element.removeAttribute(L10NARGS_ATTR_NAME); + } + return element; + } + getAttributes(element) { + return { + id: element.getAttribute(L10NID_ATTR_NAME), + args: JSON.parse(element.getAttribute(L10NARGS_ATTR_NAME) || null) + }; + } + connectRoot(newRoot) { + for (const root of this.roots) { + if (root === newRoot || root.contains(newRoot) || newRoot.contains(root)) { + throw new Error("Cannot add a root that overlaps with existing root."); + } + } + if (this.windowElement) { + if (this.windowElement !== newRoot.ownerDocument.defaultView) { + throw new Error(`Cannot connect a root: + DOMLocalization already has a root from a different window.`); + } + } else { + this.windowElement = newRoot.ownerDocument.defaultView; + this.mutationObserver = new this.windowElement.MutationObserver(mutations => this.translateMutations(mutations)); + } + this.roots.add(newRoot); + this.mutationObserver.observe(newRoot, this.observerConfig); + } + disconnectRoot(root) { + this.roots.delete(root); + this.pauseObserving(); + if (this.roots.size === 0) { + this.mutationObserver = null; + if (this.windowElement && this.pendingrAF) { + this.windowElement.cancelAnimationFrame(this.pendingrAF); + } + this.windowElement = null; + this.pendingrAF = null; + this.pendingElements.clear(); + return true; + } + this.resumeObserving(); + return false; + } + translateRoots() { + const roots = Array.from(this.roots); + return Promise.all(roots.map(root => this.translateFragment(root))); + } + pauseObserving() { + if (!this.mutationObserver) { + return; + } + this.translateMutations(this.mutationObserver.takeRecords()); + this.mutationObserver.disconnect(); + } + resumeObserving() { + if (!this.mutationObserver) { + return; + } + for (const root of this.roots) { + this.mutationObserver.observe(root, this.observerConfig); + } + } + translateMutations(mutations) { + for (const mutation of mutations) { + switch (mutation.type) { + case "attributes": + if (mutation.target.hasAttribute("data-l10n-id")) { + this.pendingElements.add(mutation.target); + } + break; + case "childList": + for (const addedNode of mutation.addedNodes) { + if (addedNode.nodeType === addedNode.ELEMENT_NODE) { + if (addedNode.childElementCount) { + for (const element of this.getTranslatables(addedNode)) { + this.pendingElements.add(element); + } + } else if (addedNode.hasAttribute(L10NID_ATTR_NAME)) { + this.pendingElements.add(addedNode); + } + } + } + break; + } + } + if (this.pendingElements.size > 0) { + if (this.pendingrAF === null) { + this.pendingrAF = this.windowElement.requestAnimationFrame(() => { + this.translateElements(Array.from(this.pendingElements)); + this.pendingElements.clear(); + this.pendingrAF = null; + }); + } + } + } + translateFragment(frag) { + return this.translateElements(this.getTranslatables(frag)); + } + async translateElements(elements) { + if (!elements.length) { + return undefined; + } + const keys = elements.map(this.getKeysForElement); + const translations = await this.formatMessages(keys); + return this.applyTranslations(elements, translations); + } + applyTranslations(elements, translations) { + this.pauseObserving(); + for (let i = 0; i < elements.length; i++) { + if (translations[i] !== undefined) { + translateElement(elements[i], translations[i]); + } + } + this.resumeObserving(); + } + getTranslatables(element) { + const nodes = Array.from(element.querySelectorAll(L10N_ELEMENT_QUERY)); + if (typeof element.hasAttribute === "function" && element.hasAttribute(L10NID_ATTR_NAME)) { + nodes.push(element); + } + return nodes; + } + getKeysForElement(element) { + return { + id: element.getAttribute(L10NID_ATTR_NAME), + args: JSON.parse(element.getAttribute(L10NARGS_ATTR_NAME) || null) + }; + } +} +;// ./node_modules/@fluent/dom/esm/index.js + + +;// ./web/l10n.js + + + + + + + + + + +class L10n { + #dir; + #elements; + #lang; + #l10n; + constructor({ + lang, + isRTL + }, l10n = null) { + this.#lang = L10n.#fixupLangCode(lang); + this.#l10n = l10n; + this.#dir = isRTL ?? L10n.#isRTL(this.#lang) ? "rtl" : "ltr"; + } + _setL10n(l10n) { + this.#l10n = l10n; + } + getLanguage() { + return this.#lang; + } + getDirection() { + return this.#dir; + } + async get(ids, args = null) { + if (Array.isArray(ids)) { + ids = ids.map(id => ({ + id + })); + const messages = await this.#l10n.formatMessages(ids); + return messages.map(message => message.value); + } + const messages = await this.#l10n.formatMessages([{ + id: ids, + args + }]); + return messages[0]?.value; + } + async translate(element) { + (this.#elements ||= new Set()).add(element); + try { + this.#l10n.connectRoot(element); + await this.#l10n.translateRoots(); + } catch {} + } + async translateOnce(element) { + try { + await this.#l10n.translateElements([element]); + } catch (ex) { + console.error("translateOnce:", ex); + } + } + async destroy() { + if (this.#elements) { + for (const element of this.#elements) { + this.#l10n.disconnectRoot(element); + } + this.#elements.clear(); + this.#elements = null; + } + this.#l10n.pauseObserving(); + } + pause() { + this.#l10n.pauseObserving(); + } + resume() { + this.#l10n.resumeObserving(); + } + static #fixupLangCode(langCode) { + langCode = langCode?.toLowerCase() || "en-us"; + const PARTIAL_LANG_CODES = { + en: "en-us", + es: "es-es", + fy: "fy-nl", + ga: "ga-ie", + gu: "gu-in", + hi: "hi-in", + hy: "hy-am", + nb: "nb-no", + ne: "ne-np", + nn: "nn-no", + pa: "pa-in", + pt: "pt-pt", + sv: "sv-se", + zh: "zh-cn" + }; + return PARTIAL_LANG_CODES[langCode] || langCode; + } + static #isRTL(lang) { + const shortCode = lang.split("-", 1)[0]; + return ["ar", "he", "fa", "ps", "ur"].includes(shortCode); + } +} +const GenericL10n = null; + +;// ./web/genericl10n.js + + + + + +function PLATFORM() { + const { + isAndroid, + isLinux, + isMac, + isWindows + } = FeatureTest.platform; + if (isLinux) { + return "linux"; + } + if (isWindows) { + return "windows"; + } + if (isMac) { + return "macos"; + } + return isAndroid ? "android" : "other"; +} +function createBundle(lang, text) { + const resource = new FluentResource(text); + const bundle = new FluentBundle(lang, { + functions: { + PLATFORM + } + }); + const errors = bundle.addResource(resource); + if (errors.length) { + console.error("L10n errors", errors); + } + return bundle; +} +class genericl10n_GenericL10n extends L10n { + constructor(lang) { + super({ + lang + }); + const generateBundles = !lang ? genericl10n_GenericL10n.#generateBundlesFallback.bind(genericl10n_GenericL10n, this.getLanguage()) : genericl10n_GenericL10n.#generateBundles.bind(genericl10n_GenericL10n, "en-us", this.getLanguage()); + this._setL10n(new DOMLocalization([], generateBundles)); + } + static async *#generateBundles(defaultLang, baseLang) { + const { + baseURL, + paths + } = await this.#getPaths(); + const langs = [baseLang]; + if (defaultLang !== baseLang) { + const shortLang = baseLang.split("-", 1)[0]; + if (shortLang !== baseLang) { + langs.push(shortLang); + } + langs.push(defaultLang); + } + const bundles = langs.map(lang => [lang, this.#createBundle(lang, baseURL, paths)]); + for (const [lang, bundlePromise] of bundles) { + const bundle = await bundlePromise; + if (bundle) { + yield bundle; + } else if (lang === "en-us") { + yield this.#createBundleFallback(lang); + } + } + } + static async #createBundle(lang, baseURL, paths) { + const path = paths[lang]; + if (!path) { + return null; + } + const url = new URL(path, baseURL); + const text = await fetchData(url, "text"); + return createBundle(lang, text); + } + static async #getPaths() { + try { + const { + href + } = document.querySelector(`link[type="application/l10n"]`); + const paths = await fetchData(href, "json"); + return { + baseURL: href.substring(0, href.lastIndexOf("/") + 1) || "./", + paths + }; + } catch {} + return { + baseURL: "./", + paths: Object.create(null) + }; + } + static async *#generateBundlesFallback(lang) { + yield this.#createBundleFallback(lang); + } + static async #createBundleFallback(lang) { + const text = "pdfjs-previous-button =\n .title = Previous Page\npdfjs-previous-button-label = Previous\npdfjs-next-button =\n .title = Next Page\npdfjs-next-button-label = Next\npdfjs-page-input =\n .title = Page\npdfjs-of-pages = of { $pagesCount }\npdfjs-page-of-pages = ({ $pageNumber } of { $pagesCount })\npdfjs-zoom-out-button =\n .title = Zoom Out\npdfjs-zoom-out-button-label = Zoom Out\npdfjs-zoom-in-button =\n .title = Zoom In\npdfjs-zoom-in-button-label = Zoom In\npdfjs-zoom-select =\n .title = Zoom\npdfjs-presentation-mode-button =\n .title = Switch to Presentation Mode\npdfjs-presentation-mode-button-label = Presentation Mode\npdfjs-open-file-button =\n .title = Open File\npdfjs-open-file-button-label = Open\npdfjs-print-button =\n .title = Print\npdfjs-print-button-label = Print\npdfjs-save-button =\n .title = Save\npdfjs-save-button-label = Save\npdfjs-download-button =\n .title = Download\npdfjs-download-button-label = Download\npdfjs-bookmark-button =\n .title = Current Page (View URL from Current Page)\npdfjs-bookmark-button-label = Current Page\npdfjs-tools-button =\n .title = Tools\npdfjs-tools-button-label = Tools\npdfjs-first-page-button =\n .title = Go to First Page\npdfjs-first-page-button-label = Go to First Page\npdfjs-last-page-button =\n .title = Go to Last Page\npdfjs-last-page-button-label = Go to Last Page\npdfjs-page-rotate-cw-button =\n .title = Rotate Clockwise\npdfjs-page-rotate-cw-button-label = Rotate Clockwise\npdfjs-page-rotate-ccw-button =\n .title = Rotate Counterclockwise\npdfjs-page-rotate-ccw-button-label = Rotate Counterclockwise\npdfjs-cursor-text-select-tool-button =\n .title = Enable Text Selection Tool\npdfjs-cursor-text-select-tool-button-label = Text Selection Tool\npdfjs-cursor-hand-tool-button =\n .title = Enable Hand Tool\npdfjs-cursor-hand-tool-button-label = Hand Tool\npdfjs-scroll-page-button =\n .title = Use Page Scrolling\npdfjs-scroll-page-button-label = Page Scrolling\npdfjs-scroll-vertical-button =\n .title = Use Vertical Scrolling\npdfjs-scroll-vertical-button-label = Vertical Scrolling\npdfjs-scroll-horizontal-button =\n .title = Use Horizontal Scrolling\npdfjs-scroll-horizontal-button-label = Horizontal Scrolling\npdfjs-scroll-wrapped-button =\n .title = Use Wrapped Scrolling\npdfjs-scroll-wrapped-button-label = Wrapped Scrolling\npdfjs-spread-none-button =\n .title = Do not join page spreads\npdfjs-spread-none-button-label = No Spreads\npdfjs-spread-odd-button =\n .title = Join page spreads starting with odd-numbered pages\npdfjs-spread-odd-button-label = Odd Spreads\npdfjs-spread-even-button =\n .title = Join page spreads starting with even-numbered pages\npdfjs-spread-even-button-label = Even Spreads\npdfjs-document-properties-button =\n .title = Document Properties…\npdfjs-document-properties-button-label = Document Properties…\npdfjs-document-properties-file-name = File name:\npdfjs-document-properties-file-size = File size:\npdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes)\npdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes)\npdfjs-document-properties-title = Title:\npdfjs-document-properties-author = Author:\npdfjs-document-properties-subject = Subject:\npdfjs-document-properties-keywords = Keywords:\npdfjs-document-properties-creation-date = Creation Date:\npdfjs-document-properties-modification-date = Modification Date:\npdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: \"short\", timeStyle: \"medium\") }\npdfjs-document-properties-creator = Creator:\npdfjs-document-properties-producer = PDF Producer:\npdfjs-document-properties-version = PDF Version:\npdfjs-document-properties-page-count = Page Count:\npdfjs-document-properties-page-size = Page Size:\npdfjs-document-properties-page-size-unit-inches = in\npdfjs-document-properties-page-size-unit-millimeters = mm\npdfjs-document-properties-page-size-orientation-portrait = portrait\npdfjs-document-properties-page-size-orientation-landscape = landscape\npdfjs-document-properties-page-size-name-a-three = A3\npdfjs-document-properties-page-size-name-a-four = A4\npdfjs-document-properties-page-size-name-letter = Letter\npdfjs-document-properties-page-size-name-legal = Legal\npdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation })\npdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation })\npdfjs-document-properties-linearized = Fast Web View:\npdfjs-document-properties-linearized-yes = Yes\npdfjs-document-properties-linearized-no = No\npdfjs-document-properties-close-button = Close\npdfjs-print-progress-message = Preparing document for printing…\npdfjs-print-progress-percent = { $progress }%\npdfjs-print-progress-close-button = Cancel\npdfjs-printing-not-supported = Warning: Printing is not fully supported by this browser.\npdfjs-printing-not-ready = Warning: The PDF is not fully loaded for printing.\npdfjs-current-outline-item-button =\n .title = Find Current Outline Item\npdfjs-current-outline-item-button-label = Current Outline Item\npdfjs-findbar-button =\n .title = Find in Document\npdfjs-findbar-button-label = Find\npdfjs-additional-layers = Additional Layers\npdfjs-thumb-page-title1 =\n .title = Page { $page } of { $total }\npdfjs-thumb-page-canvas =\n .aria-label = Thumbnail of Page { $page }\npdfjs-thumb-page-checkbox1 =\n .title = Select page { $page }\npdfjs-find-input =\n .title = Find\n .placeholder = Find in document…\npdfjs-find-previous-button =\n .title = Find the previous occurrence of the phrase\npdfjs-find-previous-button-label = Previous\npdfjs-find-next-button =\n .title = Find the next occurrence of the phrase\npdfjs-find-next-button-label = Next\npdfjs-find-highlight-checkbox = Highlight All\npdfjs-find-match-case-checkbox-label = Match Case\npdfjs-find-match-diacritics-checkbox-label = Match Diacritics\npdfjs-find-entire-word-checkbox-label = Whole Words\npdfjs-find-reached-top = Reached top of document, continued from bottom\npdfjs-find-reached-bottom = Reached end of document, continued from top\npdfjs-find-match-count =\n { $total ->\n [one] { $current } of { $total } match\n *[other] { $current } of { $total } matches\n }\npdfjs-find-match-count-limit =\n { $limit ->\n [one] More than { $limit } match\n *[other] More than { $limit } matches\n }\npdfjs-find-not-found = Phrase not found\npdfjs-page-scale-width = Page Width\npdfjs-page-scale-fit = Page Fit\npdfjs-page-scale-auto = Automatic Zoom\npdfjs-page-scale-actual = Actual Size\npdfjs-page-scale-percent = { $scale }%\npdfjs-page-landmark =\n .aria-label = Page { $page }\npdfjs-loading-error = An error occurred while loading the PDF.\npdfjs-invalid-file-error = Invalid or corrupted PDF file.\npdfjs-missing-file-error = Missing PDF file.\npdfjs-unexpected-response-error = Unexpected server response.\npdfjs-rendering-error = An error occurred while rendering the page.\npdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: \"short\", timeStyle: \"medium\") }\npdfjs-text-annotation-type =\n .alt = [{ $type } Annotation]\npdfjs-password-label = Enter the password to open this PDF file.\npdfjs-password-invalid = Invalid password. Please try again.\npdfjs-password-ok-button = OK\npdfjs-password-cancel-button = Cancel\npdfjs-web-fonts-disabled = Web fonts are disabled: unable to use embedded PDF fonts.\npdfjs-editor-free-text-button =\n .title = Text\npdfjs-editor-color-picker-free-text-input =\n .title = Change text color\npdfjs-editor-free-text-button-label = Text\npdfjs-editor-ink-button =\n .title = Draw\npdfjs-editor-color-picker-ink-input =\n .title = Change drawing color\npdfjs-editor-ink-button-label = Draw\npdfjs-editor-stamp-button =\n .title = Add or edit images\npdfjs-editor-stamp-button-label = Add or edit images\npdfjs-editor-highlight-button =\n .title = Highlight\npdfjs-editor-highlight-button-label = Highlight\npdfjs-highlight-floating-button1 =\n .title = Highlight\n .aria-label = Highlight\npdfjs-highlight-floating-button-label = Highlight\npdfjs-comment-floating-button =\n .title = Comment\n .aria-label = Comment\npdfjs-comment-floating-button-label = Comment\npdfjs-editor-comment-button =\n .title = Comment\n .aria-label = Comment\npdfjs-editor-comment-button-label = Comment\npdfjs-editor-signature-button =\n .title = Add signature\npdfjs-editor-signature-button-label = Add signature\npdfjs-editor-highlight-editor =\n .aria-label = Highlight editor\npdfjs-editor-ink-editor =\n .aria-label = Drawing editor\npdfjs-editor-signature-editor1 =\n .aria-description = Signature editor: { $description }\npdfjs-editor-stamp-editor =\n .aria-label = Image editor\npdfjs-editor-remove-ink-button =\n .title = Remove drawing\npdfjs-editor-remove-freetext-button =\n .title = Remove text\npdfjs-editor-remove-stamp-button =\n .title = Remove image\npdfjs-editor-remove-highlight-button =\n .title = Remove highlight\npdfjs-editor-remove-signature-button =\n .title = Remove signature\npdfjs-editor-free-text-color-input = Color\npdfjs-editor-free-text-size-input = Size\npdfjs-editor-ink-color-input = Color\npdfjs-editor-ink-thickness-input = Thickness\npdfjs-editor-ink-opacity-input = Opacity\npdfjs-editor-stamp-add-image-button =\n .title = Add image\npdfjs-editor-stamp-add-image-button-label = Add image\npdfjs-editor-free-highlight-thickness-input = Thickness\npdfjs-editor-free-highlight-thickness-title =\n .title = Change thickness when highlighting items other than text\npdfjs-editor-add-signature-container =\n .aria-label = Signature controls and saved signatures\npdfjs-editor-signature-add-signature-button =\n .title = Add new signature\npdfjs-editor-signature-add-signature-button-label = Add new signature\npdfjs-editor-add-saved-signature-button =\n .title = Saved signature: { $description }\npdfjs-free-text2 =\n .aria-label = Text Editor\n .default-content = Start typing…\npdfjs-editor-comments-sidebar-title =\n { $count ->\n [one] Comment\n *[other] Comments\n }\npdfjs-editor-comments-sidebar-close-button =\n .title = Close the sidebar\n .aria-label = Close the sidebar\npdfjs-editor-comments-sidebar-close-button-label = Close the sidebar\npdfjs-editor-comments-sidebar-no-comments1 = See something noteworthy? Highlight it and leave a comment.\npdfjs-editor-comments-sidebar-no-comments-link = Learn more\npdfjs-editor-alt-text-button =\n .aria-label = Alt text\npdfjs-editor-alt-text-button-label = Alt text\npdfjs-editor-alt-text-edit-button =\n .aria-label = Edit alt text\npdfjs-editor-alt-text-dialog-label = Choose an option\npdfjs-editor-alt-text-dialog-description = Alt text (alternative text) helps when people can’t see the image or when it doesn’t load.\npdfjs-editor-alt-text-add-description-label = Add a description\npdfjs-editor-alt-text-add-description-description = Aim for 1-2 sentences that describe the subject, setting, or actions.\npdfjs-editor-alt-text-mark-decorative-label = Mark as decorative\npdfjs-editor-alt-text-mark-decorative-description = This is used for ornamental images, like borders or watermarks.\npdfjs-editor-alt-text-cancel-button = Cancel\npdfjs-editor-alt-text-save-button = Save\npdfjs-editor-alt-text-decorative-tooltip = Marked as decorative\npdfjs-editor-alt-text-textarea =\n .placeholder = For example, “A young man sits down at a table to eat a meal”\npdfjs-editor-resizer-top-left =\n .aria-label = Top left corner — resize\npdfjs-editor-resizer-top-middle =\n .aria-label = Top middle — resize\npdfjs-editor-resizer-top-right =\n .aria-label = Top right corner — resize\npdfjs-editor-resizer-middle-right =\n .aria-label = Middle right — resize\npdfjs-editor-resizer-bottom-right =\n .aria-label = Bottom right corner — resize\npdfjs-editor-resizer-bottom-middle =\n .aria-label = Bottom middle — resize\npdfjs-editor-resizer-bottom-left =\n .aria-label = Bottom left corner — resize\npdfjs-editor-resizer-middle-left =\n .aria-label = Middle left — resize\npdfjs-editor-highlight-colorpicker-label = Highlight color\npdfjs-editor-colorpicker-button =\n .title = Change color\npdfjs-editor-colorpicker-dropdown =\n .aria-label = Color choices\npdfjs-editor-colorpicker-yellow =\n .title = Yellow\npdfjs-editor-colorpicker-green =\n .title = Green\npdfjs-editor-colorpicker-blue =\n .title = Blue\npdfjs-editor-colorpicker-pink =\n .title = Pink\npdfjs-editor-colorpicker-red =\n .title = Red\npdfjs-editor-highlight-show-all-button-label = Show all\npdfjs-editor-highlight-show-all-button =\n .title = Show all\npdfjs-editor-new-alt-text-dialog-edit-label = Edit alt text (image description)\npdfjs-editor-new-alt-text-dialog-add-label = Add alt text (image description)\npdfjs-editor-new-alt-text-textarea =\n .placeholder = Write your description here…\npdfjs-editor-new-alt-text-description = Short description for people who can’t see the image or when the image doesn’t load.\npdfjs-editor-new-alt-text-disclaimer1 = This alt text was created automatically and may be inaccurate.\npdfjs-editor-new-alt-text-disclaimer-learn-more-url = Learn more\npdfjs-editor-new-alt-text-create-automatically-button-label = Create alt text automatically\npdfjs-editor-new-alt-text-not-now-button = Not now\npdfjs-editor-new-alt-text-error-title = Couldn’t create alt text automatically\npdfjs-editor-new-alt-text-error-description = Please write your own alt text or try again later.\npdfjs-editor-new-alt-text-error-close-button = Close\npdfjs-editor-new-alt-text-ai-model-downloading-progress = Downloading alt text AI model ({ $downloadedSize } of { $totalSize } MB)\n .aria-valuetext = Downloading alt text AI model ({ $downloadedSize } of { $totalSize } MB)\npdfjs-editor-new-alt-text-added-button =\n .aria-label = Alt text added\npdfjs-editor-new-alt-text-added-button-label = Alt text added\npdfjs-editor-new-alt-text-missing-button =\n .aria-label = Missing alt text\npdfjs-editor-new-alt-text-missing-button-label = Missing alt text\npdfjs-editor-new-alt-text-to-review-button =\n .aria-label = Review alt text\npdfjs-editor-new-alt-text-to-review-button-label = Review alt text\npdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Created automatically: { $generatedAltText }\npdfjs-image-alt-text-settings-button =\n .title = Image alt text settings\npdfjs-image-alt-text-settings-button-label = Image alt text settings\npdfjs-editor-alt-text-settings-dialog-label = Image alt text settings\npdfjs-editor-alt-text-settings-automatic-title = Automatic alt text\npdfjs-editor-alt-text-settings-create-model-button-label = Create alt text automatically\npdfjs-editor-alt-text-settings-create-model-description = Suggests descriptions to help people who can’t see the image or when the image doesn’t load.\npdfjs-editor-alt-text-settings-editor-title = Alt text editor\npdfjs-editor-alt-text-settings-show-dialog-button-label = Show alt text editor right away when adding an image\npdfjs-editor-alt-text-settings-show-dialog-description = Helps you make sure all your images have alt text.\npdfjs-editor-alt-text-settings-close-button = Close\npdfjs-editor-highlight-added-alert = Highlight added\npdfjs-editor-freetext-added-alert = Text added\npdfjs-editor-ink-added-alert = Drawing added\npdfjs-editor-stamp-added-alert = Image added\npdfjs-editor-signature-added-alert = Signature added\npdfjs-editor-undo-bar-message-highlight = Highlight removed\npdfjs-editor-undo-bar-message-freetext = Text removed\npdfjs-editor-undo-bar-message-ink = Drawing removed\npdfjs-editor-undo-bar-message-stamp = Image removed\npdfjs-editor-undo-bar-message-signature = Signature removed\npdfjs-editor-undo-bar-message-comment = Comment removed\npdfjs-editor-undo-bar-message-multiple =\n { $count ->\n [one] { $count } annotation removed\n *[other] { $count } annotations removed\n }\npdfjs-editor-undo-bar-undo-button =\n .title = Undo\npdfjs-editor-undo-bar-undo-button-label = Undo\npdfjs-editor-undo-bar-close-button =\n .title = Close\npdfjs-editor-undo-bar-close-button-label = Close\npdfjs-editor-add-signature-dialog-label = This modal allows the user to create a signature to add to a PDF document. The user can edit the name (which also serves as the alt text), and optionally save the signature for repeated use.\npdfjs-editor-add-signature-dialog-title = Add a signature\npdfjs-editor-add-signature-type-button = Type\n .title = Type\npdfjs-editor-add-signature-draw-button = Draw\n .title = Draw\npdfjs-editor-add-signature-image-button = Image\n .title = Image\npdfjs-editor-add-signature-type-input =\n .aria-label = Type your signature\n .placeholder = Type your signature\npdfjs-editor-add-signature-draw-placeholder = Draw your signature\npdfjs-editor-add-signature-draw-thickness-range-label = Thickness\npdfjs-editor-add-signature-draw-thickness-range =\n .title = Drawing thickness: { $thickness }\npdfjs-editor-add-signature-image-placeholder = Drag a file here to upload\npdfjs-editor-add-signature-image-browse-link =\n { PLATFORM() ->\n [macos] Or choose image files\n *[other] Or browse image files\n }\npdfjs-editor-add-signature-description-label = Description (alt text)\npdfjs-editor-add-signature-description-input =\n .title = Description (alt text)\npdfjs-editor-add-signature-description-default-when-drawing = Signature\npdfjs-editor-add-signature-clear-button-label = Clear signature\npdfjs-editor-add-signature-clear-button =\n .title = Clear signature\npdfjs-editor-add-signature-save-checkbox = Save signature\npdfjs-editor-add-signature-save-warning-message = You’ve reached the limit of 5 saved signatures. Remove one to save more.\npdfjs-editor-add-signature-image-upload-error-title = Couldn’t upload image\npdfjs-editor-add-signature-image-upload-error-description = Check your network connection or try another image.\npdfjs-editor-add-signature-image-no-data-error-title = Can’t convert this image into a signature\npdfjs-editor-add-signature-image-no-data-error-description = Please try uploading a different image.\npdfjs-editor-add-signature-error-close-button = Close\npdfjs-editor-add-signature-cancel-button = Cancel\npdfjs-editor-add-signature-add-button = Add\npdfjs-editor-delete-signature-button1 =\n .title = Remove saved signature\npdfjs-editor-delete-signature-button-label1 = Remove saved signature\npdfjs-editor-add-signature-edit-button-label = Edit description\npdfjs-editor-edit-signature-dialog-title = Edit description\npdfjs-editor-edit-signature-update-button = Update\npdfjs-show-comment-button =\n .title = Show comment\npdfjs-editor-edit-comment-popup-button-label = Edit comment\npdfjs-editor-edit-comment-popup-button =\n .title = Edit comment\npdfjs-editor-delete-comment-popup-button-label = Remove comment\npdfjs-editor-delete-comment-popup-button =\n .title = Remove comment\npdfjs-editor-edit-comment-dialog-title-when-editing = Edit comment\npdfjs-editor-edit-comment-dialog-save-button-when-editing = Update\npdfjs-editor-edit-comment-dialog-title-when-adding = Add comment\npdfjs-editor-edit-comment-dialog-save-button-when-adding = Add\npdfjs-editor-edit-comment-dialog-text-input =\n .placeholder = Start typing…\npdfjs-editor-edit-comment-dialog-cancel-button = Cancel\npdfjs-editor-add-comment-button =\n .title = Add comment\npdfjs-toggle-views-manager-button1 =\n .title = Manage pages\npdfjs-toggle-views-manager-notification-button =\n .title = Toggle Sidebar (document contains thumbnails/outline/attachments/layers)\npdfjs-toggle-views-manager-button1-label = Manage pages\npdfjs-views-manager-sidebar =\n .aria-label = Sidebar\npdfjs-views-manager-sidebar-resizer =\n .aria-label = Sidebar resizer\npdfjs-views-manager-view-selector-button =\n .title = Views\npdfjs-views-manager-view-selector-button-label = Views\npdfjs-views-manager-pages-title = Pages\npdfjs-views-manager-outlines-title1 = Document outline\n .title = Document outline (double-click to expand/collapse all items)\npdfjs-views-manager-attachments-title = Attachments\npdfjs-views-manager-layers-title1 = Layers\n .title = Layers (double-click to reset all layers to the default state)\npdfjs-views-manager-pages-option-label = Pages\npdfjs-views-manager-outlines-option-label = Document outline\npdfjs-views-manager-attachments-option-label = Attachments\npdfjs-views-manager-layers-option-label = Layers\npdfjs-views-manager-add-file-button =\n .title = Add file\npdfjs-views-manager-add-file-button-label = Add file\npdfjs-views-manager-pages-status-action-label =\n { $count ->\n [one] { $count } selected\n *[other] { $count } selected\n }\npdfjs-views-manager-pages-status-none-action-label = Select pages\npdfjs-views-manager-pages-status-action-button-label = Manage\npdfjs-views-manager-pages-status-copy-button-label = Copy\npdfjs-views-manager-pages-status-cut-button-label = Cut\npdfjs-views-manager-pages-status-delete-button-label = Delete\npdfjs-views-manager-pages-status-export-selected-button-label = Export selected…\npdfjs-views-manager-status-undo-cut-label =\n { $count ->\n [one] 1 page cut\n *[other] { $count } pages cut\n }\npdfjs-views-manager-pages-status-undo-copy-label =\n { $count ->\n [one] 1 page copied\n *[other] { $count } pages copied\n }\npdfjs-views-manager-pages-status-undo-delete-label =\n { $count ->\n [one] 1 page deleted\n *[other] { $count } pages deleted\n }\npdfjs-views-manager-status-undo-button-label = Undo\npdfjs-views-manager-status-done-button-label = Done\npdfjs-views-manager-status-close-button =\n .title = Close\npdfjs-views-manager-status-close-button-label = Close\npdfjs-views-manager-paste-button-label = Paste\npdfjs-views-manager-paste-button-before =\n .title = Paste before the first page\npdfjs-views-manager-paste-button-after =\n .title = Paste after page { $page }\npdfjs-new-badge-content = NEW\npdfjs-views-manager-waiting-for-file = Uploading file…\npdfjs-digital-signature-properties-button =\n .title = Digital signature properties\n .aria-label = Digital signature properties\npdfjs-digital-signature-properties-button-label = Digital signature properties\npdfjs-digital-signature-properties-banner-verified = Document was signed with a valid digital signature\npdfjs-digital-signature-properties-banner-unknown =\n { $count ->\n [one] Document signed but { $count } digital signature could not be verified\n *[other] Document signed but { $count } digital signatures could not be verified\n }\npdfjs-digital-signature-properties-banner-untrusted =\n { $count ->\n [one] Document signed with { $count } certificate that is not trusted\n *[other] Document signed with { $count } certificates that are not trusted\n }\npdfjs-digital-signature-properties-banner-expired =\n { $count ->\n [one] Document signed with { $count } expired certificate\n *[other] Document signed with { $count } expired certificates\n }\npdfjs-digital-signature-properties-banner-invalid =\n { $count ->\n [one] Document has { $count } invalid digital signature\n *[other] Document has { $count } invalid digital signatures\n }\npdfjs-digital-signature-properties-banner-revoked =\n { $count ->\n [one] Document signed with { $count } revoked certificate\n *[other] Document signed with { $count } revoked certificates\n }\npdfjs-digital-signature-properties-status-verified = Status: Signature verified\npdfjs-digital-signature-properties-status-invalid = Status: Signature invalid\npdfjs-digital-signature-properties-status-unknown = Status: Unable to verify (unsupported)\npdfjs-digital-signature-properties-certificate-trusted = Certificate: Trusted ({ $issuer })\npdfjs-digital-signature-properties-certificate-unknown = Certificate: Unavailable\npdfjs-digital-signature-properties-certificate-untrusted = Certificate: Untrusted\npdfjs-digital-signature-properties-certificate-untrusted-unknown-issuer = Certificate: Unknown issuer ({ $issuer })\npdfjs-digital-signature-properties-certificate-untrusted-self-signed = Certificate: Self-signed ({ $issuer })\npdfjs-digital-signature-properties-certificate-untrusted-untrusted-issuer = Certificate: Untrusted issuer ({ $issuer })\npdfjs-digital-signature-properties-certificate-expired = Certificate: Expired\npdfjs-digital-signature-properties-certificate-expired-with-date = Certificate: Expired ({ DATETIME($dateObj, dateStyle: \"medium\") })\npdfjs-digital-signature-properties-certificate-revoked = Certificate: Revoked\npdfjs-digital-signature-properties-view-certificate = View certificate\npdfjs-digital-signature-properties-reason = Reason: { $reason }\npdfjs-digital-signature-properties-timestamp = Timestamp: { DATETIME($dateObj, dateStyle: \"short\", timeStyle: \"medium\") }\npdfjs-digital-signature-properties-sub-signatures =\n { $count ->\n [one] Sub-signature ({ $count })\n *[other] Sub-signatures ({ $count })\n }"; + return createBundle(lang, text); + } +} + +;// ./web/generic_scripting.js +/* unused harmony import specifier */ var generic_scripting_getPdfFilenameFromUrl; + +async function docProperties(pdfDocument) { + const url = "", + baseUrl = ""; + const { + info, + metadata, + contentDispositionFilename, + contentLength + } = await pdfDocument.getMetadata(); + return { + ...info, + baseURL: baseUrl, + filesize: contentLength || (await pdfDocument.getDownloadInfo()).length, + filename: contentDispositionFilename || generic_scripting_getPdfFilenameFromUrl(url), + metadata: metadata?.getRaw(), + authors: metadata?.get("dc:creator"), + numPages: pdfDocument.numPages, + URL: url + }; +} +class GenericScripting { + constructor(sandboxBundleSrc, wasmUrl) { + this._ready = new Promise((resolve, reject) => { + const sandbox = import( + /*webpackIgnore: true*/ + /*@vite-ignore*/ + sandboxBundleSrc); + sandbox.then(pdfjsSandbox => { + resolve(pdfjsSandbox.QuickJSSandbox(new URL(wasmUrl, location.href).href)); + }).catch(reject); + }); + } + async createSandbox(data) { + const sandbox = await this._ready; + sandbox.create(data); + } + async dispatchEventInSandbox(event) { + const sandbox = await this._ready; + setTimeout(() => sandbox.dispatchEvent(event), 0); + } + async destroySandbox() { + const sandbox = await this._ready; + sandbox.nukeSandbox(); + } +} + +;// ./web/generic_signature_storage.js + + + + + +const KEY_STORAGE = "pdfjs.signature"; +class SignatureStorage { + #eventBus; + #signatures = null; + #signal = null; + constructor(eventBus, signal) { + this.#eventBus = eventBus; + this.#signal = signal; + } + #save() { + localStorage.setItem(KEY_STORAGE, JSON.stringify(Object.fromEntries(this.#signatures))); + } + async getAll() { + if (this.#signal) { + window.addEventListener("storage", ({ + key + }) => { + if (key === KEY_STORAGE) { + this.#signatures = null; + this.#eventBus?.dispatch("storedsignatureschanged", { + source: this + }); + } + }, { + signal: this.#signal + }); + this.#signal = null; + } + if (!this.#signatures) { + this.#signatures = new Map(); + const data = localStorage.getItem(KEY_STORAGE); + if (data) { + for (const [key, value] of Object.entries(JSON.parse(data))) { + this.#signatures.set(key, value); + } + } + } + return this.#signatures; + } + async isFull() { + return (await this.size()) === 5; + } + async size() { + return (await this.getAll()).size; + } + async create(data) { + if (await this.isFull()) { + return null; + } + const uuid = getUuid(); + this.#signatures.set(uuid, data); + this.#save(); + return uuid; + } + async delete(uuid) { + const signatures = await this.getAll(); + if (!signatures.has(uuid)) { + return false; + } + signatures.delete(uuid); + this.#save(); + return true; + } +} + +;// ./web/genericcom.js + + + + + + + + +function initCom(app) {} +class Preferences extends BasePreferences { + async _writeToStorage(prefObj) { + localStorage.setItem("pdfjs.preferences", JSON.stringify(prefObj)); + } + async _readFromStorage(prefObj) { + return { + prefs: JSON.parse(localStorage.getItem("pdfjs.preferences")) + }; + } +} +class ExternalServices extends BaseExternalServices { + constructor() { + super(); + } + async createL10n() { + return new genericl10n_GenericL10n(AppOptions.get("localeProperties")?.lang); + } + createScripting() { + return new GenericScripting(AppOptions.get("sandboxBundleSrc"), AppOptions.get("wasmUrl")); + } + createSignatureStorage(eventBus, signal) { + return new SignatureStorage(eventBus, signal); + } + createSignatureVerifier() { + return null; + } +} +class MLManager { + async isEnabledFor(_name) { + return false; + } + async deleteModel(_service) { + return null; + } + isReady(_name) { + return false; + } + guess(_data) {} + toggleService(_name, _enabled) {} +} + +;// ./web/new_alt_text_manager.js + + + + + + + + + + + + +class NewAltTextManager { + #boundCancel = this.#cancel.bind(this); + #createAutomaticallyButton; + #currentEditor = null; + #cancelButton; + #descriptionContainer; + #dialog; + #disclaimer; + #downloadModel; + #downloadModelDescription; + #eventBus; + #firstTime = false; + #guessedAltText; + #hasAI = null; + #isEditing = null; + #imagePreview; + #imageData; + #isAILoading = false; + #wasAILoading = false; + #learnMore; + #notNowButton; + #overlayManager; + #textarea; + #title; + #uiManager; + #previousAltText = null; + constructor({ + descriptionContainer, + dialog, + imagePreview, + cancelButton, + disclaimer, + notNowButton, + saveButton, + textarea, + learnMore, + errorCloseButton, + createAutomaticallyButton, + downloadModel, + downloadModelDescription, + title + }, overlayManager, eventBus) { + this.#cancelButton = cancelButton; + this.#createAutomaticallyButton = createAutomaticallyButton; + this.#descriptionContainer = descriptionContainer; + this.#dialog = dialog; + this.#disclaimer = disclaimer; + this.#notNowButton = notNowButton; + this.#imagePreview = imagePreview; + this.#textarea = textarea; + this.#learnMore = learnMore; + this.#title = title; + this.#downloadModel = downloadModel; + this.#downloadModelDescription = downloadModelDescription; + this.#overlayManager = overlayManager; + this.#eventBus = eventBus; + dialog.addEventListener("close", this.#close.bind(this)); + dialog.addEventListener("contextmenu", event => { + if (event.target !== this.#textarea) { + event.preventDefault(); + } + }); + cancelButton.addEventListener("click", this.#boundCancel); + notNowButton.addEventListener("click", this.#boundCancel); + saveButton.addEventListener("click", this.#save.bind(this)); + errorCloseButton.addEventListener("click", () => { + this.#toggleError(false); + }); + createAutomaticallyButton.addEventListener("click", async () => { + const checked = createAutomaticallyButton.getAttribute("aria-pressed") !== "true"; + this.#currentEditor._reportTelemetry({ + action: "pdfjs.image.alt_text.ai_generation_check", + data: { + status: checked + } + }); + if (this.#uiManager) { + const isAltTextEnabled = await this.#uiManager.mlManager.isEnabledFor("altText"); + this.#createAutomaticallyButton.disabled = true; + if (checked && !isAltTextEnabled) { + this.#textarea.value = ""; + this.#setProgress(); + this.#uiManager.setPreference("enableGuessAltText", true); + await this.#uiManager.mlManager.downloadModel("altText"); + this.#setPref("enableAltTextModelDownload", true); + } else if (!checked && isAltTextEnabled) { + this.#uiManager.setPreference("enableGuessAltText", false); + await this.#uiManager.mlManager.deleteModel("altText"); + this.#setPref("enableAltTextModelDownload", false); + } + this.#createAutomaticallyButton.disabled = false; + await this.#uiManager.mlManager.toggleService("altText", checked); + } + this.#toggleGuessAltText(checked, false); + }); + textarea.addEventListener("focus", () => { + this.#wasAILoading = this.#isAILoading; + this.#toggleLoading(false); + this.#toggleTitleAndDisclaimer(); + }); + textarea.addEventListener("blur", () => { + if (!textarea.value) { + this.#toggleLoading(this.#wasAILoading); + } + this.#toggleTitleAndDisclaimer(); + }); + textarea.addEventListener("input", () => { + this.#toggleTitleAndDisclaimer(); + }); + textarea.addEventListener("keydown", e => { + if ((e.ctrlKey || e.metaKey) && e.key === "Enter" && !saveButton.disabled) { + this.#save(); + } + }); + eventBus.on("enableguessalttext", ({ + value + }) => { + this.#toggleGuessAltText(value, false); + }, internalOpt); + this.#overlayManager.register(dialog); + this.#learnMore.addEventListener("click", () => { + this.#currentEditor._reportTelemetry({ + action: "pdfjs.image.alt_text.info", + data: { + topic: "alt_text" + } + }); + }); + } + #setPref(name, value) { + this.#eventBus.dispatch("setpreference", { + source: this, + name, + value + }); + } + #toggleLoading(value) { + if (!this.#uiManager || this.#isAILoading === value) { + return; + } + this.#isAILoading = value; + this.#descriptionContainer.classList.toggle("loading", value); + } + #toggleError(value) { + if (!this.#uiManager) { + return; + } + this.#dialog.classList.toggle("error", value); + } + async #toggleGuessAltText(value, isInitial) { + if (!this.#uiManager) { + return; + } + this.#dialog.classList.toggle("aiDisabled", !value); + this.#createAutomaticallyButton.setAttribute("aria-pressed", value); + if (value) { + const { + altTextLearnMoreUrl + } = this.#uiManager.mlManager; + if (altTextLearnMoreUrl) { + this.#learnMore.href = altTextLearnMoreUrl; + } + this.#mlGuessAltText(isInitial); + } else { + this.#toggleLoading(false); + this.#isAILoading = false; + this.#toggleTitleAndDisclaimer(); + } + } + #toggleNotNow() { + this.#notNowButton.classList.toggle("hidden", !this.#firstTime); + this.#cancelButton.classList.toggle("hidden", this.#firstTime); + } + #toggleAI(value) { + if (!this.#uiManager || this.#hasAI === value) { + return; + } + this.#hasAI = value; + this.#dialog.classList.toggle("noAi", !value); + this.#toggleTitleAndDisclaimer(); + } + #toggleTitleAndDisclaimer() { + const visible = this.#isAILoading || this.#guessedAltText && this.#guessedAltText === this.#textarea.value; + this.#disclaimer.hidden = !visible; + const isEditing = this.#isAILoading || !!this.#textarea.value; + if (this.#isEditing === isEditing) { + return; + } + this.#isEditing = isEditing; + this.#title.setAttribute("data-l10n-id", isEditing ? "pdfjs-editor-new-alt-text-dialog-edit-label" : "pdfjs-editor-new-alt-text-dialog-add-label"); + } + async #mlGuessAltText(isInitial) { + if (this.#isAILoading) { + return; + } + if (this.#textarea.value) { + return; + } + if (isInitial && this.#previousAltText !== null) { + return; + } + this.#guessedAltText = this.#currentEditor.guessedAltText; + if (this.#previousAltText === null && this.#guessedAltText) { + this.#addAltText(this.#guessedAltText); + return; + } + this.#toggleLoading(true); + this.#toggleTitleAndDisclaimer(); + let hasError = false; + try { + const altText = await this.#currentEditor.mlGuessAltText(this.#imageData, false); + if (altText) { + this.#guessedAltText = altText; + this.#wasAILoading = this.#isAILoading; + if (this.#isAILoading) { + this.#addAltText(altText); + } + } + } catch (e) { + console.error(e); + hasError = true; + } + this.#toggleLoading(false); + this.#toggleTitleAndDisclaimer(); + if (hasError && this.#uiManager) { + this.#toggleError(true); + } + } + #addAltText(altText) { + if (!this.#uiManager || this.#textarea.value) { + return; + } + this.#textarea.value = altText; + this.#toggleTitleAndDisclaimer(); + } + #setProgress() { + this.#downloadModel.classList.toggle("hidden", false); + const callback = async ({ + detail: { + finished, + total, + totalLoaded + } + }) => { + const ONE_MEGA_BYTES = 1e6; + totalLoaded = Math.min(0.99 * total, totalLoaded); + const totalSize = this.#downloadModelDescription.ariaValueMax = Math.round(total / ONE_MEGA_BYTES); + const downloadedSize = this.#downloadModelDescription.ariaValueNow = Math.round(totalLoaded / ONE_MEGA_BYTES); + this.#downloadModelDescription.setAttribute("data-l10n-args", JSON.stringify({ + totalSize, + downloadedSize + })); + if (!finished) { + return; + } + this.#eventBus.off("loadaiengineprogress", callback); + this.#downloadModel.classList.toggle("hidden", true); + this.#toggleAI(true); + if (!this.#uiManager) { + return; + } + const { + mlManager + } = this.#uiManager; + mlManager.toggleService("altText", true); + this.#toggleGuessAltText(await mlManager.isEnabledFor("altText"), true); + }; + this.#eventBus.on("loadaiengineprogress", callback, internalOpt); + } + async editAltText(uiManager, editor, firstTime) { + if (this.#currentEditor || !editor) { + return; + } + if (firstTime && editor.hasAltTextData()) { + editor.altTextFinish(); + return; + } + this.#firstTime = firstTime; + const { + mlManager + } = uiManager; + const hasAI = !!mlManager; + this.#toggleTitleAndDisclaimer(); + if (mlManager && !mlManager.isReady("altText")) { + if (mlManager.hasProgress) { + this.#setProgress(); + } else { + this.#createAutomaticallyButton.setAttribute("aria-pressed", false); + } + } else { + this.#downloadModel.classList.toggle("hidden", true); + } + const isAltTextEnabledPromise = mlManager?.isEnabledFor("altText"); + this.#currentEditor = editor; + this.#uiManager = uiManager; + this.#uiManager.removeEditListeners(); + ({ + altText: this.#previousAltText + } = editor.altTextData); + this.#textarea.value = this.#previousAltText ?? ""; + const AI_MAX_IMAGE_DIMENSION = 224; + const MAX_PREVIEW_DIMENSION = 180; + let canvas, width, height; + if (mlManager) { + ({ + canvas, + width, + height, + imageData: this.#imageData + } = editor.copyCanvas(AI_MAX_IMAGE_DIMENSION, MAX_PREVIEW_DIMENSION, true)); + if (hasAI) { + this.#toggleGuessAltText(await isAltTextEnabledPromise, true); + } + } else { + ({ + canvas, + width, + height + } = editor.copyCanvas(AI_MAX_IMAGE_DIMENSION, MAX_PREVIEW_DIMENSION, false)); + } + canvas.setAttribute("role", "presentation"); + const { + style + } = canvas; + style.width = `${width}px`; + style.height = `${height}px`; + this.#imagePreview.append(canvas); + this.#toggleNotNow(); + this.#toggleAI(hasAI); + this.#toggleError(false); + try { + await this.#overlayManager.open(this.#dialog); + } catch (ex) { + this.#close(); + throw ex; + } + } + #cancel() { + this.#currentEditor.altTextData = { + cancel: true + }; + const altText = this.#textarea.value.trim(); + this.#currentEditor._reportTelemetry({ + action: "pdfjs.image.alt_text.dismiss", + data: { + alt_text_type: altText ? "present" : "empty", + flow: this.#firstTime ? "image_add" : "alt_text_edit" + } + }); + this.#currentEditor._reportTelemetry({ + action: "pdfjs.image.image_added", + data: { + alt_text_modal: true, + alt_text_type: "skipped" + } + }); + this.#finish(); + } + #finish() { + this.#overlayManager.closeIfActive(this.#dialog); + } + #close() { + const canvas = this.#imagePreview.firstElementChild; + canvas.remove(); + canvas.width = canvas.height = 0; + this.#imageData = null; + this.#toggleLoading(false); + this.#uiManager?.addEditListeners(); + this.#currentEditor.altTextFinish(); + this.#uiManager?.setSelected(this.#currentEditor); + this.#currentEditor = null; + this.#uiManager = null; + } + #extractWords(text) { + return new Set(text.toLowerCase().split(/[^\p{L}\p{N}]+/gu).filter(Boolean)); + } + #save() { + const altText = this.#textarea.value.trim(); + this.#currentEditor.altTextData = { + altText, + decorative: false + }; + this.#currentEditor.altTextData.guessedAltText = this.#guessedAltText; + if (this.#guessedAltText && this.#guessedAltText !== altText) { + const guessedWords = this.#extractWords(this.#guessedAltText); + const words = this.#extractWords(altText); + this.#currentEditor._reportTelemetry({ + action: "pdfjs.image.alt_text.user_edit", + data: { + total_words: guessedWords.size, + words_removed: guessedWords.difference(words).size, + words_added: words.difference(guessedWords).size + } + }); + } + this.#currentEditor._reportTelemetry({ + action: "pdfjs.image.image_added", + data: { + alt_text_modal: true, + alt_text_type: altText ? "present" : "empty" + } + }); + this.#currentEditor._reportTelemetry({ + action: "pdfjs.image.alt_text.save", + data: { + alt_text_type: altText ? "present" : "empty", + flow: this.#firstTime ? "image_add" : "alt_text_edit" + } + }); + this.#finish(); + } + destroy() { + this.#uiManager = null; + this.#finish(); + } +} +class ImageAltTextSettings { + #createModelButton; + #dialog; + #eventBus; + #mlManager; + #overlayManager; + #showAltTextDialogButton; + constructor({ + dialog, + createModelButton, + learnMore, + closeButton, + showAltTextDialogButton + }, overlayManager, eventBus, mlManager) { + this.#dialog = dialog; + this.#createModelButton = createModelButton; + this.#showAltTextDialogButton = showAltTextDialogButton; + this.#overlayManager = overlayManager; + this.#eventBus = eventBus; + this.#mlManager = mlManager; + const { + altTextLearnMoreUrl + } = mlManager; + if (altTextLearnMoreUrl) { + learnMore.href = altTextLearnMoreUrl; + } + dialog.addEventListener("contextmenu", noContextMenu); + createModelButton.addEventListener("click", async e => { + const checked = this.#togglePref("enableGuessAltText", e); + await (checked ? this.#download(true) : this.#delete(true)); + await mlManager.toggleService("altText", checked); + this.#reportTelemetry({ + type: "stamp", + action: "pdfjs.image.alt_text.settings_ai_generation_check", + data: { + status: checked + } + }); + }); + showAltTextDialogButton.addEventListener("click", e => { + const checked = this.#togglePref("enableNewAltTextWhenAddingImage", e); + this.#reportTelemetry({ + type: "stamp", + action: "pdfjs.image.alt_text.settings_edit_alt_text_check", + data: { + status: checked + } + }); + }); + closeButton.addEventListener("click", this.#finish.bind(this)); + learnMore.addEventListener("click", () => { + this.#reportTelemetry({ + type: "stamp", + action: "pdfjs.image.alt_text.info", + data: { + topic: "ai_generation" + } + }); + }); + eventBus.on("enablealttextmodeldownload", ({ + value + }) => { + if (value) { + this.#download(false); + } else { + this.#delete(false); + } + }, internalOpt); + this.#overlayManager.register(dialog); + } + #reportTelemetry(data) { + this.#eventBus.dispatch("reporttelemetry", { + source: this, + details: { + type: "editing", + data + } + }); + } + async #download(isFromUI = false) { + if (isFromUI) { + await this.#mlManager.downloadModel("altText"); + this.#setPref("enableGuessAltText", true); + this.#mlManager.toggleService("altText", true); + this.#setPref("enableAltTextModelDownload", true); + } + } + async #delete(isFromUI = false) { + if (isFromUI) { + await this.#mlManager.deleteModel("altText"); + this.#setPref("enableGuessAltText", false); + this.#setPref("enableAltTextModelDownload", false); + } + this.#createModelButton.setAttribute("aria-pressed", false); + } + async open({ + enableGuessAltText, + enableNewAltTextWhenAddingImage + }) { + const { + enableAltTextModelDownload + } = this.#mlManager; + this.#createModelButton.setAttribute("aria-pressed", enableAltTextModelDownload && enableGuessAltText); + this.#showAltTextDialogButton.setAttribute("aria-pressed", enableNewAltTextWhenAddingImage); + await this.#overlayManager.open(this.#dialog); + this.#reportTelemetry({ + type: "stamp", + action: "pdfjs.image.alt_text.settings_displayed" + }); + } + #togglePref(name, { + target + }) { + const checked = target.getAttribute("aria-pressed") !== "true"; + this.#setPref(name, checked); + target.setAttribute("aria-pressed", checked); + return checked; + } + #setPref(name, value) { + this.#eventBus.dispatch("setpreference", { + source: this, + name, + value + }); + } + #finish() { + this.#overlayManager.closeIfActive(this.#dialog); + } +} + +;// ./web/alt_text_manager.js + + +class AltTextManager { + #clickAC = null; + #currentEditor = null; + #cancelButton; + #dialog; + #eventBus; + #hasUsedPointer = false; + #optionDescription; + #optionDecorative; + #overlayManager; + #saveButton; + #textarea; + #uiManager; + #previousAltText = null; + #resizeAC = null; + #svgElement = null; + #rectElement = null; + #container; + #telemetryData = null; + constructor({ + dialog, + optionDescription, + optionDecorative, + textarea, + cancelButton, + saveButton + }, container, overlayManager, eventBus) { + this.#dialog = dialog; + this.#optionDescription = optionDescription; + this.#optionDecorative = optionDecorative; + this.#textarea = textarea; + this.#cancelButton = cancelButton; + this.#saveButton = saveButton; + this.#overlayManager = overlayManager; + this.#eventBus = eventBus; + this.#container = container; + const onUpdateUIState = this.#updateUIState.bind(this); + dialog.addEventListener("close", this.#close.bind(this)); + dialog.addEventListener("contextmenu", event => { + if (event.target !== this.#textarea) { + event.preventDefault(); + } + }); + cancelButton.addEventListener("click", this.#finish.bind(this)); + saveButton.addEventListener("click", this.#save.bind(this)); + optionDescription.addEventListener("change", onUpdateUIState); + optionDecorative.addEventListener("change", onUpdateUIState); + textarea.addEventListener("keydown", e => { + if ((e.ctrlKey || e.metaKey) && e.key === "Enter" && !saveButton.disabled) { + this.#save(); + } + }); + this.#overlayManager.register(dialog); + } + #createSVGElement() { + if (this.#svgElement) { + return; + } + const svgFactory = new DOMSVGFactory(); + const svg = this.#svgElement = svgFactory.createElement("svg"); + svg.setAttribute("width", "0"); + svg.setAttribute("height", "0"); + const defs = svgFactory.createElement("defs"); + svg.append(defs); + const mask = svgFactory.createElement("mask"); + defs.append(mask); + mask.setAttribute("id", "alttext-manager-mask"); + mask.setAttribute("maskContentUnits", "objectBoundingBox"); + let rect = svgFactory.createElement("rect"); + mask.append(rect); + rect.setAttribute("fill", "white"); + rect.setAttribute("width", "1"); + rect.setAttribute("height", "1"); + rect.setAttribute("x", "0"); + rect.setAttribute("y", "0"); + rect = this.#rectElement = svgFactory.createElement("rect"); + mask.append(rect); + rect.setAttribute("fill", "black"); + this.#dialog.append(svg); + } + async editAltText(uiManager, editor) { + if (this.#currentEditor || !editor) { + return; + } + this.#createSVGElement(); + this.#hasUsedPointer = false; + this.#clickAC = new AbortController(); + const clickOpts = { + signal: this.#clickAC.signal + }, + onClick = this.#onClick.bind(this); + for (const element of [this.#optionDescription, this.#optionDecorative, this.#textarea, this.#saveButton, this.#cancelButton]) { + element.addEventListener("click", onClick, clickOpts); + } + const { + altText, + decorative + } = editor.altTextData; + if (decorative === true) { + this.#optionDecorative.checked = true; + this.#optionDescription.checked = false; + } else { + this.#optionDecorative.checked = false; + this.#optionDescription.checked = true; + } + this.#previousAltText = this.#textarea.value = altText?.trim() || ""; + this.#updateUIState(); + this.#currentEditor = editor; + this.#uiManager = uiManager; + this.#uiManager.removeEditListeners(); + this.#resizeAC = new AbortController(); + this.#eventBus.on("resize", this.#setPosition.bind(this), { + signal: this.#resizeAC.signal, + ...internalOpt + }); + try { + await this.#overlayManager.open(this.#dialog); + this.#setPosition(); + } catch (ex) { + this.#close(); + throw ex; + } + } + #setPosition() { + if (!this.#currentEditor) { + return; + } + const dialog = this.#dialog; + const { + style + } = dialog; + const { + x: containerX, + y: containerY, + width: containerW, + height: containerH + } = this.#container.getBoundingClientRect(); + const { + innerWidth: windowW, + innerHeight: windowH + } = window; + const { + width: dialogW, + height: dialogH + } = dialog.getBoundingClientRect(); + const { + x, + y, + width, + height + } = this.#currentEditor.getClientDimensions(); + const MARGIN = 10; + const isLTR = this.#uiManager.direction === "ltr"; + const xs = Math.max(x, containerX); + const xe = Math.min(x + width, containerX + containerW); + const ys = Math.max(y, containerY); + const ye = Math.min(y + height, containerY + containerH); + this.#rectElement.setAttribute("width", `${(xe - xs) / windowW}`); + this.#rectElement.setAttribute("height", `${(ye - ys) / windowH}`); + this.#rectElement.setAttribute("x", `${xs / windowW}`); + this.#rectElement.setAttribute("y", `${ys / windowH}`); + let left = null; + let top = Math.max(y, 0); + top += Math.min(windowH - (top + dialogH), 0); + if (isLTR) { + if (x + width + MARGIN + dialogW < windowW) { + left = x + width + MARGIN; + } else if (x > dialogW + MARGIN) { + left = x - dialogW - MARGIN; + } + } else if (x > dialogW + MARGIN) { + left = x - dialogW - MARGIN; + } else if (x + width + MARGIN + dialogW < windowW) { + left = x + width + MARGIN; + } + if (left === null) { + top = null; + left = Math.max(x, 0); + left += Math.min(windowW - (left + dialogW), 0); + if (y > dialogH + MARGIN) { + top = y - dialogH - MARGIN; + } else if (y + height + MARGIN + dialogH < windowH) { + top = y + height + MARGIN; + } + } + if (top !== null) { + dialog.classList.add("positioned"); + if (isLTR) { + style.left = `${left}px`; + } else { + style.right = `${windowW - left - dialogW}px`; + } + style.top = `${top}px`; + } else { + dialog.classList.remove("positioned"); + style.left = ""; + style.top = ""; + } + } + #finish() { + this.#overlayManager.closeIfActive(this.#dialog); + } + #close() { + this.#currentEditor._reportTelemetry(this.#telemetryData || { + action: "alt_text_cancel", + alt_text_keyboard: !this.#hasUsedPointer + }); + this.#telemetryData = null; + this.#removeOnClickListeners(); + this.#uiManager?.addEditListeners(); + this.#resizeAC?.abort(); + this.#resizeAC = null; + this.#currentEditor.altTextFinish(); + this.#currentEditor = null; + this.#uiManager = null; + } + #updateUIState() { + this.#textarea.disabled = this.#optionDecorative.checked; + } + #save() { + const altText = this.#textarea.value.trim(); + const decorative = this.#optionDecorative.checked; + this.#currentEditor.altTextData = { + altText, + decorative + }; + this.#telemetryData = { + action: "alt_text_save", + alt_text_description: !!altText, + alt_text_edit: !!this.#previousAltText && this.#previousAltText !== altText, + alt_text_decorative: decorative, + alt_text_keyboard: !this.#hasUsedPointer + }; + this.#finish(); + } + #onClick(evt) { + if (evt.detail === 0) { + return; + } + this.#hasUsedPointer = true; + this.#removeOnClickListeners(); + } + #removeOnClickListeners() { + this.#clickAC?.abort(); + this.#clickAC = null; + } + destroy() { + this.#uiManager = null; + this.#finish(); + this.#svgElement?.remove(); + this.#svgElement = this.#rectElement = null; + } +} + +;// ./web/annotation_editor_params.js + + +class AnnotationEditorParams { + constructor(options, eventBus) { + this.eventBus = eventBus; + this.#bindListeners(options); + } + #bindListeners({ + editorFreeTextFontSize, + editorFreeTextColor, + editorInkColor, + editorInkThickness, + editorInkOpacity, + editorStampAddImage, + editorFreeHighlightThickness, + editorHighlightShowAll, + editorSignatureAddSignature + }) { + const { + eventBus + } = this; + const dispatchEvent = (typeStr, value) => { + eventBus.dispatch("switchannotationeditorparams", { + source: this, + type: AnnotationEditorParamsType[typeStr], + value + }); + }; + editorFreeTextFontSize.addEventListener("input", function () { + dispatchEvent("FREETEXT_SIZE", this.valueAsNumber); + }); + editorFreeTextColor.addEventListener("input", function () { + dispatchEvent("FREETEXT_COLOR", this.value); + }); + let updateInkColor, updateInkOpacity; + if (FeatureTest.isAlphaColorInputSupported) { + editorInkColor.setAttribute("alpha", ""); + editorInkOpacity.closest(".editorParamsSetter").remove(); + let currentInkColor = "#000000"; + let currentInkOpacity = 1; + editorInkColor.addEventListener("input", function () { + const rgba = getRGBA(this.value); + if (!rgba) { + return; + } + const [r, g, b, opacity] = rgba; + const hex = Util.makeHexColor(r, g, b); + currentInkColor = hex; + currentInkOpacity = opacity; + dispatchEvent("INK_COLOR_AND_OPACITY", { + color: hex, + opacity + }); + }); + updateInkColor = value => { + currentInkColor = value; + const alphaHex = Util.hexNums[Math.round(currentInkOpacity * 255)]; + editorInkColor.value = currentInkColor + alphaHex; + }; + updateInkOpacity = value => { + currentInkOpacity = value; + const alphaHex = Util.hexNums[Math.round(currentInkOpacity * 255)]; + editorInkColor.value = currentInkColor + alphaHex; + }; + } else { + editorInkColor.addEventListener("input", function () { + dispatchEvent("INK_COLOR", this.value); + }); + editorInkOpacity.addEventListener("input", function () { + dispatchEvent("INK_OPACITY", this.valueAsNumber); + }); + updateInkColor = value => { + editorInkColor.value = value; + }; + updateInkOpacity = value => { + editorInkOpacity.value = value; + }; + } + editorInkThickness.addEventListener("input", function () { + dispatchEvent("INK_THICKNESS", this.valueAsNumber); + }); + editorStampAddImage.addEventListener("click", () => { + eventBus.dispatch("reporttelemetry", { + source: this, + details: { + type: "editing", + data: { + action: "pdfjs.image.add_image_click" + } + } + }); + dispatchEvent("CREATE"); + }); + editorFreeHighlightThickness.addEventListener("input", function () { + dispatchEvent("HIGHLIGHT_THICKNESS", this.valueAsNumber); + }); + editorHighlightShowAll.addEventListener("click", function () { + const checked = this.getAttribute("aria-pressed") === "true"; + this.setAttribute("aria-pressed", !checked); + dispatchEvent("HIGHLIGHT_SHOW_ALL", !checked); + }); + editorSignatureAddSignature.addEventListener("click", () => { + dispatchEvent("CREATE"); + }); + eventBus.on("annotationeditorparamschanged", evt => { + for (const [type, value] of evt.details) { + switch (type) { + case AnnotationEditorParamsType.FREETEXT_SIZE: + editorFreeTextFontSize.value = value; + break; + case AnnotationEditorParamsType.FREETEXT_COLOR: + editorFreeTextColor.value = value; + break; + case AnnotationEditorParamsType.INK_COLOR: + updateInkColor(value); + break; + case AnnotationEditorParamsType.INK_THICKNESS: + editorInkThickness.value = value; + break; + case AnnotationEditorParamsType.INK_OPACITY: + updateInkOpacity(value); + break; + case AnnotationEditorParamsType.HIGHLIGHT_COLOR: + eventBus.dispatch("mainhighlightcolorpickerupdatecolor", { + source: this, + value + }); + break; + case AnnotationEditorParamsType.HIGHLIGHT_THICKNESS: + editorFreeHighlightThickness.value = value; + break; + case AnnotationEditorParamsType.HIGHLIGHT_FREE: + editorFreeHighlightThickness.disabled = !value; + break; + case AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL: + editorHighlightShowAll.setAttribute("aria-pressed", value); + break; + } + } + }, internalOpt); + } +} + +;// ./web/caret_browsing.js + +const PRECISION = 1e-1; +class CaretBrowsingMode { + #mainContainer; + #toolBarHeight = 0; + #viewerContainer; + constructor(abortSignal, mainContainer, viewerContainer, toolbarContainer) { + this.#mainContainer = mainContainer; + this.#viewerContainer = viewerContainer; + if (!toolbarContainer) { + return; + } + this.#toolBarHeight = toolbarContainer.getBoundingClientRect().height; + const toolbarObserver = new ResizeObserver(entries => { + for (const entry of entries) { + if (entry.target === toolbarContainer) { + this.#toolBarHeight = Math.floor(entry.borderBoxSize[0].blockSize); + break; + } + } + }); + toolbarObserver.observe(toolbarContainer); + abortSignal.addEventListener("abort", () => toolbarObserver.disconnect(), { + once: true + }); + } + #isOnSameLine(rect1, rect2) { + const top1 = rect1.y; + const bot1 = rect1.bottom; + const mid1 = rect1.y + rect1.height / 2; + const top2 = rect2.y; + const bot2 = rect2.bottom; + const mid2 = rect2.y + rect2.height / 2; + return top1 <= mid2 && mid2 <= bot1 || top2 <= mid1 && mid1 <= bot2; + } + #isUnderOver(rect, x, y, isUp) { + const midY = rect.y + rect.height / 2; + return (isUp ? y >= midY : y <= midY) && rect.x - PRECISION <= x && x <= rect.right + PRECISION; + } + #isVisible(rect) { + return rect.top >= this.#toolBarHeight && rect.left >= 0 && rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && rect.right <= (window.innerWidth || document.documentElement.clientWidth); + } + #getCaretPosition(selection, isUp) { + const { + focusNode, + focusOffset + } = selection; + const range = document.createRange(); + range.setStart(focusNode, focusOffset); + range.setEnd(focusNode, focusOffset); + const rect = range.getBoundingClientRect(); + return [rect.x, isUp ? rect.top : rect.bottom]; + } + static #caretPositionFromPoint(x, y) { + if (!document.caretPositionFromPoint) { + const { + startContainer: offsetNode, + startOffset: offset + } = document.caretRangeFromPoint(x, y); + return { + offsetNode, + offset + }; + } + return document.caretPositionFromPoint(x, y); + } + #setCaretPositionHelper(selection, caretX, select, element, rect) { + rect ||= element.getBoundingClientRect(); + if (caretX <= rect.x + PRECISION) { + if (select) { + selection.extend(element.firstChild, 0); + } else { + selection.setPosition(element.firstChild, 0); + } + return; + } + if (rect.right - PRECISION <= caretX) { + const { + lastChild + } = element; + if (select) { + selection.extend(lastChild, lastChild.length); + } else { + selection.setPosition(lastChild, lastChild.length); + } + return; + } + const midY = rect.y + rect.height / 2; + let caretPosition = CaretBrowsingMode.#caretPositionFromPoint(caretX, midY); + let parentElement = caretPosition.offsetNode?.parentElement; + if (parentElement && parentElement !== element) { + const elementsAtPoint = document.elementsFromPoint(caretX, midY); + const savedVisibilities = []; + for (const el of elementsAtPoint) { + if (el === element) { + break; + } + const { + style + } = el; + savedVisibilities.push([el, style.visibility]); + style.visibility = "hidden"; + } + caretPosition = CaretBrowsingMode.#caretPositionFromPoint(caretX, midY); + parentElement = caretPosition.offsetNode?.parentElement; + for (const [el, visibility] of savedVisibilities) { + el.style.visibility = visibility; + } + } + if (parentElement !== element) { + if (select) { + selection.extend(element.firstChild, 0); + } else { + selection.setPosition(element.firstChild, 0); + } + return; + } + if (select) { + selection.extend(caretPosition.offsetNode, caretPosition.offset); + } else { + selection.setPosition(caretPosition.offsetNode, caretPosition.offset); + } + } + #setCaretPosition(select, selection, newLineElement, newLineElementRect, caretX) { + if (this.#isVisible(newLineElementRect)) { + this.#setCaretPositionHelper(selection, caretX, select, newLineElement, newLineElementRect); + return; + } + this.#mainContainer.addEventListener("scrollend", this.#setCaretPositionHelper.bind(this, selection, caretX, select, newLineElement, null), { + once: true + }); + newLineElement.scrollIntoView(); + } + #getNodeOnNextPage(textLayer, isUp) { + while (true) { + const page = textLayer.closest(".page"); + const pageNumber = parseInt(page.getAttribute("data-page-number"), 10); + const nextPage = isUp ? pageNumber - 1 : pageNumber + 1; + textLayer = this.#viewerContainer.querySelector(`.page[data-page-number="${nextPage}"] .textLayer`); + if (!textLayer) { + return null; + } + const walker = document.createTreeWalker(textLayer, NodeFilter.SHOW_TEXT); + const node = isUp ? walker.lastChild() : walker.firstChild(); + if (node) { + return node; + } + } + } + moveCaret(isUp, select) { + const selection = document.getSelection(); + if (selection.rangeCount === 0) { + return; + } + const { + focusNode + } = selection; + const focusElement = focusNode.nodeType !== Node.ELEMENT_NODE ? focusNode.parentElement : focusNode; + const root = focusElement.closest(".textLayer"); + if (!root) { + return; + } + const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT); + walker.currentNode = focusNode; + const focusRect = focusElement.getBoundingClientRect(); + let newLineElement = null; + const nodeIterator = (isUp ? walker.previousSibling : walker.nextSibling).bind(walker); + while (nodeIterator()) { + const element = walker.currentNode.parentElement; + if (!this.#isOnSameLine(focusRect, element.getBoundingClientRect())) { + newLineElement = element; + break; + } + } + if (!newLineElement) { + const node = this.#getNodeOnNextPage(root, isUp); + if (!node) { + return; + } + if (select) { + const lastNode = (isUp ? walker.firstChild() : walker.lastChild()) || focusNode; + selection.extend(lastNode, isUp ? 0 : lastNode.length); + const range = document.createRange(); + range.setStart(node, isUp ? node.length : 0); + range.setEnd(node, isUp ? node.length : 0); + selection.addRange(range); + return; + } + const [caretX] = this.#getCaretPosition(selection, isUp); + const { + parentElement + } = node; + this.#setCaretPosition(select, selection, parentElement, parentElement.getBoundingClientRect(), caretX); + return; + } + const [caretX, caretY] = this.#getCaretPosition(selection, isUp); + const newLineElementRect = newLineElement.getBoundingClientRect(); + if (this.#isUnderOver(newLineElementRect, caretX, caretY, isUp)) { + this.#setCaretPosition(select, selection, newLineElement, newLineElementRect, caretX); + return; + } + while (nodeIterator()) { + const element = walker.currentNode.parentElement; + const elementRect = element.getBoundingClientRect(); + if (!this.#isOnSameLine(newLineElementRect, elementRect)) { + break; + } + if (this.#isUnderOver(elementRect, caretX, caretY, isUp)) { + this.#setCaretPosition(select, selection, element, elementRect, caretX); + return; + } + } + this.#setCaretPosition(select, selection, newLineElement, newLineElementRect, caretX); + } +} + +;// ./node_modules/core-js/modules/es.weak-map.get-or-insert.js +es_weak_map_get_or_insert_namespaceFn(); + +;// ./node_modules/core-js/modules/es.weak-map.get-or-insert-computed.js +es_weak_map_get_or_insert_computed_namespaceFn(); + +;// ./web/sidebar.js + +const RESIZE_TIMEOUT = 400; +class Sidebar { + #initialWidth = 0; + #width = 0; + #coefficient; + #resizeTimeout = null; + #resizer; + #isResizerOnTheLeft; + #isKeyboardResizing = false; + #resizeObserver; + #prevX = 0; + constructor({ + sidebar, + resizer, + toggleButton + }, ltr, isResizerOnTheLeft, globalAbortSignal) { + this._sidebar = sidebar; + this.#coefficient = ltr === isResizerOnTheLeft ? -1 : 1; + this.#resizer = resizer; + this.#isResizerOnTheLeft = isResizerOnTheLeft; + const style = window.getComputedStyle(sidebar); + this.#initialWidth = this.#width = parseFloat(style.getPropertyValue("--sidebar-width")); + resizer.ariaValueMin = parseFloat(style.getPropertyValue("--sidebar-min-width")) || 0; + resizer.ariaValueMax = parseFloat(style.getPropertyValue("--sidebar-max-width")) || Infinity; + resizer.ariaValueNow = this.#width; + this.#makeSidebarResizable(); + toggleButton.addEventListener("click", this.toggle.bind(this)); + this._isOpen = false; + sidebar.hidden = true; + globalAbortSignal?.addEventListener("abort", this.destroy.bind(this), { + once: true + }); + this.#resizeObserver = new ResizeObserver(([{ + borderBoxSize: [{ + inlineSize + }] + }]) => { + if (!isNaN(this.#prevX)) { + this.#prevX += this.#coefficient * (inlineSize - this.#width); + } + this.#setWidth(inlineSize); + }); + this.#resizeObserver.observe(sidebar); + } + #makeSidebarResizable() { + const sidebarStyle = this._sidebar.style; + let pointerMoveAC; + const cancelResize = () => { + this.#resizeTimeout = null; + this._sidebar.classList.remove("resizing"); + pointerMoveAC?.abort(); + pointerMoveAC = null; + this.#isKeyboardResizing = false; + this.onStopResizing(); + this.#prevX = NaN; + }; + this.#resizer.addEventListener("pointerdown", e => { + if (pointerMoveAC) { + cancelResize(); + return; + } + this.onStartResizing(); + const { + clientX + } = e; + stopEvent(e); + this.#prevX = clientX; + pointerMoveAC = new AbortController(); + const { + signal + } = pointerMoveAC; + const sidebar = this._sidebar; + sidebar.classList.add("resizing"); + const parentStyle = sidebar.parentElement.style; + parentStyle.minWidth = 0; + window.addEventListener("contextmenu", noContextMenu, { + signal + }); + window.addEventListener("pointermove", ev => { + if (!pointerMoveAC || Math.abs(ev.clientX - this.#prevX) < 1) { + return; + } + stopEvent(ev); + sidebarStyle.width = `${Math.round(this.#width + this.#coefficient * (ev.clientX - this.#prevX))}px`; + }, { + signal, + capture: true + }); + window.addEventListener("blur", cancelResize, { + signal + }); + window.addEventListener("pointerup", ev => { + if (pointerMoveAC) { + cancelResize(); + stopEvent(ev); + } + }, { + signal + }); + }); + this.#resizer.addEventListener("keydown", e => { + const { + key + } = e; + const isArrowLeft = key === "ArrowLeft"; + if (isArrowLeft || key === "ArrowRight") { + if (!this.#isKeyboardResizing) { + this._sidebar.classList.add("resizing"); + this.#isKeyboardResizing = true; + this.onStartResizing(); + } + const base = e.ctrlKey || e.metaKey ? 10 : 1; + const dx = base * (isArrowLeft ? -1 : 1); + clearTimeout(this.#resizeTimeout); + this.#resizeTimeout = setTimeout(cancelResize, RESIZE_TIMEOUT); + sidebarStyle.width = `${Math.round(this.#width + this.#coefficient * dx)}px`; + stopEvent(e); + } + }); + } + #setWidth(newWidth) { + this.#width = newWidth; + this.#resizer.ariaValueNow = Math.round(newWidth); + if (this.#isResizerOnTheLeft) { + this._sidebar.parentElement.style.insetInlineStart = `${(this.#initialWidth - newWidth).toFixed(3)}px`; + } + this.onResizing(newWidth); + } + get width() { + return this.#width; + } + set width(newWidth) { + this._sidebar.style.width = `${newWidth}px`; + } + onStartResizing() {} + onStopResizing() {} + onResizing(_newWidth) {} + toggle(visibility = !this._isOpen) { + this._sidebar.hidden = !(this._isOpen = visibility); + } + destroy() { + this.#resizeObserver?.disconnect(); + this.#resizeObserver = null; + } +} + +;// ./web/comment_manager.js + + + + + + + + + + + + + + + + +class CommentManager { + #dialog; + #popup; + #sidebar; + static #hasForcedColors = null; + constructor(commentDialog, sidebar, eventBus, linkService, overlayManager, ltr, hasForcedColors, globalAbortSignal) { + const dateFormat = new Intl.DateTimeFormat(undefined, { + dateStyle: "long" + }); + this.dialogElement = commentDialog.dialog; + this.#dialog = new CommentDialog(commentDialog, overlayManager, eventBus, ltr); + this.#popup = new CommentPopup(eventBus, dateFormat, ltr, this.dialogElement); + this.#sidebar = new CommentSidebar(sidebar, eventBus, linkService, this.#popup, dateFormat, ltr, globalAbortSignal); + this.#popup.sidebar = this.#sidebar; + CommentManager.#hasForcedColors = hasForcedColors; + } + setSidebarUiManager(uiManager) { + this.#sidebar.setUIManager(uiManager); + } + showSidebar(annotations) { + this.#sidebar.show(annotations); + } + hideSidebar() { + this.#sidebar.hide(); + } + removeComments(ids) { + this.#sidebar.removeComments(ids); + } + selectComment(id) { + this.#sidebar.selectComment(null, id); + } + addComment(annotation) { + this.#sidebar.addComment(annotation); + } + updateComment(annotation) { + this.#sidebar.updateComment(annotation); + } + toggleCommentPopup(editor, isSelected, visibility, isEditable) { + if (isSelected) { + this.selectComment(editor.uid); + } + this.#popup.toggle(editor, isSelected, visibility, isEditable); + } + destroyPopup() { + this.#popup.destroy(); + } + updatePopupColor(editor) { + this.#popup.updateColor(editor); + } + showDialog(uiManager, editor, posX, posY, options) { + return this.#dialog.open(uiManager, editor, posX, posY, options); + } + makeCommentColor(color, opacity) { + return CommentManager._makeCommentColor(color, opacity); + } + static _makeCommentColor(color, opacity) { + return this.#hasForcedColors ? null : findContrastColor(applyOpacity(color, opacity ?? 1), CSSConstants.commentForegroundColor); + } + destroy() { + this.#dialog.destroy(); + this.#sidebar.hide(); + this.#popup.destroy(); + } +} +class CommentSidebar extends Sidebar { + #annotations = null; + #eventBus; + #boundCommentClick = this.#commentClick.bind(this); + #boundCommentKeydown = this.#commentKeydown.bind(this); + #closeButton; + #commentsList; + #commentCount; + #dateFormat; + #sidebarTitle; + #learnMoreUrl; + #linkService; + #popup; + #elementsToAnnotations = null; + #idsToElements = null; + #uiManager = null; + constructor({ + learnMoreUrl, + sidebar, + sidebarResizer, + commentsList, + commentCount, + sidebarTitle, + closeButton, + commentToolbarButton + }, eventBus, linkService, popup, dateFormat, ltr, globalAbortSignal) { + super({ + sidebar, + resizer: sidebarResizer, + toggleButton: commentToolbarButton + }, ltr, true, globalAbortSignal); + this.#sidebarTitle = sidebarTitle; + this.#commentsList = commentsList; + this.#commentCount = commentCount; + this.#learnMoreUrl = learnMoreUrl; + this.#linkService = linkService; + this.#closeButton = closeButton; + this.#popup = popup; + this.#dateFormat = dateFormat; + this.#eventBus = eventBus; + closeButton.addEventListener("click", () => { + eventBus.dispatch("switchannotationeditormode", { + source: this, + mode: AnnotationEditorType.NONE + }); + }); + const keyDownCallback = e => { + if (e.key === "ArrowDown" || e.key === "Home" || e.key === "F6") { + this.#commentsList.firstElementChild.focus(); + stopEvent(e); + } else if (e.key === "ArrowUp" || e.key === "End") { + this.#commentsList.lastElementChild.focus(); + stopEvent(e); + } + }; + commentToolbarButton.addEventListener("keydown", keyDownCallback); + sidebar.addEventListener("keydown", keyDownCallback); + } + setUIManager(uiManager) { + this.#uiManager = uiManager; + } + show(annotations) { + this.#elementsToAnnotations = new WeakMap(); + this.#idsToElements = new Map(); + this.#annotations = annotations; + annotations.sort(this.#sortComments.bind(this)); + if (annotations.length !== 0) { + const fragment = document.createDocumentFragment(); + for (const annotation of annotations) { + fragment.append(this.#createCommentElement(annotation)); + } + this.#setCommentsCount(fragment); + this.#commentsList.append(fragment); + } else { + this.#setCommentsCount(); + } + this._sidebar.hidden = false; + this.#eventBus.dispatch("reporttelemetry", { + source: this, + details: { + type: "commentSidebar", + data: { + numberOfAnnotations: annotations.length + } + } + }); + } + hide() { + this._sidebar.hidden = true; + this.#commentsList.replaceChildren(); + this.#elementsToAnnotations = null; + this.#idsToElements = null; + this.#annotations = null; + } + removeComments(ids) { + if (ids.length === 0 || !this.#idsToElements) { + return; + } + if (new Set(this.#idsToElements.keys()).isSubsetOf(new Set(ids))) { + this.#removeAll(); + return; + } + for (const id of ids) { + this.#removeComment(id); + } + } + focusComment(id) { + const element = this.#idsToElements.get(id); + if (!element) { + return; + } + this._sidebar.scrollTop = element.offsetTop - this._sidebar.offsetTop; + for (const el of this.#commentsList.children) { + el.classList.toggle("selected", el === element); + } + } + updateComment(annotation) { + if (!this.#idsToElements) { + return; + } + const { + id, + creationDate, + modificationDate, + richText, + contentsObj, + popupRef + } = annotation; + if (!popupRef || !richText && !contentsObj?.str) { + this.#removeComment(id); + } + const element = this.#idsToElements.get(id); + if (!element) { + return; + } + const prevAnnotation = this.#elementsToAnnotations.get(element); + let index = binarySearchFirstItem(this.#annotations, a => this.#sortComments(a, prevAnnotation) >= 0); + if (index >= this.#annotations.length) { + return; + } + this.#setDate(element.firstElementChild, modificationDate || creationDate); + this.#setText(element.lastElementChild, richText, contentsObj); + this.#annotations.splice(index, 1); + index = binarySearchFirstItem(this.#annotations, a => this.#sortComments(a, annotation) >= 0); + this.#annotations.splice(index, 0, annotation); + if (index >= this.#commentsList.children.length) { + this.#commentsList.append(element); + } else { + this.#commentsList.insertBefore(element, this.#commentsList.children[index]); + } + } + #removeComment(id) { + const element = this.#idsToElements?.get(id); + if (!element) { + return; + } + const annotation = this.#elementsToAnnotations.get(element); + const index = binarySearchFirstItem(this.#annotations, a => this.#sortComments(a, annotation) >= 0); + if (index >= this.#annotations.length) { + return; + } + this.#annotations.splice(index, 1); + element.remove(); + this.#idsToElements.delete(id); + this.#setCommentsCount(); + } + #removeAll() { + this.#commentsList.replaceChildren(); + this.#elementsToAnnotations = new WeakMap(); + this.#idsToElements.clear(); + this.#annotations.length = 0; + this.#setCommentsCount(); + } + selectComment(element, id = null) { + if (!this.#idsToElements) { + return; + } + const hasNoElement = !element; + element ||= this.#idsToElements.get(id); + for (const el of this.#commentsList.children) { + el.classList.toggle("selected", el === element); + } + if (hasNoElement) { + element?.scrollIntoView({ + behavior: "instant", + block: "center" + }); + } + } + addComment(annotation) { + if (this.#idsToElements?.has(annotation.id)) { + return; + } + const { + popupRef, + contentsObj + } = annotation; + if (!popupRef || !contentsObj?.str) { + return; + } + const commentItem = this.#createCommentElement(annotation); + if (this.#annotations.length === 0) { + this.#commentsList.replaceChildren(commentItem); + this.#annotations.push(annotation); + this.#setCommentsCount(); + return; + } + const index = binarySearchFirstItem(this.#annotations, a => this.#sortComments(a, annotation) >= 0); + this.#annotations.splice(index, 0, annotation); + if (index >= this.#commentsList.children.length) { + this.#commentsList.append(commentItem); + } else { + this.#commentsList.insertBefore(commentItem, this.#commentsList.children[index]); + } + this.#setCommentsCount(); + } + #setCommentsCount(container = this.#commentsList) { + const count = this.#idsToElements.size; + this.#sidebarTitle.setAttribute("data-l10n-args", JSON.stringify({ + count + })); + this.#commentCount.textContent = count; + if (count === 0) { + container.append(this.#createZeroCommentElement()); + } + } + #createZeroCommentElement() { + const commentItem = document.createElement("li"); + commentItem.classList.add("sidebarComment", "noComments"); + const textDiv = document.createElement("div"); + textDiv.className = "sidebarCommentText"; + textDiv.setAttribute("data-l10n-id", "pdfjs-editor-comments-sidebar-no-comments1"); + commentItem.append(textDiv); + if (this.#learnMoreUrl) { + const a = document.createElement("a"); + a.setAttribute("data-l10n-id", "pdfjs-editor-comments-sidebar-no-comments-link"); + a.href = this.#learnMoreUrl; + a.target = "_blank"; + a.rel = "noopener noreferrer"; + commentItem.append(a); + } + return commentItem; + } + #setDate(element, date) { + date = PDFDateString.toDateObject(date); + element.dateTime = date.toISOString(); + element.textContent = this.#dateFormat.format(date); + } + #setText(element, richText, contentsObj) { + element.replaceChildren(); + const html = richText?.str && (!contentsObj?.str || richText.str === contentsObj.str) ? richText.html : contentsObj?.str; + renderRichText({ + html, + dir: contentsObj?.dir || "auto", + className: "richText" + }, element); + } + #createCommentElement(annotation) { + const { + id, + creationDate, + modificationDate, + richText, + contentsObj, + color, + opacity + } = annotation; + const commentItem = document.createElement("li"); + commentItem.role = "button"; + commentItem.className = "sidebarComment"; + commentItem.tabIndex = -1; + commentItem.style.backgroundColor = color && CommentManager._makeCommentColor(color, opacity) || ""; + const dateDiv = document.createElement("time"); + this.#setDate(dateDiv, modificationDate || creationDate); + const textDiv = document.createElement("div"); + textDiv.className = "sidebarCommentText"; + this.#setText(textDiv, richText, contentsObj); + commentItem.append(dateDiv, textDiv); + commentItem.addEventListener("click", this.#boundCommentClick); + commentItem.addEventListener("keydown", this.#boundCommentKeydown); + this.#elementsToAnnotations.set(commentItem, annotation); + this.#idsToElements.set(id, commentItem); + return commentItem; + } + async #commentClick({ + currentTarget + }) { + if (currentTarget.classList.contains("selected")) { + currentTarget.classList.remove("selected"); + this.#popup._hide(); + return; + } + const annotation = this.#elementsToAnnotations.get(currentTarget); + if (!annotation) { + return; + } + this.#popup._hide(); + const { + id, + pageIndex, + rect + } = annotation; + const pageNumber = pageIndex + 1; + const pageVisiblePromise = this.#uiManager?.waitForEditorsRendered(pageNumber); + this.#linkService?.goToXY(pageNumber, rect[0], rect[3], { + center: "both" + }); + this.selectComment(currentTarget); + await pageVisiblePromise; + this.#uiManager?.selectComment(pageIndex, id); + } + #commentKeydown(e) { + const { + key, + currentTarget + } = e; + switch (key) { + case "ArrowDown": + (currentTarget.nextElementSibling || this.#commentsList.firstElementChild).focus(); + stopEvent(e); + break; + case "ArrowUp": + (currentTarget.previousElementSibling || this.#commentsList.lastElementChild).focus(); + stopEvent(e); + break; + case "Home": + this.#commentsList.firstElementChild.focus(); + stopEvent(e); + break; + case "End": + this.#commentsList.lastElementChild.focus(); + stopEvent(e); + break; + case "Enter": + case " ": + this.#commentClick(e); + stopEvent(e); + break; + case "ShiftTab": + this.#closeButton.focus(); + stopEvent(e); + break; + } + } + #sortComments(a, b) { + const dateA = PDFDateString.toDateObject(a.modificationDate || a.creationDate); + const dateB = PDFDateString.toDateObject(b.modificationDate || b.creationDate); + if (dateA !== dateB) { + if (dateA !== null && dateB !== null) { + return dateB - dateA; + } + return dateA !== null ? -1 : 1; + } + if (a.pageIndex !== b.pageIndex) { + return a.pageIndex - b.pageIndex; + } + if (a.rect[3] !== b.rect[3]) { + return b.rect[3] - a.rect[3]; + } + if (a.rect[0] !== b.rect[0]) { + return a.rect[0] - b.rect[0]; + } + if (a.rect[1] !== b.rect[1]) { + return b.rect[1] - a.rect[1]; + } + return a.rect[2] !== b.rect[2] ? a.rect[2] - b.rect[2] : a.id.localeCompare(b.id); + } +} +class CommentDialog { + #dialog; + #editor; + #overlayManager; + #previousText = ""; + #commentText = ""; + #textInput; + #title; + #saveButton; + #saveButtonLabel; + #uiManager; + #prevDragX = 0; + #prevDragY = 0; + #dialogX = 0; + #dialogY = 0; + #isLTR; + #eventBus; + constructor({ + dialog, + toolbar, + title, + textInput, + cancelButton, + saveButton + }, overlayManager, eventBus, ltr) { + this.#dialog = dialog; + this.#textInput = textInput; + this.#overlayManager = overlayManager; + this.#eventBus = eventBus; + this.#saveButton = saveButton; + this.#saveButtonLabel = saveButton.firstElementChild; + this.#title = title; + this.#isLTR = ltr; + const finishBound = this.#finish.bind(this); + dialog.addEventListener("close", finishBound); + dialog.addEventListener("contextmenu", e => { + if (e.target !== this.#textInput) { + e.preventDefault(); + } + }); + cancelButton.addEventListener("click", finishBound); + saveButton.addEventListener("click", this.#save.bind(this)); + textInput.addEventListener("input", () => { + saveButton.disabled = textInput.value === this.#previousText; + }); + textInput.addEventListener("keydown", e => { + if ((e.ctrlKey || e.metaKey) && e.key === "Enter" && !saveButton.disabled) { + this.#save(); + } + }); + let pointerMoveAC; + const cancelDrag = () => { + dialog.classList.remove("dragging"); + pointerMoveAC?.abort(); + pointerMoveAC = null; + }; + toolbar.addEventListener("pointerdown", e => { + if (pointerMoveAC) { + cancelDrag(); + return; + } + const { + clientX, + clientY + } = e; + stopEvent(e); + this.#prevDragX = clientX; + this.#prevDragY = clientY; + pointerMoveAC = new AbortController(); + const { + signal + } = pointerMoveAC; + const { + innerHeight, + innerWidth + } = window; + dialog.classList.add("dragging"); + window.addEventListener("pointermove", ev => { + if (!pointerMoveAC) { + return; + } + const { + clientX: x, + clientY: y + } = ev; + this.#setPosition(this.#dialogX + (x - this.#prevDragX) / innerWidth, this.#dialogY + (y - this.#prevDragY) / innerHeight); + this.#prevDragX = x; + this.#prevDragY = y; + stopEvent(ev); + }, { + signal + }); + window.addEventListener("blur", cancelDrag, { + signal + }); + window.addEventListener("pointerup", ev => { + if (pointerMoveAC) { + cancelDrag(); + stopEvent(ev); + } + }, { + signal + }); + }); + overlayManager.register(dialog); + } + async open(uiManager, editor, posX, posY, options) { + if (editor) { + this.#uiManager = uiManager; + this.#editor = editor; + } + const { + contentsObj: { + str + }, + color, + opacity + } = editor.getData(); + const { + style: dialogStyle + } = this.#dialog; + if (color) { + dialogStyle.backgroundColor = CommentManager._makeCommentColor(color, opacity); + dialogStyle.borderColor = Util.makeHexColor(...color); + } else { + dialogStyle.backgroundColor = dialogStyle.borderColor = ""; + } + this.#commentText = str || ""; + const textInput = this.#textInput; + textInput.value = this.#previousText = this.#commentText; + if (str) { + this.#title.setAttribute("data-l10n-id", "pdfjs-editor-edit-comment-dialog-title-when-editing"); + this.#saveButtonLabel.setAttribute("data-l10n-id", "pdfjs-editor-edit-comment-dialog-save-button-when-editing"); + } else { + this.#title.setAttribute("data-l10n-id", "pdfjs-editor-edit-comment-dialog-title-when-adding"); + this.#saveButtonLabel.setAttribute("data-l10n-id", "pdfjs-editor-edit-comment-dialog-save-button-when-adding"); + } + if (options?.height) { + textInput.style.height = `${options.height}px`; + } + this.#uiManager?.removeEditListeners(); + this.#saveButton.disabled = true; + const parentDimensions = options?.parentDimensions; + const { + innerHeight, + innerWidth + } = window; + if (editor.hasDefaultPopupPosition()) { + const { + dialogWidth, + dialogHeight + } = this._dialogDimensions; + if (parentDimensions) { + if (this.#isLTR && posX + dialogWidth > Math.min(parentDimensions.x + parentDimensions.width, innerWidth)) { + const buttonWidth = this.#editor.commentButtonWidth; + posX -= dialogWidth - buttonWidth * parentDimensions.width; + } else if (!this.#isLTR) { + const buttonWidth = this.#editor.commentButtonWidth * parentDimensions.width; + if (posX - dialogWidth < Math.max(0, parentDimensions.x)) { + posX = Math.max(0, posX); + } else { + posX -= dialogWidth - buttonWidth; + } + } + } + const height = Math.max(dialogHeight, options?.height || 0); + if (posY + height > innerHeight) { + posY = innerHeight - height; + } + if (posY < 0) { + posY = 0; + } + } + posX = MathClamp(posX / innerWidth, 0, 1); + posY = MathClamp(posY / innerHeight, 0, 1); + this.#setPosition(posX, posY); + await this.#overlayManager.open(this.#dialog); + textInput.focus(); + } + async #save() { + this.#editor.comment = this.#textInput.value; + this.#finish(); + } + get _dialogDimensions() { + const dialog = this.#dialog; + const { + style + } = dialog; + style.opacity = "0"; + style.display = "block"; + const { + width, + height + } = dialog.getBoundingClientRect(); + style.opacity = style.display = ""; + return pdfjs_shadow(this, "_dialogDimensions", { + dialogWidth: width, + dialogHeight: height + }); + } + #setPosition(x, y) { + this.#dialogX = x; + this.#dialogY = y; + const { + style + } = this.#dialog; + style.left = `${100 * x}%`; + style.top = `${100 * y}%`; + } + #finish() { + if (!this.#editor) { + return; + } + const edited = this.#textInput.value !== this.#commentText; + this.#eventBus.dispatch("reporttelemetry", { + source: this, + details: { + type: "comment", + data: { + edited + } + } + }); + this.#editor?.focusCommentButton(); + this.#editor = null; + this.#textInput.value = this.#previousText = this.#commentText = ""; + this.#overlayManager.closeIfActive(this.#dialog); + this.#textInput.style.height = ""; + this.#uiManager?.addEditListeners(); + this.#uiManager = null; + } + destroy() { + this.#uiManager = null; + this.#editor = null; + this.#finish(); + } +} +class CommentPopup { + #buttonsContainer = null; + #eventBus; + #commentDialog; + #dateFormat; + #editor = null; + #isLTR; + #container = null; + #text = null; + #time = null; + #prevDragX = 0; + #prevDragY = 0; + #posX = 0; + #posY = 0; + #previousFocusedElement = null; + #selected = false; + #visible = false; + constructor(eventBus, dateFormat, ltr, commentDialog) { + this.#eventBus = eventBus; + this.#dateFormat = dateFormat; + this.#isLTR = ltr; + this.#commentDialog = commentDialog; + this.sidebar = null; + } + get _popupWidth() { + const container = this.#createPopup(); + const { + style + } = container; + style.opacity = "0"; + style.display = "block"; + document.body.append(container); + const width = container.getBoundingClientRect().width; + container.remove(); + style.opacity = style.display = ""; + return pdfjs_shadow(this, "_popupWidth", width); + } + #createPopup() { + if (this.#container) { + return this.#container; + } + const container = this.#container = document.createElement("div"); + container.className = "commentPopup"; + container.id = "commentPopup"; + container.tabIndex = -1; + container.role = "dialog"; + container.ariaModal = "false"; + container.addEventListener("contextmenu", noContextMenu); + container.addEventListener("keydown", e => { + if (e.key === "Escape") { + this.toggle(this.#editor, true, false); + this.#previousFocusedElement?.focus(); + stopEvent(e); + } + }); + container.addEventListener("click", () => { + container.focus(); + }); + const top = document.createElement("div"); + top.className = "commentPopupTop"; + const time = this.#time = document.createElement("time"); + time.className = "commentPopupTime"; + const buttons = this.#buttonsContainer = document.createElement("div"); + buttons.className = "commentPopupButtons"; + const edit = document.createElement("button"); + edit.classList.add("commentPopupEdit", "toolbarButton"); + edit.tabIndex = 0; + edit.setAttribute("data-l10n-id", "pdfjs-editor-edit-comment-popup-button"); + edit.ariaHasPopup = "dialog"; + edit.ariaControlsElements = [this.#commentDialog]; + const editLabel = document.createElement("span"); + editLabel.setAttribute("data-l10n-id", "pdfjs-editor-edit-comment-popup-button-label"); + edit.append(editLabel); + edit.addEventListener("click", () => { + const editor = this.#editor; + const height = parseFloat(getComputedStyle(this.#text).height); + this.toggle(editor, true, false); + editor.editComment({ + height + }); + }); + edit.addEventListener("contextmenu", noContextMenu); + const del = document.createElement("button"); + del.classList.add("commentPopupDelete", "toolbarButton"); + del.tabIndex = 0; + del.setAttribute("data-l10n-id", "pdfjs-editor-delete-comment-popup-button"); + const delLabel = document.createElement("span"); + delLabel.setAttribute("data-l10n-id", "pdfjs-editor-delete-comment-popup-button-label"); + del.append(delLabel); + del.addEventListener("click", () => { + this.#eventBus.dispatch("reporttelemetry", { + source: this, + details: { + type: "comment", + data: { + deleted: true + } + } + }); + const editor = this.#editor; + const savedData = editor.comment; + this.destroy(); + if (savedData?.text) { + editor._uiManager.deleteComment(editor, savedData); + } else { + editor.comment = null; + } + editor.focus(); + }); + del.addEventListener("contextmenu", noContextMenu); + buttons.append(edit, del); + top.append(time, buttons); + const separator = document.createElement("hr"); + const text = this.#text = document.createElement("div"); + text.className = "commentPopupText"; + container.append(top, separator, text); + let pointerMoveAC; + const cancelDrag = () => { + container.classList.remove("dragging"); + pointerMoveAC?.abort(); + pointerMoveAC = null; + }; + top.addEventListener("pointerdown", e => { + if (pointerMoveAC) { + cancelDrag(); + return; + } + const { + target, + clientX, + clientY + } = e; + if (buttons.contains(target)) { + return; + } + stopEvent(e); + const { + width: parentWidth, + height: parentHeight + } = this.#editor.parentBoundingClientRect; + this.#prevDragX = clientX; + this.#prevDragY = clientY; + pointerMoveAC = new AbortController(); + const { + signal + } = pointerMoveAC; + container.classList.add("dragging"); + window.addEventListener("pointermove", ev => { + if (!pointerMoveAC) { + return; + } + const { + clientX: x, + clientY: y + } = ev; + this.#setPosition(this.#posX + (x - this.#prevDragX) / parentWidth, this.#posY + (y - this.#prevDragY) / parentHeight, false); + this.#prevDragX = x; + this.#prevDragY = y; + stopEvent(ev); + }, { + signal + }); + window.addEventListener("blur", cancelDrag, { + signal + }); + window.addEventListener("pointerup", ev => { + if (pointerMoveAC) { + cancelDrag(); + stopEvent(ev); + } + }, { + signal + }); + }); + return container; + } + updateColor(editor) { + if (this.#editor !== editor || !this.#visible) { + return; + } + const { + color, + opacity + } = editor.getData(); + this.#container.style.backgroundColor = color && CommentManager._makeCommentColor(color, opacity) || ""; + } + _hide(editor) { + const container = this.#createPopup(); + container.classList.toggle("hidden", true); + container.classList.toggle("selected", false); + (editor || this.#editor)?.setCommentButtonStates({ + selected: false, + hasPopup: false + }); + this.#editor = null; + this.#selected = false; + this.#visible = false; + this.#text.replaceChildren(); + this.sidebar.selectComment(null); + } + toggle(editor, isSelected, visibility = undefined, isEditable = true) { + if (!editor) { + this.destroy(); + return; + } + if (isSelected) { + visibility ??= this.#editor === editor ? !this.#selected || !this.#visible : true; + } else { + if (this.#selected) { + return; + } + visibility ??= !this.#visible; + } + if (!visibility) { + this._hide(editor); + return; + } + this.#visible = true; + if (this.#editor !== editor) { + this.#editor?.setCommentButtonStates({ + selected: false, + hasPopup: false + }); + } + const container = this.#createPopup(); + this.#buttonsContainer.classList.toggle("hidden", !isEditable); + container.classList.toggle("hidden", false); + container.classList.toggle("selected", isSelected); + this.#selected = isSelected; + this.#editor = editor; + editor.setCommentButtonStates({ + selected: isSelected, + hasPopup: true + }); + const { + contentsObj, + richText, + creationDate, + modificationDate, + color, + opacity + } = editor.getData(); + container.style.backgroundColor = color && CommentManager._makeCommentColor(color, opacity) || ""; + this.#text.replaceChildren(); + const html = richText?.str && (!contentsObj?.str || richText.str === contentsObj.str) ? richText.html : contentsObj?.str; + if (html) { + renderRichText({ + html, + dir: contentsObj?.dir || "auto", + className: "richText" + }, this.#text); + } + this.#time.textContent = this.#dateFormat.format(PDFDateString.toDateObject(modificationDate || creationDate)); + this.#setPosition(...editor.commentPopupPosition, editor.hasDefaultPopupPosition()); + editor.elementBeforePopup.after(container); + container.addEventListener("focus", ({ + relatedTarget + }) => { + this.#previousFocusedElement = relatedTarget; + }, { + once: true + }); + if (isSelected) { + setTimeout(() => container.focus(), 0); + } + } + #setPosition(x, y, correctPosition) { + if (!correctPosition) { + this.#editor.commentPopupPosition = [x, y]; + } else { + const parentRect = this.#editor.parentBoundingClientRect; + const widthRatio = this._popupWidth / parentRect.width; + if (this.#isLTR && x + widthRatio > 1 || !this.#isLTR && x - widthRatio >= 0) { + const buttonWidth = this.#editor.commentButtonWidth; + x -= widthRatio - buttonWidth; + } + const margin = 0.01; + if (this.#isLTR) { + x = Math.max(x, -parentRect.x / parentRect.width + margin); + } else { + x = Math.min(x, (window.innerWidth - parentRect.x) / parentRect.width - widthRatio - margin); + } + } + this.#posX = x; + this.#posY = y; + const { + style + } = this.#container; + style.left = `${100 * x}%`; + style.top = `${100 * y}%`; + } + destroy() { + this._hide(); + this.#container?.remove(); + this.#container = this.#text = this.#time = null; + this.#prevDragX = this.#prevDragY = Infinity; + this.#posX = this.#posY = 0; + this.#previousFocusedElement = null; + } +} + +;// ./web/base_download_manager.js + + + +class BaseDownloadManager { + #openBlobUrls = new WeakMap(); + _triggerDownload(blobUrl, originalUrl, filename, isAttachment = false) { + throw new Error("Not implemented: _triggerDownload"); + } + _getOpenDataUrl(blobUrl, filename, dest = null) { + throw new Error("Not implemented: _getOpenDataUrl"); + } + downloadData(data, filename, contentType) { + const blobUrl = URL.createObjectURL(new Blob([data], { + type: contentType + })); + this._triggerDownload(blobUrl, blobUrl, filename, true); + } + openOrDownloadData(data, filename, dest = null) { + const isPdfData = isPdfFile(filename); + const contentType = isPdfData ? "application/pdf" : ""; + if (isPdfData) { + const blobUrl = this.#openBlobUrls.getOrInsertComputed(data, () => URL.createObjectURL(new Blob([data], { + type: contentType + }))); + try { + const viewerUrl = this._getOpenDataUrl(blobUrl, filename, dest); + window.open(viewerUrl); + return true; + } catch (ex) { + console.error("openOrDownloadData:", ex); + URL.revokeObjectURL(blobUrl); + this.#openBlobUrls.delete(data); + } + } + this.downloadData(data, filename, contentType); + return false; + } + download(data, url, filename) { + const blobUrl = data ? URL.createObjectURL(new Blob([data], { + type: "application/pdf" + })) : null; + this._triggerDownload(blobUrl, url, filename); + } +} + +;// ./web/download_manager.js + + +class DownloadManager extends BaseDownloadManager { + _triggerDownload(blobUrl, originalUrl, filename, isAttachment = false) { + if (!blobUrl && !isAttachment) { + if (!createValidAbsoluteUrl(originalUrl, "http://example.com")) { + throw new Error(`_triggerDownload - not a valid URL: ${originalUrl}`); + } + blobUrl = originalUrl + "#pdfjs.action=download"; + } + const a = document.createElement("a"); + a.href = blobUrl; + a.target = "_parent"; + if ("download" in a) { + a.download = filename; + } + (document.body || document.documentElement).append(a); + a.click(); + a.remove(); + } + _getOpenDataUrl(blobUrl, filename, dest = null) { + let url = "?file=" + encodeURIComponent(blobUrl + "#" + filename); + if (dest) { + url += `#${escape(dest)}`; + } + return url; + } +} + +;// ./web/editor_undo_bar.js + + + +class EditorUndoBar { + #closeButton = null; + #container; + #eventBus = null; + #focusTimeout = null; + #initController = null; + isOpen = false; + #message; + #showController = null; + #undoButton; + static #l10nMessages = Object.freeze({ + highlight: "pdfjs-editor-undo-bar-message-highlight", + freetext: "pdfjs-editor-undo-bar-message-freetext", + stamp: "pdfjs-editor-undo-bar-message-stamp", + ink: "pdfjs-editor-undo-bar-message-ink", + signature: "pdfjs-editor-undo-bar-message-signature", + comment: "pdfjs-editor-undo-bar-message-comment", + _multiple: "pdfjs-editor-undo-bar-message-multiple" + }); + constructor({ + container, + message, + undoButton, + closeButton + }, eventBus) { + this.#container = container; + this.#message = message; + this.#undoButton = undoButton; + this.#closeButton = closeButton; + this.#eventBus = eventBus; + } + destroy() { + this.#initController?.abort(); + this.#initController = null; + this.hide(); + } + show(undoAction, messageData) { + if (!this.#initController) { + this.#initController = new AbortController(); + const domOpts = { + signal: this.#initController.signal + }; + const evtOpts = { + signal: this.#initController.signal, + ...internalOpt + }; + const boundHide = this.hide.bind(this); + this.#container.addEventListener("contextmenu", noContextMenu, domOpts); + this.#closeButton.addEventListener("click", boundHide, domOpts); + this.#eventBus.on("beforeprint", boundHide, evtOpts); + this.#eventBus.on("download", boundHide, evtOpts); + } + this.hide(); + if (typeof messageData === "string") { + this.#message.setAttribute("data-l10n-id", EditorUndoBar.#l10nMessages[messageData]); + } else { + this.#message.setAttribute("data-l10n-id", EditorUndoBar.#l10nMessages._multiple); + this.#message.setAttribute("data-l10n-args", JSON.stringify({ + count: messageData + })); + } + this.isOpen = true; + this.#container.hidden = false; + this.#showController = new AbortController(); + this.#undoButton.addEventListener("click", () => { + undoAction(); + this.hide(); + }, { + signal: this.#showController.signal + }); + this.#focusTimeout = setTimeout(() => { + if (!this.#container.contains(document.activeElement)) { + this.#container.focus(); + } + this.#focusTimeout = null; + }, 100); + } + hide() { + if (!this.isOpen) { + return; + } + this.isOpen = false; + this.#container.hidden = true; + this.#showController?.abort(); + this.#showController = null; + if (this.#focusTimeout) { + clearTimeout(this.#focusTimeout); + this.#focusTimeout = null; + } + } +} + +;// ./web/overlay_manager.js + + +class OverlayManager { + #overlays = new WeakMap(); + #active = null; + get active() { + return this.#active; + } + async register(dialog, canForceClose = false) { + if (typeof dialog !== "object") { + throw new Error("Not enough parameters."); + } else if (this.#overlays.has(dialog)) { + throw new Error("The overlay is already registered."); + } + this.#overlays.set(dialog, { + canForceClose + }); + dialog.addEventListener("cancel", ({ + target + }) => { + if (this.#active === target) { + this.#active = null; + } + }); + } + async open(dialog) { + if (!this.#overlays.has(dialog)) { + throw new Error("The overlay does not exist."); + } else if (this.#active) { + if (this.#active === dialog) { + throw new Error("The overlay is already active."); + } else if (this.#overlays.get(dialog).canForceClose) { + await this.close(); + } else { + throw new Error("Another overlay is currently active."); + } + } + this.#active = dialog; + dialog.showModal(); + } + async close(dialog = this.#active) { + if (!this.#overlays.has(dialog)) { + throw new Error("The overlay does not exist."); + } else if (!this.#active) { + throw new Error("The overlay is currently not active."); + } else if (this.#active !== dialog) { + throw new Error("Another overlay is currently active."); + } + dialog.close(); + this.#active = null; + } + async closeIfActive(dialog) { + if (this.#active === dialog) { + await this.close(dialog); + } + } +} + +;// ./web/password_prompt.js + +class PasswordPrompt { + #activeCapability = null; + #updateCallback = null; + #reason = null; + constructor(options, overlayManager, isViewerEmbedded = false) { + this.dialog = options.dialog; + this.label = options.label; + this.input = options.input; + this.submitButton = options.submitButton; + this.cancelButton = options.cancelButton; + this.overlayManager = overlayManager; + this._isViewerEmbedded = isViewerEmbedded; + this.submitButton.addEventListener("click", this.#verify.bind(this)); + this.cancelButton.addEventListener("click", this.close.bind(this)); + this.input.addEventListener("keydown", e => { + if (e.keyCode === 13) { + this.#verify(); + e.preventDefault(); + } + }); + this.overlayManager.register(this.dialog, true); + this.dialog.addEventListener("close", this.#cancel.bind(this)); + } + async open() { + await this.#activeCapability?.promise; + this.#activeCapability = Promise.withResolvers(); + try { + await this.overlayManager.open(this.dialog); + } catch (ex) { + this.#activeCapability.resolve(); + throw ex; + } + const passwordIncorrect = this.#reason === PasswordResponses.INCORRECT_PASSWORD; + if (!this._isViewerEmbedded || passwordIncorrect) { + this.input.focus(); + } + this.label.setAttribute("data-l10n-id", passwordIncorrect ? "pdfjs-password-invalid" : "pdfjs-password-label"); + } + async close() { + this.overlayManager.closeIfActive(this.dialog); + } + #verify() { + const password = this.input.value; + if (password?.length > 0) { + this.#invokeCallback(password); + } + } + #cancel() { + this.#invokeCallback(new Error("PasswordPrompt cancelled.")); + this.#activeCapability.resolve(); + } + #invokeCallback(password) { + if (!this.#updateCallback) { + return; + } + this.close(); + this.input.value = ""; + this.#updateCallback(password); + this.#updateCallback = null; + } + async setUpdateCallback(updateCallback, reason) { + if (this.#activeCapability) { + await this.#activeCapability.promise; + } + this.#updateCallback = updateCallback; + this.#reason = reason; + } +} + +;// ./web/base_tree_viewer.js + + +const TREEITEM_SELECTED_CLASS = "selected"; +class BaseTreeViewer { + constructor(options) { + this.container = options.container; + this.eventBus = options.eventBus; + this._l10n = options.l10n; + this.reset(); + } + reset() { + this._pdfDocument = null; + this._lastToggleIsShow = true; + this._currentTreeItem = null; + this.container.replaceChildren(); + this.container.classList.remove("withNesting"); + } + _dispatchEvent(count) { + throw new Error("Not implemented: _dispatchEvent"); + } + _bindLink(element, params) { + throw new Error("Not implemented: _bindLink"); + } + _normalizeTextContent(str) { + return removeNullCharacters(str, true) || "\u2013"; + } + _addToggleButton(div, hidden = false) { + const toggler = document.createElement("div"); + toggler.className = "treeItemToggler"; + if (hidden) { + toggler.classList.add("treeItemsHidden"); + } + div.prepend(toggler); + } + _toggleTreeItem(root, show = false) { + this._l10n.pause(); + this._lastToggleIsShow = show; + for (const toggler of root.querySelectorAll(".treeItemToggler")) { + toggler.classList.toggle("treeItemsHidden", !show); + } + this._l10n.resume(); + } + _toggleAllTreeItems() { + this._toggleTreeItem(this.container, !this._lastToggleIsShow); + } + _finishRendering(fragment, count, hasAnyNesting = false) { + if (hasAnyNesting) { + this.container.classList.add("withNesting"); + this._lastToggleIsShow = !fragment.querySelector(".treeItemsHidden"); + this.container.addEventListener("click", e => { + const { + target + } = e; + if (!target.classList.contains("treeItemToggler")) { + return; + } + stopEvent(e); + target.classList.toggle("treeItemsHidden"); + if (e.shiftKey) { + const shouldShowAll = !target.classList.contains("treeItemsHidden"); + this._toggleTreeItem(target.parentNode, shouldShowAll); + } + }); + } + this._l10n.pause(); + this.container.append(fragment); + this._l10n.resume(); + this._dispatchEvent(count); + } + render(params) { + throw new Error("Not implemented: render"); + } + _updateCurrentTreeItem(treeItem = null) { + if (this._currentTreeItem) { + this._currentTreeItem.classList.remove(TREEITEM_SELECTED_CLASS); + this._currentTreeItem = null; + } + if (treeItem) { + treeItem.classList.add(TREEITEM_SELECTED_CLASS); + this._currentTreeItem = treeItem; + } + } + _scrollToCurrentTreeItem(treeItem) { + if (!treeItem) { + return; + } + this._l10n.pause(); + let currentNode = treeItem.parentNode; + while (currentNode && currentNode !== this.container) { + if (currentNode.classList.contains("treeItem")) { + const toggler = currentNode.firstElementChild; + toggler?.classList.remove("treeItemsHidden"); + } + currentNode = currentNode.parentNode; + } + this._l10n.resume(); + this._updateCurrentTreeItem(treeItem); + treeItem.scrollIntoView({ + behavior: "instant", + block: "center", + inline: "center", + container: "nearest" + }); + } +} + +;// ./web/pdf_attachment_viewer.js + + + + + +class PDFAttachmentViewer extends BaseTreeViewer { + constructor(options) { + super(options); + this.downloadManager = options.downloadManager; + this.linkService = options.linkService; + this.eventBus.on("fileattachmentannotation", this.#appendAttachment.bind(this), internalOpt); + } + reset(keepRenderedCapability = false) { + super.reset(); + this._attachments = null; + if (!keepRenderedCapability) { + this._renderedCapability = Promise.withResolvers(); + } + this._pendingDispatchEvent = false; + } + async _dispatchEvent(attachmentsCount) { + this._renderedCapability.resolve(); + if (attachmentsCount === 0 && !this._pendingDispatchEvent) { + this._pendingDispatchEvent = true; + await waitOnEventOrTimeout({ + target: this.eventBus, + name: "annotationlayerrendered", + delay: 1000 + }); + if (!this._pendingDispatchEvent) { + return; + } + } + this._pendingDispatchEvent = false; + this.eventBus.dispatch("attachmentsloaded", { + source: this, + attachmentsCount + }); + } + _bindLink(element, { + attachmentId, + content: fallbackContent, + description, + filename + }) { + if (description) { + element.title = description; + } + const openAttachment = async () => { + const content = attachmentId ? await this.linkService.getAttachmentContent(attachmentId) : fallbackContent; + if (content) { + this.downloadManager?.openOrDownloadData(content, filename); + } + }; + element.onclick = () => { + openAttachment(); + return false; + }; + } + render({ + attachments, + keepRenderedCapability = false + }) { + if (this._attachments) { + this.reset(keepRenderedCapability); + } + this._attachments = attachments || null; + if (!attachments) { + this._dispatchEvent(0); + return; + } + const fragment = document.createDocumentFragment(); + const ul = document.createElement("ul"); + fragment.append(ul); + let attachmentsCount = 0; + for (const [name, item] of attachments) { + const li = document.createElement("li"); + ul.append(li); + const element = document.createElement("a"); + li.append(element); + this._bindLink(element, { + ...item, + attachmentId: item.attachmentId ?? name + }); + element.textContent = this._normalizeTextContent(item.filename); + attachmentsCount++; + } + this._finishRendering(fragment, attachmentsCount); + } + #appendAttachment(item) { + const renderedPromise = this._renderedCapability.promise; + renderedPromise.then(() => { + if (renderedPromise !== this._renderedCapability.promise) { + return; + } + const attachments = new Map(this._attachments); + if (attachments.has(item.filename)) { + return; + } + attachments.set(item.filename, item); + this.render({ + attachments, + keepRenderedCapability: true + }); + }); + } +} + +;// ./web/grab_to_pan.js + +const CSS_CLASS_GRAB = "grab-to-pan-grab"; +class GrabToPan { + #activateAC = null; + #mouseDownAC = null; + #scrollAC = null; + constructor({ + element + }) { + this.element = element; + this.document = element.ownerDocument; + const overlay = this.overlay = document.createElement("div"); + overlay.className = "grab-to-pan-grabbing"; + } + activate() { + if (!this.#activateAC) { + this.#activateAC = new AbortController(); + this.element.addEventListener("mousedown", this.#onMouseDown.bind(this), { + capture: true, + signal: this.#activateAC.signal + }); + this.element.classList.add(CSS_CLASS_GRAB); + } + } + deactivate() { + if (this.#activateAC) { + this.#activateAC.abort(); + this.#activateAC = null; + this.#endPan(); + this.element.classList.remove(CSS_CLASS_GRAB); + } + } + ignoreTarget(node) { + return node.matches("a[href], a[href] *, input, textarea, button, button *, select, option"); + } + #onMouseDown(event) { + if (event.button !== 0 || this.ignoreTarget(event.target)) { + return; + } + if (event.originalTarget) { + try { + event.originalTarget.tagName; + } catch { + return; + } + } + this.scrollLeftStart = this.element.scrollLeft; + this.scrollTopStart = this.element.scrollTop; + this.clientXStart = event.clientX; + this.clientYStart = event.clientY; + this.#mouseDownAC = new AbortController(); + const boundEndPan = this.#endPan.bind(this), + mouseOpts = { + capture: true, + signal: this.#mouseDownAC.signal + }; + this.document.addEventListener("mousemove", this.#onMouseMove.bind(this), mouseOpts); + this.document.addEventListener("mouseup", boundEndPan, mouseOpts); + this.#scrollAC = new AbortController(); + this.element.addEventListener("scroll", boundEndPan, { + capture: true, + signal: this.#scrollAC.signal + }); + stopEvent(event); + const focusedElement = document.activeElement; + if (focusedElement && !focusedElement.contains(event.target)) { + focusedElement.blur(); + } + } + #onMouseMove(event) { + this.#scrollAC?.abort(); + this.#scrollAC = null; + if (!(event.buttons & 1)) { + this.#endPan(); + return; + } + const xDiff = event.clientX - this.clientXStart; + const yDiff = event.clientY - this.clientYStart; + this.element.scrollTo({ + top: this.scrollTopStart - yDiff, + left: this.scrollLeftStart - xDiff, + behavior: "instant" + }); + if (!this.overlay.parentNode) { + document.body.append(this.overlay); + } + } + #endPan() { + this.#mouseDownAC?.abort(); + this.#mouseDownAC = null; + this.#scrollAC?.abort(); + this.#scrollAC = null; + this.overlay.remove(); + } +} + +;// ./web/pdf_cursor_tools.js + + + + +class PDFCursorTools { + #active = CursorTool.SELECT; + #prevActive = null; + constructor({ + container, + eventBus, + cursorToolOnLoad = CursorTool.SELECT + }) { + this.container = container; + this.eventBus = eventBus; + this.#addEventListeners(); + Promise.resolve().then(() => { + this.switchTool(cursorToolOnLoad); + }); + } + get activeTool() { + return this.#active; + } + switchTool(tool) { + if (this.#prevActive !== null) { + return; + } + this.#switchTool(tool); + } + #switchTool(tool, disabled = false) { + if (tool === this.#active) { + if (this.#prevActive !== null) { + this.eventBus.dispatch("cursortoolchanged", { + source: this, + tool, + disabled + }); + } + return; + } + const disableActiveTool = () => { + switch (this.#active) { + case CursorTool.SELECT: + break; + case CursorTool.HAND: + this._handTool.deactivate(); + break; + case CursorTool.ZOOM: + } + }; + switch (tool) { + case CursorTool.SELECT: + disableActiveTool(); + break; + case CursorTool.HAND: + disableActiveTool(); + this._handTool.activate(); + break; + case CursorTool.ZOOM: + default: + console.error(`switchTool: "${tool}" is an unsupported value.`); + return; + } + this.#active = tool; + this.eventBus.dispatch("cursortoolchanged", { + source: this, + tool, + disabled + }); + } + #addEventListeners() { + const { + eventBus + } = this; + eventBus.on("switchcursortool", evt => { + if (!evt.reset) { + this.switchTool(evt.tool); + } else if (this.#prevActive !== null) { + annotationEditorMode = AnnotationEditorType.NONE; + presentationModeState = PresentationModeState.NORMAL; + enableActive(); + } + }, internalOpt); + let annotationEditorMode = AnnotationEditorType.NONE, + presentationModeState = PresentationModeState.NORMAL; + const disableActive = () => { + this.#prevActive ??= this.#active; + this.#switchTool(CursorTool.SELECT, true); + }; + const enableActive = () => { + if (this.#prevActive !== null && annotationEditorMode === AnnotationEditorType.NONE && presentationModeState === PresentationModeState.NORMAL) { + this.#switchTool(this.#prevActive); + this.#prevActive = null; + } + }; + eventBus.on("annotationeditormodechanged", ({ + mode + }) => { + annotationEditorMode = mode; + if (mode === AnnotationEditorType.NONE) { + enableActive(); + } else { + disableActive(); + } + }, internalOpt); + eventBus.on("presentationmodechanged", ({ + state + }) => { + presentationModeState = state; + if (state === PresentationModeState.NORMAL) { + enableActive(); + } else if (state === PresentationModeState.FULLSCREEN) { + disableActive(); + } + }, internalOpt); + } + get _handTool() { + return pdfjs_shadow(this, "_handTool", new GrabToPan({ + element: this.container + })); + } +} + +;// ./web/pdf_document_properties.js + + + + + + +const NON_METRIC_LOCALES = ["en-us", "en-lr", "my"]; +const US_PAGE_NAMES = { + "8.5x11": "pdfjs-document-properties-page-size-name-letter", + "8.5x14": "pdfjs-document-properties-page-size-name-legal" +}; +const METRIC_PAGE_NAMES = { + "297x420": "pdfjs-document-properties-page-size-name-a-three", + "210x297": "pdfjs-document-properties-page-size-name-a-four" +}; +function getPageName(size, isPortrait, pageNames) { + const width = isPortrait ? size.width : size.height; + const height = isPortrait ? size.height : size.width; + return pageNames[`${width}x${height}`]; +} +class PDFDocumentProperties { + #fieldData = null; + constructor({ + dialog, + fields, + closeButton + }, overlayManager, eventBus, l10n, fileNameLookup, titleLookup) { + this.dialog = dialog; + this.fields = fields; + this.overlayManager = overlayManager; + this.l10n = l10n; + this._fileNameLookup = fileNameLookup; + this._titleLookup = titleLookup; + this.#reset(); + closeButton.addEventListener("click", this.close.bind(this)); + this.overlayManager.register(this.dialog); + eventBus.on("pagechanging", evt => { + this._currentPageNumber = evt.pageNumber; + }, internalOpt); + eventBus.on("rotationchanging", evt => { + this._pagesRotation = evt.pagesRotation; + }, internalOpt); + } + async open() { + await Promise.all([this.overlayManager.open(this.dialog), this._dataAvailableCapability.promise]); + const currentPageNumber = this._currentPageNumber; + const pagesRotation = this._pagesRotation; + if (this.#fieldData && currentPageNumber === this.#fieldData._currentPageNumber && pagesRotation === this.#fieldData._pagesRotation) { + this.#updateUI(); + return; + } + const [{ + info, + metadata, + contentLength + }, pageSize] = await Promise.all([this.pdfDocument.getMetadata(), this.pdfDocument.getPage(currentPageNumber).then(pdfPage => this.#parsePageSize(pdfPage, pagesRotation), reason => { + console.error(`PDFDocumentProperties - unable to get page ${currentPageNumber}.`, reason); + return undefined; + })]); + this.#fieldData = Object.freeze({ + fileName: this._fileNameLookup(), + fileSize: this.#parseFileSize(contentLength), + title: this._titleLookup(), + author: metadata?.get("dc:creator")?.join("\n") || info.Author, + subject: metadata?.get("dc:subject")?.join("\n") || info.Subject, + keywords: metadata?.get("pdf:keywords") || info.Keywords, + creationDate: this.#parseDate(metadata?.get("xmp:createdate"), info.CreationDate), + modificationDate: this.#parseDate(metadata?.get("xmp:modifydate"), info.ModDate), + creator: metadata?.get("xmp:creatortool") || info.Creator, + producer: metadata?.get("pdf:producer") || info.Producer, + version: info.PDFFormatVersion, + pageCount: this.pdfDocument.numPages, + pageSize, + linearized: this.#parseLinearization(info.IsLinearized), + _currentPageNumber: currentPageNumber, + _pagesRotation: pagesRotation + }); + this.#updateUI(); + const { + length + } = await this.pdfDocument.getDownloadInfo(); + if (contentLength === length) { + return; + } + const data = Object.assign(Object.create(null), this.#fieldData); + data.fileSize = this.#parseFileSize(length); + this.#fieldData = Object.freeze(data); + this.#updateUI(); + } + async close() { + this.overlayManager.close(this.dialog); + } + setDocument(pdfDocument) { + if (this.pdfDocument) { + this.#reset(); + this.#updateUI(); + } + if (!pdfDocument) { + return; + } + this.pdfDocument = pdfDocument; + this._dataAvailableCapability.resolve(); + } + #reset() { + this.pdfDocument = null; + this.#fieldData = null; + this._dataAvailableCapability = Promise.withResolvers(); + this._currentPageNumber = 1; + this._pagesRotation = 0; + } + #updateUI() { + if (this.#fieldData && this.overlayManager.active !== this.dialog) { + return; + } + for (const id in this.fields) { + const field = this.fields[id], + data = this.#fieldData?.[id]; + if (data?.id) { + field.setAttribute("data-l10n-id", data.id); + if (data.args) { + field.setAttribute("data-l10n-args", JSON.stringify(data.args)); + } + } else { + field.removeAttribute("data-l10n-id"); + field.removeAttribute("data-l10n-args"); + field.textContent = data || data === 0 ? data : "-"; + } + } + } + #parseFileSize(b = 0) { + const kb = b / 1024, + mb = kb / 1024; + return kb ? { + id: mb >= 1 ? "pdfjs-document-properties-size-mb" : "pdfjs-document-properties-size-kb", + args: { + mb, + kb, + b + } + } : undefined; + } + async #parsePageSize(pdfPage, pagesRotation) { + let pageSizeInches = getPageSizeInches(pdfPage); + if (pagesRotation % 180 !== 0) { + pageSizeInches = { + width: pageSizeInches.height, + height: pageSizeInches.width + }; + } + const isPortrait = isPortraitOrientation(pageSizeInches), + nonMetric = NON_METRIC_LOCALES.includes(this.l10n.getLanguage()); + let sizeInches = { + width: Math.round(pageSizeInches.width * 100) / 100, + height: Math.round(pageSizeInches.height * 100) / 100 + }; + let sizeMillimeters = { + width: Math.round(pageSizeInches.width * 25.4 * 10) / 10, + height: Math.round(pageSizeInches.height * 25.4 * 10) / 10 + }; + let nameId = getPageName(sizeInches, isPortrait, US_PAGE_NAMES) || getPageName(sizeMillimeters, isPortrait, METRIC_PAGE_NAMES); + if (!nameId && !(Number.isInteger(sizeMillimeters.width) && Number.isInteger(sizeMillimeters.height))) { + const exactMillimeters = { + width: pageSizeInches.width * 25.4, + height: pageSizeInches.height * 25.4 + }; + const intMillimeters = { + width: Math.round(sizeMillimeters.width), + height: Math.round(sizeMillimeters.height) + }; + if (Math.abs(exactMillimeters.width - intMillimeters.width) < 0.1 && Math.abs(exactMillimeters.height - intMillimeters.height) < 0.1) { + nameId = getPageName(intMillimeters, isPortrait, METRIC_PAGE_NAMES); + if (nameId) { + sizeInches = { + width: Math.round(intMillimeters.width / 25.4 * 100) / 100, + height: Math.round(intMillimeters.height / 25.4 * 100) / 100 + }; + sizeMillimeters = intMillimeters; + } + } + } + const { + width, + height + } = nonMetric ? sizeInches : sizeMillimeters; + const ids = [nonMetric ? "pdfjs-document-properties-page-size-unit-inches" : "pdfjs-document-properties-page-size-unit-millimeters", isPortrait ? "pdfjs-document-properties-page-size-orientation-portrait" : "pdfjs-document-properties-page-size-orientation-landscape"]; + if (nameId) { + ids.push(nameId); + } + const [unit, orientation, name] = await this.l10n.get(ids); + return { + id: name ? "pdfjs-document-properties-page-size-dimension-name-string" : "pdfjs-document-properties-page-size-dimension-string", + args: { + width, + height, + unit, + name, + orientation + } + }; + } + #parseDate(metadataDate, infoDate) { + const dateObj = Date.parse(metadataDate) || PDFDateString.toDateObject(infoDate); + return dateObj ? { + id: "pdfjs-document-properties-date-time-string", + args: { + dateObj: dateObj.valueOf() + } + } : undefined; + } + #parseLinearization(isLinearized) { + return { + id: isLinearized ? "pdfjs-document-properties-linearized-yes" : "pdfjs-document-properties-linearized-no" + }; + } +} + +;// ./node_modules/core-js/modules/es.regexp.escape.js +es_regexp_escape_namespaceFn(); + +;// ./node_modules/core-js/modules/es.typed-array.with.js +es_typed_array_with_namespaceFn(); + +;// ./web/pdf_find_utils.js + + +let wordSegmenter = null; +let graphemeSegmenter = null; +function isWordBreakAt(content, pos) { + graphemeSegmenter ||= new Intl.Segmenter(undefined, { + granularity: "grapheme" + }); + const graphemes = graphemeSegmenter.segment(content); + const after = graphemes.containing(pos); + if (after.index !== pos) { + return false; + } + wordSegmenter ||= new Intl.Segmenter(undefined, { + granularity: "word" + }); + const before = graphemes.containing(pos - 1).segment; + return wordSegmenter.segment(before + after.segment).containing(before.length).index === before.length; +} +function isEntireWord(content, startIdx, length) { + const endIdx = startIdx + length; + return (startIdx === 0 || isWordBreakAt(content, startIdx)) && (endIdx === content.length || isWordBreakAt(content, endIdx)); +} +let NormalizeWithNFKC; +function getNormalizeWithNFKC() { + if (!NormalizeWithNFKC) { + const ranges = []; + const range = []; + const diacriticsRegex = /^\p{M}$/u; + for (let i = 0; i < 65536; i++) { + if (i >= 0xd800 && i <= 0xdfff) { + continue; + } + const c = String.fromCharCode(i); + if (c.normalize("NFKC") !== c && !diacriticsRegex.test(c)) { + if (range.length !== 2) { + range[0] = range[1] = i; + continue; + } + if (range[1] + 1 !== i) { + if (range[0] === range[1]) { + ranges.push(String.fromCharCode(range[0])); + } else { + ranges.push(`${String.fromCharCode(range[0])}-${String.fromCharCode(range[1])}`); + } + range[0] = range[1] = i; + } else { + range[1] = i; + } + } + } + const rangesStr = ranges.join(""); + if (!NormalizeWithNFKC) { + NormalizeWithNFKC = rangesStr; + } else if (rangesStr !== NormalizeWithNFKC) { + for (let i = 1; i < rangesStr.length; i++) { + if (rangesStr[i] !== NormalizeWithNFKC[i]) { + console.log(`Difference at index ${i}: ` + `U+${rangesStr.charCodeAt(i).toString(16).toUpperCase().padStart(4, "0")}` + `!== U+${NormalizeWithNFKC.charCodeAt(i).toString(16).toUpperCase().padStart(4, "0")}`); + break; + } + } + throw new Error("getNormalizeWithNFKC - update the `NormalizeWithNFKC` string."); + } + } + return NormalizeWithNFKC; +} + +;// ./web/pdf_find_controller.js + + + + + + + + + + + + + + + + + + + + +const FindState = { + FOUND: 0, + NOT_FOUND: 1, + WRAPPED: 2, + PENDING: 3 +}; +const CHARACTERS_TO_NORMALIZE = new Map([["\u2010", "-"], ["\u2018", "'"], ["\u2019", "'"], ["\u201A", "'"], ["\u201B", "'"], ["\u201C", '"'], ["\u201D", '"'], ["\u201E", '"'], ["\u201F", '"'], ["\u00BC", "1/4"], ["\u00BD", "1/2"], ["\u00BE", "3/4"]]); +const DIACRITICS_EXCEPTION = new Set([0x3099, 0x309a, 0x094d, 0x09cd, 0x0a4d, 0x0acd, 0x0b4d, 0x0bcd, 0x0c4d, 0x0ccd, 0x0d3b, 0x0d3c, 0x0d4d, 0x0dca, 0x0e3a, 0x0eba, 0x0f84, 0x1039, 0x103a, 0x1714, 0x1734, 0x17d2, 0x1a60, 0x1b44, 0x1baa, 0x1bab, 0x1bf2, 0x1bf3, 0x2d7f, 0xa806, 0xa82c, 0xa8c4, 0xa953, 0xa9c0, 0xaaf6, 0xabed, 0x0c56, 0x0f71, 0x0f72, 0x0f7a, 0x0f7b, 0x0f7c, 0x0f7d, 0x0f80, 0x0f74]); +let DIACRITICS_EXCEPTION_STR; +const DIACRITICS_REG_EXP = /\p{M}+/gu; +const SPECIAL_CHARS_REG_EXP = /([+^$|])|(\p{P}+)|(\s+)|(\p{M})|(\p{L})/gu; +const SYLLABLES_REG_EXP = /[\uAC00-\uD7AF\uFA6C\uFACF-\uFAD1\uFAD5-\uFAD7]+/g; +const SYLLABLES_LENGTHS = new Map(); +const FIRST_CHAR_SYLLABLES_REG_EXP = "[\\u1100-\\u1112\\ud7a4-\\ud7af\\ud84a\\ud84c\\ud850\\ud854\\ud857\\ud85f]"; +const NFKC_CHARS_TO_NORMALIZE = new Map(); +let noSyllablesRegExp = null; +let withSyllablesRegExp = null; +function pdf_find_controller_normalize(text, options = {}) { + const syllablePositions = []; + let m; + while ((m = SYLLABLES_REG_EXP.exec(text)) !== null) { + let { + index + } = m; + for (const char of m[0]) { + let len = SYLLABLES_LENGTHS.get(char); + if (!len) { + len = char.normalize("NFD").length; + SYLLABLES_LENGTHS.set(char, len); + } + syllablePositions.push([len, index++]); + } + } + const hasSyllables = syllablePositions.length > 0; + const ignoreDashEOL = options.ignoreDashEOL ?? false; + let normalizationRegex; + if (!hasSyllables && noSyllablesRegExp) { + normalizationRegex = noSyllablesRegExp; + } else if (hasSyllables && withSyllablesRegExp) { + normalizationRegex = withSyllablesRegExp; + } else { + const replace = CHARACTERS_TO_NORMALIZE.keys().join(""); + const toNormalizeWithNFKC = getNormalizeWithNFKC(); + const CJK = "(?:\\p{Ideographic}|[\u3040-\u30FF])"; + const HKDiacritics = "(?:\u3099|\u309A)"; + const BrokenWord = `\\p{Ll}-\\n(?=\\p{Ll})|\\p{Lu}-\\n(?=\\p{L})`; + const regexps = [`[${replace}]`, `[${toNormalizeWithNFKC}]`, `${HKDiacritics}\\n`, "\\p{M}+(?:-\\n)?", `${BrokenWord}`, "\\S-\\n", `${CJK}\\n`, "\\n", hasSyllables ? FIRST_CHAR_SYLLABLES_REG_EXP : "\\u0000"]; + normalizationRegex = new RegExp(regexps.map(r => `(${r})`).join("|"), "gmu"); + if (hasSyllables) { + withSyllablesRegExp = normalizationRegex; + } else { + noSyllablesRegExp = normalizationRegex; + } + } + const rawDiacriticsPositions = []; + while ((m = DIACRITICS_REG_EXP.exec(text)) !== null) { + rawDiacriticsPositions.push([m[0].length, m.index]); + } + let normalized = text.normalize("NFD"); + const positions = [0, 0]; + let rawDiacriticsIndex = 0; + let syllableIndex = 0; + let shift = 0; + let shiftOrigin = 0; + let eol = 0; + let hasDiacritics = false; + normalized = normalized.replace(normalizationRegex, (match, p1, p2, p3, p4, p5, p6, p7, p8, p9, i) => { + i -= shiftOrigin; + if (p1) { + const replacement = CHARACTERS_TO_NORMALIZE.get(p1); + const jj = replacement.length; + for (let j = 1; j < jj; j++) { + positions.push(i - shift + j, shift - j); + } + shift -= jj - 1; + return replacement; + } + if (p2) { + const replacement = NFKC_CHARS_TO_NORMALIZE.getOrInsertComputed(p2, () => p2.normalize("NFKC")); + const jj = replacement.length; + for (let j = 1; j < jj; j++) { + positions.push(i - shift + j, shift - j); + } + shift -= jj - 1; + return replacement; + } + if (p3) { + hasDiacritics = true; + if (i + eol === rawDiacriticsPositions[rawDiacriticsIndex]?.[1]) { + ++rawDiacriticsIndex; + } else { + positions.push(i - 1 - shift + 1, shift - 1); + shift -= 1; + shiftOrigin += 1; + } + positions.push(i - shift + 1, shift); + shiftOrigin += 1; + eol += 1; + return p3.charAt(0); + } + if (p4) { + const hasTrailingDashEOL = p4.endsWith("\n"); + const len = hasTrailingDashEOL ? p4.length - 2 : p4.length; + hasDiacritics = true; + let jj = len; + if (i + eol === rawDiacriticsPositions[rawDiacriticsIndex]?.[1]) { + jj -= rawDiacriticsPositions[rawDiacriticsIndex][0]; + ++rawDiacriticsIndex; + } + for (let j = 1; j <= jj; j++) { + positions.push(i - 1 - shift + j, shift - j); + } + shift -= jj; + shiftOrigin += jj; + if (hasTrailingDashEOL) { + i += len - 1; + positions.push(i - shift + 1, 1 + shift); + shift += 1; + shiftOrigin += 1; + eol += 1; + return p4.slice(0, len); + } + return p4; + } + if (p5) { + if (ignoreDashEOL) { + shiftOrigin += 1; + eol += 1; + return p5.slice(0, -1); + } + const len = p5.length - 2; + positions.push(i - shift + len, 1 + shift); + shift += 1; + shiftOrigin += 1; + eol += 1; + return p5.slice(0, -2); + } + if (p6) { + shiftOrigin += 1; + eol += 1; + return p6.slice(0, -1); + } + if (p7) { + const len = p7.length - 1; + positions.push(i - shift + len, shift); + shiftOrigin += 1; + eol += 1; + return p7.slice(0, -1); + } + if (p8) { + positions.push(i - shift + 1, shift - 1); + shift -= 1; + shiftOrigin += 1; + eol += 1; + return " "; + } + if (i + eol === syllablePositions[syllableIndex]?.[1]) { + const newCharLen = syllablePositions[syllableIndex][0] - 1; + ++syllableIndex; + for (let j = 1; j <= newCharLen; j++) { + positions.push(i - (shift - j), shift - j); + } + shift -= newCharLen; + shiftOrigin += newCharLen; + } + return p9; + }); + positions.push(normalized.length, shift); + const starts = new Uint32Array(positions.length >> 1); + const shifts = new Int32Array(positions.length >> 1); + for (let i = 0, ii = positions.length; i < ii; i += 2) { + starts[i >> 1] = positions[i]; + shifts[i >> 1] = positions[i + 1]; + } + return [normalized, [starts, shifts], hasDiacritics]; +} +function getOriginalIndex(diffs, pos, len) { + if (!diffs) { + return [pos, len]; + } + const [starts, shifts] = diffs; + const start = pos; + const end = pos + len - 1; + let i = binarySearchFirstItem(starts, x => x >= start); + if (starts[i] > start) { + --i; + } + let j = binarySearchFirstItem(starts, x => x >= end, i); + if (starts[j] > end) { + --j; + } + const oldStart = start + shifts[i]; + const oldEnd = end + shifts[j]; + const oldLen = oldEnd + 1 - oldStart; + return [oldStart, oldLen]; +} +class PDFFindController { + #state = null; + #updateMatchesCountOnProgress = true; + #delay = 0; + #visitedPagesCount = 0; + #copiedPageData = null; + #savedPageData = null; + constructor({ + linkService, + eventBus, + delay = 250, + updateMatchesCountOnProgress = true + }) { + this._linkService = linkService; + this._eventBus = eventBus; + this.#updateMatchesCountOnProgress = updateMatchesCountOnProgress; + this.#delay = delay; + this.onIsPageVisible = null; + this.#reset(); + eventBus.on("find", this.#onFind.bind(this), internalOpt); + eventBus.on("findbarclose", this.#onFindBarClose.bind(this), internalOpt); + eventBus.on("pagesedited", this.#onPagesEdited.bind(this), internalOpt); + } + get highlightMatches() { + return this._highlightMatches; + } + get pageMatches() { + return this._pageMatches; + } + get pageMatchesLength() { + return this._pageMatchesLength; + } + get selected() { + return this._selected; + } + get state() { + return this.#state; + } + setDocument(pdfDocument) { + if (this._pdfDocument) { + this.#reset(); + } + if (!pdfDocument) { + return; + } + this._pdfDocument = pdfDocument; + this._firstPageCapability.resolve(); + } + #onFind(state) { + if (!state) { + return; + } + const pdfDocument = this._pdfDocument; + const { + type + } = state; + if (this.#state === null || this.#shouldDirtyMatch(state)) { + this._dirtyMatch = true; + } + this.#state = state; + if (type !== "highlightallchange") { + this.#updateUIState(FindState.PENDING); + } + this._firstPageCapability.promise.then(() => { + if (!this._pdfDocument || pdfDocument && this._pdfDocument !== pdfDocument) { + return; + } + this.#extractText(); + const findbarClosed = !this._highlightMatches; + const pendingTimeout = !!this._findTimeout; + if (this._findTimeout) { + clearTimeout(this._findTimeout); + this._findTimeout = null; + } + if (!type) { + this._findTimeout = setTimeout(() => { + this.#nextMatch(); + this._findTimeout = null; + }, this.#delay); + } else if (this._dirtyMatch) { + this.#nextMatch(); + } else if (type === "again") { + this.#nextMatch(); + if (findbarClosed && this.#state.highlightAll) { + this.#updateAllPages(); + } + } else if (type === "highlightallchange") { + if (pendingTimeout) { + this.#nextMatch(); + } else { + this._highlightMatches = true; + } + this.#updateAllPages(); + } else { + this.#nextMatch(); + } + }); + } + scrollMatchIntoView({ + element = null, + pageIndex = -1, + matchIndex = -1 + }) { + if (!this._scrollMatches || !element) { + return; + } else if (matchIndex === -1 || matchIndex !== this._selected.matchIdx) { + return; + } else if (pageIndex === -1 || pageIndex !== this._selected.pageIdx) { + return; + } + this._scrollMatches = false; + element.scrollIntoView({ + block: "start", + inline: "center" + }); + } + #reset() { + this._highlightMatches = false; + this._scrollMatches = false; + this._pdfDocument = null; + this._pageMatches = []; + this._pageMatchesLength = []; + this.#visitedPagesCount = 0; + this.#state = null; + this._selected = { + pageIdx: -1, + matchIdx: -1 + }; + this._offset = { + pageIdx: null, + matchIdx: null, + wrapped: false + }; + this._extractTextPromises = []; + this._pageContents = []; + this._pageDiffs = []; + this._hasDiacritics = []; + this._matchesCountTotal = 0; + this._pagesToSearch = null; + this._pendingFindMatches = new Set(); + this._resumePageIdx = null; + this._dirtyMatch = false; + clearTimeout(this._findTimeout); + this._findTimeout = null; + this.#copiedPageData = null; + this._firstPageCapability = Promise.withResolvers(); + } + get #query() { + const { + query + } = this.#state; + if (typeof query === "string") { + if (query !== this._rawQuery) { + this._rawQuery = query; + [this._normalizedQuery] = pdf_find_controller_normalize(query); + } + return this._normalizedQuery; + } + return (query || []).filter(Boolean).map(q => pdf_find_controller_normalize(q)[0]); + } + #shouldDirtyMatch(state) { + const newQuery = state.query, + prevQuery = this.#state.query; + const newType = typeof newQuery, + prevType = typeof prevQuery; + if (newType !== prevType) { + return true; + } + if (newType === "string") { + if (newQuery !== prevQuery) { + return true; + } + } else if (JSON.stringify(newQuery) !== JSON.stringify(prevQuery)) { + return true; + } + switch (state.type) { + case "again": + const pageNumber = this._selected.pageIdx + 1; + const linkService = this._linkService; + return pageNumber >= 1 && pageNumber <= linkService.pagesCount && pageNumber !== linkService.page && !(this.onIsPageVisible?.(pageNumber) ?? true); + case "highlightallchange": + return false; + } + return true; + } + #convertToRegExpString(query, hasDiacritics) { + const { + matchDiacritics + } = this.#state; + let isUnicode = false; + const addExtraWhitespaces = (original, fixed) => { + if (original === query) { + return fixed; + } + if (query.startsWith(original)) { + return `${fixed}[ ]*`; + } + return query.endsWith(original) ? `[ ]*${fixed}` : `[ ]*${fixed}[ ]*`; + }; + query = query.replaceAll(SPECIAL_CHARS_REG_EXP, (match, p1, p2, p3, p4, p5) => { + if (p1) { + return addExtraWhitespaces(p1, RegExp.escape(p1)); + } + if (p2) { + return addExtraWhitespaces(p2, RegExp.escape(p2)); + } + if (p3) { + return "[ ]+"; + } + if (matchDiacritics) { + return p4 || p5; + } + if (p4) { + return DIACRITICS_EXCEPTION.has(p4.charCodeAt(0)) ? p4 : ""; + } + if (hasDiacritics) { + isUnicode = true; + return `${p5}\\p{M}*`; + } + return p5; + }); + const trailingSpaces = "[ ]*"; + if (query.endsWith(trailingSpaces)) { + query = query.slice(0, query.length - trailingSpaces.length); + } + if (matchDiacritics) { + if (hasDiacritics) { + DIACRITICS_EXCEPTION_STR ||= String.fromCharCode(...DIACRITICS_EXCEPTION); + isUnicode = true; + query = `${query}(?=[${DIACRITICS_EXCEPTION_STR}]|[^\\p{M}]|$)`; + } + } + return [isUnicode, query]; + } + #calculateMatch(pageIndex) { + if (!this.#state) { + return; + } + const query = this.#query; + if (query.length === 0) { + return; + } + const pageContent = this._pageContents[pageIndex]; + const matcherResult = this.match(query, pageContent, pageIndex); + const matches = this._pageMatches[pageIndex] = []; + const matchesLength = this._pageMatchesLength[pageIndex] = []; + const diffs = this._pageDiffs[pageIndex]; + matcherResult?.forEach(({ + index, + length + }) => { + const [matchPos, matchLen] = getOriginalIndex(diffs, index, length); + if (matchLen) { + matches.push(matchPos); + matchesLength.push(matchLen); + } + }); + if (this.#state.highlightAll) { + this.#updatePage(pageIndex); + } + if (this._resumePageIdx === pageIndex) { + this._resumePageIdx = null; + this.#nextPageMatch(); + } + const pageMatchesCount = matches.length; + this._matchesCountTotal += pageMatchesCount; + if (this.#updateMatchesCountOnProgress) { + if (pageMatchesCount > 0) { + this.#updateUIResultsCount(); + } + } else if (++this.#visitedPagesCount === this._linkService.pagesCount) { + this.#updateUIResultsCount(); + } + } + match(query, pageContent, pageIndex) { + const hasDiacritics = this._hasDiacritics[pageIndex]; + let isUnicode = false; + if (typeof query === "string") { + [isUnicode, query] = this.#convertToRegExpString(query, hasDiacritics); + } else { + query = query.sort().reverse().map(q => { + const [isUnicodePart, queryPart] = this.#convertToRegExpString(q, hasDiacritics); + isUnicode ||= isUnicodePart; + return `(${queryPart})`; + }).join("|"); + } + if (!query) { + return undefined; + } + const { + caseSensitive, + entireWord + } = this.#state; + const flags = `g${isUnicode ? "u" : ""}${caseSensitive ? "" : "i"}`; + query = new RegExp(query, flags); + const matches = []; + let match; + while ((match = query.exec(pageContent)) !== null) { + if (entireWord && !isEntireWord(pageContent, match.index, match[0].length)) { + continue; + } + matches.push({ + index: match.index, + length: match[0].length + }); + } + return matches; + } + #extractText() { + if (this._extractTextPromises.length > 0) { + return; + } + let deferred = Promise.resolve(); + const textOptions = { + disableNormalization: true + }; + const pdfDoc = this._pdfDocument; + for (let i = 0, ii = this._linkService.pagesCount; i < ii; i++) { + const { + promise, + resolve + } = Promise.withResolvers(); + this._extractTextPromises[i] = promise; + deferred = deferred.then(async () => { + if (pdfDoc !== this._pdfDocument) { + resolve(); + return; + } + try { + const pdfPage = await pdfDoc.getPage(i + 1); + const textContent = await pdfPage.getTextContent(textOptions); + if (pdfDoc !== this._pdfDocument) { + resolve(); + return; + } + const strBuf = []; + for (const textItem of textContent.items) { + strBuf.push(textItem.str); + if (textItem.hasEOL) { + strBuf.push("\n"); + } + } + [this._pageContents[i], this._pageDiffs[i], this._hasDiacritics[i]] = pdf_find_controller_normalize(strBuf.join("")); + } catch (ex) { + if (pdfDoc !== this._pdfDocument) { + resolve(); + return; + } + console.error(`Unable to get text content for page ${i + 1}`, ex); + [this._pageContents[i], this._pageDiffs[i], this._hasDiacritics[i]] = ["", null, false]; + } + resolve(); + }); + } + } + #updatePage(index) { + if (this._scrollMatches && this._selected.pageIdx === index) { + this._linkService.page = index + 1; + } + this._eventBus.dispatch("updatetextlayermatches", { + source: this, + pageIndex: index + }); + } + #updateAllPages() { + this._eventBus.dispatch("updatetextlayermatches", { + source: this, + pageIndex: -1 + }); + } + #nextMatch() { + const previous = this.#state.findPrevious; + const currentPageIndex = this._linkService.page - 1; + const numPages = this._linkService.pagesCount; + this._highlightMatches = true; + if (this._dirtyMatch) { + this._dirtyMatch = false; + this._selected.pageIdx = this._selected.matchIdx = -1; + this._offset.pageIdx = currentPageIndex; + this._offset.matchIdx = null; + this._offset.wrapped = false; + this._resumePageIdx = null; + this._pageMatches.length = 0; + this._pageMatchesLength.length = 0; + this.#visitedPagesCount = 0; + this._matchesCountTotal = 0; + this.#updateAllPages(); + for (let i = 0; i < numPages; i++) { + if (this._pendingFindMatches.has(i)) { + continue; + } + this._pendingFindMatches.add(i); + this._extractTextPromises[i].then(() => { + this._pendingFindMatches.delete(i); + this.#calculateMatch(i); + }); + } + } + const query = this.#query; + if (query.length === 0) { + this.#updateUIState(FindState.FOUND); + return; + } + if (this._resumePageIdx) { + return; + } + const offset = this._offset; + this._pagesToSearch = numPages; + if (offset.matchIdx !== null) { + const numPageMatches = this._pageMatches[offset.pageIdx].length; + if (!previous && offset.matchIdx + 1 < numPageMatches || previous && offset.matchIdx > 0) { + offset.matchIdx = previous ? offset.matchIdx - 1 : offset.matchIdx + 1; + this.#updateMatch(true); + return; + } + this.#advanceOffsetPage(previous); + } + this.#nextPageMatch(); + } + #matchesReady(matches) { + const offset = this._offset; + const numMatches = matches.length; + const previous = this.#state.findPrevious; + if (numMatches) { + offset.matchIdx = previous ? numMatches - 1 : 0; + this.#updateMatch(true); + return true; + } + this.#advanceOffsetPage(previous); + if (offset.wrapped) { + offset.matchIdx = null; + if (this._pagesToSearch < 0) { + this.#updateMatch(false); + return true; + } + } + return false; + } + #nextPageMatch() { + if (this._resumePageIdx !== null) { + console.error("There can only be one pending page."); + } + let matches = null; + do { + const pageIdx = this._offset.pageIdx; + matches = this._pageMatches[pageIdx]; + if (!matches) { + this._resumePageIdx = pageIdx; + break; + } + } while (!this.#matchesReady(matches)); + } + #advanceOffsetPage(previous) { + const offset = this._offset; + const numPages = this._linkService.pagesCount; + offset.pageIdx = previous ? offset.pageIdx - 1 : offset.pageIdx + 1; + offset.matchIdx = null; + this._pagesToSearch--; + if (offset.pageIdx >= numPages || offset.pageIdx < 0) { + offset.pageIdx = previous ? numPages - 1 : 0; + offset.wrapped = true; + } + } + #updateMatch(found = false) { + let state = FindState.NOT_FOUND; + const wrapped = this._offset.wrapped; + this._offset.wrapped = false; + if (found) { + const previousPage = this._selected.pageIdx; + this._selected.pageIdx = this._offset.pageIdx; + this._selected.matchIdx = this._offset.matchIdx; + state = wrapped ? FindState.WRAPPED : FindState.FOUND; + if (previousPage !== -1 && previousPage !== this._selected.pageIdx) { + this.#updatePage(previousPage); + } + } + this.#updateUIState(state, this.#state.findPrevious); + if (this._selected.pageIdx !== -1) { + this._scrollMatches = true; + this.#updatePage(this._selected.pageIdx); + } + } + #onPagesEdited({ + pagesMapper, + type, + pageNumbers + }) { + if (this._extractTextPromises.length === 0) { + return; + } + if (type === "copy") { + const promises = new Map(); + const contents = new Map(); + const diffs = new Map(); + const diacritics = new Map(); + for (const pageNum of pageNumbers) { + promises.set(pageNum, this._extractTextPromises[pageNum - 1]); + contents.set(pageNum, this._pageContents[pageNum - 1]); + diffs.set(pageNum, this._pageDiffs[pageNum - 1]); + diacritics.set(pageNum, this._hasDiacritics[pageNum - 1]); + } + this.#copiedPageData = { + promises, + contents, + diffs, + diacritics + }; + return; + } + if (type === "cancelCopy") { + this.#copiedPageData = null; + return; + } + if (type === "delete") { + this.#savedPageData = { + promises: this._extractTextPromises, + contents: this._pageContents, + diffs: this._pageDiffs, + diacritics: this._hasDiacritics + }; + } + if (type === "cancelDelete") { + this._extractTextPromises = this.#savedPageData.promises; + this._pageContents = this.#savedPageData.contents; + this._pageDiffs = this.#savedPageData.diffs; + this._hasDiacritics = this.#savedPageData.diacritics; + return; + } + if (type === "cleanSavedData") { + this.#savedPageData = null; + return; + } + if (this._findTimeout) { + clearTimeout(this._findTimeout); + this._findTimeout = null; + } + this._resumePageIdx = null; + this._dirtyMatch = true; + const prevPromises = this._extractTextPromises; + const prevContents = this._pageContents; + const prevDiffs = this._pageDiffs; + const prevDiacritics = this._hasDiacritics; + const extractTextPromises = this._extractTextPromises = []; + const pageContents = this._pageContents = []; + const pageDiffs = this._pageDiffs = []; + const hasDiacritics = this._hasDiacritics = []; + for (let i = 1, ii = pagesMapper.pagesNumber; i <= ii; i++) { + const prevPageNumber = pagesMapper.getPrevPageNumber(i); + if (prevPageNumber < 0) { + const src = -prevPageNumber; + extractTextPromises.push(this.#copiedPageData?.promises.get(src) || Promise.resolve()); + pageContents.push(this.#copiedPageData?.contents.get(src) ?? ""); + pageDiffs.push(this.#copiedPageData?.diffs.get(src) ?? null); + hasDiacritics.push(this.#copiedPageData?.diacritics.get(src) ?? false); + continue; + } + extractTextPromises.push(prevPromises[prevPageNumber - 1] || Promise.resolve()); + pageContents.push(prevContents[prevPageNumber - 1] ?? ""); + pageDiffs.push(prevDiffs[prevPageNumber - 1] ?? null); + hasDiacritics.push(prevDiacritics[prevPageNumber - 1] ?? false); + } + if (this.#state) { + this.#nextMatch(); + } + } + #onFindBarClose(evt) { + const pdfDocument = this._pdfDocument; + this._firstPageCapability.promise.then(() => { + if (!this._pdfDocument || pdfDocument && this._pdfDocument !== pdfDocument) { + return; + } + if (this._findTimeout) { + clearTimeout(this._findTimeout); + this._findTimeout = null; + } + if (this._resumePageIdx) { + this._resumePageIdx = null; + this._dirtyMatch = true; + } + this.#updateUIState(FindState.FOUND); + this._highlightMatches = false; + this.#updateAllPages(); + }); + } + #requestMatchesCount() { + const { + pageIdx, + matchIdx + } = this._selected; + let current = 0, + total = this._matchesCountTotal; + if (matchIdx !== -1) { + for (let i = 0; i < pageIdx; i++) { + current += this._pageMatches[i]?.length || 0; + } + current += matchIdx + 1; + } + if (current < 1 || current > total) { + current = total = 0; + } + return { + current, + total + }; + } + #updateUIResultsCount() { + this._eventBus.dispatch("updatefindmatchescount", { + source: this, + matchesCount: this.#requestMatchesCount() + }); + } + #updateUIState(state, previous = false) { + if (!this.#updateMatchesCountOnProgress && (this.#visitedPagesCount !== this._linkService.pagesCount || state === FindState.PENDING)) { + return; + } + this._eventBus.dispatch("updatefindcontrolstate", { + source: this, + state, + previous, + entireWord: this.#state?.entireWord ?? null, + matchesCount: this.#requestMatchesCount(), + rawQuery: this.#state?.query ?? null + }); + } +} + +;// ./web/pdf_find_bar.js + + + + + +const MATCHES_COUNT_LIMIT = 1000; +class PDFFindBar { + #mainContainer; + #resizeObserver = new ResizeObserver(this.#resizeObserverCallback.bind(this)); + opened = false; + constructor(options, mainContainer, eventBus) { + this.bar = options.bar; + this.toggleButton = options.toggleButton; + this.findField = options.findField; + this.highlightAll = options.highlightAllCheckbox; + this.caseSensitive = options.caseSensitiveCheckbox; + this.matchDiacritics = options.matchDiacriticsCheckbox; + this.entireWord = options.entireWordCheckbox; + this.findMsg = options.findMsg; + this.findResultsCount = options.findResultsCount; + this.findPreviousButton = options.findPreviousButton; + this.findNextButton = options.findNextButton; + this.eventBus = eventBus; + this.#mainContainer = mainContainer; + const checkedInputs = new Map([[this.highlightAll, "highlightallchange"], [this.caseSensitive, "casesensitivitychange"], [this.entireWord, "entirewordchange"], [this.matchDiacritics, "diacriticmatchingchange"]]); + this.toggleButton.addEventListener("click", () => { + this.toggle(); + }); + this.findField.addEventListener("input", () => { + this.dispatchEvent(""); + }); + this.bar.addEventListener("keydown", ({ + keyCode, + shiftKey, + target + }) => { + switch (keyCode) { + case 13: + if (target === this.findField) { + this.dispatchEvent("again", shiftKey); + } else if (checkedInputs.has(target)) { + target.checked = !target.checked; + this.dispatchEvent(checkedInputs.get(target)); + } + break; + case 27: + this.close(); + break; + } + }); + this.findPreviousButton.addEventListener("click", () => { + this.dispatchEvent("again", true); + }); + this.findNextButton.addEventListener("click", () => { + this.dispatchEvent("again", false); + }); + for (const [elem, evtName] of checkedInputs) { + elem.addEventListener("click", () => { + this.dispatchEvent(evtName); + }); + } + } + reset() { + this.updateUIState(); + } + dispatchEvent(type, findPrev = false) { + this.eventBus.dispatch("find", { + source: this, + type, + query: this.findField.value, + caseSensitive: this.caseSensitive.checked, + entireWord: this.entireWord.checked, + highlightAll: this.highlightAll.checked, + findPrevious: findPrev, + matchDiacritics: this.matchDiacritics.checked + }); + } + updateUIState(state, previous, matchesCount) { + const { + findField, + findMsg + } = this; + let findMsgId = "", + status = ""; + switch (state) { + case FindState.FOUND: + break; + case FindState.PENDING: + status = "pending"; + break; + case FindState.NOT_FOUND: + findMsgId = "pdfjs-find-not-found"; + status = "notFound"; + break; + case FindState.WRAPPED: + findMsgId = previous ? "pdfjs-find-reached-top" : "pdfjs-find-reached-bottom"; + break; + } + findField.setAttribute("data-status", status); + findField.setAttribute("aria-invalid", state === FindState.NOT_FOUND); + findMsg.setAttribute("data-status", status); + if (findMsgId) { + findMsg.setAttribute("data-l10n-id", findMsgId); + } else { + findMsg.removeAttribute("data-l10n-id"); + findMsg.textContent = ""; + } + this.updateResultsCount(matchesCount); + } + updateResultsCount({ + current = 0, + total = 0 + } = {}) { + const { + findResultsCount + } = this; + if (total > 0) { + const limit = MATCHES_COUNT_LIMIT; + findResultsCount.setAttribute("data-l10n-id", total > limit ? "pdfjs-find-match-count-limit" : "pdfjs-find-match-count"); + findResultsCount.setAttribute("data-l10n-args", JSON.stringify({ + limit, + current, + total + })); + } else { + findResultsCount.removeAttribute("data-l10n-id"); + findResultsCount.textContent = ""; + } + } + open() { + if (!this.opened) { + this.#resizeObserver.observe(this.#mainContainer); + this.#resizeObserver.observe(this.bar); + this.opened = true; + toggleExpandedBtn(this.toggleButton, true, this.bar); + } + this.findField.select(); + this.findField.focus(); + } + close() { + if (!this.opened) { + return; + } + this.#resizeObserver.disconnect(); + this.opened = false; + toggleExpandedBtn(this.toggleButton, false, this.bar); + this.eventBus.dispatch("findbarclose", { + source: this + }); + } + toggle() { + if (this.opened) { + this.close(); + } else { + this.open(); + } + } + #resizeObserverCallback() { + const { + bar + } = this; + bar.classList.remove("wrapContainers"); + const findbarHeight = bar.clientHeight; + const inputContainerHeight = bar.firstElementChild.clientHeight; + if (findbarHeight > inputContainerHeight) { + bar.classList.add("wrapContainers"); + } + } +} + +;// ./web/pdf_history.js + + + + + +const HASH_CHANGE_TIMEOUT = 1000; +const POSITION_UPDATED_THRESHOLD = 50; +const UPDATE_VIEWAREA_TIMEOUT = 1000; +function getCurrentHash() { + return document.location.hash; +} +class PDFHistory { + #eventAC = null; + constructor({ + linkService, + eventBus + }) { + this.linkService = linkService; + this.eventBus = eventBus; + this._initialized = false; + this._fingerprint = ""; + this.reset(); + this.eventBus.on("pagesinit", () => { + this._isPagesLoaded = false; + this.eventBus.on("pagesloaded", evt => { + this._isPagesLoaded = !!evt.pagesCount; + }, { + once: true, + ...internalOpt + }); + }, internalOpt); + } + initialize({ + fingerprint, + resetHistory = false, + updateUrl = false + }) { + if (!fingerprint || typeof fingerprint !== "string") { + console.error('PDFHistory.initialize: The "fingerprint" must be a non-empty string.'); + return; + } + if (this._initialized) { + this.reset(); + } + const reInitialized = this._fingerprint !== "" && this._fingerprint !== fingerprint; + this._fingerprint = fingerprint; + this._updateUrl = updateUrl === true; + this._initialized = true; + this.#bindEvents(); + const state = window.history.state; + this._popStateInProgress = false; + this._blockHashChange = 0; + this._currentHash = getCurrentHash(); + this._numPositionUpdates = 0; + this._uid = this._maxUid = 0; + this._destination = null; + this._position = null; + if (!this.#isValidState(state, true) || resetHistory) { + const { + hash, + page, + rotation + } = this.#parseCurrentHash(true); + if (!hash || reInitialized || resetHistory) { + this.#pushOrReplaceState(null, true); + return; + } + this.#pushOrReplaceState({ + hash, + page, + rotation + }, true); + return; + } + const destination = state.destination; + this.#updateInternalState(destination, state.uid, true); + if (destination.rotation !== undefined) { + this._initialRotation = destination.rotation; + } + if (destination.dest) { + this._initialBookmark = JSON.stringify(destination.dest); + this._destination.page = null; + } else if (destination.hash) { + this._initialBookmark = destination.hash; + } else if (destination.page) { + this._initialBookmark = `page=${destination.page}`; + } + } + reset() { + if (this._initialized) { + this.#pageHide(); + this._initialized = false; + this.#unbindEvents(); + } + if (this._updateViewareaTimeout) { + clearTimeout(this._updateViewareaTimeout); + this._updateViewareaTimeout = null; + } + this._initialBookmark = null; + this._initialRotation = null; + } + push({ + namedDest = null, + explicitDest, + pageNumber + }) { + if (!this._initialized) { + return; + } + if (namedDest && typeof namedDest !== "string") { + console.error("PDFHistory.push: " + `"${namedDest}" is not a valid namedDest parameter.`); + return; + } else if (!Array.isArray(explicitDest)) { + console.error("PDFHistory.push: " + `"${explicitDest}" is not a valid explicitDest parameter.`); + return; + } else if (!this.#isValidPage(pageNumber)) { + if (pageNumber !== null || this._destination) { + console.error("PDFHistory.push: " + `"${pageNumber}" is not a valid pageNumber parameter.`); + return; + } + } + const hash = namedDest || JSON.stringify(explicitDest); + if (!hash) { + return; + } + let forceReplace = false; + if (this._destination && (isDestHashesEqual(this._destination.hash, hash) || isDestArraysEqual(this._destination.dest, explicitDest))) { + if (this._destination.page) { + return; + } + forceReplace = true; + } + if (this._popStateInProgress && !forceReplace) { + return; + } + this.#pushOrReplaceState({ + dest: explicitDest, + hash, + page: pageNumber, + rotation: this.linkService.rotation + }, forceReplace); + if (!this._popStateInProgress) { + this._popStateInProgress = true; + Promise.resolve().then(() => { + this._popStateInProgress = false; + }); + } + } + pushPage(pageNumber) { + if (!this._initialized) { + return; + } + if (!this.#isValidPage(pageNumber)) { + console.error(`PDFHistory.pushPage: "${pageNumber}" is not a valid page number.`); + return; + } + if (this._destination?.page === pageNumber) { + return; + } + if (this._popStateInProgress) { + return; + } + this.#pushOrReplaceState({ + dest: null, + hash: `page=${pageNumber}`, + page: pageNumber, + rotation: this.linkService.rotation + }); + if (!this._popStateInProgress) { + this._popStateInProgress = true; + Promise.resolve().then(() => { + this._popStateInProgress = false; + }); + } + } + pushCurrentPosition() { + if (!this._initialized || this._popStateInProgress) { + return; + } + this.#tryPushCurrentPosition(); + } + back() { + if (!this._initialized || this._popStateInProgress) { + return; + } + const state = window.history.state; + if (this.#isValidState(state) && state.uid > 0) { + window.history.back(); + } + } + forward() { + if (!this._initialized || this._popStateInProgress) { + return; + } + const state = window.history.state; + if (this.#isValidState(state) && state.uid < this._maxUid) { + window.history.forward(); + } + } + get popStateInProgress() { + return this._initialized && (this._popStateInProgress || this._blockHashChange > 0); + } + get initialBookmark() { + return this._initialized ? this._initialBookmark : null; + } + get initialRotation() { + return this._initialized ? this._initialRotation : null; + } + #pushOrReplaceState(destination, forceReplace = false) { + const shouldReplace = forceReplace || !this._destination; + const newState = { + fingerprint: this._fingerprint, + uid: shouldReplace ? this._uid : this._uid + 1, + destination + }; + this.#updateInternalState(destination, newState.uid); + let newUrl; + if (this._updateUrl && destination?.hash) { + const { + href, + protocol + } = document.location; + if (protocol !== "file:") { + newUrl = updateUrlHash(href, destination.hash); + } + } + if (shouldReplace) { + window.history.replaceState(newState, "", newUrl); + } else { + window.history.pushState(newState, "", newUrl); + } + } + #tryPushCurrentPosition(temporary = false) { + if (!this._position) { + return; + } + let position = this._position; + if (temporary) { + position = Object.assign(Object.create(null), this._position); + position.temporary = true; + } + if (!this._destination) { + this.#pushOrReplaceState(position); + return; + } + if (this._destination.temporary) { + this.#pushOrReplaceState(position, true); + return; + } + if (this._destination.hash === position.hash) { + return; + } + if (!this._destination.page && ( false || this._numPositionUpdates <= POSITION_UPDATED_THRESHOLD)) { + return; + } + let forceReplace = false; + if (this._destination.page >= position.first && this._destination.page <= position.page) { + if (this._destination.dest !== undefined || !this._destination.first) { + return; + } + forceReplace = true; + } + this.#pushOrReplaceState(position, forceReplace); + } + #isValidPage(val) { + return Number.isInteger(val) && val > 0 && val <= this.linkService.pagesCount; + } + #isValidState(state, checkReload = false) { + if (!state) { + return false; + } + if (state.fingerprint !== this._fingerprint) { + if (checkReload) { + if (typeof state.fingerprint !== "string" || state.fingerprint.length !== this._fingerprint.length) { + return false; + } + const [perfEntry] = performance.getEntriesByType("navigation"); + if (perfEntry?.type !== "reload") { + return false; + } + } else { + return false; + } + } + if (!Number.isInteger(state.uid) || state.uid < 0 || state.destination === null || typeof state.destination !== "object") { + return false; + } + return true; + } + #updateInternalState(destination, uid, removeTemporary = false) { + if (this._updateViewareaTimeout) { + clearTimeout(this._updateViewareaTimeout); + this._updateViewareaTimeout = null; + } + if (removeTemporary && destination?.temporary) { + delete destination.temporary; + } + this._destination = destination; + this._uid = uid; + this._maxUid = Math.max(this._maxUid, uid); + this._numPositionUpdates = 0; + } + #parseCurrentHash(checkNameddest = false) { + const hash = unescape(getCurrentHash()).substring(1); + const params = parseQueryString(hash); + const nameddest = params.get("nameddest") || ""; + let page = params.get("page") | 0; + if (!this.#isValidPage(page) || checkNameddest && nameddest.length > 0) { + page = null; + } + return { + hash, + page, + rotation: this.linkService.rotation + }; + } + #updateViewarea({ + location + }) { + if (this._updateViewareaTimeout) { + clearTimeout(this._updateViewareaTimeout); + this._updateViewareaTimeout = null; + } + this._position = { + hash: location.pdfOpenParams.substring(1), + page: this.linkService.page, + first: location.pageNumber, + rotation: location.rotation + }; + if (this._popStateInProgress) { + return; + } + if ( true && this._isPagesLoaded && this._destination && !this._destination.page) { + this._numPositionUpdates++; + } + if (true) { + this._updateViewareaTimeout = setTimeout(() => { + if (!this._popStateInProgress) { + this.#tryPushCurrentPosition(true); + } + this._updateViewareaTimeout = null; + }, UPDATE_VIEWAREA_TIMEOUT); + } + } + #popState({ + state + }) { + const newHash = getCurrentHash(), + hashChanged = this._currentHash !== newHash; + this._currentHash = newHash; + if (!state) { + this._uid++; + const { + hash, + page, + rotation + } = this.#parseCurrentHash(); + this.#pushOrReplaceState({ + hash, + page, + rotation + }, true); + return; + } + if (!this.#isValidState(state)) { + return; + } + this._popStateInProgress = true; + if (hashChanged) { + this._blockHashChange++; + waitOnEventOrTimeout({ + target: window, + name: "hashchange", + delay: HASH_CHANGE_TIMEOUT + }).then(() => { + this._blockHashChange--; + }); + } + const destination = state.destination; + this.#updateInternalState(destination, state.uid, true); + if (isValidRotation(destination.rotation)) { + this.linkService.rotation = destination.rotation; + } + if (destination.dest) { + this.linkService.goToDestination(destination.dest); + } else if (destination.hash) { + this.linkService.setHash(destination.hash); + } else if (destination.page) { + this.linkService.page = destination.page; + } + Promise.resolve().then(() => { + this._popStateInProgress = false; + }); + } + #pageHide() { + if (!this._destination || this._destination.temporary) { + this.#tryPushCurrentPosition(); + } + } + #bindEvents() { + if (this.#eventAC) { + return; + } + this.#eventAC = new AbortController(); + const { + signal + } = this.#eventAC; + this.eventBus.on("updateviewarea", this.#updateViewarea.bind(this), { + signal, + ...internalOpt + }); + window.addEventListener("popstate", this.#popState.bind(this), { + signal + }); + window.addEventListener("pagehide", this.#pageHide.bind(this), { + signal + }); + } + #unbindEvents() { + this.#eventAC?.abort(); + this.#eventAC = null; + } +} +function isDestHashesEqual(destHash, pushHash) { + if (typeof destHash !== "string" || typeof pushHash !== "string") { + return false; + } + if (destHash === pushHash) { + return true; + } + const nameddest = parseQueryString(destHash).get("nameddest"); + if (nameddest === pushHash) { + return true; + } + return false; +} +function isDestArraysEqual(firstDest, secondDest) { + function isEntryEqual(first, second) { + if (typeof first !== typeof second || Array.isArray(first) || Array.isArray(second)) { + return false; + } + if (first !== null && typeof first === "object" && second !== null) { + if (Object.keys(first).length !== Object.keys(second).length) { + return false; + } + for (const key in first) { + if (!isEntryEqual(first[key], second[key])) { + return false; + } + } + return true; + } + return first === second || Number.isNaN(first) && Number.isNaN(second); + } + if (!(Array.isArray(firstDest) && Array.isArray(secondDest))) { + return false; + } + if (firstDest.length !== secondDest.length) { + return false; + } + for (let i = 0, ii = firstDest.length; i < ii; i++) { + if (!isEntryEqual(firstDest[i], secondDest[i])) { + return false; + } + } + return true; +} + +;// ./web/pdf_layer_viewer.js + + + + + +class PDFLayerViewer extends BaseTreeViewer { + constructor(options) { + super(options); + const { + eventBus + } = this; + eventBus.on("optionalcontentconfigchanged", evt => { + this.#updateLayers(evt.promise); + }, internalOpt); + eventBus.on("resetlayers", () => { + this.#updateLayers(); + }, internalOpt); + eventBus.on("togglelayerstree", this._toggleAllTreeItems.bind(this), internalOpt); + } + reset() { + super.reset(); + this._optionalContentConfig = null; + this._optionalContentVisibility?.clear(); + this._optionalContentVisibility = null; + } + _dispatchEvent(layersCount) { + this.eventBus.dispatch("layersloaded", { + source: this, + layersCount + }); + } + _bindLink(element, { + groupId, + input + }) { + const setVisibility = () => { + const visible = input.checked; + this._optionalContentConfig.setVisibility(groupId, visible); + const cached = this._optionalContentVisibility.get(groupId); + if (cached) { + cached.visible = visible; + } + this.eventBus.dispatch("optionalcontentconfig", { + source: this, + promise: Promise.resolve(this._optionalContentConfig) + }); + }; + element.onclick = evt => { + if (evt.target === input) { + setVisibility(); + return true; + } else if (evt.target !== element) { + return true; + } + input.checked = !input.checked; + setVisibility(); + return false; + }; + } + _setNestedName(element, { + name = null + }) { + if (typeof name === "string") { + element.textContent = this._normalizeTextContent(name); + return; + } + element.setAttribute("data-l10n-id", "pdfjs-additional-layers"); + element.style.fontStyle = "italic"; + this._l10n.translateOnce(element); + } + _addToggleButton(div, { + name = null + }) { + super._addToggleButton(div, name === null); + } + _toggleAllTreeItems() { + if (!this._optionalContentConfig) { + return; + } + super._toggleAllTreeItems(); + } + render({ + optionalContentConfig, + pdfDocument + }) { + if (this._optionalContentConfig) { + this.reset(); + } + this._optionalContentConfig = optionalContentConfig || null; + this._pdfDocument = pdfDocument || null; + const groups = optionalContentConfig?.getOrder(); + if (!groups) { + this._dispatchEvent(0); + return; + } + this._optionalContentVisibility = new Map(); + const fragment = document.createDocumentFragment(), + queue = [{ + parent: fragment, + groups + }]; + let layersCount = 0, + hasAnyNesting = false; + while (queue.length > 0) { + const levelData = queue.shift(); + for (const groupId of levelData.groups) { + const div = document.createElement("div"); + div.className = "treeItem"; + const element = document.createElement("a"); + div.append(element); + if (typeof groupId === "object") { + hasAnyNesting = true; + this._addToggleButton(div, groupId); + this._setNestedName(element, groupId); + const itemsDiv = document.createElement("div"); + itemsDiv.className = "treeItems"; + div.append(itemsDiv); + queue.push({ + parent: itemsDiv, + groups: groupId.order + }); + } else { + const group = optionalContentConfig.getGroup(groupId); + const label = document.createElement("label"); + const input = document.createElement("input"); + label.append(input, document.createTextNode(this._normalizeTextContent(group.name))); + this._bindLink(element, { + groupId, + input + }); + input.type = "checkbox"; + input.checked = group.visible; + this._optionalContentVisibility.set(groupId, { + input, + visible: input.checked + }); + element.append(label); + layersCount++; + } + levelData.parent.append(div); + } + } + this._finishRendering(fragment, layersCount, hasAnyNesting); + } + async #updateLayers(promise = null) { + if (!this._optionalContentConfig) { + return; + } + const pdfDocument = this._pdfDocument; + const optionalContentConfig = await (promise || pdfDocument.getOptionalContentConfig({ + intent: "display" + })); + if (pdfDocument !== this._pdfDocument) { + return; + } + if (promise) { + for (const [groupId, cached] of this._optionalContentVisibility) { + const group = optionalContentConfig.getGroup(groupId); + if (group && cached.visible !== group.visible) { + cached.input.checked = cached.visible = !cached.visible; + } + } + return; + } + this.eventBus.dispatch("optionalcontentconfig", { + source: this, + promise: Promise.resolve(optionalContentConfig) + }); + this.render({ + optionalContentConfig, + pdfDocument: this._pdfDocument + }); + } +} + +;// ./web/pdf_outline_viewer.js + + + + + + +class PDFOutlineViewer extends BaseTreeViewer { + constructor(options) { + super(options); + this.linkService = options.linkService; + this.downloadManager = options.downloadManager; + const { + eventBus + } = this; + eventBus.on("toggleoutlinetree", this._toggleAllTreeItems.bind(this), internalOpt); + eventBus.on("currentoutlineitem", this._currentOutlineItem.bind(this), internalOpt); + eventBus.on("pagechanging", evt => { + this._currentPageNumber = evt.pageNumber; + }, internalOpt); + eventBus.on("pagesloaded", evt => { + this._isPagesLoaded = !!evt.pagesCount; + this._currentOutlineItemCapability?.resolve(this._isPagesLoaded); + }, internalOpt); + eventBus.on("sidebarviewchanged", evt => { + this._sidebarView = evt.view; + }, internalOpt); + } + reset() { + super.reset(); + this._outline = null; + this._pageNumberToDestHashCapability = null; + this._currentPageNumber = 1; + this._isPagesLoaded = null; + this._currentOutlineItemCapability?.resolve(false); + this._currentOutlineItemCapability = null; + } + _dispatchEvent(outlineCount) { + this._currentOutlineItemCapability = Promise.withResolvers(); + if (outlineCount === 0 || this._pdfDocument?.loadingParams.disableAutoFetch) { + this._currentOutlineItemCapability.resolve(false); + } else if (this._isPagesLoaded !== null) { + this._currentOutlineItemCapability.resolve(this._isPagesLoaded); + } + this.eventBus.dispatch("outlineloaded", { + source: this, + outlineCount, + currentOutlineItemPromise: this._currentOutlineItemCapability.promise + }); + } + _bindLink(element, { + url, + newWindow, + action, + attachmentId, + attachment, + dest, + setOCGState + }) { + const { + linkService + } = this; + if (url) { + linkService.addLinkAttributes(element, url, newWindow); + return; + } + if (action) { + element.href = linkService.getAnchorUrl(""); + element.onclick = () => { + linkService.executeNamedAction(action); + return false; + }; + return; + } + if (attachmentId && attachment) { + element.href = linkService.getAnchorUrl(""); + const openAttachment = async () => { + const content = await linkService.getAttachmentContent(attachmentId); + if (content) { + this.downloadManager?.openOrDownloadData(content, attachment.filename); + } + }; + element.onclick = () => { + openAttachment(); + return false; + }; + return; + } + if (setOCGState) { + element.href = linkService.getAnchorUrl(""); + element.onclick = () => { + linkService.executeSetOCGState(setOCGState); + return false; + }; + return; + } + element.href = linkService.getDestinationHash(dest); + element.onclick = evt => { + this._updateCurrentTreeItem(evt.target.parentNode); + if (dest) { + linkService.goToDestination(dest); + } + return false; + }; + } + _setStyles(element, { + bold, + italic + }) { + if (bold) { + element.style.fontWeight = "bold"; + } + if (italic) { + element.style.fontStyle = "italic"; + } + } + _addToggleButton(div, { + count, + items + }) { + let hidden = false; + if (count < 0) { + let totalCount = items.length; + if (totalCount > 0) { + const queue = [...items]; + while (queue.length > 0) { + const { + count: nestedCount, + items: nestedItems + } = queue.shift(); + if (nestedCount > 0 && nestedItems.length > 0) { + totalCount += nestedItems.length; + queue.push(...nestedItems); + } + } + } + if (Math.abs(count) === totalCount) { + hidden = true; + } + } + super._addToggleButton(div, hidden); + } + _toggleAllTreeItems() { + if (!this._outline) { + return; + } + super._toggleAllTreeItems(); + } + render({ + outline, + pdfDocument + }) { + if (this._outline) { + this.reset(); + } + this._outline = outline || null; + this._pdfDocument = pdfDocument || null; + if (!outline) { + this._dispatchEvent(0); + return; + } + const fragment = document.createDocumentFragment(); + const queue = [{ + parent: fragment, + items: outline + }]; + let outlineCount = 0, + hasAnyNesting = false; + while (queue.length > 0) { + const levelData = queue.shift(); + for (const item of levelData.items) { + const div = document.createElement("div"); + div.className = "treeItem"; + const element = document.createElement("a"); + this._bindLink(element, item); + this._setStyles(element, item); + element.textContent = this._normalizeTextContent(item.title); + div.append(element); + if (item.items.length > 0) { + hasAnyNesting = true; + this._addToggleButton(div, item); + const itemsDiv = document.createElement("div"); + itemsDiv.className = "treeItems"; + div.append(itemsDiv); + queue.push({ + parent: itemsDiv, + items: item.items + }); + } + levelData.parent.append(div); + outlineCount++; + } + } + this._finishRendering(fragment, outlineCount, hasAnyNesting); + } + async _currentOutlineItem() { + if (!this._isPagesLoaded) { + throw new Error("_currentOutlineItem: All pages have not been loaded."); + } + if (!this._outline || !this._pdfDocument) { + return; + } + const pageNumberToDestHash = await this._getPageNumberToDestHash(this._pdfDocument); + if (!pageNumberToDestHash) { + return; + } + this._updateCurrentTreeItem(null); + if (this._sidebarView !== SidebarView.OUTLINE) { + return; + } + for (let i = this._currentPageNumber; i > 0; i--) { + const destHash = pageNumberToDestHash.get(i); + if (!destHash) { + continue; + } + const linkElement = this.container.querySelector(`a[href="${destHash}"]`); + if (!linkElement) { + continue; + } + this._scrollToCurrentTreeItem(linkElement.parentNode); + break; + } + } + async _getPageNumberToDestHash(pdfDocument) { + if (this._pageNumberToDestHashCapability) { + return this._pageNumberToDestHashCapability.promise; + } + this._pageNumberToDestHashCapability = Promise.withResolvers(); + const pageNumberToDestHash = new Map(), + pageNumberNesting = new Map(); + const queue = [{ + nesting: 0, + items: this._outline + }]; + while (queue.length > 0) { + const levelData = queue.shift(), + currentNesting = levelData.nesting; + for (const { + dest, + items + } of levelData.items) { + let explicitDest, pageNumber; + if (typeof dest === "string") { + explicitDest = await pdfDocument.getDestination(dest); + if (pdfDocument !== this._pdfDocument) { + return null; + } + } else { + explicitDest = dest; + } + if (Array.isArray(explicitDest)) { + const [destRef] = explicitDest; + if (destRef && typeof destRef === "object") { + pageNumber = pdfDocument.cachedPageNumber(destRef); + } else if (Number.isInteger(destRef)) { + pageNumber = destRef + 1; + } + if (Number.isInteger(pageNumber) && (!pageNumberToDestHash.has(pageNumber) || currentNesting > pageNumberNesting.get(pageNumber))) { + const destHash = this.linkService.getDestinationHash(dest); + pageNumberToDestHash.set(pageNumber, destHash); + pageNumberNesting.set(pageNumber, currentNesting); + } + } + if (items.length > 0) { + queue.push({ + nesting: currentNesting + 1, + items + }); + } + } + } + this._pageNumberToDestHashCapability.resolve(pageNumberToDestHash.size > 0 ? pageNumberToDestHash : null); + return this._pageNumberToDestHashCapability.promise; + } +} + +;// ./web/pdf_presentation_mode.js + + +const DELAY_BEFORE_HIDING_CONTROLS = 3000; +const ACTIVE_SELECTOR = "pdfPresentationMode"; +const CONTROLS_SELECTOR = "pdfPresentationModeControls"; +const MOUSE_SCROLL_COOLDOWN_TIME = 50; +const PAGE_SWITCH_THRESHOLD = 0.1; +const SWIPE_MIN_DISTANCE_THRESHOLD = 50; +const SWIPE_ANGLE_THRESHOLD = Math.PI / 6; +class PDFPresentationMode { + #state = PresentationModeState.UNKNOWN; + #args = null; + #fullscreenChangeAC = null; + #windowAC = null; + constructor({ + container, + pdfViewer, + eventBus + }) { + this.container = container; + this.pdfViewer = pdfViewer; + this.eventBus = eventBus; + this.contextMenuOpen = false; + this.mouseScrollTimeStamp = 0; + this.mouseScrollDelta = 0; + this.touchSwipeState = null; + } + async request() { + const { + container, + pdfViewer + } = this; + if (this.active || !pdfViewer.pagesCount || !container.requestFullscreen) { + return false; + } + this.#addFullscreenChangeListeners(); + this.#notifyStateChange(PresentationModeState.CHANGING); + const promise = container.requestFullscreen(); + this.#args = { + pageNumber: pdfViewer.currentPageNumber, + scaleValue: pdfViewer.currentScaleValue, + scrollMode: pdfViewer.scrollMode, + spreadMode: null, + annotationEditorMode: null + }; + if (pdfViewer.spreadMode !== SpreadMode.NONE && !(pdfViewer.pageViewsReady && pdfViewer.hasEqualPageSizes)) { + console.warn("Ignoring Spread modes when entering PresentationMode, " + "since the document may contain varying page sizes."); + this.#args.spreadMode = pdfViewer.spreadMode; + } + if (pdfViewer.annotationEditorMode !== AnnotationEditorType.DISABLE) { + this.#args.annotationEditorMode = pdfViewer.annotationEditorMode; + } + try { + await promise; + pdfViewer.focus(); + return true; + } catch { + this.#removeFullscreenChangeListeners(); + this.#notifyStateChange(PresentationModeState.NORMAL); + } + return false; + } + get active() { + return this.#state === PresentationModeState.CHANGING || this.#state === PresentationModeState.FULLSCREEN; + } + #mouseWheel(evt) { + if (!this.active || evt.target.closest?.(".mediaAnnotation")) { + return; + } + evt.preventDefault(); + const delta = normalizeWheelEventDelta(evt); + const currentTime = Date.now(); + const storedTime = this.mouseScrollTimeStamp; + if (currentTime > storedTime && currentTime - storedTime < MOUSE_SCROLL_COOLDOWN_TIME) { + return; + } + if (this.mouseScrollDelta > 0 && delta < 0 || this.mouseScrollDelta < 0 && delta > 0) { + this.#resetMouseScrollState(); + } + this.mouseScrollDelta += delta; + if (Math.abs(this.mouseScrollDelta) >= PAGE_SWITCH_THRESHOLD) { + const totalDelta = this.mouseScrollDelta; + this.#resetMouseScrollState(); + const success = totalDelta > 0 ? this.pdfViewer.previousPage() : this.pdfViewer.nextPage(); + if (success) { + this.mouseScrollTimeStamp = currentTime; + } + } + } + #notifyStateChange(state) { + this.#state = state; + this.eventBus.dispatch("presentationmodechanged", { + source: this, + state + }); + } + #enter() { + this.#notifyStateChange(PresentationModeState.FULLSCREEN); + this.container.classList.add(ACTIVE_SELECTOR); + setTimeout(() => { + this.pdfViewer.scrollMode = ScrollMode.PAGE; + if (this.#args.spreadMode !== null) { + this.pdfViewer.spreadMode = SpreadMode.NONE; + } + this.pdfViewer.currentPageNumber = this.#args.pageNumber; + this.pdfViewer.currentScaleValue = "page-fit"; + if (this.#args.annotationEditorMode !== null) { + this.pdfViewer.annotationEditorMode = { + mode: AnnotationEditorType.NONE + }; + } + }, 0); + this.#addWindowListeners(); + this.#showControls(); + this.contextMenuOpen = false; + document.getSelection().empty(); + } + #exit() { + const pageNumber = this.pdfViewer.currentPageNumber; + this.container.classList.remove(ACTIVE_SELECTOR); + setTimeout(() => { + this.#removeFullscreenChangeListeners(); + this.#notifyStateChange(PresentationModeState.NORMAL); + this.pdfViewer.scrollMode = this.#args.scrollMode; + if (this.#args.spreadMode !== null) { + this.pdfViewer.spreadMode = this.#args.spreadMode; + } + this.pdfViewer.currentScaleValue = this.#args.scaleValue; + this.pdfViewer.currentPageNumber = pageNumber; + if (this.#args.annotationEditorMode !== null) { + this.pdfViewer.annotationEditorMode = { + mode: this.#args.annotationEditorMode + }; + } + this.#args = null; + }, 0); + this.#removeWindowListeners(); + this.#hideControls(); + this.#resetMouseScrollState(); + this.contextMenuOpen = false; + } + #mouseDown(evt) { + if (this.contextMenuOpen) { + this.contextMenuOpen = false; + evt.preventDefault(); + return; + } + if (evt.button !== 0) { + return; + } + if (evt.target.href && evt.target.parentNode?.hasAttribute("data-internal-link")) { + return; + } + if (evt.target.closest?.(".mediaAnnotation")) { + return; + } + evt.preventDefault(); + if (evt.shiftKey) { + this.pdfViewer.previousPage(); + } else { + this.pdfViewer.nextPage(); + } + } + #contextMenu() { + this.contextMenuOpen = true; + } + #showControls() { + if (this.controlsTimeout) { + clearTimeout(this.controlsTimeout); + } else { + this.container.classList.add(CONTROLS_SELECTOR); + } + this.controlsTimeout = setTimeout(() => { + this.container.classList.remove(CONTROLS_SELECTOR); + delete this.controlsTimeout; + }, DELAY_BEFORE_HIDING_CONTROLS); + } + #hideControls() { + if (!this.controlsTimeout) { + return; + } + clearTimeout(this.controlsTimeout); + this.container.classList.remove(CONTROLS_SELECTOR); + delete this.controlsTimeout; + } + #resetMouseScrollState() { + this.mouseScrollTimeStamp = 0; + this.mouseScrollDelta = 0; + } + #touchSwipe(evt) { + if (!this.active) { + return; + } + if (evt.target.closest?.(".mediaAnnotation")) { + this.touchSwipeState = null; + return; + } + if (evt.touches.length > 1) { + this.touchSwipeState = null; + return; + } + switch (evt.type) { + case "touchstart": + this.touchSwipeState = { + startX: evt.touches[0].pageX, + startY: evt.touches[0].pageY, + endX: evt.touches[0].pageX, + endY: evt.touches[0].pageY + }; + break; + case "touchmove": + if (this.touchSwipeState === null) { + return; + } + this.touchSwipeState.endX = evt.touches[0].pageX; + this.touchSwipeState.endY = evt.touches[0].pageY; + evt.preventDefault(); + break; + case "touchend": + if (this.touchSwipeState === null) { + return; + } + let delta = 0; + const dx = this.touchSwipeState.endX - this.touchSwipeState.startX; + const dy = this.touchSwipeState.endY - this.touchSwipeState.startY; + const absAngle = Math.abs(Math.atan2(dy, dx)); + if (Math.abs(dx) > SWIPE_MIN_DISTANCE_THRESHOLD && (absAngle <= SWIPE_ANGLE_THRESHOLD || absAngle >= Math.PI - SWIPE_ANGLE_THRESHOLD)) { + delta = dx; + } else if (Math.abs(dy) > SWIPE_MIN_DISTANCE_THRESHOLD && Math.abs(absAngle - Math.PI / 2) <= SWIPE_ANGLE_THRESHOLD) { + delta = dy; + } + if (delta > 0) { + this.pdfViewer.previousPage(); + } else if (delta < 0) { + this.pdfViewer.nextPage(); + } + break; + } + } + #addWindowListeners() { + if (this.#windowAC) { + return; + } + this.#windowAC = new AbortController(); + const { + signal + } = this.#windowAC; + const touchSwipeBind = this.#touchSwipe.bind(this); + window.addEventListener("mousemove", this.#showControls.bind(this), { + signal + }); + window.addEventListener("mousedown", this.#mouseDown.bind(this), { + signal + }); + window.addEventListener("wheel", this.#mouseWheel.bind(this), { + passive: false, + signal + }); + window.addEventListener("keydown", this.#resetMouseScrollState.bind(this), { + signal + }); + window.addEventListener("contextmenu", this.#contextMenu.bind(this), { + signal + }); + window.addEventListener("touchstart", touchSwipeBind, { + signal + }); + window.addEventListener("touchmove", touchSwipeBind, { + signal + }); + window.addEventListener("touchend", touchSwipeBind, { + signal + }); + } + #removeWindowListeners() { + this.#windowAC?.abort(); + this.#windowAC = null; + } + #addFullscreenChangeListeners() { + if (this.#fullscreenChangeAC) { + return; + } + this.#fullscreenChangeAC = new AbortController(); + window.addEventListener("fullscreenchange", () => { + if (document.fullscreenElement) { + this.#enter(); + } else { + this.#exit(); + } + }, { + signal: this.#fullscreenChangeAC.signal + }); + } + #removeFullscreenChangeListeners() { + this.#fullscreenChangeAC?.abort(); + this.#fullscreenChangeAC = null; + } +} + +;// ./node_modules/core-js/modules/es.iterator.every.js +es_iterator_every_namespaceFn(); + +;// ./web/xfa_layer_builder.js + +class XfaLayerBuilder { + #cancelled = false; + div = null; + constructor({ + pdfPage, + annotationStorage = null, + linkService, + xfaHtml = null + }) { + this.pdfPage = pdfPage; + this.annotationStorage = annotationStorage; + this.linkService = linkService; + this.xfaHtml = xfaHtml; + } + async render({ + viewport, + intent = "display" + }) { + let xfaHtml; + if (intent === "print") { + xfaHtml = this.xfaHtml; + } else { + xfaHtml = await this.pdfPage.getXfa(); + if (this.#cancelled || !xfaHtml) { + return { + textDivs: [] + }; + } + } + const hasDiv = !!this.div; + const params = { + viewport: viewport.clone({ + dontFlip: true + }), + div: this.div ??= document.createElement("div"), + xfaHtml, + annotationStorage: this.annotationStorage, + linkService: this.linkService, + intent + }; + return hasDiv ? XfaLayer.update(params) : XfaLayer.render(params); + } + cancel() { + this.#cancelled = true; + } + hide() { + if (!this.div) { + return; + } + this.div.hidden = true; + } +} + +;// ./web/print_utils.js + + + +class BasePrintServiceFactory { + static initGlobals(app) {} + static get supportsPrinting() { + throw new Error("Not implemented: supportsPrinting"); + } + static createPrintService(params) { + throw new Error("Not implemented: createPrintService"); + } +} +function getXfaHtmlForPrinting(printContainer, pdfDocument) { + const xfaHtml = pdfDocument.allXfaHtml; + const linkService = new SimpleLinkService(); + const scale = Math.round(PixelsPerInch.PDF_TO_CSS_UNITS * 100) / 100; + for (const xfaPage of xfaHtml.children) { + const page = document.createElement("div"); + page.className = "xfaPrintedPage"; + printContainer.append(page); + const builder = new XfaLayerBuilder({ + pdfPage: null, + annotationStorage: pdfDocument.annotationStorage, + linkService, + xfaHtml: xfaPage + }); + const viewport = XfaLayer.getPageViewport(xfaPage, { + scale + }); + builder.render({ + viewport, + intent: "print" + }); + page.append(builder.div); + } +} + +;// ./web/pdf_print_service.js + + + + + + + +let activeService = null; +let dialog = null; +let overlayManager = null; +let viewerApp = { + initialized: false +}; +function renderPage(activeServiceOnEntry, pdfDocument, pageNumber, size, printResolution, optionalContentConfigPromise, printAnnotationStoragePromise) { + const scratchCanvas = activeService.scratchCanvas; + const PRINT_UNITS = printResolution / PixelsPerInch.PDF; + scratchCanvas.width = Math.floor(size.width * PRINT_UNITS); + scratchCanvas.height = Math.floor(size.height * PRINT_UNITS); + const ctx = scratchCanvas.getContext("2d"); + ctx.save(); + ctx.fillStyle = "rgb(255, 255, 255)"; + ctx.fillRect(0, 0, scratchCanvas.width, scratchCanvas.height); + ctx.restore(); + return Promise.all([pdfDocument.getPage(pageNumber), printAnnotationStoragePromise]).then(function ([pdfPage, printAnnotationStorage]) { + const renderContext = { + canvas: scratchCanvas, + transform: [PRINT_UNITS, 0, 0, PRINT_UNITS, 0, 0], + viewport: pdfPage.getViewport({ + scale: 1, + rotation: size.rotation + }), + intent: "print", + annotationMode: AnnotationMode.ENABLE_STORAGE, + optionalContentConfigPromise, + printAnnotationStorage + }; + const renderTask = pdfPage.render(renderContext); + return renderTask.promise.catch(reason => { + if (!(reason instanceof RenderingCancelledException)) { + console.error(reason); + } + throw reason; + }); + }); +} +class PDFPrintService { + constructor({ + pdfDocument, + pagesOverview, + printContainer, + printResolution, + printAnnotationStoragePromise = null + }) { + this.pdfDocument = pdfDocument; + this.pagesOverview = pagesOverview; + this.printContainer = printContainer; + this._printResolution = printResolution || 150; + this._optionalContentConfigPromise = pdfDocument.getOptionalContentConfig({ + intent: "print" + }); + this._printAnnotationStoragePromise = printAnnotationStoragePromise || Promise.resolve(); + this.currentPage = -1; + this.scratchCanvas = document.createElement("canvas"); + } + layout() { + this.throwIfInactive(); + const body = document.querySelector("body"); + body.setAttribute("data-pdfjsprinting", true); + const { + width, + height + } = this.pagesOverview[0]; + const hasEqualPageSizes = this.pagesOverview.every(size => size.width === width && size.height === height); + if (!hasEqualPageSizes) { + console.warn("Not all pages have the same size. The printed result may be incorrect!"); + } + this.pageStyleSheet = new CSSStyleSheet(); + this.pageStyleSheet.replaceSync(`@page { size: ${width}pt ${height}pt;}`); + document.adoptedStyleSheets.push(this.pageStyleSheet); + } + destroy() { + if (activeService !== this) { + return; + } + this.printContainer.textContent = ""; + const body = document.querySelector("body"); + body.removeAttribute("data-pdfjsprinting"); + if (this.pageStyleSheet) { + document.adoptedStyleSheets = document.adoptedStyleSheets.filter(styleSheet => styleSheet !== this.pageStyleSheet); + this.pageStyleSheet = null; + } + if (this._blobURLs) { + for (const url of this._blobURLs) { + URL.revokeObjectURL(url); + } + this._blobURLs = null; + } + this.scratchCanvas.width = this.scratchCanvas.height = 0; + this.scratchCanvas = null; + activeService = null; + ensureOverlay().then(function () { + overlayManager.closeIfActive(dialog); + }); + } + renderPages() { + if (this.pdfDocument.isPureXfa) { + getXfaHtmlForPrinting(this.printContainer, this.pdfDocument); + return Promise.resolve(); + } + const pageCount = this.pagesOverview.length; + const renderNextPage = (resolve, reject) => { + this.throwIfInactive(); + if (++this.currentPage >= pageCount) { + renderProgress(pageCount, pageCount); + resolve(); + return; + } + const index = this.currentPage; + renderProgress(index, pageCount); + renderPage(this, this.pdfDocument, index + 1, this.pagesOverview[index], this._printResolution, this._optionalContentConfigPromise, this._printAnnotationStoragePromise).then(this.useRenderedPage.bind(this)).then(function () { + renderNextPage(resolve, reject); + }, reject); + }; + return new Promise(renderNextPage); + } + useRenderedPage() { + this.throwIfInactive(); + const img = document.createElement("img"); + this.scratchCanvas.toBlob(blob => { + const blobURL = URL.createObjectURL(blob); + img.src = blobURL; + (this._blobURLs ??= []).push(blobURL); + }); + const wrapper = document.createElement("div"); + wrapper.className = "printedPage"; + wrapper.append(img); + this.printContainer.append(wrapper); + const { + promise, + resolve, + reject + } = Promise.withResolvers(); + img.onload = resolve; + img.onerror = reject; + promise.catch(() => {}); + return promise; + } + performPrint() { + this.throwIfInactive(); + return new Promise(resolve => { + setTimeout(() => { + if (!this.active) { + resolve(); + return; + } + print.call(window); + setTimeout(resolve, 20); + }, 0); + }); + } + get active() { + return this === activeService; + } + throwIfInactive() { + if (!this.active) { + throw new Error("This print request was cancelled or completed."); + } + } +} +const print = window.print; +window.print = function () { + if (activeService) { + console.warn("Ignored window.print() because of a pending print job."); + return; + } + ensureOverlay().then(function () { + if (activeService) { + overlayManager.open(dialog); + } + }); + try { + dispatchEvent("beforeprint"); + } finally { + if (!activeService) { + console.error("Expected print service to be initialized."); + ensureOverlay().then(function () { + overlayManager.closeIfActive(dialog); + }); + } else { + const activeServiceOnEntry = activeService; + activeService.renderPages().then(() => activeServiceOnEntry.performPrint()).catch(() => {}).then(() => { + if (activeServiceOnEntry.active) { + abort(); + } + }); + } + } +}; +function dispatchEvent(eventType) { + const event = new CustomEvent(eventType, { + bubbles: false, + cancelable: false, + detail: "custom" + }); + window.dispatchEvent(event); +} +function abort() { + if (activeService) { + activeService.destroy(); + dispatchEvent("afterprint"); + } +} +function renderProgress(index, total) { + dialog ||= document.getElementById("printServiceDialog"); + const progress = Math.round(100 * index / total); + const progressBar = dialog.querySelector("progress"); + const progressPerc = dialog.querySelector(".relative-progress"); + progressBar.value = progress; + progressPerc.setAttribute("data-l10n-args", JSON.stringify({ + progress + })); +} +window.addEventListener("keydown", function (event) { + if (event.keyCode === 80 && (event.ctrlKey || event.metaKey) && !event.altKey && (!event.shiftKey || window.chrome || window.opera)) { + window.print(); + event.preventDefault(); + event.stopImmediatePropagation(); + } +}, true); +if ("onbeforeprint" in window) { + const stopPropagationIfNeeded = function (event) { + if (event.detail !== "custom") { + event.stopImmediatePropagation(); + } + }; + window.addEventListener("beforeprint", stopPropagationIfNeeded); + window.addEventListener("afterprint", stopPropagationIfNeeded); +} +let overlayPromise; +function ensureOverlay() { + if (!overlayPromise) { + overlayManager = viewerApp.overlayManager; + if (!overlayManager) { + throw new Error("The overlay manager has not yet been initialized."); + } + dialog ||= document.getElementById("printServiceDialog"); + overlayPromise = overlayManager.register(dialog, true); + document.getElementById("printCancel").onclick = abort; + dialog.addEventListener("close", abort); + } + return overlayPromise; +} +class PDFPrintServiceFactory extends BasePrintServiceFactory { + static initGlobals(app) { + viewerApp = app; + } + static get supportsPrinting() { + return pdfjs_shadow(this, "supportsPrinting", true); + } + static createPrintService(params) { + if (activeService) { + throw new Error("The print service is created and active."); + } + return activeService = new PDFPrintService(params); + } +} + +;// ./web/renderable_view.js +const RenderingStates = { + INITIAL: 0, + RUNNING: 1, + PAUSED: 2, + FINISHED: 3 +}; +class RenderableView { + renderingId = ""; + renderTask = null; + resume = null; + get renderingState() { + throw new Error("Abstract getter `renderingState` accessed"); + } + set renderingState(state) { + throw new Error("Abstract setter `renderingState` accessed"); + } + async draw() { + throw new Error("Not implemented: draw"); + } +} + +;// ./web/pdf_rendering_queue.js + + +const CLEANUP_TIMEOUT = 30000; +class PDFRenderingQueue { + #highestPriorityPage = null; + #idleTimeout = null; + #pdfThumbnailViewer = null; + #pdfViewer = null; + isThumbnailViewEnabled = false; + onIdle = null; + printing = false; + constructor() { + Object.defineProperty(this, "hasViewer", { + value: () => !!this.#pdfViewer + }); + } + setViewer(pdfViewer) { + this.#pdfViewer = pdfViewer; + } + setThumbnailViewer(pdfThumbnailViewer) { + this.#pdfThumbnailViewer = pdfThumbnailViewer; + } + isHighestPriority(view) { + return this.#highestPriorityPage === view.renderingId; + } + renderHighestPriority(currentlyVisiblePages) { + if (this.#idleTimeout) { + clearTimeout(this.#idleTimeout); + this.#idleTimeout = null; + } + if (this.#pdfViewer.forceRendering(currentlyVisiblePages)) { + return; + } + if (this.isThumbnailViewEnabled && this.#pdfThumbnailViewer?.forceRendering()) { + return; + } + if (this.printing) { + return; + } + if (this.onIdle) { + this.#idleTimeout = setTimeout(this.onIdle.bind(this), CLEANUP_TIMEOUT); + } + } + getHighestPriority(visible, views, scrolledDown, preRenderExtra = false, ignoreDetailViews = false) { + const visibleViews = visible.views, + numVisible = visibleViews.length; + if (numVisible === 0) { + return null; + } + for (let i = 0; i < numVisible; i++) { + const view = visibleViews[i].view; + if (!this.isViewFinished(view)) { + return view; + } + } + if (!ignoreDetailViews) { + for (let i = 0; i < numVisible; i++) { + const { + detailView + } = visibleViews[i].view; + if (detailView && !this.isViewFinished(detailView)) { + return detailView; + } + } + } + const firstId = visible.first.id, + lastId = visible.last.id; + if (lastId - firstId + 1 > numVisible) { + const visibleIds = visible.ids; + for (let i = 1, ii = lastId - firstId; i < ii; i++) { + const holeId = scrolledDown ? firstId + i : lastId - i; + if (visibleIds.has(holeId)) { + continue; + } + const holeView = views[holeId - 1]; + if (!this.isViewFinished(holeView)) { + return holeView; + } + } + } + let preRenderIndex = scrolledDown ? lastId : firstId - 2; + let preRenderView = views[preRenderIndex]; + if (preRenderView && !this.isViewFinished(preRenderView)) { + return preRenderView; + } + if (preRenderExtra) { + preRenderIndex += scrolledDown ? 1 : -1; + preRenderView = views[preRenderIndex]; + if (preRenderView && !this.isViewFinished(preRenderView)) { + return preRenderView; + } + } + return null; + } + isViewFinished(view) { + return view.renderingState === RenderingStates.FINISHED; + } + renderView(view) { + switch (view.renderingState) { + case RenderingStates.FINISHED: + return false; + case RenderingStates.PAUSED: + this.#highestPriorityPage = view.renderingId; + view.resume(); + break; + case RenderingStates.RUNNING: + this.#highestPriorityPage = view.renderingId; + break; + case RenderingStates.INITIAL: + this.#highestPriorityPage = view.renderingId; + view.draw().finally(() => { + this.renderHighestPriority(); + }).catch(reason => { + if (reason instanceof RenderingCancelledException) { + return; + } + console.error("renderView:", reason); + }); + break; + } + return true; + } +} + +;// ./web/pdf_scripting_manager.js + + + + + + + + + + + + + +class PDFScriptingManager { + #closeCapability = null; + #destroyCapability = null; + #docProperties = null; + #eventAC = null; + #eventBus = null; + #externalServices = null; + #objectIds = null; + #pdfDocument = null; + #pdfViewer = null; + #ready = false; + #scripting = null; + #willPrintCapability = null; + constructor({ + eventBus, + externalServices = null, + docProperties = null + }) { + this.#eventBus = eventBus; + this.#externalServices = externalServices; + this.#docProperties = docProperties; + } + setViewer(pdfViewer) { + this.#pdfViewer = pdfViewer; + } + async setDocument(pdfDocument) { + if (this.#pdfDocument) { + await this.#destroyScripting(); + } + this.#pdfDocument = pdfDocument; + if (!pdfDocument) { + return; + } + const [objects, calculationOrder, docActions] = await Promise.all([pdfDocument.getFieldObjects(), pdfDocument.getCalculationOrderIds(), pdfDocument.getJSActions()]); + if (!objects && !docActions) { + await this.#destroyScripting(); + return; + } + if (pdfDocument !== this.#pdfDocument) { + return; + } + if (objects) { + this.#objectIds = new Set(); + for (const fields of objects.values()) { + for (const { + id + } of fields) { + this.#objectIds.add(id); + } + } + } + try { + this.#scripting = this.#initScripting(); + } catch (error) { + console.error("setDocument:", error); + await this.#destroyScripting(); + return; + } + const eventBus = this.#eventBus; + this.#eventAC = new AbortController(); + const evtOpts = { + signal: this.#eventAC.signal, + ...internalOpt + }; + eventBus.on("updatefromsandbox", event => { + if (event?.source === window) { + this.#updateFromSandbox(event.detail); + } + }, evtOpts); + eventBus.on("dispatcheventinsandbox", event => { + this.#scripting?.dispatchEventInSandbox(event.detail); + }, evtOpts); + eventBus.on("pagechanging", ({ + pageNumber, + previous + }) => { + if (pageNumber === previous) { + return; + } + this.#dispatchPageClose(previous); + this.#dispatchPageOpen(pageNumber); + }, evtOpts); + eventBus.on("pagerendered", ({ + pageNumber + }) => { + if (!this._pageOpenPending.has(pageNumber)) { + return; + } + if (pageNumber !== this.#pdfViewer.currentPageNumber) { + return; + } + this.#dispatchPageOpen(pageNumber); + }, evtOpts); + eventBus.on("pagesdestroy", async () => { + await this.#dispatchPageClose(this.#pdfViewer.currentPageNumber); + await this.#scripting?.dispatchEventInSandbox({ + id: "doc", + name: "WillClose" + }); + this.#closeCapability?.resolve(); + }, evtOpts); + try { + const docProperties = await this.#docProperties(pdfDocument); + if (pdfDocument !== this.#pdfDocument) { + return; + } + await this.#scripting.createSandbox({ + objects, + calculationOrder, + appInfo: { + platform: navigator.platform, + language: navigator.language + }, + docInfo: { + ...docProperties, + actions: docActions + } + }); + eventBus.dispatch("sandboxcreated", { + source: this + }); + } catch (error) { + console.error("setDocument:", error); + await this.#destroyScripting(); + return; + } + await this.#scripting?.dispatchEventInSandbox({ + id: "doc", + name: "Open" + }); + await this.#dispatchPageOpen(this.#pdfViewer.currentPageNumber, true); + Promise.resolve().then(() => { + if (pdfDocument === this.#pdfDocument) { + this.#ready = true; + } + }); + } + async dispatchWillSave() { + return this.#scripting?.dispatchEventInSandbox({ + id: "doc", + name: "WillSave" + }); + } + async dispatchDidSave() { + return this.#scripting?.dispatchEventInSandbox({ + id: "doc", + name: "DidSave" + }); + } + async dispatchWillPrint() { + if (!this.#scripting) { + return; + } + await this.#willPrintCapability?.promise; + this.#willPrintCapability = Promise.withResolvers(); + try { + await this.#scripting.dispatchEventInSandbox({ + id: "doc", + name: "WillPrint" + }); + } catch (ex) { + this.#willPrintCapability.resolve(); + this.#willPrintCapability = null; + throw ex; + } + await this.#willPrintCapability.promise; + } + async dispatchDidPrint() { + return this.#scripting?.dispatchEventInSandbox({ + id: "doc", + name: "DidPrint" + }); + } + get destroyPromise() { + return this.#destroyCapability?.promise || null; + } + get ready() { + return this.#ready; + } + get _pageOpenPending() { + return pdfjs_shadow(this, "_pageOpenPending", new Set()); + } + get _visitedPages() { + return pdfjs_shadow(this, "_visitedPages", new Map()); + } + async #updateFromSandbox(detail) { + const pdfViewer = this.#pdfViewer; + const isInPresentationMode = pdfViewer.isInPresentationMode || pdfViewer.isChangingPresentationMode; + const { + id, + siblings, + command, + value + } = detail; + if (!id) { + switch (command) { + case "clear": + console.clear(); + break; + case "error": + console.error(value); + break; + case "layout": + if (!isInPresentationMode) { + const modes = apiPageLayoutToViewerModes(value); + pdfViewer.spreadMode = modes.spreadMode; + } + break; + case "page-num": + pdfViewer.currentPageNumber = value + 1; + break; + case "print": + await pdfViewer.pagesPromise; + this.#eventBus.dispatch("print", { + source: this + }); + break; + case "println": + console.log(value); + break; + case "zoom": + if (!isInPresentationMode) { + pdfViewer.currentScaleValue = value; + } + break; + case "SaveAs": + this.#eventBus.dispatch("download", { + source: this + }); + break; + case "FirstPage": + pdfViewer.currentPageNumber = 1; + break; + case "LastPage": + pdfViewer.currentPageNumber = pdfViewer.pagesCount; + break; + case "NextPage": + pdfViewer.nextPage(); + break; + case "PrevPage": + pdfViewer.previousPage(); + break; + case "ZoomViewIn": + if (!isInPresentationMode) { + pdfViewer.increaseScale(); + } + break; + case "ZoomViewOut": + if (!isInPresentationMode) { + pdfViewer.decreaseScale(); + } + break; + case "WillPrintFinished": + this.#willPrintCapability?.resolve(); + this.#willPrintCapability = null; + break; + } + return; + } + if (isInPresentationMode && detail.focus) { + return; + } + delete detail.id; + delete detail.siblings; + const ids = siblings ? [id, ...siblings] : [id]; + for (const elementId of ids) { + if (!this.#objectIds?.has(elementId)) { + continue; + } + const element = document.querySelector(`[data-element-id="${elementId}"]`); + if (element) { + element.dispatchEvent(new CustomEvent("updatefromsandbox", { + detail + })); + } else { + this.#pdfDocument?.annotationStorage.setValue(elementId, detail); + } + } + } + async #dispatchPageOpen(pageNumber, initialize = false) { + const pdfDocument = this.#pdfDocument, + visitedPages = this._visitedPages; + if (initialize) { + this.#closeCapability = Promise.withResolvers(); + } + if (!this.#closeCapability) { + return; + } + const pageView = this.#pdfViewer.getPageView(pageNumber - 1); + if (pageView?.renderingState !== RenderingStates.FINISHED) { + this._pageOpenPending.add(pageNumber); + return; + } + this._pageOpenPending.delete(pageNumber); + const actionsPromise = (async () => { + const actions = await (!visitedPages.has(pageNumber) ? pageView.pdfPage?.getJSActions() : null); + if (pdfDocument !== this.#pdfDocument) { + return; + } + await this.#scripting?.dispatchEventInSandbox({ + id: "page", + name: "PageOpen", + pageNumber, + actions + }); + })(); + visitedPages.set(pageNumber, actionsPromise); + } + async #dispatchPageClose(pageNumber) { + const pdfDocument = this.#pdfDocument, + visitedPages = this._visitedPages; + if (!this.#closeCapability) { + return; + } + if (this._pageOpenPending.has(pageNumber)) { + return; + } + const actionsPromise = visitedPages.get(pageNumber); + if (!actionsPromise) { + return; + } + visitedPages.set(pageNumber, null); + await actionsPromise; + if (pdfDocument !== this.#pdfDocument) { + return; + } + await this.#scripting?.dispatchEventInSandbox({ + id: "page", + name: "PageClose", + pageNumber + }); + } + #initScripting() { + this.#destroyCapability = Promise.withResolvers(); + if (this.#scripting) { + throw new Error("#initScripting: Scripting already exists."); + } + return this.#externalServices.createScripting(); + } + async #destroyScripting() { + this.#objectIds = null; + if (!this.#scripting) { + this.#pdfDocument = null; + this.#destroyCapability?.resolve(); + return; + } + if (this.#closeCapability) { + await Promise.race([this.#closeCapability.promise, new Promise(resolve => { + setTimeout(resolve, 1000); + })]).catch(() => {}); + this.#closeCapability = null; + } + this.#pdfDocument = null; + try { + await this.#scripting.destroySandbox(); + } catch {} + this.#willPrintCapability?.reject(new Error("Scripting destroyed.")); + this.#willPrintCapability = null; + this.#eventAC?.abort(); + this.#eventAC = null; + this._pageOpenPending.clear(); + this._visitedPages.clear(); + this.#scripting = null; + this.#ready = false; + this.#destroyCapability?.resolve(); + } +} + +;// ./web/pdf_text_extractor.js +/* unused harmony import specifier */ var pdf_text_extractor_internalOpt; + +class PdfTextExtractor { + #externalServices; + #textPromise; + #capability = Promise.withResolvers(); + constructor(externalServices, pdfViewer, eventBus) { + this.#externalServices = externalServices; + eventBus.on("pagesinit", () => { + this.#capability.resolve(pdfViewer); + }, pdf_text_extractor_internalOpt); + eventBus.on("pagesdestroy", () => { + this.#capability.reject(new Error("pagesdestroy")); + this.#textPromise = null; + this.#capability = Promise.withResolvers(); + }, pdf_text_extractor_internalOpt); + window.addEventListener("requestTextContent", ({ + detail + }) => { + this.extractTextContent(detail.requestId); + }); + } + async extractTextContent(requestId) { + if (!this.#textPromise) { + const textPromise = this.#textPromise = this.#capability.promise.then(pdfViewer => pdfViewer.getAllText()); + textPromise.then(() => { + setTimeout(() => { + if (this.#textPromise === textPromise) { + this.#textPromise = null; + } + }, 5000); + }); + } + this.#externalServices.reportText({ + text: await this.#textPromise, + requestId + }); + } +} + +;// ./web/menu.js + +class Menu { + #triggeringButton; + #menu; + #menuItems; + #openMenuAC = null; + #menuAC = new AbortController(); + #lastIndex = -1; + #onFocusOutBound = this.#onFocusOut.bind(this); + constructor(menuContainer, triggeringButton, menuItems) { + this.#menu = menuContainer; + this.#triggeringButton = triggeringButton; + this.#menuItems = Array.isArray(menuItems) ? menuItems : [...this.#menu.querySelectorAll("button")]; + this.#setUpMenu(); + } + #closeMenu() { + if (!this.#openMenuAC) { + return; + } + const menu = this.#menu; + this.#triggeringButton.ariaExpanded = "false"; + this.#openMenuAC.abort(); + this.#openMenuAC = null; + if (menu.contains(document.activeElement)) { + setTimeout(() => { + if (!menu.contains(document.activeElement)) { + this.#triggeringButton.focus(); + } + }, 0); + } + this.#lastIndex = -1; + } + #openMenu() { + if (this.#openMenuAC) { + return; + } + const menu = this.#menu; + this.#triggeringButton.ariaExpanded = "true"; + this.#openMenuAC = new AbortController(); + const signal = AbortSignal.any([this.#menuAC.signal, this.#openMenuAC.signal]); + window.addEventListener("pointerdown", ({ + target + }) => { + if (!this.#triggeringButton.contains(target) && !menu.contains(target)) { + this.#closeMenu(); + } + }, { + signal + }); + const closeMenu = this.#closeMenu.bind(this); + window.addEventListener("blur", closeMenu, { + signal + }); + menu.addEventListener("focusout", this.#onFocusOutBound, { + signal + }); + } + #onFocusOut({ + relatedTarget + }) { + if (!this.#triggeringButton.contains(relatedTarget) && !this.#menu.contains(relatedTarget)) { + this.#closeMenu(); + } + } + #setUpMenu() { + this.#triggeringButton.addEventListener("click", e => { + if (this.#openMenuAC) { + this.#closeMenu(); + return; + } + this.#openMenu(); + }); + this.#triggeringButton.addEventListener("focusout", this.#onFocusOutBound); + const { + signal + } = this.#menuAC; + this.#menu.addEventListener("keydown", e => { + switch (e.key) { + case "Escape": + this.#closeMenu(); + stopEvent(e); + break; + case "ArrowDown": + this.#goToNextItem(e.target, true); + stopEvent(e); + break; + case "ArrowUp": + this.#goToNextItem(e.target, false); + stopEvent(e); + break; + case "Home": + this.#goToFirstLast(false); + stopEvent(e); + break; + case "End": + this.#goToFirstLast(true); + stopEvent(e); + break; + default: + const { + key + } = e; + if (!/^\p{L}$/u.test(key)) { + break; + } + const char = key.toLocaleLowerCase(); + this.#goToNextItem(e.target, true, item => item.textContent.trim().toLowerCase().startsWith(char)); + stopEvent(e); + break; + } + }, { + signal, + capture: true + }); + this.#menu.addEventListener("contextmenu", noContextMenu, { + signal + }); + this.#menu.addEventListener("click", this.#closeMenu.bind(this), { + signal, + capture: true + }); + this.#triggeringButton.addEventListener("keydown", e => { + switch (e.key) { + case " ": + case "Enter": + case "ArrowDown": + case "Home": + stopEvent(e); + if (!this.#openMenuAC) { + this.#openMenu(); + } + this.#goToFirstLast(false); + break; + case "ArrowUp": + case "End": + stopEvent(e); + if (!this.#openMenuAC) { + this.#openMenu(); + } + this.#goToFirstLast(true); + break; + case "Escape": + this.#closeMenu(); + stopEvent(e); + break; + } + }, { + signal + }); + } + #goToNextItem(element, forward, check = () => true) { + const index = this.#lastIndex === -1 ? this.#menuItems.indexOf(element) : this.#lastIndex; + const len = this.#menuItems.length; + const increment = forward ? 1 : len - 1; + for (let i = (index + increment) % len; i !== index; i = (i + increment) % len) { + const menuItem = this.#menuItems[i]; + if (!menuItem.disabled && !menuItem.classList.contains("hidden") && check(menuItem)) { + menuItem.focus(); + this.#lastIndex = i; + break; + } + } + } + #goToFirstLast(last = false) { + const i = this.#menuItems[last ? "findLastIndex" : "findIndex"](item => !item.disabled && !item.classList.contains("hidden")); + if (i >= 0) { + this.#menuItems[i].focus(); + this.#lastIndex = i; + } + } + destroy() { + this.#closeMenu(); + this.#menuAC?.abort(); + this.#menuAC = null; + } +} + +;// ./web/pdf_thumbnail_view.js + + + + +const DRAW_UPSCALE_FACTOR = 2; +const MAX_NUM_SCALING_STEPS = 3; +const THUMBNAIL_WIDTH = 126; +function getTempCanvas(width, height) { + const canvas = new OffscreenCanvas(width, height); + const ctx = canvas.getContext("2d", { + alpha: false + }); + ctx.save(); + ctx.fillStyle = "rgb(255, 255, 255)"; + ctx.fillRect(0, 0, width, height); + ctx.restore(); + return [canvas, ctx]; +} +class PDFThumbnailView extends RenderableView { + #renderingState = RenderingStates.INITIAL; + constructor({ + container, + eventBus, + id, + defaultViewport, + optionalContentConfigPromise, + linkService, + renderingQueue, + maxCanvasPixels, + maxCanvasDim, + pageColors, + enableSplitMerge = false + }) { + super(); + this.id = id; + this.renderingId = `thumbnail${id}`; + this.pageLabel = null; + this.pdfPage = null; + this.rotation = 0; + this.viewport = defaultViewport; + this.pdfPageRotate = defaultViewport.rotation; + this._optionalContentConfigPromise = optionalContentConfigPromise || null; + this.maxCanvasPixels = maxCanvasPixels ?? AppOptions.get("maxCanvasPixels"); + this.maxCanvasDim = maxCanvasDim || AppOptions.get("maxCanvasDim"); + this.pageColors = pageColors || null; + this.eventBus = eventBus; + this.linkService = linkService; + this.renderingQueue = renderingQueue; + this.placeholder = null; + const thumbnailContainer = this.div = document.createElement("div"); + thumbnailContainer.className = "thumbnail"; + thumbnailContainer.setAttribute("page-number", id); + const imageContainer = this.imageContainer = document.createElement("div"); + thumbnailContainer.append(imageContainer); + imageContainer.classList.add("thumbnailImageContainer", "missingThumbnailImage"); + imageContainer.role = "button"; + imageContainer.tabIndex = -1; + imageContainer.draggable = false; + imageContainer.setAttribute("page-number", id); + imageContainer.setAttribute("data-l10n-id", "pdfjs-thumb-page-title1"); + imageContainer.setAttribute("data-l10n-args", this.#getPageL10nArgs(true)); + const image = this.image = document.createElement("img"); + imageContainer.append(image); + if (enableSplitMerge) { + const checkbox = this.checkbox = document.createElement("input"); + checkbox.type = "checkbox"; + checkbox.tabIndex = -1; + checkbox.setAttribute("data-l10n-id", "pdfjs-thumb-page-checkbox1"); + checkbox.setAttribute("data-l10n-args", this.#getPageL10nArgs()); + thumbnailContainer.append(checkbox); + this.pasteButton = null; + } + this.#updateDims(); + container.append(thumbnailContainer); + } + clone(container, id) { + const thumbnailView = new PDFThumbnailView({ + container, + id, + eventBus: this.eventBus, + defaultViewport: this.viewport, + optionalContentConfigPromise: this._optionalContentConfigPromise, + linkService: this.linkService, + renderingQueue: this.renderingQueue, + maxCanvasPixels: this.maxCanvasPixels, + maxCanvasDim: this.maxCanvasDim, + pageColors: this.pageColors, + enableSplitMerge: !!this.checkbox + }); + const { + imageContainer + } = this; + if (!imageContainer.classList.contains("missingThumbnailImage")) { + thumbnailView.image.replaceWith(this.image.cloneNode(true)); + thumbnailView.imageContainer.classList.remove("missingThumbnailImage"); + } + return thumbnailView; + } + addPasteButton(pasteCallback) { + if (this.pasteButton) { + return; + } + const pasteButton = this.pasteButton = document.createElement("button"); + pasteButton.classList.add("thumbnailPasteButton", "viewsManagerButton"); + pasteButton.tabIndex = 0; + pasteButton.setAttribute("data-l10n-id", "pdfjs-views-manager-paste-button-after"); + pasteButton.setAttribute("data-l10n-args", this.#getPageL10nArgs()); + const span = document.createElement("span"); + span.setAttribute("data-l10n-id", "pdfjs-views-manager-paste-button-label"); + pasteButton.append(span); + pasteButton.addEventListener("click", () => { + pasteCallback(this.id); + }); + if (this.id === 1) { + const prevPasteButton = this.prevPasteButton = pasteButton.cloneNode(true); + prevPasteButton.setAttribute("data-l10n-id", "pdfjs-views-manager-paste-button-before"); + prevPasteButton.addEventListener("click", () => { + pasteCallback(0); + }); + this.imageContainer.before(prevPasteButton); + } + this.imageContainer.after(pasteButton); + } + removePasteButton() { + this.pasteButton?.remove(); + this.pasteButton = null; + this.prevPasteButton?.remove(); + this.prevPasteButton = null; + } + toggleSelected(isSelected) { + if (this.checkbox) { + this.checkbox.checked = isSelected; + } + } + updateId(newId) { + this.id = newId; + this.renderingId = `thumbnail${newId}`; + this.div.setAttribute("page-number", newId); + this.imageContainer.setAttribute("page-number", newId); + this.setPageLabel(this.pageLabel); + } + #updateDims() { + const { + width, + height + } = this.viewport; + const ratio = width / height; + const canvasWidth = this.canvasWidth = THUMBNAIL_WIDTH; + const canvasHeight = this.canvasHeight = canvasWidth / ratio | 0; + this.scale = canvasWidth / width; + this.imageContainer.style.height = `${canvasHeight}px`; + } + get renderingState() { + return this.#renderingState; + } + set renderingState(state) { + this.#renderingState = state; + } + setPdfPage(pdfPage) { + this.pdfPage = pdfPage; + this.pdfPageRotate = pdfPage.rotate; + const totalRotation = (this.rotation + this.pdfPageRotate) % 360; + this.viewport = pdfPage.getViewport({ + scale: 1, + rotation: totalRotation + }); + this.reset(); + } + reset() { + this.cancelRendering(); + this.renderingState = RenderingStates.INITIAL; + this.#updateDims(); + const { + image, + imageContainer + } = this; + const url = image.src; + if (url) { + URL.revokeObjectURL(url); + image.src = ""; + imageContainer.removeAttribute("data-l10n-id"); + imageContainer.removeAttribute("data-l10n-args"); + imageContainer.classList.add("missingThumbnailImage"); + } + } + destroy() { + this.reset(); + this.toggleCurrent(false); + this.div.remove(); + } + update({ + rotation = null + }) { + if (typeof rotation === "number") { + this.rotation = rotation; + } + const totalRotation = (this.rotation + this.pdfPageRotate) % 360; + this.viewport = this.viewport.clone({ + scale: 1, + rotation: totalRotation + }); + this.reset(); + } + toggleCurrent(isCurrent) { + const { + imageContainer + } = this; + if (isCurrent) { + imageContainer.ariaCurrent = "page"; + imageContainer.tabIndex = 0; + if (this.checkbox) { + this.checkbox.tabIndex = 0; + } + } else { + imageContainer.ariaCurrent = false; + imageContainer.tabIndex = -1; + if (this.checkbox) { + this.checkbox.tabIndex = -1; + } + } + } + cancelRendering() { + if (this.renderTask) { + this.renderTask.cancel(); + this.renderTask = null; + } + this.resume = null; + } + #getPageDrawContext(upscaleFactor = 1) { + const outputScale = new OutputScale(); + const width = upscaleFactor * this.canvasWidth, + height = upscaleFactor * this.canvasHeight; + outputScale.limitCanvas(width, height, this.maxCanvasPixels, this.maxCanvasDim); + const canvas = document.createElement("canvas"); + canvas.width = width * outputScale.sx | 0; + canvas.height = height * outputScale.sy | 0; + const transform = outputScale.scaled ? [outputScale.sx, 0, 0, outputScale.sy, 0, 0] : null; + return { + canvas, + transform + }; + } + async #convertCanvasToImage(canvas) { + if (this.renderingState !== RenderingStates.FINISHED) { + throw new Error("#convertCanvasToImage: Rendering has not finished."); + } + const reducedCanvas = this.#reduceImage(canvas); + const { + imageContainer, + image + } = this; + const { + promise, + resolve + } = Promise.withResolvers(); + reducedCanvas.toBlob(resolve); + const blob = await promise; + image.src = URL.createObjectURL(blob); + image.setAttribute("data-l10n-id", "pdfjs-thumb-page-canvas"); + image.setAttribute("data-l10n-args", this.#getPageL10nArgs()); + imageContainer.classList.remove("missingThumbnailImage"); + } + async draw() { + if (this.renderingState !== RenderingStates.INITIAL) { + console.error("Must be in new state before drawing"); + return; + } + const { + pageColors, + pdfPage + } = this; + if (!pdfPage) { + this.renderingState = RenderingStates.FINISHED; + throw new Error("pdfPage is not loaded"); + } + this.renderingState = RenderingStates.RUNNING; + const { + canvas, + transform + } = this.#getPageDrawContext(DRAW_UPSCALE_FACTOR); + const drawViewport = this.viewport.clone({ + scale: DRAW_UPSCALE_FACTOR * this.scale + }); + const renderContinueCallback = cont => { + if (!this.renderingQueue.isHighestPriority(this)) { + this.renderingState = RenderingStates.PAUSED; + this.resume = () => { + this.renderingState = RenderingStates.RUNNING; + cont(); + }; + return; + } + cont(); + }; + const renderContext = { + canvas, + transform, + viewport: drawViewport, + optionalContentConfigPromise: this._optionalContentConfigPromise, + pageColors + }; + const renderTask = this.renderTask = pdfPage.render(renderContext); + renderTask.onContinue = renderContinueCallback; + let error = null; + try { + await renderTask.promise; + } catch (e) { + if (e instanceof RenderingCancelledException) { + return; + } + error = e; + } finally { + if (renderTask === this.renderTask) { + this.renderTask = null; + } + } + this.renderingState = RenderingStates.FINISHED; + await this.#convertCanvasToImage(canvas); + this.eventBus.dispatch("thumbnailrendered", { + source: this, + pageNumber: this.id, + pdfPage + }); + if (error) { + throw error; + } + } + setImage(pageView) { + if (this.renderingState !== RenderingStates.INITIAL) { + return; + } + const { + thumbnailCanvas: canvas, + pdfPage, + scale + } = pageView; + if (!canvas) { + return; + } + if (!this.pdfPage) { + this.setPdfPage(pdfPage); + } + if (scale < this.scale) { + return; + } + this.renderingState = RenderingStates.FINISHED; + this.#convertCanvasToImage(canvas); + } + #getReducedImageDims(canvas) { + const width = canvas.width << MAX_NUM_SCALING_STEPS, + height = canvas.height << MAX_NUM_SCALING_STEPS; + const outputScale = new OutputScale(); + outputScale.sx = outputScale.sy = 1; + outputScale.limitCanvas(width, height, this.maxCanvasPixels, this.maxCanvasDim); + return [width * outputScale.sx | 0, height * outputScale.sy | 0]; + } + #reduceImage(img) { + const { + canvas + } = this.#getPageDrawContext(1); + const ctx = canvas.getContext("2d", { + alpha: false, + willReadFrequently: false + }); + if (img.width <= 2 * canvas.width) { + ctx.drawImage(img, 0, 0, img.width, img.height, 0, 0, canvas.width, canvas.height); + return canvas; + } + let [reducedWidth, reducedHeight] = this.#getReducedImageDims(canvas); + const [reducedImage, reducedImageCtx] = getTempCanvas(reducedWidth, reducedHeight); + while (reducedWidth > img.width || reducedHeight > img.height) { + reducedWidth >>= 1; + reducedHeight >>= 1; + } + reducedImageCtx.drawImage(img, 0, 0, img.width, img.height, 0, 0, reducedWidth, reducedHeight); + while (reducedWidth > 2 * canvas.width) { + reducedImageCtx.drawImage(reducedImage, 0, 0, reducedWidth, reducedHeight, 0, 0, reducedWidth >> 1, reducedHeight >> 1); + reducedWidth >>= 1; + reducedHeight >>= 1; + } + ctx.drawImage(reducedImage, 0, 0, reducedWidth, reducedHeight, 0, 0, canvas.width, canvas.height); + return canvas; + } + #getPageL10nArgs(hasTotal = false) { + return JSON.stringify({ + page: this.pageLabel ?? this.id, + total: hasTotal ? this.linkService.pagesCount : undefined + }); + } + setPageLabel(label) { + this.pageLabel = typeof label === "string" ? label : null; + this.imageContainer.setAttribute("data-l10n-args", this.#getPageL10nArgs(true)); + this.image.setAttribute("data-l10n-args", this.#getPageL10nArgs()); + this.checkbox?.setAttribute("data-l10n-args", this.#getPageL10nArgs()); + } +} + +;// ./web/pdf_thumbnail_viewer.js + + + + + + + + + + + + + + + + + + + +const SCROLL_OPTIONS = { + behavior: "instant", + block: "nearest", + inline: "nearest", + container: "nearest" +}; +const DRAG_THRESHOLD_IN_PIXELS = 5; +const PIXELS_TO_SCROLL_WHEN_DRAGGING = 20; +const SPACE_FOR_DRAG_MARKER_WHEN_NO_NEXT_ELEMENT = 15; +class PDFThumbnailViewer { + static #draggingScaleFactor = 0; + #enableMerge = false; + #enableSplitMerge = false; + #dragAC = null; + #abortSignal = undefined; + #externalDragActive = false; + #draggedContainer = null; + #thumbnailsPositions = null; + #lastDraggedOverIndex = NaN; + #selectedPages = null; + #draggedImageX = 0; + #draggedImageY = 0; + #draggedImageWidth = 0; + #draggedImageHeight = 0; + #draggedImageOffsetX = 0; + #draggedImageOffsetY = 0; + #dragMarker = null; + #pageNumberToRemove = NaN; + #currentScrollBottom = 0; + #currentScrollTop = 0; + #pagesMapper = null; + #manageExportButton = null; + #manageDeleteButton = null; + #manageCopyButton = null; + #manageCutButton = null; + #copiedThumbnails = null; + #savedThumbnails = null; + #deletedPageNumbers = null; + #copiedPageNumbers = null; + #boundPastePages = this.#pastePages.bind(this); + #isCut = false; + #isOneColumnView = false; + #scrollableContainerWidth = 0; + #scrollableContainerHeight = 0; + #statusLabel = null; + #statusBar = null; + #deselectButton = null; + #undoBar = null; + #undoLabel = null; + #undoButton = null; + #undoCloseButton = null; + #waitingBar = null; + #isInPasteMode = false; + #hasUndoBarVisible = false; + #newBadge = null; + constructor({ + container, + eventBus, + linkService, + renderingQueue, + maxCanvasPixels, + maxCanvasDim, + pageColors, + abortSignal, + enableMerge, + enableSplitMerge, + enableNewBadge, + statusBar, + undoBar, + waitingBar, + manageMenu, + addFileComponent + }) { + this.scrollableContainer = container.parentElement; + this.container = container; + this.eventBus = eventBus; + this.linkService = linkService; + this.renderingQueue = renderingQueue; + this.maxCanvasPixels = maxCanvasPixels; + this.maxCanvasDim = maxCanvasDim; + this.pageColors = pageColors || null; + this.#abortSignal = abortSignal; + this.#enableMerge = enableMerge || false; + this.#enableSplitMerge = enableSplitMerge || false; + this.#statusLabel = statusBar?.viewsManagerStatusActionLabel || null; + this.#deselectButton = statusBar?.viewsManagerStatusActionDeselectButton || null; + this.#statusBar = statusBar?.viewsManagerStatusAction || null; + this.#undoBar = undoBar?.viewsManagerStatusUndo || null; + this.#undoLabel = undoBar?.viewsManagerStatusUndoLabel || null; + this.#undoButton = undoBar?.viewsManagerStatusUndoButton || null; + this.#undoCloseButton = undoBar?.viewsManagerStatusUndoCloseButton || null; + this.#waitingBar = waitingBar || null; + if (this.#enableSplitMerge && manageMenu) { + const { + button: menuButton, + menu, + copy, + cut, + delete: del, + exportSelected + } = manageMenu; + if (enableNewBadge) { + const newSpan = document.createElement("span"); + newSpan.setAttribute("data-l10n-id", "pdfjs-new-badge-content"); + newSpan.classList.add("newBadge"); + menuButton.parentElement.before(newSpan); + this.#newBadge = newSpan; + } + eventBus.on("pagesloaded", () => { + menuButton.disabled = false; + }, { + once: true, + ...internalOpt + }); + this._manageMenu = new Menu(menu, menuButton, [copy, cut, del, exportSelected]); + this.#manageExportButton = exportSelected; + exportSelected.addEventListener("click", this.#saveExtractedPages.bind(this)); + this.#manageDeleteButton = del; + del.addEventListener("click", this.#deletePages.bind(this, "delete")); + this.#manageCopyButton = copy; + copy.addEventListener("click", this.#copyPages.bind(this)); + this.#manageCutButton = cut; + cut.addEventListener("click", this.#cutPages.bind(this)); + this.#toggleMenuEntries(false); + menuButton.disabled = true; + eventBus.on("editingaction", ({ + name + }) => { + switch (name) { + case "copyPage": + this.#copyPages(); + break; + case "cutPage": + this.#cutPages(); + break; + case "deletePage": + this.#deletePages("delete"); + break; + case "savePage": + this.#saveExtractedPages(); + break; + } + }, internalOpt); + this.container.addEventListener("contextmenu", e => { + eventBus.dispatch("editingstateschanged", { + source: this, + details: { + thumbnailId: parseInt(e.target.closest(".thumbnailImageContainer")?.parentElement.getAttribute("page-number"), 10) ?? -1, + hasSelectedPages: !!this.#selectedPages?.size, + canDeletePages: this.#canDelete() + } + }); + }, { + signal: abortSignal, + passive: true + }); + this.#undoButton?.addEventListener("click", this.#undo.bind(this)); + this.#undoCloseButton?.addEventListener("click", this.#dismissUndo.bind(this, true)); + this.#deselectButton?.addEventListener("click", () => { + this.#clearSelection(); + this.#toggleMenuEntries(false); + this.#updateStatus("select"); + }); + this.#deselectButton.classList.toggle("hidden", true); + if (this.#enableMerge && addFileComponent) { + const { + picker, + button + } = addFileComponent; + picker.addEventListener("change", () => { + const files = Array.from(picker.files ?? []); + if (files.length) { + this.#mergeFiles(files, this._currentPageNumber - 1); + } + }); + button.addEventListener("click", () => { + picker.click(); + }); + this.#waitingBar.closeButton?.addEventListener("click", () => { + this.#toggleBar("status"); + picker.value = ""; + }); + } + } else { + manageMenu.button.hidden = true; + } + this.scroll = watchScroll(this.scrollableContainer, this.#scrollUpdated.bind(this), abortSignal); + this.#resetView(); + this.#addEventListeners(); + } + #scrollUpdated() { + this.renderingQueue.renderHighestPriority(); + } + async #mergeFiles(files, insertAfter) { + this.#toggleBar("waiting", "pdfjs-views-manager-waiting-for-file"); + const entries = []; + for (const file of files) { + const isImage = file.type?.startsWith("image/"); + if (!isImage && file.type !== "application/pdf") { + const magic = await file.slice(0, 5).text(); + if (magic !== "%PDF-") { + continue; + } + } + if (isImage) { + let bitmap; + try { + bitmap = await PDFThumbnailViewer.#fileToImageBitmap(file); + } catch { + continue; + } + entries.push({ + image: bitmap, + insertAfter + }); + } else { + entries.push({ + document: await file.bytes(), + insertAfter + }); + } + } + if (entries.length === 0) { + this.#toggleBar("status"); + return; + } + const pagesCount = this.#pagesMapper.pagesNumber; + const data = this.hasStructuralChanges() ? this.getStructuralChanges() : { + pageInfos: [{ + document: null + }], + copyLevels: null + }; + data.pageInfos.push(...entries); + this.eventBus.on("pagesloaded", () => { + this.#selectedPages = null; + this.#updateMenuEntries(); + this.#toggleBar("status"); + const newPagesCount = this.#pagesMapper.pagesNumber; + const insertedPagesCount = newPagesCount - pagesCount; + for (let i = insertAfter + 1, ii = insertAfter + 1 + insertedPagesCount; i < ii; i++) { + this._thumbnails[i].checkbox.checked = true; + this.#selectPage(i + 1, true); + } + if (insertedPagesCount) { + this.#updateCurrentPage(insertAfter + 2, true); + } + }, { + once: true, + ...internalOpt + }); + this.#reportTelemetry({ + action: "merge" + }); + this.eventBus.dispatch("saveandload", { + source: this, + data + }); + } + getThumbnail(index) { + return this._thumbnails[index]; + } + #getVisibleThumbs() { + return getVisibleElements({ + scrollEl: this.scrollableContainer, + views: this._thumbnails + }); + } + #resetCurrentThumbnail(newPageNumber) { + if (!this.pdfDocument) { + return; + } + const thumbnailView = this._thumbnails[this._currentPageNumber - 1]; + thumbnailView?.toggleCurrent(false); + this._currentPageNumber = newPageNumber; + } + scrollThumbnailIntoView(pageNumber) { + if (!this.pdfDocument) { + return; + } + const thumbnailView = this._thumbnails[pageNumber - 1]; + if (!thumbnailView) { + console.error('scrollThumbnailIntoView: Invalid "pageNumber" parameter.'); + return; + } + if (pageNumber !== this._currentPageNumber) { + this.#resetCurrentThumbnail(pageNumber); + thumbnailView.toggleCurrent(true); + } + const { + first, + last, + views + } = this.#getVisibleThumbs(); + if (views.length > 0) { + let shouldScroll = false; + if (pageNumber <= first.id || pageNumber >= last.id) { + shouldScroll = true; + } else { + for (const { + id, + percent + } of views) { + if (id !== pageNumber) { + continue; + } + shouldScroll = percent < 100; + break; + } + } + if (shouldScroll) { + thumbnailView.div.scrollIntoView(SCROLL_OPTIONS); + } + } + this._currentPageNumber = pageNumber; + } + get pagesRotation() { + return this._pagesRotation; + } + set pagesRotation(rotation) { + if (!isValidRotation(rotation)) { + throw new Error("Invalid thumbnails rotation angle."); + } + if (!this.pdfDocument) { + return; + } + if (this._pagesRotation === rotation) { + return; + } + this._pagesRotation = rotation; + const updateArgs = { + rotation + }; + for (const thumbnail of this._thumbnails) { + thumbnail.update(updateArgs); + } + } + cleanup() { + for (const thumbnail of this._thumbnails) { + if (thumbnail.renderingState !== RenderingStates.FINISHED) { + thumbnail.reset(); + } + } + } + #resetView() { + this._thumbnails = []; + this._currentPageNumber = 1; + this._pageLabels = null; + this._pagesRotation = 0; + this.container.textContent = ""; + } + setDocument(pdfDocument) { + if (this.pdfDocument) { + this.#cancelRendering(); + this.#resetView(); + } + this.pdfDocument = pdfDocument; + if (!pdfDocument) { + return; + } + this.#pagesMapper = pdfDocument.pagesMapper; + const firstPagePromise = pdfDocument.getPage(1); + const optionalContentConfigPromise = pdfDocument.getOptionalContentConfig({ + intent: "display" + }); + firstPagePromise.then(firstPdfPage => { + const pagesCount = pdfDocument.numPages; + const viewport = firstPdfPage.getViewport({ + scale: 1 + }); + const fragment = document.createDocumentFragment(); + for (let pageNum = 1; pageNum <= pagesCount; ++pageNum) { + const thumbnail = new PDFThumbnailView({ + container: fragment, + eventBus: this.eventBus, + id: pageNum, + defaultViewport: viewport.clone(), + optionalContentConfigPromise, + linkService: this.linkService, + renderingQueue: this.renderingQueue, + maxCanvasPixels: this.maxCanvasPixels, + maxCanvasDim: this.maxCanvasDim, + pageColors: this.pageColors, + enableSplitMerge: this.#enableSplitMerge + }); + this._thumbnails.push(thumbnail); + } + this._thumbnails[0]?.setPdfPage(firstPdfPage); + const thumbnailView = this._thumbnails[this._currentPageNumber - 1]; + thumbnailView.toggleCurrent(true); + this.container.append(fragment); + this.eventBus.dispatch("thumbnailsloaded", { + source: this + }); + }).catch(reason => { + console.error("Unable to initialize thumbnail viewer", reason); + }); + } + #cancelRendering() { + for (const thumbnail of this._thumbnails) { + thumbnail.cancelRendering(); + } + } + setPageLabels(labels) { + if (!this.pdfDocument) { + return; + } + if (!labels) { + this._pageLabels = null; + } else if (!(Array.isArray(labels) && this.pdfDocument.numPages === labels.length)) { + this._pageLabels = null; + console.error("PDFThumbnailViewer_setPageLabels: Invalid page labels."); + } else { + this._pageLabels = labels; + } + for (let i = 0, ii = this._thumbnails.length; i < ii; i++) { + this._thumbnails[i].setPageLabel(this._pageLabels?.[i] ?? null); + } + } + async #ensurePdfPageLoaded(thumbView) { + if (thumbView.pdfPage) { + return thumbView.pdfPage; + } + try { + const pdfPage = await this.pdfDocument.getPage(thumbView.id); + if (!thumbView.pdfPage) { + thumbView.setPdfPage(pdfPage); + } + return pdfPage; + } catch (reason) { + console.error("Unable to get page for thumb view", reason); + return null; + } + } + #getScrollAhead(visible) { + if (visible.first?.id === 1) { + return true; + } else if (visible.last?.id === this._thumbnails.length) { + return false; + } + return this.scroll.down; + } + forceRendering() { + const visibleThumbs = this.#getVisibleThumbs(); + const scrollAhead = this.#getScrollAhead(visibleThumbs); + const thumbView = this.renderingQueue.getHighestPriority(visibleThumbs, this._thumbnails, scrollAhead, false, true); + if (thumbView) { + this.#ensurePdfPageLoaded(thumbView).then(() => { + this.renderingQueue.renderView(thumbView); + }); + return true; + } + return false; + } + hasStructuralChanges() { + return this.#pagesMapper?.hasBeenAltered() || false; + } + getStructuralChanges() { + return this.#pagesMapper?.getPageMappingForSaving() || null; + } + static #getScaleFactor(image) { + return PDFThumbnailViewer.#draggingScaleFactor ||= parseFloat(getComputedStyle(image).getPropertyValue("--thumbnail-dragging-scale")); + } + static #fitImageDimensions(width, height, { + minSide = 0, + maxSide + }) { + const longest = Math.max(width, height); + let scale = 1; + if (minSide > 0 && longest < minSide) { + scale = minSide / longest; + } else if (longest > maxSide) { + scale = maxSide / longest; + } + return scale === 1 ? { + width, + height + } : { + width: Math.max(1, Math.round(width * scale)), + height: Math.max(1, Math.round(height * scale)) + }; + } + static async #fileToImageBitmap(file) { + const MIN_RASTER_SIDE = 1024; + const MAX_RASTER_SIDE = 4096; + if (file.type !== "image/svg+xml") { + const bitmap = await createImageBitmap(file); + const { + width, + height + } = PDFThumbnailViewer.#fitImageDimensions(bitmap.width, bitmap.height, { + maxSide: MAX_RASTER_SIDE + }); + if (width === bitmap.width && height === bitmap.height) { + return bitmap; + } + const canvas = new OffscreenCanvas(width, height); + const ctx = canvas.getContext("2d"); + ctx.drawImage(bitmap, 0, 0, width, height); + bitmap.close(); + return canvas.transferToImageBitmap(); + } + const url = URL.createObjectURL(file); + try { + const image = new Image(); + image.src = url; + await image.decode(); + const { + width, + height + } = PDFThumbnailViewer.#fitImageDimensions(image.naturalWidth || MIN_RASTER_SIDE, image.naturalHeight || MIN_RASTER_SIDE, { + minSide: MIN_RASTER_SIDE, + maxSide: MAX_RASTER_SIDE + }); + const canvas = new OffscreenCanvas(width, height); + const ctx = canvas.getContext("2d"); + ctx.drawImage(image, 0, 0, width, height); + return canvas.transferToImageBitmap(); + } finally { + URL.revokeObjectURL(url); + } + } + #updateThumbnails(currentPageNumber) { + this.#resetCurrentThumbnail(0); + let newCurrentPageNumber = 0; + const pagesMapper = this.#pagesMapper; + const prevThumbnails = this.#savedThumbnails = this._thumbnails; + const newThumbnails = this._thumbnails = []; + const fragment = document.createDocumentFragment(); + const isCut = this.#isCut; + for (let i = 1, ii = pagesMapper.pagesNumber; i <= ii; i++) { + const prevPageNumber = pagesMapper.getPrevPageNumber(i); + if (prevPageNumber < 0) { + let thumbnail = this.#copiedThumbnails.get(-prevPageNumber); + thumbnail.checkbox.checked = false; + if (isCut) { + thumbnail.updateId(i); + fragment.append(thumbnail.div); + } else { + thumbnail = thumbnail.clone(fragment, i); + } + newThumbnails.push(thumbnail); + continue; + } + if (prevPageNumber === currentPageNumber) { + newCurrentPageNumber = i; + } + const newThumbnail = prevThumbnails[prevPageNumber - 1]; + newThumbnails.push(newThumbnail); + newThumbnail.updateId(i); + newThumbnail.checkbox.checked = false; + fragment.append(newThumbnail.div); + } + this.container.replaceChildren(fragment); + return newCurrentPageNumber; + } + #onStartDragging(draggedThumbnail) { + this.#currentScrollTop = this.scrollableContainer.scrollTop; + this.#currentScrollBottom = this.#currentScrollTop + this.scrollableContainer.clientHeight; + this.#dragAC = new AbortController(); + this.container.classList.add("isDragging"); + this.#newBadge?.classList.add("hidden"); + const startPageNumber = parseInt(draggedThumbnail.getAttribute("page-number"), 10); + this.#lastDraggedOverIndex = startPageNumber - 1; + if (!this.#selectedPages?.has(startPageNumber)) { + this.#pageNumberToRemove = startPageNumber; + this.#selectPage(startPageNumber, true); + } + for (const selected of this.#selectedPages) { + const thumbnail = this._thumbnails[selected - 1]; + const placeholder = thumbnail.placeholder = document.createElement("div"); + placeholder.classList.add("thumbnailImageContainer", "placeholder"); + const { + div, + imageContainer + } = thumbnail; + div.classList.add("isDragging"); + placeholder.style.height = getComputedStyle(imageContainer).height; + imageContainer.after(placeholder); + if (selected !== startPageNumber) { + imageContainer.classList.add("hidden"); + continue; + } + if (this.#selectedPages.size === 1) { + imageContainer.classList.add("draggingThumbnail"); + this.#draggedContainer = imageContainer; + continue; + } + const draggedContainer = this.#draggedContainer = document.createElement("div"); + draggedContainer.classList.add("draggingThumbnail", "thumbnailImageContainer", "multiple"); + draggedContainer.style.height = getComputedStyle(imageContainer).height; + imageContainer.replaceWith(draggedContainer); + imageContainer.classList.remove("thumbnailImageContainer"); + draggedContainer.append(imageContainer); + draggedContainer.setAttribute("data-multiple-count", this.#selectedPages.size); + } + } + #onStopDragging(isDropping = false) { + const draggedContainer = this.#draggedContainer; + this.#draggedContainer = null; + const lastDraggedOverIndex = this.#lastDraggedOverIndex; + this.#lastDraggedOverIndex = NaN; + this.#dragMarker?.remove(); + this.#dragMarker = null; + this.#dragAC.abort(); + this.#dragAC = null; + this.#newBadge?.classList.remove("hidden"); + this.container.classList.remove("isDragging"); + for (const selected of this.#selectedPages) { + const thumbnail = this._thumbnails[selected - 1]; + const { + div, + placeholder, + imageContainer + } = thumbnail; + placeholder.remove(); + imageContainer.classList.remove("draggingThumbnail", "hidden"); + div.classList.remove("isDragging"); + } + if (draggedContainer.classList.contains("multiple")) { + const originalImageContainer = draggedContainer.firstElementChild; + draggedContainer.replaceWith(originalImageContainer); + originalImageContainer.classList.add("thumbnailImageContainer"); + } else { + draggedContainer.style.translate = ""; + } + const selectedPages = this.#selectedPages; + if (!isNaN(lastDraggedOverIndex) && isDropping && !(selectedPages.size === 1 && (selectedPages.has(lastDraggedOverIndex + 1) || selectedPages.has(lastDraggedOverIndex + 2)))) { + this._thumbnails[this._currentPageNumber - 1]?.toggleCurrent(false); + this._currentPageNumber = -1; + const newIndex = lastDraggedOverIndex + 1; + const pagesToMove = Array.from(selectedPages).sort((a, b) => a - b); + const pagesMapper = this.#pagesMapper; + const currentPageNumber = isNaN(this.#pageNumberToRemove) ? pagesToMove[0] : this.#pageNumberToRemove; + pagesMapper.movePages(selectedPages, pagesToMove, newIndex); + this.#updateCurrentPage(this.#updateThumbnails(currentPageNumber)); + this.#thumbnailsPositions = null; + selectedPages.clear(); + this.#pageNumberToRemove = NaN; + this.#toggleMenuEntries(false); + this.#updateStatus("select"); + this.#reportTelemetry({ + action: "move" + }); + this.eventBus.dispatch("pagesedited", { + source: this, + pagesMapper, + type: "move" + }); + } + if (!isNaN(this.#pageNumberToRemove)) { + this.#selectPage(this.#pageNumberToRemove, false); + this.#pageNumberToRemove = NaN; + } + } + #clearSelection() { + for (const pageNumber of this.#selectedPages) { + this._thumbnails[pageNumber - 1].toggleSelected(false); + } + this.#selectedPages.clear(); + } + #updateCurrentPage(currentPageNumber, forceFocus = false) { + setTimeout(() => { + this.forceRendering(); + const newPageNumber = currentPageNumber || 1; + this.linkService.goToPage(newPageNumber); + const thumbnailView = this._thumbnails[newPageNumber - 1]; + if (forceFocus || !this.container.contains(document.activeElement)) { + thumbnailView.imageContainer.focus(); + } + }, 0); + } + #undo() { + this.#clearSelection(); + this.#toggleMenuEntries(false); + this.#updateStatus("select"); + if (this.#copiedThumbnails) { + this.#copiedThumbnails = null; + this.#pagesMapper.cancelCopy(); + this.#togglePasteMode(false); + this.eventBus.dispatch("pagesedited", { + source: this, + pagesMapper: this.#pagesMapper, + type: "cancelCopy" + }); + } + this.#isCut = false; + if (this.#savedThumbnails) { + const currentThumb = this._thumbnails[this._currentPageNumber - 1]; + currentThumb?.toggleCurrent(false); + const fragment = document.createDocumentFragment(); + for (let i = 1, ii = this.#savedThumbnails.length; i <= ii; i++) { + const thumbnail = this.#savedThumbnails[i - 1]; + thumbnail.updateId(i); + thumbnail.checkbox.checked = false; + fragment.append(thumbnail.div); + } + this.container.replaceChildren(fragment); + this._thumbnails = this.#savedThumbnails; + this.#savedThumbnails = null; + const newIdx = currentThumb ? this._thumbnails.indexOf(currentThumb) : -1; + this._currentPageNumber = newIdx + 1; + currentThumb?.toggleCurrent(newIdx !== -1); + this.#pagesMapper.cancelDelete(); + this.eventBus.dispatch("pagesedited", { + source: this, + pagesMapper: this.#pagesMapper, + type: "cancelDelete" + }); + } + } + #dismissUndo(mustUpdateStatus) { + this.#copiedThumbnails = null; + if (this.#deletedPageNumbers) { + if (this.#savedThumbnails) { + for (const pageNumber of this.#deletedPageNumbers) { + this.#savedThumbnails[pageNumber - 1].destroy(); + } + this.#savedThumbnails = null; + } + this.#deletedPageNumbers = null; + } + this.#isCut = false; + if (mustUpdateStatus) { + this.#updateStatus("select"); + } + this.#togglePasteMode(false); + this.#pagesMapper.cleanSavedData(); + this.eventBus.dispatch("pagesedited", { + source: this, + pagesMapper: this.#pagesMapper, + type: "cleanSavedData" + }); + } + #canDelete() { + const size = this.#selectedPages?.size || 0; + return size > 0 && size < this._thumbnails.length; + } + #toggleBar(type, message, args) { + this.#statusBar.classList.toggle("hidden", type !== "status"); + this.#waitingBar.container.classList.toggle("hidden", type !== "waiting"); + this.#undoBar.classList.toggle("hidden", type !== "undo"); + this.#hasUndoBarVisible = type === "undo"; + switch (type) { + case "waiting": + this.#waitingBar.label.setAttribute("data-l10n-id", message); + break; + case "undo": + this.#undoLabel.setAttribute("data-l10n-id", message); + if (args) { + this.#undoLabel.setAttribute("data-l10n-args", JSON.stringify(args)); + } + break; + case "status": + if (args) { + this.#statusLabel.setAttribute("data-l10n-args", JSON.stringify(args)); + } else { + this.#statusLabel.removeAttribute("data-l10n-args"); + } + this.#newBadge?.classList.toggle("hidden", !!args); + this.#deselectButton.classList.toggle("hidden", !args); + break; + } + } + #togglePasteMode(enable) { + this.#isInPasteMode = enable; + if (enable) { + this.container.classList.add("pasteMode"); + for (const thumbnail of this._thumbnails) { + thumbnail.addPasteButton(this.#boundPastePages); + } + } else { + this.container.classList.remove("pasteMode"); + for (const thumbnail of this._thumbnails) { + thumbnail.removePasteButton(); + } + } + } + #reportTelemetry(data) { + this.eventBus.dispatch("reporttelemetry", { + source: this, + details: { + type: "pageOrganization", + data + } + }); + } + #saveExtractedPages() { + this.#reportTelemetry({ + action: "exportSelected" + }); + this.eventBus.dispatch("saveextractedpages", { + source: this, + data: this.#pagesMapper.extractPages(this.#selectedPages) + }); + this.#clearSelection(); + this.#toggleMenuEntries(false); + this.#updateStatus("select"); + } + #copyPages(clearSelection = true) { + if (!this.#isCut) { + this.#savedThumbnails = null; + this.#reportTelemetry({ + action: "copy" + }); + } + this.#updateStatus(this.#isCut ? "cut" : "copy"); + const pageNumbersToCopy = this.#copiedPageNumbers = Uint32Array.from(this.#selectedPages).sort((a, b) => a - b); + const pagesMapper = this.#pagesMapper; + pagesMapper.copyPages(pageNumbersToCopy); + this.#copiedThumbnails = new Map(); + for (const pageNumber of pageNumbersToCopy) { + this.#copiedThumbnails.set(pageNumber, this._thumbnails[pageNumber - 1]); + } + this.eventBus.dispatch("pagesedited", { + source: this, + pagesMapper, + pageNumbers: pageNumbersToCopy, + type: "copy" + }); + if (clearSelection) { + this.#clearSelection(); + } + this.#togglePasteMode(true); + this.#toggleMenuEntries(false); + } + #cutPages() { + if (!this.#canDelete()) { + return; + } + this.#reportTelemetry({ + action: "cut" + }); + this.#isCut = true; + this.#copyPages(false); + this.#deletePages("cut"); + } + #pastePages(index) { + this.#reportTelemetry({ + action: "paste" + }); + const pagesMapper = this.#pagesMapper; + const currentPageNumber = this.#copiedPageNumbers.includes(this._currentPageNumber) ? 0 : this._currentPageNumber; + pagesMapper.pastePages(index); + this.#updateThumbnails(currentPageNumber); + this.#updateCurrentPage(index + 1, true); + this.#thumbnailsPositions = null; + this.eventBus.dispatch("pagesedited", { + source: this, + pagesMapper, + hasBeenCut: this.#isCut, + type: "paste" + }); + this.#copiedThumbnails = null; + this.#isCut = false; + this.#togglePasteMode(false); + this.#toggleMenuEntries(false); + this.#updateStatus("select"); + } + #deletePages(type = "delete") { + if (!this.#canDelete()) { + return; + } + const selectedPages = this.#selectedPages; + if (type === "delete") { + this.#reportTelemetry({ + action: "delete" + }); + this.#updateStatus("delete"); + } + const pagesMapper = this.#pagesMapper; + const currentPageNumber = selectedPages.has(this._currentPageNumber) ? 0 : this._currentPageNumber; + const pagesToDelete = this.#deletedPageNumbers = Uint32Array.from(selectedPages).sort((a, b) => a - b); + pagesMapper.deletePages(pagesToDelete); + this.#updateCurrentPage(this.#updateThumbnails(currentPageNumber)); + this.#thumbnailsPositions = null; + selectedPages.clear(); + this.#updateMenuEntries(); + this.eventBus.dispatch("pagesedited", { + source: this, + pagesMapper, + pageNumbers: pagesToDelete, + type + }); + } + #updateMenuEntries() { + const size = this.#selectedPages?.size || 0; + this.#manageExportButton.disabled = this.#manageCopyButton.disabled = !size; + this.#manageDeleteButton.disabled = this.#manageCutButton.disabled = !this.#canDelete(); + } + #toggleMenuEntries(enable) { + this.#manageExportButton.disabled = this.#manageDeleteButton.disabled = this.#manageCopyButton.disabled = this.#manageCutButton.disabled = !enable; + } + #updateStatus(type) { + if (!this.#statusBar || !this.#undoBar) { + return; + } + const count = this.#selectedPages?.size || 0; + if (type === "select") { + this.#statusLabel.setAttribute("data-l10n-id", count ? "pdfjs-views-manager-pages-status-action-label" : "pdfjs-views-manager-pages-status-none-action-label"); + this.#toggleBar("status", "", count ? { + count + } : null); + return; + } + let l10nId; + switch (type) { + case "copy": + l10nId = "pdfjs-views-manager-pages-status-undo-copy-label"; + break; + case "cut": + l10nId = "pdfjs-views-manager-status-undo-cut-label"; + break; + case "delete": + l10nId = "pdfjs-views-manager-pages-status-undo-delete-label"; + break; + } + this.#toggleBar("undo", l10nId, { + count + }); + const isCopy = type === "copy"; + this.#undoButton.firstElementChild.setAttribute("data-l10n-id", isCopy ? "pdfjs-views-manager-status-done-button-label" : "pdfjs-views-manager-status-undo-button-label"); + this.#undoCloseButton.classList.toggle("hidden", isCopy); + } + #moveDraggedContainer(dx, dy) { + if (this.#isOneColumnView) { + dx = 0; + } + if (this.#draggedImageX + dx < 0 || this.#draggedImageX + this.#draggedImageWidth + dx > this.#scrollableContainerWidth) { + dx = 0; + } + if (this.#draggedImageY + dy < 0 || this.#draggedImageY + this.#draggedImageHeight + dy > this.#scrollableContainerHeight) { + dy = 0; + } + this.#draggedImageX += dx; + this.#draggedImageY += dy; + this.#draggedImageOffsetX += dx; + this.#draggedImageOffsetY += dy; + this.#draggedContainer.style.translate = `${this.#draggedImageOffsetX}px ${this.#draggedImageOffsetY}px`; + if (this.#draggedImageY + this.#draggedImageHeight > this.#currentScrollBottom) { + this.scrollableContainer.scrollTop = Math.min(this.scrollableContainer.scrollTop + PIXELS_TO_SCROLL_WHEN_DRAGGING, this.#scrollableContainerHeight); + } else if (this.#draggedImageY < this.#currentScrollTop) { + this.scrollableContainer.scrollTop = Math.max(this.scrollableContainer.scrollTop - PIXELS_TO_SCROLL_WHEN_DRAGGING, 0); + } + const positionData = this.#findClosestThumbnail(this.#draggedImageX + this.#draggedImageWidth / 2, this.#draggedImageY + this.#draggedImageHeight / 2); + this.#positionDragMarker(positionData); + } + #positionDragMarker(positionData) { + if (!positionData) { + return; + } + let dragMarker = this.#dragMarker; + if (!dragMarker) { + dragMarker = this.#dragMarker = document.createElement("div"); + dragMarker.className = "dragMarker"; + this.container.firstChild.before(dragMarker); + } + const [index, space] = positionData; + const dragMarkerStyle = dragMarker.style; + const { + bbox, + x: xPos + } = this.#thumbnailsPositions; + let x, y, width, height; + if (index < 0) { + if (xPos.length === 1) { + y = bbox[1] - SPACE_FOR_DRAG_MARKER_WHEN_NO_NEXT_ELEMENT; + x = bbox[0]; + width = bbox[2]; + } else { + y = bbox[1]; + x = bbox[0] - SPACE_FOR_DRAG_MARKER_WHEN_NO_NEXT_ELEMENT; + height = bbox[3]; + } + } else if (xPos.length === 1) { + y = bbox[index * 4 + 1] + bbox[index * 4 + 3] + space; + x = bbox[index * 4]; + width = bbox[index * 4 + 2]; + } else { + y = bbox[index * 4 + 1]; + x = bbox[index * 4] + bbox[index * 4 + 2] + space; + height = bbox[index * 4 + 3]; + } + dragMarkerStyle.translate = `${x}px ${y}px`; + dragMarkerStyle.width = width ? `${width}px` : ""; + dragMarkerStyle.height = height ? `${height}px` : ""; + } + #computeThumbnailsPosition() { + const positionsX = []; + const positionsY = []; + const positionsLastX = []; + const bbox = new Float32Array(this._thumbnails.length * 4); + let prevX = -Infinity; + let prevY = -Infinity; + let reminder = -1; + let firstRightX; + let lastRightX; + let firstBottomY; + for (let i = 0, ii = this._thumbnails.length; i < ii; i++) { + const { + div + } = this._thumbnails[i]; + const { + offsetTop: y, + offsetLeft: x, + offsetWidth: w, + offsetHeight: h + } = div; + if (w === 0) { + return; + } + bbox[i * 4] = x; + bbox[i * 4 + 1] = y; + bbox[i * 4 + 2] = w; + bbox[i * 4 + 3] = h; + if (x > prevX) { + prevX = x + w / 2; + firstRightX ??= prevX + w; + positionsX.push(prevX); + } + if (y > prevY) { + if (reminder === -1 && positionsX.length > 1) { + reminder = ii % positionsX.length; + } + prevY = y + h / 2; + firstBottomY ??= prevY + h; + positionsY.push(prevY); + } + if (reminder > 0 && i >= ii - reminder) { + const cx = x + w / 2; + positionsLastX.push(cx); + lastRightX ??= cx + w; + } + } + let space; + if (positionsX.length > 1) { + space = (positionsX[1] - firstRightX) / 2; + } else if (positionsY.length > 1) { + space = (positionsY[1] - firstBottomY) / 2; + } else { + space = SPACE_FOR_DRAG_MARKER_WHEN_NO_NEXT_ELEMENT; + } + this.#thumbnailsPositions = { + x: positionsX, + y: positionsY, + lastX: positionsLastX, + space, + lastSpace: positionsLastX.length ? (positionsLastX.at(-1) - lastRightX) / 2 : space, + bbox + }; + this.#isOneColumnView = positionsX.length === 1; + ({ + clientWidth: this.#scrollableContainerWidth, + scrollHeight: this.#scrollableContainerHeight + } = this.scrollableContainer); + } + #addEventListeners() { + this.eventBus.on("resize", ({ + source + }) => { + if (source.thumbnailsView === this.container) { + this.#computeThumbnailsPosition(); + } + }, internalOpt); + this.container.addEventListener("keydown", e => { + const { + target + } = e; + const isCheckbox = target instanceof HTMLInputElement && target.type === "checkbox"; + switch (e.key) { + case "ArrowLeft": + this.#goToNextItem(target, false, true, isCheckbox); + stopEvent(e); + break; + case "ArrowRight": + this.#goToNextItem(target, true, true, isCheckbox); + stopEvent(e); + break; + case "ArrowDown": + this.#goToNextItem(target, true, false, isCheckbox); + stopEvent(e); + break; + case "ArrowUp": + this.#goToNextItem(target, false, false, isCheckbox); + stopEvent(e); + break; + case "Home": + this.#focusThumbnailElement(this._thumbnails[0], isCheckbox); + stopEvent(e); + break; + case "End": + this.#focusThumbnailElement(this._thumbnails.at(-1), isCheckbox); + stopEvent(e); + break; + case "Enter": + case " ": + if (!isCheckbox) { + this.#goToPage(e); + } + break; + case "c": + if (this.#enableSplitMerge && (e.ctrlKey || e.metaKey) && this.#selectedPages?.size) { + this.#copyPages(); + stopEvent(e); + } + break; + case "x": + if (this.#enableSplitMerge && (e.ctrlKey || e.metaKey) && this.#selectedPages?.size) { + this.#cutPages(); + stopEvent(e); + } + break; + case "Delete": + case "Backspace": + if (this.#enableSplitMerge && !this.#isInPasteMode && this.#selectedPages?.size) { + this.#deletePages(); + stopEvent(e); + } + break; + } + }); + this.container.addEventListener("click", e => { + const { + target + } = e; + if (target instanceof HTMLInputElement) { + const pageNumber = parseInt(target.parentElement.getAttribute("page-number"), 10); + this.#selectPage(pageNumber, target.checked); + return; + } + this.#goToPage(e); + }); + this.#addDragListeners(); + this.#addExternalFileDropListeners(); + } + #selectPage(pageNumber, checked) { + if (this.#hasUndoBarVisible) { + this.#dismissUndo(false); + } + const set = this.#selectedPages ??= new Set(); + if (checked) { + set.add(pageNumber); + } else { + set.delete(pageNumber); + } + this.#updateMenuEntries(); + this.#updateStatus("select"); + } + #addDragListeners() { + if (!this.#enableSplitMerge) { + return; + } + this.container.addEventListener("pointerdown", e => { + const { + target: draggedImage, + clientX: clickX, + clientY: clickY, + pointerId: dragPointerId + } = e; + if (e.button !== 0 || this.#isInPasteMode || this._thumbnails.length === 1 || !isNaN(this.#lastDraggedOverIndex) || !draggedImage.classList.contains("thumbnailImageContainer")) { + return; + } + const thumbnail = draggedImage.parentElement; + const pointerDownAC = new AbortController(); + const { + signal: pointerDownSignal + } = pointerDownAC; + let prevDragX = clickX; + let prevDragY = clickY; + let prevScrollTop = this.scrollableContainer.scrollTop; + const scaleFactor = PDFThumbnailViewer.#getScaleFactor(draggedImage); + this.#draggedImageOffsetY = ((scaleFactor - 1) * e.layerY + draggedImage.offsetTop) / scaleFactor; + if (this.#isOneColumnView) { + this.#draggedImageOffsetX = draggedImage.offsetLeft + (scaleFactor - 1) * 0.5 * draggedImage.offsetWidth / scaleFactor; + } else { + this.#draggedImageOffsetX = ((scaleFactor - 1) * e.layerX + draggedImage.offsetLeft) / scaleFactor; + } + this.#draggedImageX = thumbnail.offsetLeft + this.#draggedImageOffsetX; + this.#draggedImageY = thumbnail.offsetTop + this.#draggedImageOffsetY; + this.#draggedImageWidth = draggedImage.offsetWidth / scaleFactor; + this.#draggedImageHeight = draggedImage.offsetHeight / scaleFactor; + this.container.addEventListener("pointermove", ev => { + const { + clientX: x, + clientY: y, + pointerId + } = ev; + if (isNaN(this.#lastDraggedOverIndex)) { + if (pointerId !== dragPointerId || Math.abs(x - clickX) <= DRAG_THRESHOLD_IN_PIXELS && Math.abs(y - clickY) <= DRAG_THRESHOLD_IN_PIXELS) { + return; + } + this.#onStartDragging(thumbnail); + const stopDragging = (_e, isDropping = false) => { + this.#onStopDragging(isDropping); + pointerDownAC.abort(); + }; + const { + signal + } = this.#dragAC; + window.addEventListener("touchmove", stopEvent, { + passive: false, + signal + }); + window.addEventListener("contextmenu", noContextMenu, { + signal + }); + this.scrollableContainer.addEventListener("scrollend", () => { + const { + scrollableContainer: { + clientHeight, + scrollTop + } + } = this; + this.#currentScrollTop = scrollTop; + this.#currentScrollBottom = scrollTop + clientHeight; + const dy = scrollTop - prevScrollTop; + prevScrollTop = scrollTop; + this.#moveDraggedContainer(0, dy); + }, { + passive: true, + signal + }); + window.addEventListener("pointerup", upEv => { + if (upEv.pointerId !== dragPointerId) { + return; + } + window.addEventListener("click", stopEvent, { + capture: true, + once: true, + signal + }); + stopEvent(upEv); + stopDragging(upEv, true); + }, { + signal + }); + window.addEventListener("blur", stopDragging, { + signal + }); + window.addEventListener("pointercancel", stopDragging, { + signal + }); + window.addEventListener("wheel", stopEvent, { + passive: false, + signal + }); + window.addEventListener("keydown", kEv => { + if (kEv.key === "Escape" && !isNaN(this.#lastDraggedOverIndex)) { + stopDragging(kEv); + } + }, { + signal + }); + } + const dx = x - prevDragX; + const dy = y - prevDragY; + prevDragX = x; + prevDragY = y; + this.#moveDraggedContainer(dx, dy); + }, { + passive: true, + signal: pointerDownSignal + }); + window.addEventListener("pointerup", ({ + pointerId + }) => { + if (pointerId !== dragPointerId) { + return; + } + pointerDownAC.abort(); + }, { + signal: pointerDownSignal + }); + window.addEventListener("dragstart", stopEvent, { + capture: true, + signal: pointerDownSignal + }); + }); + } + #addExternalFileDropListeners() { + if (!this.#enableMerge) { + return; + } + const container = this.container; + const signal = this.#abortSignal; + const hasMergeableItem = dataTransfer => { + if (!dataTransfer) { + return false; + } + for (const item of dataTransfer.items) { + if (item.kind === "file" && (item.type === "application/pdf" || item.type.startsWith("image/"))) { + return true; + } + } + return false; + }; + const pointerInContainer = ({ + clientX, + clientY + }) => { + const { + left, + right, + top, + bottom + } = container.getBoundingClientRect(); + return clientX >= left && clientX < right && clientY >= top && clientY < bottom; + }; + container.addEventListener("dragenter", e => { + if (this.#externalDragActive || !isNaN(this.#lastDraggedOverIndex) || !this._thumbnails.length || !hasMergeableItem(e.dataTransfer)) { + return; + } + e.preventDefault(); + e.stopPropagation(); + e.dataTransfer.dropEffect = "copy"; + this.#externalDragActive = true; + this.container.classList.add("isDraggingFile"); + this.#thumbnailsPositions = null; + this.#computeThumbnailsPosition(); + this.#lastDraggedOverIndex = NaN; + }, { + signal + }); + container.addEventListener("dragover", e => { + if (!this.#externalDragActive) { + return; + } + e.preventDefault(); + e.stopPropagation(); + e.dataTransfer.dropEffect = "copy"; + if (!this.#thumbnailsPositions) { + return; + } + const rect = container.getBoundingClientRect(); + const x = e.clientX - rect.left; + const y = e.clientY - rect.top; + const positionData = this.#findClosestThumbnail(x, y); + this.#positionDragMarker(positionData); + }, { + signal + }); + container.addEventListener("dragleave", e => { + if (!this.#externalDragActive) { + return; + } + if (e.relatedTarget && container.contains(e.relatedTarget) || pointerInContainer(e)) { + return; + } + this.#endExternalFileDrag(); + }, { + signal + }); + container.addEventListener("drop", e => { + if (!this.#externalDragActive) { + return; + } + e.preventDefault(); + e.stopPropagation(); + const files = Array.from(e.dataTransfer.files ?? []); + if (isNaN(this.#lastDraggedOverIndex) && this.#thumbnailsPositions) { + const rect = container.getBoundingClientRect(); + this.#findClosestThumbnail(e.clientX - rect.left, e.clientY - rect.top); + } + const insertAfter = isNaN(this.#lastDraggedOverIndex) ? -1 : this.#lastDraggedOverIndex; + this.#endExternalFileDrag(); + if (files.length) { + this.#mergeFiles(files, insertAfter); + } + }, { + signal + }); + } + #endExternalFileDrag() { + this.#externalDragActive = false; + this.container.classList.remove("isDraggingFile"); + this.#dragMarker?.remove(); + this.#dragMarker = null; + this.#lastDraggedOverIndex = NaN; + } + #goToPage(e) { + const container = e.target.closest(".thumbnailImageContainer"); + if (container) { + const pageNumber = parseInt(container.getAttribute("page-number"), 10); + this.linkService.goToPage(pageNumber); + stopEvent(e); + } + } + #focusThumbnailElement(thumbnail, focusCheckbox) { + if (focusCheckbox && thumbnail.checkbox) { + thumbnail.checkbox.focus(); + } else { + thumbnail.imageContainer.focus(); + } + } + #goToNextItem(element, forward, horizontal, navigateCheckboxes = false) { + let currentPageNumber = parseInt(element.parentElement.getAttribute("page-number"), 10); + if (isNaN(currentPageNumber)) { + currentPageNumber = this._currentPageNumber; + } + const increment = forward ? 1 : -1; + let nextThumbnail; + if (horizontal) { + const nextPageNumber = MathClamp(currentPageNumber + increment, 1, this._thumbnails.length + 1); + nextThumbnail = this._thumbnails[nextPageNumber - 1]; + } else { + const currentThumbnail = this._thumbnails[currentPageNumber - 1]; + const { + x: currentX, + y: currentY + } = currentThumbnail.div.getBoundingClientRect(); + let firstWithDifferentY; + for (let i = currentPageNumber - 1 + increment; i >= 0 && i < this._thumbnails.length; i += increment) { + const thumbnail = this._thumbnails[i]; + const { + x, + y + } = thumbnail.div.getBoundingClientRect(); + if (!firstWithDifferentY && y !== currentY) { + firstWithDifferentY = thumbnail; + } + if (x === currentX) { + nextThumbnail = thumbnail; + break; + } + } + nextThumbnail ??= firstWithDifferentY; + } + if (nextThumbnail) { + this.#focusThumbnailElement(nextThumbnail, navigateCheckboxes); + } + } + #findClosestThumbnail(x, y) { + if (!this.#thumbnailsPositions) { + this.#computeThumbnailsPosition(); + } + const { + x: positionsX, + y: positionsY, + lastX: positionsLastX, + space: spaceBetweenThumbnails, + lastSpace: lastSpaceBetweenThumbnails + } = this.#thumbnailsPositions; + const lastDraggedOverIndex = this.#lastDraggedOverIndex; + let xPos = lastDraggedOverIndex % positionsX.length; + let yPos = Math.floor(lastDraggedOverIndex / positionsX.length); + let xArray = yPos === positionsY.length - 1 ? positionsLastX : positionsX; + if (positionsY[yPos] <= y && y < (positionsY[yPos + 1] ?? Infinity) && xArray[xPos] <= x && x < (xArray[xPos + 1] ?? Infinity)) { + return null; + } + let index; + yPos = binarySearchFirstItem(positionsY, cy => y < cy); + if (this.#isOneColumnView) { + index = yPos - 1; + } else { + if (yPos === positionsY.length) { + yPos = positionsY.length - 1; + } else { + const dist1 = Math.abs(positionsY[yPos - 1] - y); + const dist2 = Math.abs(positionsY[yPos] - y); + yPos = dist1 < dist2 ? yPos - 1 : yPos; + } + xArray = yPos === positionsY.length - 1 && positionsLastX.length > 0 ? positionsLastX : positionsX; + xPos = binarySearchFirstItem(xArray, cx => x < cx) - 1; + if (yPos < 0) { + if (xPos <= 0) { + xPos = -1; + } + yPos = 0; + } + index = MathClamp(yPos * positionsX.length + xPos, -1, this._thumbnails.length - 1); + } + if (index === lastDraggedOverIndex) { + return null; + } + this.#lastDraggedOverIndex = index; + const space = yPos === positionsY.length - 1 && positionsLastX.length > 0 && xPos >= 0 ? lastSpaceBetweenThumbnails : spaceBetweenThumbnails; + return [index, space]; + } +} + +;// ./web/annotation_editor_layer_builder.js + + +class AnnotationEditorLayerBuilder { + #annotationLayer = null; + #drawLayer = null; + #onAppend = null; + #structTreeLayer = null; + #textLayer = null; + #uiManager; + constructor(options) { + this.pageIndex = options.pageIndex; + this.accessibilityManager = options.accessibilityManager; + this.l10n = options.l10n; + this.l10n ||= new genericl10n_GenericL10n(); + this.annotationEditorLayer = null; + this.div = null; + this._cancelled = false; + this.#uiManager = options.uiManager; + this.#annotationLayer = options.annotationLayer || null; + this.#textLayer = options.textLayer || null; + this.#drawLayer = options.drawLayer || null; + this.#onAppend = options.onAppend || null; + this.#structTreeLayer = options.structTreeLayer || null; + } + updatePageIndex(newPageIndex) { + this.pageIndex = newPageIndex; + this.annotationEditorLayer?.updatePageIndex(newPageIndex); + } + async render({ + viewport, + intent = "display" + }) { + if (intent !== "display" || this._cancelled) { + return; + } + const clonedViewport = viewport.clone({ + dontFlip: true + }); + if (this.div) { + this.annotationEditorLayer.update({ + viewport: clonedViewport + }); + this.show(); + return; + } + const div = this.div = document.createElement("div"); + div.className = "annotationEditorLayer"; + div.hidden = true; + div.dir = this.#uiManager.direction; + this.#onAppend?.(div); + this.annotationEditorLayer = new AnnotationEditorLayer({ + uiManager: this.#uiManager, + div, + structTreeLayer: this.#structTreeLayer, + accessibilityManager: this.accessibilityManager, + pageIndex: this.pageIndex, + l10n: this.l10n, + viewport: clonedViewport, + annotationLayer: this.#annotationLayer, + textLayer: this.#textLayer, + drawLayer: this.#drawLayer + }); + const parameters = { + viewport: clonedViewport, + div, + annotations: null, + intent + }; + await this.annotationEditorLayer.render(parameters); + this.show(); + } + update(viewport) { + if (this.div) { + this.annotationEditorLayer.update({ + viewport: viewport.clone({ + dontFlip: true + }) + }); + } + } + cancel() { + this._cancelled = true; + if (!this.div) { + return; + } + this.annotationEditorLayer.destroy(); + } + hide() { + if (!this.div) { + return; + } + this.annotationEditorLayer.pause(true); + this.div.hidden = true; + } + show() { + if (!this.div || this.annotationEditorLayer.isInvisible) { + return; + } + this.div.hidden = false; + this.annotationEditorLayer.pause(false); + } +} + +;// ./web/annotation_layer_builder.js + + + + + + +class AnnotationLayerBuilder { + #annotations = null; + #commentManager = null; + #onAppend = null; + #eventAC = null; + #linksInjected = false; + constructor({ + pdfPage, + linkService, + downloadManager, + annotationStorage = null, + imageResourcesPath = "", + renderForms = true, + enableComment = false, + commentManager = null, + enableScripting = false, + hasJSActionsPromise = null, + fieldObjectsPromise = null, + annotationCanvasMap = null, + accessibilityManager = null, + annotationEditorUIManager = null, + onAppend = null + }) { + this.pdfPage = pdfPage; + this.linkService = linkService; + this.downloadManager = downloadManager; + this.imageResourcesPath = imageResourcesPath; + this.renderForms = renderForms; + this.annotationStorage = annotationStorage; + this.enableComment = enableComment; + this.#commentManager = commentManager; + this.enableScripting = enableScripting; + this._hasJSActionsPromise = hasJSActionsPromise || Promise.resolve(false); + this._fieldObjectsPromise = fieldObjectsPromise || Promise.resolve(null); + this._annotationCanvasMap = annotationCanvasMap; + this._accessibilityManager = accessibilityManager; + this._annotationEditorUIManager = annotationEditorUIManager; + this.#onAppend = onAppend; + this.annotationLayer = null; + this.div = null; + this._cancelled = false; + this._eventBus = linkService.eventBus; + } + async render({ + viewport, + intent = "display", + structTreeLayer = null, + optionalContentConfigPromise = null + }) { + if (this.div) { + const optionalContentConfig = await optionalContentConfigPromise; + if (this._cancelled || !this.annotationLayer) { + return; + } + this.annotationLayer.update({ + viewport: viewport.clone({ + dontFlip: true + }), + optionalContentConfig + }); + return; + } + const [annotations, hasJSActions, fieldObjects, optionalContentConfig] = await Promise.all([this.pdfPage.getAnnotations({ + intent + }), this._hasJSActionsPromise, this._fieldObjectsPromise, optionalContentConfigPromise]); + if (this._cancelled) { + return; + } + const div = this.div = document.createElement("div"); + div.className = "annotationLayer"; + this.#onAppend?.(div); + this.#initAnnotationLayer(viewport, structTreeLayer); + if (annotations.length === 0) { + this.#annotations = annotations; + setLayerDimensions(this.div, viewport); + return; + } + await this.annotationLayer.render({ + annotations, + imageResourcesPath: this.imageResourcesPath, + renderForms: this.renderForms, + downloadManager: this.downloadManager, + enableComment: this.enableComment, + enableScripting: this.enableScripting, + hasJSActions, + fieldObjects, + optionalContentConfig + }); + this.#annotations = annotations; + if (this.linkService.isInPresentationMode) { + this.#updatePresentationModeState(PresentationModeState.FULLSCREEN); + } + if (!this.#eventAC) { + this.#eventAC = new AbortController(); + this._eventBus?.on("presentationmodechanged", evt => { + this.#updatePresentationModeState(evt.state); + }, { + signal: this.#eventAC.signal, + ...internalOpt + }); + } + } + #initAnnotationLayer(viewport, structTreeLayer) { + this.annotationLayer = new AnnotationLayer({ + div: this.div, + accessibilityManager: this._accessibilityManager, + annotationCanvasMap: this._annotationCanvasMap, + annotationEditorUIManager: this._annotationEditorUIManager, + annotationStorage: this.annotationStorage, + page: this.pdfPage, + viewport: viewport.clone({ + dontFlip: true + }), + structTreeLayer, + commentManager: this.#commentManager, + linkService: this.linkService + }); + } + cancel() { + this._cancelled = true; + this.#eventAC?.abort(); + this.#eventAC = null; + this.annotationLayer?.destroy(); + } + refreshCanvases() { + this.annotationLayer?.refreshCanvases(); + } + hide() { + if (!this.div) { + return; + } + this.div.hidden = true; + } + hasEditableAnnotations() { + return !!this.annotationLayer?.hasEditableAnnotations(); + } + async injectLinkAnnotations(inferredLinks) { + if (this.#annotations === null) { + throw new Error("`render` method must be called before `injectLinkAnnotations`."); + } + if (this._cancelled || this.#linksInjected) { + return; + } + this.#linksInjected = true; + const newLinks = this.#annotations.length ? this.#checkInferredLinks(inferredLinks) : inferredLinks; + if (!newLinks.length) { + return; + } + await this.annotationLayer.addLinkAnnotations(newLinks); + } + #updatePresentationModeState(state) { + if (!this.div) { + return; + } + let disableFormElements = false; + switch (state) { + case PresentationModeState.FULLSCREEN: + disableFormElements = true; + break; + case PresentationModeState.NORMAL: + break; + default: + return; + } + for (const section of this.div.childNodes) { + if (section.hasAttribute("data-internal-link") || section.classList.contains("mediaAnnotation")) { + continue; + } + section.inert = disableFormElements; + } + } + #checkInferredLinks(inferredLinks) { + function annotationRects(annot) { + if (!annot.quadPoints) { + return [annot.rect]; + } + const rects = []; + for (let i = 2, ii = annot.quadPoints.length; i < ii; i += 8) { + const trX = annot.quadPoints[i]; + const trY = annot.quadPoints[i + 1]; + const blX = annot.quadPoints[i + 2]; + const blY = annot.quadPoints[i + 3]; + rects.push([blX, blY, trX, trY]); + } + return rects; + } + function intersectAnnotations(annot1, annot2) { + const intersections = []; + const annot1Rects = annotationRects(annot1); + const annot2Rects = annotationRects(annot2); + for (const rect1 of annot1Rects) { + for (const rect2 of annot2Rects) { + const intersection = Util.intersect(rect1, rect2); + if (intersection) { + intersections.push(intersection); + } + } + } + return intersections; + } + function areaRects(rects) { + let totalArea = 0; + for (const rect of rects) { + totalArea += Math.abs((rect[2] - rect[0]) * (rect[3] - rect[1])); + } + return totalArea; + } + return inferredLinks.filter(link => { + let linkAreaRects; + for (const annotation of this.#annotations) { + if (annotation.annotationType !== AnnotationType.LINK) { + continue; + } + const intersections = intersectAnnotations(annotation, link); + if (intersections.length === 0) { + continue; + } + linkAreaRects ??= areaRects(annotationRects(link)); + if (areaRects(intersections) / linkAreaRects > 0.5) { + return false; + } + } + return true; + }); + } +} + +;// ./web/autolinker.js + + + + + + +function DOMRectToPDF({ + width, + height, + left, + top +}, pdfPageView) { + if (width === 0 || height === 0) { + return null; + } + const pageBox = pdfPageView.textLayer.div.getBoundingClientRect(); + const bottomLeft = pdfPageView.getPagePoint(left - pageBox.left, top - pageBox.top); + const topRight = pdfPageView.getPagePoint(left - pageBox.left + width, top - pageBox.top + height); + return Util.normalizeRect([bottomLeft[0], bottomLeft[1], topRight[0], topRight[1]]); +} +function calculateLinkPosition(range, pdfPageView) { + const rangeRects = range.getClientRects(); + if (rangeRects.length === 1) { + return { + rect: DOMRectToPDF(rangeRects[0], pdfPageView) + }; + } + const rect = [Infinity, Infinity, -Infinity, -Infinity]; + const quadPoints = []; + let i = 0; + for (const domRect of rangeRects) { + const normalized = DOMRectToPDF(domRect, pdfPageView); + if (normalized === null) { + continue; + } + quadPoints[i] = quadPoints[i + 4] = normalized[0]; + quadPoints[i + 1] = quadPoints[i + 3] = normalized[3]; + quadPoints[i + 2] = quadPoints[i + 6] = normalized[2]; + quadPoints[i + 5] = quadPoints[i + 7] = normalized[1]; + Util.rectBoundingBox(...normalized, rect); + i += 8; + } + return { + quadPoints, + rect + }; +} +function textPosition(container, offset) { + let currentContainer = container; + do { + if (currentContainer.nodeType === Node.TEXT_NODE) { + const currentLength = currentContainer.textContent.length; + if (offset <= currentLength) { + return [currentContainer, offset]; + } + offset -= currentLength; + } else if (currentContainer.firstChild) { + currentContainer = currentContainer.firstChild; + continue; + } + while (!currentContainer.nextSibling && currentContainer !== container) { + currentContainer = currentContainer.parentNode; + } + if (currentContainer !== container) { + currentContainer = currentContainer.nextSibling; + } + } while (currentContainer !== container); + throw new Error("Offset is bigger than container's contents length."); +} +function createLinkAnnotation({ + url, + index, + length +}, pdfPageView, id) { + const highlighter = pdfPageView._textHighlighter; + const [{ + begin, + end + }] = highlighter._convertMatches([index], [length]); + const range = new Range(); + range.setStart(...textPosition(highlighter.textDivs[begin.divIdx], begin.offset)); + range.setEnd(...textPosition(highlighter.textDivs[end.divIdx], end.offset)); + return { + id: `inferred_link_${id}`, + unsafeUrl: url, + url, + annotationType: AnnotationType.LINK, + rotation: 0, + ...calculateLinkPosition(range, pdfPageView), + borderStyle: null + }; +} +class Autolinker { + static #index = 0; + static #regex; + static #numericTLDRegex; + static findLinks(text) { + this.#regex ??= /\b(?:https?:\/\/|mailto:|www\.)(?:[\S--[\p{P}<>]]|\/|[\S--[\[\]]]+[\S--[\p{P}<>]])+|(?=\p{L})[\S--[@\p{Ps}\p{Pe}<>]]{1,64}@([\S--[[\p{P}--\-]<>]]{1,63}(?:\.[\S--[[\p{P}--\-]<>]]{1,63})+)/gv; + const [normalizedText, diffs] = pdf_find_controller_normalize(text, { + ignoreDashEOL: true + }); + const matches = normalizedText.matchAll(this.#regex); + const links = []; + for (const match of matches) { + const [url, emailDomain] = match; + let raw; + if (url.startsWith("www.") || url.startsWith("http://") || url.startsWith("https://")) { + raw = url; + } else if (emailDomain) { + const hostname = URL.parse(`http://${emailDomain}`)?.hostname; + if (!hostname) { + continue; + } + this.#numericTLDRegex ??= /\.\d+$/; + if (this.#numericTLDRegex.test(hostname)) { + continue; + } + } + raw ??= url.startsWith("mailto:") ? url : `mailto:${url}`; + const absoluteURL = createValidAbsoluteUrl(raw, null, { + addDefaultProtocol: true + }); + if (absoluteURL) { + const [index, length] = getOriginalIndex(diffs, match.index, url.length); + links.push({ + url: absoluteURL.href, + index, + length + }); + } + } + return links; + } + static processLinks(pdfPageView) { + return this.findLinks(pdfPageView._textHighlighter.textContentItemsStr.join("\n")).map(link => createLinkAnnotation(link, pdfPageView, this.#index++)); + } +} + +;// ./web/base_pdf_page_view.js + + +class BasePDFPageView extends RenderableView { + #loadingId = null; + #renderError = null; + #renderingState = RenderingStates.INITIAL; + #showCanvas = null; + #startTime = 0; + #tempCanvas = null; + canvas = null; + div = null; + enableOptimizedPartialRendering = false; + enableSelectionRendering = true; + imagesRightClickMinSize = -1; + eventBus = null; + id = null; + imageCoordinates = null; + pageColors = null; + recordedBBoxes = null; + renderingQueue = null; + constructor(options) { + super(); + this.eventBus = options.eventBus; + this.id = options.id; + this.pageColors = options.pageColors || null; + this.renderingQueue = options.renderingQueue; + this.enableOptimizedPartialRendering = options.enableOptimizedPartialRendering ?? false; + this.enableSelectionRendering = options.enableSelectionRendering !== false && FeatureTest.isBackdropFilterSupported; + this.imagesRightClickMinSize = options.imagesRightClickMinSize ?? -1; + this.minDurationToUpdateCanvas = options.minDurationToUpdateCanvas ?? 500; + } + get renderingState() { + return this.#renderingState; + } + set renderingState(state) { + if (state === this.#renderingState) { + return; + } + this.#renderingState = state; + if (this.#loadingId) { + clearTimeout(this.#loadingId); + this.#loadingId = null; + } + switch (state) { + case RenderingStates.PAUSED: + this.div.classList.remove("loading"); + this.#startTime = 0; + this.#showCanvas?.(false); + break; + case RenderingStates.RUNNING: + this.div.classList.add("loadingIcon"); + this.#loadingId = setTimeout(() => { + this.div.classList.add("loading"); + this.#loadingId = null; + }, 0); + this.#startTime = Date.now(); + break; + case RenderingStates.INITIAL: + case RenderingStates.FINISHED: + this.div.classList.remove("loadingIcon", "loading"); + this.#startTime = 0; + break; + } + } + _createCanvas(onShow, hideUntilComplete = false) { + const { + pageColors + } = this; + const hasHCM = !!(pageColors?.background && pageColors?.foreground); + const prevCanvas = this.canvas; + const updateOnFirstShow = !prevCanvas && !hasHCM && !hideUntilComplete; + let canvas = this.canvas = document.createElement("canvas"); + this.#showCanvas = isLastShow => { + if (updateOnFirstShow) { + let tempCanvas = this.#tempCanvas; + if (!isLastShow && this.minDurationToUpdateCanvas > 0) { + if (Date.now() - this.#startTime < this.minDurationToUpdateCanvas) { + return; + } + if (!tempCanvas) { + tempCanvas = this.#tempCanvas = canvas; + canvas = this.canvas = canvas.cloneNode(false); + onShow(canvas); + } + } + if (tempCanvas) { + const ctx = canvas.getContext("2d", { + alpha: false + }); + ctx.drawImage(tempCanvas, 0, 0); + if (isLastShow) { + this.#resetTempCanvas(); + } else { + this.#startTime = Date.now(); + } + return; + } + onShow(canvas); + this.#showCanvas = null; + return; + } + if (!isLastShow) { + return; + } + if (prevCanvas) { + prevCanvas.replaceWith(canvas); + prevCanvas.width = prevCanvas.height = 0; + } else { + onShow(canvas); + } + }; + return { + canvas, + prevCanvas + }; + } + #renderContinueCallback = cont => { + this.#showCanvas?.(false); + if (this.renderingQueue && !this.renderingQueue.isHighestPriority(this)) { + this.renderingState = RenderingStates.PAUSED; + this.resume = () => { + this.renderingState = RenderingStates.RUNNING; + cont(); + }; + return; + } + cont(); + }; + _resetCanvas() { + const { + canvas + } = this; + if (!canvas) { + return; + } + canvas.remove(); + canvas.width = canvas.height = 0; + this.canvas = null; + this.#resetTempCanvas(); + } + #resetTempCanvas() { + if (this.#tempCanvas) { + this.#tempCanvas.width = this.#tempCanvas.height = 0; + this.#tempCanvas = null; + } + } + async _drawCanvas(options, onCancel, onFinish) { + const renderTask = this.renderTask = this.pdfPage.render(options); + renderTask.onContinue = this.#renderContinueCallback; + renderTask.onError = error => { + if (error instanceof RenderingCancelledException) { + onCancel(); + this.#renderError = null; + } + }; + let error = null; + try { + await renderTask.promise; + this.#showCanvas?.(true); + } catch (e) { + if (e instanceof RenderingCancelledException) { + return; + } + error = e; + this.#showCanvas?.(true); + } finally { + this.#renderError = error; + if (renderTask === this.renderTask) { + this.renderTask = null; + if (this.enableOptimizedPartialRendering) { + this.recordedBBoxes ??= renderTask.recordedBBoxes; + } + if (this.imagesRightClickMinSize !== -1) { + this.imageCoordinates ??= this.pdfPage.imageCoordinates; + } + } + } + this.renderingState = RenderingStates.FINISHED; + onFinish(renderTask); + if (error) { + throw error; + } + } + cancelRendering({ + cancelExtraDelay = 0 + } = {}) { + if (this.renderTask) { + this.renderTask.cancel(cancelExtraDelay); + this.renderTask = null; + } + this.resume = null; + } + dispatchPageRender() { + this.eventBus.dispatch("pagerender", { + source: this, + pageNumber: this.id + }); + } + dispatchPageRendered(cssTransform, isDetailView) { + this.eventBus.dispatch("pagerendered", { + source: this, + pageNumber: this.id, + cssTransform, + isDetailView, + timestamp: performance.now(), + error: this.#renderError + }); + } +} + +;// ./web/draw_layer_builder.js + +class DrawLayerBuilder { + #drawLayer = null; + constructor(options) { + this.pageIndex = options.pageIndex; + this.textLayer = options.textLayer || null; + this.filterFactory = options.filterFactory || null; + this.pageColors = options.pageColors || null; + } + async render({ + intent = "display" + }) { + if (intent !== "display" || this.#drawLayer || this._cancelled) { + return; + } + this.#drawLayer = new DrawLayer({ + pageIndex: this.pageIndex, + textLayer: this.textLayer, + filterFactory: this.filterFactory, + pageColors: this.pageColors + }); + } + cancel() { + this._cancelled = true; + this.#drawLayer?.destroy(); + this.#drawLayer = null; + } + setParent(parent) { + this.#drawLayer?.setParent(parent); + } + getDrawLayer() { + return this.#drawLayer; + } +} + +;// ./web/pdf_page_detail_view.js + + + +class PDFPageDetailView extends BasePDFPageView { + #detailArea = null; + renderingCancelled = false; + constructor({ + pageView + }) { + super(pageView); + this.pageView = pageView; + this.renderingId = "detail" + this.id; + this.div = pageView.div; + } + setPdfPage(pdfPage) { + this.pageView.setPdfPage(pdfPage); + } + get pdfPage() { + return this.pageView.pdfPage; + } + get renderingState() { + return super.renderingState; + } + set renderingState(state) { + this.renderingCancelled = false; + super.renderingState = state; + } + reset({ + keepCanvas = false + } = {}) { + const renderingCancelled = this.renderingCancelled || this.renderingState === RenderingStates.RUNNING || this.renderingState === RenderingStates.PAUSED; + this.cancelRendering(); + this.renderingState = RenderingStates.INITIAL; + this.renderingCancelled = renderingCancelled; + if (!keepCanvas) { + this._resetCanvas(); + } + } + #shouldRenderDifferentArea(visibleArea) { + if (!this.#detailArea) { + return true; + } + const minDetailX = this.#detailArea.minX; + const minDetailY = this.#detailArea.minY; + const maxDetailX = this.#detailArea.width + minDetailX; + const maxDetailY = this.#detailArea.height + minDetailY; + if (visibleArea.minX < minDetailX || visibleArea.minY < minDetailY || visibleArea.maxX > maxDetailX || visibleArea.maxY > maxDetailY) { + return true; + } + const { + width: maxWidth, + height: maxHeight, + scale + } = this.pageView.viewport; + if (this.#detailArea.scale !== scale) { + return true; + } + const paddingLeftSize = visibleArea.minX - minDetailX; + const paddingRightSize = maxDetailX - visibleArea.maxX; + const paddingTopSize = visibleArea.minY - minDetailY; + const paddingBottomSize = maxDetailY - visibleArea.maxY; + const MOVEMENT_THRESHOLD = 0.5; + const ratio = (1 + MOVEMENT_THRESHOLD) / MOVEMENT_THRESHOLD; + if (minDetailX > 0 && paddingRightSize / paddingLeftSize > ratio || maxDetailX < maxWidth && paddingLeftSize / paddingRightSize > ratio || minDetailY > 0 && paddingBottomSize / paddingTopSize > ratio || maxDetailY < maxHeight && paddingTopSize / paddingBottomSize > ratio) { + return true; + } + return false; + } + update({ + visibleArea = null, + underlyingViewUpdated = false + } = {}) { + if (underlyingViewUpdated) { + this.cancelRendering(); + this.renderingState = RenderingStates.INITIAL; + return; + } + if (!this.#shouldRenderDifferentArea(visibleArea)) { + return; + } + const { + viewport, + maxCanvasPixels, + capCanvasAreaFactor + } = this.pageView; + const visibleWidth = visibleArea.maxX - visibleArea.minX; + const visibleHeight = visibleArea.maxY - visibleArea.minY; + const visiblePixels = visibleWidth * visibleHeight * OutputScale.pixelRatio ** 2; + const maxDetailToVisibleLinearRatio = Math.sqrt(OutputScale.capPixels(maxCanvasPixels, capCanvasAreaFactor) / visiblePixels); + const maxOverflowScale = (maxDetailToVisibleLinearRatio - 1) / 2; + let overflowScale = Math.min(1, maxOverflowScale); + if (overflowScale < 0) { + overflowScale = 0; + } + const overflowWidth = visibleWidth * overflowScale; + const overflowHeight = visibleHeight * overflowScale; + const minX = Math.max(0, visibleArea.minX - overflowWidth); + const maxX = Math.min(viewport.width, visibleArea.maxX + overflowWidth); + const minY = Math.max(0, visibleArea.minY - overflowHeight); + const maxY = Math.min(viewport.height, visibleArea.maxY + overflowHeight); + const width = maxX - minX; + const height = maxY - minY; + this.#detailArea = { + minX, + minY, + width, + height, + scale: viewport.scale + }; + this.reset({ + keepCanvas: true + }); + } + _getRenderingContext(canvas, transform) { + const baseContext = this.pageView._getRenderingContext(canvas, transform, false); + const recordedBBoxes = this.pdfPage.recordedBBoxes; + if (!recordedBBoxes || !this.enableOptimizedPartialRendering) { + return baseContext; + } + const { + viewport: { + width: vWidth, + height: vHeight + } + } = this.pageView; + const { + width: aWidth, + height: aHeight, + minX: aMinX, + minY: aMinY + } = this.#detailArea; + const detailMinX = aMinX / vWidth; + const detailMinY = aMinY / vHeight; + const detailMaxX = (aMinX + aWidth) / vWidth; + const detailMaxY = (aMinY + aHeight) / vHeight; + return { + ...baseContext, + operationsFilter(index) { + if (recordedBBoxes.isEmpty(index)) { + return false; + } + return recordedBBoxes.minX(index) <= detailMaxX && recordedBBoxes.maxX(index) >= detailMinX && recordedBBoxes.minY(index) <= detailMaxY && recordedBBoxes.maxY(index) >= detailMinY; + } + }; + } + async draw() { + if (this.pageView.detailView !== this) { + return undefined; + } + const hideUntilComplete = this.pageView.renderingState === RenderingStates.FINISHED || this.renderingState === RenderingStates.FINISHED; + if (this.renderingState !== RenderingStates.INITIAL) { + console.error("Must be in new state before drawing"); + this.reset(); + } + const { + div, + pdfPage, + viewport + } = this.pageView; + if (!pdfPage) { + this.renderingState = RenderingStates.FINISHED; + throw new Error("pdfPage is not loaded"); + } + this.renderingState = RenderingStates.RUNNING; + const canvasWrapper = this.pageView._ensureCanvasWrapper(); + const { + canvas, + prevCanvas + } = this._createCanvas(newCanvas => { + if (canvasWrapper.firstElementChild?.tagName === "CANVAS") { + canvasWrapper.firstElementChild.after(newCanvas); + } else { + canvasWrapper.prepend(newCanvas); + } + }, hideUntilComplete); + canvas.ariaHidden = true; + if (this.enableOptimizedPartialRendering) { + canvas.className = "detailView"; + } + const { + width, + height + } = viewport; + const area = this.#detailArea; + const { + pixelRatio + } = OutputScale; + const transform = [pixelRatio, 0, 0, pixelRatio, -area.minX * pixelRatio, -area.minY * pixelRatio]; + canvas.width = area.width * pixelRatio; + canvas.height = area.height * pixelRatio; + const { + style + } = canvas; + style.width = `${area.width * 100 / width}%`; + style.height = `${area.height * 100 / height}%`; + style.top = `${area.minY * 100 / height}%`; + style.left = `${area.minX * 100 / width}%`; + const renderingPromise = this._drawCanvas(this._getRenderingContext(canvas, transform), () => { + this.canvas?.remove(); + this.canvas = prevCanvas; + }, () => { + this.pageView._refreshAnnotationLayer(); + this.dispatchPageRendered(false, true); + }); + div.setAttribute("data-loaded", true); + this.dispatchPageRender(); + return renderingPromise; + } +} + +;// ./web/struct_tree_layer_builder.js + + + + + + + + + + + + + + +const PDF_ROLE_TO_HTML_ROLE = { + Document: null, + DocumentFragment: null, + Part: "group", + Art: "article", + Sect: "group", + Div: "group", + BlockQuote: "blockquote", + Aside: "note", + NonStruct: "none", + P: "paragraph", + H: "heading", + Title: null, + FENote: "note", + Sub: "group", + Lbl: null, + Span: null, + Em: "emphasis", + Strong: "strong", + Note: "note", + Code: "code", + Link: "link", + Annot: "note", + Form: "form", + Ruby: null, + RB: null, + RT: null, + RP: null, + Warichu: null, + WT: null, + WP: null, + L: "list", + LI: "listitem", + LBody: null, + Table: "table", + TR: "row", + TH: "columnheader", + TD: "cell", + THead: "rowgroup", + TBody: "rowgroup", + TFoot: "rowgroup", + Caption: "caption", + Figure: "figure", + Formula: null, + Artifact: null +}; +const ARIA_ROLES_WITH_PROHIBITED_NAMES = new Set(["caption", "code", "emphasis", "generic", "none", "paragraph", "strong"]); +const MathMLElements = new Set(["math", "merror", "mfrac", "mi", "mmultiscripts", "mn", "mo", "mover", "mpadded", "mprescripts", "mroot", "mrow", "ms", "mspace", "msqrt", "mstyle", "msub", "msubsup", "msup", "mtable", "mtd", "mtext", "mtr", "munder", "munderover", "semantics"]); +const MathMLNamespace = "http://www.w3.org/1998/Math/MathML"; +class MathMLSanitizer { + static get sanitizer() { + return pdfjs_shadow(this, "sanitizer", FeatureTest.isSanitizerSupported ? new Sanitizer({ + elements: Array.from(MathMLElements.keys(), name => ({ + name, + namespace: MathMLNamespace + })), + replaceWithChildrenElements: [{ + name: "maction", + namespace: MathMLNamespace + }], + attributes: ["dir", "displaystyle", "mathbackground", "mathcolor", "mathsize", "scriptlevel", "encoding", "display", "linethickness", "intent", "arg", "form", "fence", "separator", "lspace", "rspace", "stretchy", "symmetric", "maxsize", "minsize", "largeop", "movablelimits", "width", "height", "depth", "voffset", "accent", "accentunder", "columnspan", "rowspan"], + comments: false + }) : null); + } +} +const HEADING_PATTERN = /^H(\d+)$/; +class StructTreeLayerBuilder { + #promise; + #treeDom = null; + #treePromise; + #annotationIds = new Set(); + #elementAttributes = new Map(); + #pendingLinkOwnership = new Map(); + #linkTextId = 0; + #structElementIdPrefix = `pdfjs_internal_struct_${getUuid()}_`; + #structElementIds = new Map(); + #structElements = new Map(); + #rawDims; + #elementsToAddToTextLayer = null; + #elementsToHideInTextLayer = null; + #elementsToStealFromTextLayer = null; + constructor(pdfPage, rawDims) { + this.#promise = pdfPage.getStructTree(); + this.#rawDims = rawDims; + } + async render() { + if (this.#treePromise) { + return this.#treePromise; + } + const { + promise, + resolve, + reject + } = Promise.withResolvers(); + this.#treePromise = promise; + try { + const tree = await this.#promise; + this.#collectStructElements(tree); + this.#collectAnnotations(tree); + this.#treeDom = this.#walk(tree); + } catch (ex) { + reject(ex); + } + this.#promise = null; + this.#treeDom?.classList.add("structTree"); + resolve(this.#treeDom); + return promise; + } + async getAriaAttributes(annotationId, { + enableLinkOwnership = false + } = {}) { + try { + await this.render(); + const ownership = this.#pendingLinkOwnership.get(annotationId); + if (ownership && enableLinkOwnership) { + const { + element, + ids + } = ownership; + element.removeAttribute("role"); + if (ids.length > 0) { + this.#elementAttributes.getOrInsertComputed(annotationId, makeMap).set("aria-owns", ids.join(" ")); + } + this.#pendingLinkOwnership.delete(annotationId); + } + return this.#elementAttributes.get(annotationId); + } catch {} + return null; + } + async getAnnotationIds() { + try { + await this.render(); + return this.#annotationIds; + } catch {} + return null; + } + hide() { + if (this.#treeDom && !this.#treeDom.hidden) { + this.#treeDom.hidden = true; + } + } + show() { + if (this.#treeDom?.hidden) { + this.#treeDom.hidden = false; + } + } + #collectStructElements(node) { + if (!node) { + return; + } + if (node.structId) { + this.#structElements.getOrInsert(node.structId, node); + } + for (const child of node.children || []) { + this.#collectStructElements(child); + } + } + #collectAnnotations(node) { + if (!node) { + return; + } + if (node.type === "annotation") { + this.#annotationIds.add(node.id); + return; + } + for (const child of node.children || []) { + this.#collectAnnotations(child); + } + } + #getStructElementId(structId) { + return this.#structElementIds.getOrInsertComputed(structId, () => `${this.#structElementIdPrefix}${this.#structElementIds.size}`); + } + #getHeaderIds(headers) { + const result = [], + visited = new Set(), + pending = headers.toReversed(); + while (pending.length > 0) { + const structId = pending.pop(); + if (visited.has(structId)) { + continue; + } + visited.add(structId); + const header = this.#structElements.get(structId); + if (header?.role !== "TH") { + continue; + } + result.push(this.#getStructElementId(structId)); + if (header.headers) { + for (let i = header.headers.length - 1; i >= 0; i--) { + pending.push(header.headers[i]); + } + } + } + return result; + } + #setAttributes(structElement, htmlElement) { + const { + alt, + colSpan, + headers, + id, + lang, + rowSpan, + short, + structId, + summary + } = structElement; + if (alt !== undefined) { + let added = false; + const label = removeNullCharacters(alt); + for (const child of structElement.children) { + if (child.type === "annotation") { + this.#elementAttributes.getOrInsertComputed(child.id, makeMap).set("aria-label", label); + added = true; + } + } + const role = htmlElement.getAttribute("role") || (htmlElement.localName === "span" ? "generic" : null); + if (!added && role !== "none") { + htmlElement.setAttribute(ARIA_ROLES_WITH_PROHIBITED_NAMES.has(role) ? "aria-description" : "aria-label", label); + } + } + if (id !== undefined) { + htmlElement.setAttribute("aria-owns", id); + } + if (structId !== undefined && this.#structElements.get(structId) === structElement) { + const elementId = this.#getStructElementId(structId); + if (short !== undefined) { + const abbreviation = document.createElement("span"); + abbreviation.setAttribute("id", elementId); + abbreviation.setAttribute("aria-hidden", "true"); + abbreviation.textContent = removeNullCharacters(short); + htmlElement.append(abbreviation); + } else { + htmlElement.setAttribute("id", elementId); + } + } + if (lang !== undefined) { + htmlElement.setAttribute("lang", removeNullCharacters(lang, true)); + } + if (rowSpan !== undefined) { + htmlElement.setAttribute("aria-rowspan", rowSpan); + } + if (colSpan !== undefined) { + htmlElement.setAttribute("aria-colspan", colSpan); + } + if (headers?.length > 0) { + const headerIds = this.#getHeaderIds(headers); + if (headerIds.length > 0) { + htmlElement.setAttribute("aria-describedby", headerIds.join(" ")); + } + } + if (summary !== undefined) { + htmlElement.setAttribute("aria-description", removeNullCharacters(summary)); + } + } + #addImageInTextLayer(node, element) { + const { + alt, + bbox, + children + } = node; + const child = children?.[0]; + if (!this.#rawDims || !alt || !bbox || child?.type !== "content") { + return false; + } + const { + id + } = child; + if (!id) { + return false; + } + element.setAttribute("aria-owns", id); + const img = document.createElement("span"); + (this.#elementsToAddToTextLayer ||= new Map()).set(id, img); + img.setAttribute("role", "img"); + img.setAttribute("aria-label", removeNullCharacters(alt)); + const { + pageHeight, + pageX, + pageY + } = this.#rawDims; + const calc = "calc(var(--total-scale-factor) *"; + const { + style + } = img; + style.width = `${calc}${bbox[2] - bbox[0]}px)`; + style.height = `${calc}${bbox[3] - bbox[1]}px)`; + style.left = `${calc}${bbox[0] - pageX}px)`; + style.top = `${calc}${pageHeight - bbox[3] + pageY}px)`; + return true; + } + updateTextLayer() { + if (this.#elementsToAddToTextLayer) { + for (const [id, img] of this.#elementsToAddToTextLayer) { + document.getElementById(id)?.append(img); + } + this.#elementsToAddToTextLayer.clear(); + this.#elementsToAddToTextLayer = null; + } + if (this.#elementsToHideInTextLayer) { + for (const id of this.#elementsToHideInTextLayer) { + const elem = document.getElementById(id); + if (elem) { + elem.ariaHidden = true; + } + } + this.#elementsToHideInTextLayer.length = 0; + this.#elementsToHideInTextLayer = null; + } + if (this.#elementsToStealFromTextLayer) { + for (let i = 0, ii = this.#elementsToStealFromTextLayer.length; i < ii; i += 2) { + const element = this.#elementsToStealFromTextLayer[i]; + const ids = this.#elementsToStealFromTextLayer[i + 1]; + let textContent = ""; + for (const id of ids) { + const elem = document.getElementById(id); + if (elem) { + textContent += elem.textContent.trim() || ""; + elem.ariaHidden = "true"; + } + } + if (textContent) { + element.textContent = textContent; + } + } + this.#elementsToStealFromTextLayer.length = 0; + this.#elementsToStealFromTextLayer = null; + } + } + #collectIds(node, ids) { + if (!node) { + return; + } + if ("id" in node) { + ids.push(node.id); + } + for (const kid of node.children || []) { + this.#collectIds(kid, ids); + } + } + #walk(node, parentNodes = []) { + if (!node) { + return null; + } + let element; + let visitChildren = true; + if ("role" in node) { + const { + role + } = node; + if (MathMLElements.has(role)) { + element = document.createElementNS(MathMLNamespace, role); + const ids = []; + (this.#elementsToStealFromTextLayer ||= []).push(element, ids); + for (const { + type, + id + } of node.children || []) { + if (type === "content" && id) { + ids.push(id); + } + } + } else { + element = document.createElement("span"); + } + const match = role.match(HEADING_PATTERN); + if (match) { + element.setAttribute("role", "heading"); + element.setAttribute("aria-level", match[1]); + } else if (PDF_ROLE_TO_HTML_ROLE[role]) { + let htmlRole = PDF_ROLE_TO_HTML_ROLE[role]; + if (role === "TH") { + if (node.scope === "Row") { + htmlRole = "rowheader"; + } else if (node.scope === "Column") { + htmlRole = "columnheader"; + } else if (parentNodes.at(-1)?.role === "TR" && parentNodes.at(-2)?.role === "TBody") { + htmlRole = "rowheader"; + } + } else if (role === "Caption") { + const parentRole = parentNodes.at(-1)?.role; + if (parentRole !== "Table" && parentRole !== "Figure") { + htmlRole = null; + } + } + if (htmlRole) { + element.setAttribute("role", htmlRole); + } + } + if (role === "Figure" && this.#addImageInTextLayer(node, element)) { + return element; + } + if (role === "Formula") { + if (node.mathML && MathMLSanitizer.sanitizer) { + visitChildren = false; + element.setHTML(node.mathML, { + sanitizer: MathMLSanitizer.sanitizer + }); + this.#collectIds(node, this.#elementsToHideInTextLayer ||= []); + delete node.alt; + } + if (!node.mathML && node.children.length === 1 && node.children[0].role !== "math") { + element = document.createElementNS(MathMLNamespace, "math"); + delete node.alt; + } + } + } + element ||= document.createElement("span"); + this.#setAttributes(node, element); + if (node.children) { + if (node.children.length === 1 && !("role" in node.children[0]) && "id" in node.children[0] && element.getAttribute("role") !== "none") { + this.#setAttributes(node.children[0], element); + } else if (visitChildren) { + parentNodes.push(node); + for (const kid of node.children) { + element.append(this.#walk(kid, parentNodes)); + } + parentNodes.pop(); + } + } + if (node.role === "Link") { + const annotations = node.children?.filter(child => child.type === "annotation"); + if (annotations?.length === 1) { + const annotation = annotations[0]; + const ids = []; + for (const child of element.children) { + if (child.getAttribute("aria-owns") === annotation.id) { + continue; + } + child.id ||= `${this.#structElementIdPrefix}link_${this.#linkTextId++}`; + ids.push(child.id); + } + this.#pendingLinkOwnership.set(annotation.id, { + element, + ids + }); + } + } + return element; + } +} + +;// ./web/text_accessibility.js + + + + + + +class TextAccessibilityManager { + #enabled = false; + #textChildren = null; + #textNodes = new Map(); + #waitingElements = new Map(); + setTextMapping(textDivs) { + this.#textChildren = textDivs; + } + static #compareElementPositions(e1, e2) { + const rect1 = e1.getBoundingClientRect(); + const rect2 = e2.getBoundingClientRect(); + if (rect1.width === 0 && rect1.height === 0) { + return +1; + } + if (rect2.width === 0 && rect2.height === 0) { + return -1; + } + const top1 = rect1.y; + const bot1 = rect1.y + rect1.height; + const mid1 = rect1.y + rect1.height / 2; + const top2 = rect2.y; + const bot2 = rect2.y + rect2.height; + const mid2 = rect2.y + rect2.height / 2; + if (mid1 <= top2 && mid2 >= bot1) { + return -1; + } + if (mid2 <= top1 && mid1 >= bot2) { + return +1; + } + const centerX1 = rect1.x + rect1.width / 2; + const centerX2 = rect2.x + rect2.width / 2; + return centerX1 - centerX2; + } + enable() { + if (this.#enabled) { + throw new Error("TextAccessibilityManager is already enabled."); + } + if (!this.#textChildren) { + throw new Error("Text divs and strings have not been set."); + } + this.#enabled = true; + this.#textChildren = this.#textChildren.slice(); + this.#textChildren.sort(TextAccessibilityManager.#compareElementPositions); + if (this.#textNodes.size > 0) { + const textChildren = this.#textChildren; + for (const [id, nodeIndex] of this.#textNodes) { + const element = document.getElementById(id); + if (!element) { + this.#textNodes.delete(id); + continue; + } + this.#addIdToAriaOwns(id, textChildren[nodeIndex]); + } + } + for (const [element, isRemovable] of this.#waitingElements) { + this.addPointerInTextLayer(element, isRemovable); + } + this.#waitingElements.clear(); + } + disable() { + if (!this.#enabled) { + return; + } + this.#waitingElements.clear(); + this.#textChildren = null; + this.#enabled = false; + } + removePointerInTextLayer(element) { + if (!this.#enabled) { + this.#waitingElements.delete(element); + return; + } + const children = this.#textChildren; + if (!children?.length) { + return; + } + const { + id + } = element; + const nodeIndex = this.#textNodes.get(id); + if (nodeIndex === undefined) { + return; + } + const node = children[nodeIndex]; + this.#textNodes.delete(id); + let owns = node.getAttribute("aria-owns"); + if (owns?.includes(id)) { + owns = owns.split(" ").filter(x => x !== id).join(" "); + if (owns) { + node.setAttribute("aria-owns", owns); + } else { + node.removeAttribute("aria-owns"); + node.setAttribute("role", "presentation"); + } + } + } + #addIdToAriaOwns(id, node) { + const owns = node.getAttribute("aria-owns"); + if (!owns?.includes(id)) { + node.setAttribute("aria-owns", owns ? `${owns} ${id}` : id); + } + node.removeAttribute("role"); + } + addPointerInTextLayer(element, isRemovable) { + const { + id + } = element; + if (!id) { + return null; + } + if (!this.#enabled) { + this.#waitingElements.set(element, isRemovable); + return null; + } + if (isRemovable) { + this.removePointerInTextLayer(element); + } + const children = this.#textChildren; + if (!children?.length) { + return null; + } + const index = binarySearchFirstItem(children, node => TextAccessibilityManager.#compareElementPositions(element, node) < 0); + const nodeIndex = Math.max(0, index - 1); + const child = children[nodeIndex]; + this.#addIdToAriaOwns(id, child); + this.#textNodes.set(id, nodeIndex); + const parent = child.parentNode; + return parent?.classList.contains("markedContent") ? parent.id : null; + } + moveElementInDOM(container, element, contentElement, isRemovable) { + const id = this.addPointerInTextLayer(contentElement, isRemovable); + if (!container.hasChildNodes()) { + container.append(element); + return id; + } + const children = Array.from(container.childNodes).filter(node => node !== element); + if (children.length === 0) { + return id; + } + const index = binarySearchFirstItem(children, node => TextAccessibilityManager.#compareElementPositions(element, node) < 0); + if (index === 0) { + children[0].before(element); + } else { + children[index - 1].after(element); + } + return id; + } +} + +;// ./web/text_highlighter.js + + + +class TextHighlighter { + #eventAC = null; + constructor({ + findController, + eventBus, + pageIndex + }) { + this.findController = findController; + this.matches = []; + this.eventBus = eventBus; + this.pageIdx = pageIndex; + this.textDivs = null; + this.textContentItemsStr = null; + this.enabled = false; + } + setTextMapping(divs, texts) { + this.textDivs = divs; + this.textContentItemsStr = texts; + } + enable() { + if (!this.textDivs || !this.textContentItemsStr) { + throw new Error("Text divs and strings have not been set."); + } + if (this.enabled) { + throw new Error("TextHighlighter is already enabled."); + } + this.enabled = true; + if (!this.#eventAC) { + this.#eventAC = new AbortController(); + this.eventBus.on("updatetextlayermatches", evt => { + if (evt.pageIndex === this.pageIdx || evt.pageIndex === -1) { + this._updateMatches(); + } + }, { + signal: this.#eventAC.signal, + ...internalOpt + }); + } + this._updateMatches(); + } + disable() { + if (!this.enabled) { + return; + } + this.enabled = false; + this.#eventAC?.abort(); + this.#eventAC = null; + this._updateMatches(true); + } + _convertMatches(matches, matchesLength) { + if (!matches) { + return []; + } + const { + textContentItemsStr + } = this; + let i = 0, + iIndex = 0; + const end = textContentItemsStr.length - 1; + const result = []; + for (let m = 0, mm = matches.length; m < mm; m++) { + let matchIdx = matches[m]; + while (i !== end && matchIdx >= iIndex + textContentItemsStr[i].length) { + iIndex += textContentItemsStr[i].length; + i++; + } + if (i === textContentItemsStr.length) { + console.error("Could not find a matching mapping"); + } + const match = { + begin: { + divIdx: i, + offset: matchIdx - iIndex + } + }; + matchIdx += matchesLength[m]; + while (i !== end && matchIdx > iIndex + textContentItemsStr[i].length) { + iIndex += textContentItemsStr[i].length; + i++; + } + match.end = { + divIdx: i, + offset: matchIdx - iIndex + }; + result.push(match); + } + return result; + } + _renderMatches(matches) { + if (matches.length === 0) { + return; + } + const { + findController, + pageIdx + } = this; + const { + textContentItemsStr, + textDivs + } = this; + const isSelectedPage = pageIdx === findController.selected.pageIdx; + const selectedMatchIdx = findController.selected.matchIdx; + const highlightAll = findController.state.highlightAll; + let prevEnd = null; + const infinity = { + divIdx: -1, + offset: undefined + }; + function beginText(begin, className) { + const divIdx = begin.divIdx; + textDivs[divIdx].textContent = ""; + return appendTextToDiv(divIdx, 0, begin.offset, className); + } + function appendTextToDiv(divIdx, fromOffset, toOffset, className) { + let div = textDivs[divIdx]; + if (div.nodeType === Node.TEXT_NODE) { + const span = document.createElement("span"); + div.before(span); + span.append(div); + textDivs[divIdx] = span; + div = span; + } + const content = textContentItemsStr[divIdx].substring(fromOffset, toOffset); + const node = document.createTextNode(content); + if (className) { + const span = document.createElement("span"); + span.className = `${className} appended`; + span.append(node); + div.append(span); + return className.includes("selected") ? span : null; + } + div.append(node); + return 0; + } + let i0 = selectedMatchIdx, + i1 = i0 + 1; + if (highlightAll) { + i0 = 0; + i1 = matches.length; + } else if (!isSelectedPage) { + return; + } + let lastDivIdx = -1; + let lastOffset = -1; + for (let i = i0; i < i1; i++) { + const match = matches[i]; + const begin = match.begin; + if (begin.divIdx === lastDivIdx && begin.offset === lastOffset) { + continue; + } + lastDivIdx = begin.divIdx; + lastOffset = begin.offset; + const end = match.end; + const isSelected = isSelectedPage && i === selectedMatchIdx; + const highlightSuffix = isSelected ? " selected" : ""; + let selectedSpan = null; + if (!prevEnd || begin.divIdx !== prevEnd.divIdx) { + if (prevEnd !== null) { + appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset); + } + beginText(begin); + } else { + appendTextToDiv(prevEnd.divIdx, prevEnd.offset, begin.offset); + } + if (begin.divIdx === end.divIdx) { + selectedSpan = appendTextToDiv(begin.divIdx, begin.offset, end.offset, "highlight" + highlightSuffix); + } else { + selectedSpan = appendTextToDiv(begin.divIdx, begin.offset, infinity.offset, "highlight begin" + highlightSuffix); + for (let n0 = begin.divIdx + 1, n1 = end.divIdx; n0 < n1; n0++) { + textDivs[n0].className = "highlight middle" + highlightSuffix; + } + beginText(end, "highlight end" + highlightSuffix); + } + prevEnd = end; + if (isSelected) { + findController.scrollMatchIntoView({ + element: selectedSpan, + pageIndex: pageIdx, + matchIndex: selectedMatchIdx + }); + } + } + if (prevEnd) { + appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset); + } + } + _updateMatches(reset = false) { + if (!this.enabled && !reset) { + return; + } + const { + findController, + matches, + pageIdx + } = this; + const { + textContentItemsStr, + textDivs + } = this; + let clearedUntilDivIdx = -1; + for (const match of matches) { + const begin = Math.max(clearedUntilDivIdx, match.begin.divIdx); + for (let n = begin, end = match.end.divIdx; n <= end; n++) { + const div = textDivs[n]; + div.textContent = textContentItemsStr[n]; + div.className = ""; + } + clearedUntilDivIdx = match.end.divIdx + 1; + } + if (!findController?.highlightMatches || reset) { + return; + } + const pageMatches = findController.pageMatches[pageIdx] || null; + const pageMatchesLength = findController.pageMatchesLength[pageIdx] || null; + this.matches = this._convertMatches(pageMatches, pageMatchesLength); + this._renderMatches(this.matches); + } +} + +;// ./web/text_layer_builder.js + + + + + + + + + + + + + + +class TextLayerBuilder { + #abortSignal = null; + #enablePermissions = false; + #onAppend = null; + #renderingDone = false; + #textLayer = null; + static #textLayers = new Map(); + static #selectionChangeAC = null; + constructor({ + pdfPage, + highlighter = null, + accessibilityManager = null, + enablePermissions = false, + onAppend = null, + abortSignal = null + }) { + this.pdfPage = pdfPage; + this.highlighter = highlighter; + this.accessibilityManager = accessibilityManager; + this.#enablePermissions = enablePermissions === true; + this.#onAppend = onAppend; + this.#abortSignal = abortSignal; + this.div = document.createElement("div"); + this.div.tabIndex = 0; + this.div.className = "textLayer"; + } + async render({ + viewport, + images, + textContentParams = null + }) { + if (this.#renderingDone && this.#textLayer) { + this.#textLayer.update({ + viewport, + onBefore: this.hide.bind(this) + }); + this.show(); + return; + } + this.cancel(); + this.#textLayer = new TextLayer({ + textContentSource: this.pdfPage.streamTextContent(textContentParams || { + includeMarkedContent: true, + disableNormalization: true + }), + images, + container: this.div, + viewport + }); + const { + textDivs, + textContentItemsStr + } = this.#textLayer; + this.highlighter?.setTextMapping(textDivs, textContentItemsStr); + this.accessibilityManager?.setTextMapping(textDivs); + await this.#textLayer.render(); + this.#renderingDone = true; + const endOfContent = document.createElement("div"); + endOfContent.className = "endOfContent"; + this.div.append(endOfContent); + this.#bindMouse(endOfContent); + this.#onAppend?.(this.div); + this.highlighter?.enable(); + this.accessibilityManager?.enable(); + } + hide() { + if (!this.div.hidden && this.#renderingDone) { + this.highlighter?.disable(); + this.div.hidden = true; + } + } + show() { + if (this.div.hidden && this.#renderingDone) { + this.div.hidden = false; + this.highlighter?.enable(); + } + } + cancel() { + this.#textLayer?.cancel(); + this.#textLayer = null; + this.#renderingDone = false; + this.div.replaceChildren(); + this.highlighter?.disable(); + this.accessibilityManager?.disable(); + TextLayerBuilder.#removeGlobalSelectionListener(this.div); + } + #bindMouse(end) { + const { + div + } = this; + const abortSignal = this.#abortSignal; + const opts = abortSignal ? { + signal: abortSignal + } : null; + div.addEventListener("mousedown", () => { + div.classList.add("selecting"); + }, opts); + div.addEventListener("copy", event => { + if (!this.#enablePermissions) { + const selection = document.getSelection(); + event.clipboardData.setData("text/plain", removeNullCharacters(normalizeUnicode(selection.toString()))); + } + stopEvent(event); + }, opts); + TextLayerBuilder.#textLayers.set(div, end); + TextLayerBuilder.#enableGlobalSelectionListener(abortSignal); + } + static #removeGlobalSelectionListener(textLayerDiv) { + this.#textLayers.delete(textLayerDiv); + if (this.#textLayers.size === 0) { + this.#selectionChangeAC?.abort(); + this.#selectionChangeAC = null; + } + } + static #enableGlobalSelectionListener(globalAbortSignal) { + if (this.#selectionChangeAC) { + return; + } + this.#selectionChangeAC = new AbortController(); + const signal = globalAbortSignal ? AbortSignal.any([this.#selectionChangeAC.signal, globalAbortSignal]) : this.#selectionChangeAC.signal; + const reset = (end, textLayer) => { + textLayer.append(end); + end.style.width = ""; + end.style.height = ""; + textLayer.classList.remove("selecting"); + }; + let isPointerDown = false; + document.addEventListener("pointerdown", () => { + isPointerDown = true; + }, { + signal + }); + document.addEventListener("pointerup", () => { + isPointerDown = false; + this.#textLayers.forEach(reset); + }, { + signal + }); + window.addEventListener("blur", () => { + isPointerDown = false; + this.#textLayers.forEach(reset); + }, { + signal + }); + document.addEventListener("keyup", () => { + if (!isPointerDown) { + this.#textLayers.forEach(reset); + } + }, { + signal + }); + var isFirefoxOrModernChromium, prevRange; + document.addEventListener("selectionchange", () => { + const selection = document.getSelection(); + if (selection.rangeCount === 0) { + this.#textLayers.forEach(reset); + return; + } + const activeTextLayers = new Set(); + for (let i = 0; i < selection.rangeCount; i++) { + const range = selection.getRangeAt(i); + for (const textLayerDiv of this.#textLayers.keys()) { + if (!activeTextLayers.has(textLayerDiv) && range.intersectsNode(textLayerDiv)) { + activeTextLayers.add(textLayerDiv); + } + } + } + for (const [textLayerDiv, endDiv] of this.#textLayers) { + if (activeTextLayers.has(textLayerDiv)) { + textLayerDiv.classList.add("selecting"); + } else { + reset(endDiv, textLayerDiv); + } + } + if (isFirefoxOrModernChromium === undefined) { + isFirefoxOrModernChromium = getComputedStyle(this.#textLayers.values().next().value).getPropertyValue("-moz-user-select") === "none"; + if (!isFirefoxOrModernChromium) { + const chromiumVersion = navigator.userAgentData ? navigator.userAgentData.brands.find(({ + brand + }) => brand === "Chromium")?.version : /\bChrome\/(\d+)\b/.exec(navigator.userAgent)?.[1]; + isFirefoxOrModernChromium = !!chromiumVersion && parseInt(chromiumVersion, 10) >= 148; + } + } + if (isFirefoxOrModernChromium) { + return; + } + const range = selection.getRangeAt(0); + const modifyStart = prevRange && (range.compareBoundaryPoints(Range.END_TO_END, prevRange) === 0 || range.compareBoundaryPoints(Range.START_TO_END, prevRange) === 0); + let anchor = modifyStart ? range.startContainer : range.endContainer; + if (anchor.nodeType === Node.TEXT_NODE) { + anchor = anchor.parentNode; + } + if (anchor.classList?.contains("highlight")) { + anchor = anchor.parentNode; + } + if (!modifyStart && range.endOffset === 0) { + do { + while (!anchor.previousSibling) { + anchor = anchor.parentNode; + } + anchor = anchor.previousSibling; + } while (!anchor.childNodes.length); + } + const parentTextLayer = anchor.parentElement?.closest(".textLayer"); + const endDiv = this.#textLayers.get(parentTextLayer); + if (endDiv) { + endDiv.style.width = parentTextLayer.style.width; + endDiv.style.height = parentTextLayer.style.height; + endDiv.style.userSelect = "text"; + anchor.parentElement.insertBefore(endDiv, modifyStart ? anchor : anchor.nextSibling); + } + prevRange = range.cloneRange(); + }, { + signal + }); + } +} + +;// ./web/pdf_page_view.js + + + + + + + + + + + + + + + + + + + + + +const DEFAULT_LAYER_PROPERTIES = null; +const LAYERS_ORDER = new Map([["canvasWrapper", 0], ["textLayer", 1], ["annotationLayer", 2], ["annotationEditorLayer", 3], ["xfaLayer", 3]]); +class PDFPageView extends BasePDFPageView { + #abortSignal = null; + #annotationMode = AnnotationMode.ENABLE_FORMS; + #canvasWrapper = null; + #commentManager = null; + #enableAutoLinking = true; + #hasRestrictedScaling = false; + #isEditing = false; + #layerProperties = null; + #needsRestrictedScaling = false; + #originalViewport = null; + #previousRotation = null; + #scaleRoundX = 1; + #scaleRoundY = 1; + #textLayerMode = TextLayerMode.ENABLE; + #userUnit = 1; + #useThumbnailCanvas = { + directDrawing: true, + initialOptionalContent: true, + regularAnnotations: true + }; + #layers = [null, null, null, null]; + constructor(options) { + super(options); + const { + container, + defaultViewport + } = options; + this.renderingId = "page" + this.id; + this.#layerProperties = options.layerProperties || DEFAULT_LAYER_PROPERTIES; + this.#abortSignal = options.abortSignal || null; + this.pdfPage = null; + this.pageLabel = null; + this.rotation = 0; + this.scale = options.scale || (/* inlined export .DEFAULT_SCALE */1); + this.viewport = defaultViewport; + this.pdfPageRotate = defaultViewport.rotation; + this._optionalContentConfigPromise = options.optionalContentConfigPromise || null; + this.#textLayerMode = options.textLayerMode ?? TextLayerMode.ENABLE; + this.#annotationMode = options.annotationMode ?? AnnotationMode.ENABLE_FORMS; + this.imageResourcesPath = options.imageResourcesPath || ""; + this.enableDetailCanvas = options.enableDetailCanvas ?? true; + this.maxCanvasPixels = options.maxCanvasPixels ?? AppOptions.get("maxCanvasPixels"); + this.maxCanvasDim = options.maxCanvasDim || AppOptions.get("maxCanvasDim"); + this.capCanvasAreaFactor = options.capCanvasAreaFactor ?? AppOptions.get("capCanvasAreaFactor"); + this.#enableAutoLinking = options.enableAutoLinking !== false; + this.#commentManager = options.commentManager || null; + this.l10n = options.l10n; + this.l10n ||= new genericl10n_GenericL10n(); + this._isStandalone = !this.renderingQueue?.hasViewer(); + this._container = container; + this._annotationCanvasMap = null; + this.annotationLayer = null; + this.annotationEditorLayer = null; + this.textLayer = null; + this.xfaLayer = null; + this.structTreeLayer = null; + this.drawLayer = null; + this.detailView = null; + const div = document.createElement("div"); + div.className = "page"; + div.setAttribute("data-page-number", this.id); + div.setAttribute("role", "region"); + div.setAttribute("data-l10n-id", "pdfjs-page-landmark"); + div.setAttribute("data-l10n-args", JSON.stringify({ + page: this.id + })); + this.div = div; + this.#setDimensions(); + container?.append(div); + if (this._isStandalone) { + container?.style.setProperty("--scale-factor", this.scale * PixelsPerInch.PDF_TO_CSS_UNITS); + if (this.pageColors?.background) { + container?.style.setProperty("--page-bg-color", this.pageColors.background); + } + const { + optionalContentConfigPromise + } = options; + if (optionalContentConfigPromise) { + optionalContentConfigPromise.then(optionalContentConfig => { + if (optionalContentConfigPromise !== this._optionalContentConfigPromise) { + return; + } + this.#useThumbnailCanvas.initialOptionalContent = optionalContentConfig.hasInitialVisibility; + }); + } + if (!options.l10n) { + this.l10n.translate(this.div); + } + } + } + clone(id) { + const clone = new PDFPageView({ + container: null, + eventBus: this.eventBus, + pagesColors: this.pageColors, + renderingQueue: this.renderingQueue, + enableOptimizedPartialRendering: this.enableOptimizedPartialRendering, + minDurationToUpdateCanvas: this.minDurationToUpdateCanvas, + defaultViewport: this.viewport, + id, + layerProperties: this.#layerProperties, + abortSignal: this.#abortSignal, + scale: this.scale, + optionalContentConfigPromise: this._optionalContentConfigPromise, + textLayerMode: this.#textLayerMode, + annotationMode: this.#annotationMode, + imageResourcesPath: this.imageResourcesPath, + enableDetailCanvas: this.enableDetailCanvas, + maxCanvasPixels: this.maxCanvasPixels, + maxCanvasDim: this.maxCanvasDim, + capCanvasAreaFactor: this.capCanvasAreaFactor, + enableAutoLinking: this.#enableAutoLinking, + commentManager: this.#commentManager, + l10n: this.l10n + }); + clone.setPdfPage(this.pdfPage.clone(id - 1)); + return clone; + } + #addLayer(div, name) { + const pos = LAYERS_ORDER.get(name); + const oldDiv = this.#layers[pos]; + this.#layers[pos] = div; + if (oldDiv) { + oldDiv.replaceWith(div); + return; + } + for (let i = pos - 1; i >= 0; i--) { + const layer = this.#layers[i]; + if (layer) { + layer.after(div); + return; + } + } + this.div.prepend(div); + } + #setDimensions() { + const { + div, + viewport + } = this; + if (viewport.userUnit !== this.#userUnit) { + if (viewport.userUnit !== 1) { + div.style.setProperty("--user-unit", viewport.userUnit); + } else { + div.style.removeProperty("--user-unit"); + } + this.#userUnit = viewport.userUnit; + } + if (this.pdfPage) { + if (this.#previousRotation === viewport.rotation) { + return; + } + this.#previousRotation = viewport.rotation; + } + setLayerDimensions(div, viewport, true, false); + } + updatePageNumber(newPageNumber) { + const oldPageNumber = this.id; + if (oldPageNumber !== newPageNumber) { + this.id = newPageNumber; + this.renderingId = `page${newPageNumber}`; + if (this.pdfPage) { + this.pdfPage.pageNumber = newPageNumber; + } + this.setPageLabel(this.pageLabel); + const { + div + } = this; + div.setAttribute("data-page-number", newPageNumber); + div.setAttribute("data-l10n-args", JSON.stringify({ + page: newPageNumber + })); + this._textHighlighter.pageIdx = newPageNumber - 1; + } + this.#layerProperties.annotationEditorUIManager?.updatePageIndex(oldPageNumber - 1, newPageNumber - 1); + } + setPdfPage(pdfPage) { + if (this._isStandalone && (this.pageColors?.foreground === "CanvasText" || this.pageColors?.background === "Canvas")) { + this._container?.style.setProperty("--hcm-highlight-filter", pdfPage.filterFactory.addHighlightHCMFilter("highlight", "CanvasText", "Canvas", "HighlightText", "Highlight")); + this._container?.style.setProperty("--hcm-highlight-selected-filter", pdfPage.filterFactory.addHighlightHCMFilter("highlight_selected", "CanvasText", "Canvas", "HighlightText", "Highlight")); + } + this.pdfPage = pdfPage; + this.pdfPageRotate = pdfPage.rotate; + const totalRotation = (this.rotation + this.pdfPageRotate) % 360; + this.viewport = pdfPage.getViewport({ + scale: this.scale * PixelsPerInch.PDF_TO_CSS_UNITS, + rotation: totalRotation + }); + this.#setDimensions(); + this.reset(); + } + destroy() { + this.reset(); + this.pdfPage?.cleanup(); + } + deleteMe(isCut) { + if (isCut) { + this.div.remove(); + return; + } + this.destroy(); + this.#layerProperties.annotationEditorUIManager?.deletePage(this.id); + } + hasEditableAnnotations() { + return !!this.annotationLayer?.hasEditableAnnotations(); + } + get _textHighlighter() { + return pdfjs_shadow(this, "_textHighlighter", new TextHighlighter({ + pageIndex: this.id - 1, + eventBus: this.eventBus, + findController: this.#layerProperties.findController + })); + } + #dispatchLayerRendered(name, error) { + this.eventBus.dispatch(name, { + source: this, + pageNumber: this.id, + error + }); + } + async #renderAnnotationLayer(textLayerPromise = null) { + const { + annotationLayer, + textLayer + } = this; + let error = null; + try { + await this.annotationLayer.render({ + viewport: this.viewport, + intent: "display", + structTreeLayer: this.structTreeLayer, + optionalContentConfigPromise: this._optionalContentConfigPromise + }); + } catch (ex) { + console.error("#renderAnnotationLayer:", ex); + error = ex; + } finally { + this.#dispatchLayerRendered("annotationlayerrendered", error); + } + if (this.#enableAutoLinking && textLayerPromise) { + this.#injectLinkAnnotations(textLayerPromise, annotationLayer, textLayer); + } + } + _refreshAnnotationLayer() { + if (this._annotationCanvasMap?.size) { + this.annotationLayer?.refreshCanvases(); + } + } + async #renderAnnotationEditorLayer() { + let error = null; + try { + await this.annotationEditorLayer.render({ + viewport: this.viewport, + intent: "display" + }); + } catch (ex) { + console.error("#renderAnnotationEditorLayer:", ex); + error = ex; + } finally { + this.#dispatchLayerRendered("annotationeditorlayerrendered", error); + } + } + async #renderDrawLayer() { + try { + await this.drawLayer.render({ + intent: "display" + }); + } catch (ex) { + console.error("#renderDrawLayer:", ex); + } + } + async #renderXfaLayer() { + let error = null; + try { + const result = await this.xfaLayer.render({ + viewport: this.viewport, + intent: "display" + }); + if (result?.textDivs && this._textHighlighter) { + this.#buildXfaTextContentItems(result.textDivs); + } + } catch (ex) { + console.error("#renderXfaLayer:", ex); + error = ex; + } finally { + if (this.xfaLayer?.div) { + this.l10n.pause(); + this.#addLayer(this.xfaLayer.div, "xfaLayer"); + this.l10n.resume(); + } + this.#dispatchLayerRendered("xfalayerrendered", error); + } + } + async #renderTextLayer() { + let error = null; + try { + await this.textLayer.render({ + viewport: this.viewport, + images: this.imageCoordinates ? new TextLayerImages(this.imagesRightClickMinSize, this.imageCoordinates, this.viewport, () => this.canvas) : null + }); + } catch (ex) { + if (ex instanceof AbortException) { + return; + } + console.error("#renderTextLayer:", ex); + error = ex; + } + this.#dispatchLayerRendered("textlayerrendered", error); + this.#renderStructTreeLayer(); + } + async #renderStructTreeLayer() { + const treeDom = await this.structTreeLayer?.render(); + if (treeDom) { + this.l10n.pause(); + this.structTreeLayer?.updateTextLayer(); + if (this.canvas && treeDom.parentNode !== this.canvas) { + this.canvas.append(treeDom); + } + this.l10n.resume(); + } + this.structTreeLayer?.show(); + } + async #buildXfaTextContentItems(textDivs) { + const text = await this.pdfPage.getTextContent(); + const items = []; + for (const item of text.items) { + items.push(item.str); + } + this._textHighlighter.setTextMapping(textDivs, items); + this._textHighlighter.enable(); + } + async #injectLinkAnnotations(textLayerPromise, annotationLayer, textLayer) { + let error = null; + try { + await textLayerPromise; + if (annotationLayer !== this.annotationLayer || textLayer !== this.textLayer) { + return; + } + await annotationLayer.injectLinkAnnotations(Autolinker.processLinks(this)); + } catch (ex) { + console.error("#injectLinkAnnotations:", ex); + error = ex; + } + this.#dispatchLayerRendered("linkannotationsadded", error); + } + _resetCanvas() { + super._resetCanvas(); + this.#originalViewport = null; + } + reset({ + keepAnnotationLayer = false, + keepAnnotationEditorLayer = false, + keepXfaLayer = false, + keepTextLayer = false, + keepCanvasWrapper = false, + preserveDetailViewState = false + } = {}) { + const keepPdfBugGroups = this.pdfPage?._pdfBug ?? false; + this.cancelRendering({ + keepAnnotationLayer, + keepAnnotationEditorLayer, + keepXfaLayer, + keepTextLayer + }); + this.renderingState = RenderingStates.INITIAL; + const div = this.div; + const childNodes = div.childNodes, + annotationLayerNode = keepAnnotationLayer && this.annotationLayer?.div || null, + annotationEditorLayerNode = keepAnnotationEditorLayer && this.annotationEditorLayer?.div || null, + xfaLayerNode = keepXfaLayer && this.xfaLayer?.div || null, + textLayerNode = keepTextLayer && this.textLayer?.div || null, + canvasWrapperNode = keepCanvasWrapper && this.#canvasWrapper || null; + for (let i = childNodes.length - 1; i >= 0; i--) { + const node = childNodes[i]; + switch (node) { + case annotationLayerNode: + case annotationEditorLayerNode: + case xfaLayerNode: + case textLayerNode: + case canvasWrapperNode: + continue; + } + if (keepPdfBugGroups && node.classList.contains("pdfBugGroupsLayer")) { + continue; + } + node.remove(); + const layerIndex = this.#layers.indexOf(node); + if (layerIndex >= 0) { + this.#layers[layerIndex] = null; + } + } + div.removeAttribute("data-loaded"); + if (annotationLayerNode) { + this.annotationLayer.hide(); + } + if (annotationEditorLayerNode) { + this.annotationEditorLayer.hide(); + } + if (xfaLayerNode) { + this.xfaLayer.hide(); + } + if (textLayerNode) { + this.textLayer.hide(); + } + this.structTreeLayer?.hide(); + if (!keepCanvasWrapper && this.#canvasWrapper) { + this.#canvasWrapper = null; + this._resetCanvas(); + } + if (!preserveDetailViewState) { + this.detailView?.reset({ + keepCanvas: keepCanvasWrapper + }); + if (!keepCanvasWrapper) { + this.detailView = null; + } + } + } + toggleEditingMode(isEditing) { + this.#isEditing = isEditing; + if (!this.hasEditableAnnotations()) { + return; + } + this.reset({ + keepAnnotationLayer: true, + keepAnnotationEditorLayer: true, + keepXfaLayer: true, + keepTextLayer: true, + keepCanvasWrapper: true + }); + } + updateVisibleArea(visibleArea) { + if (this.enableDetailCanvas) { + if (this.#needsRestrictedScaling && this.maxCanvasPixels > 0 && visibleArea) { + this.detailView ??= new PDFPageDetailView({ + pageView: this, + enableOptimizedPartialRendering: this.enableOptimizedPartialRendering, + imagesRightClickMinSize: -1 + }); + this.detailView.update({ + visibleArea + }); + } else if (this.detailView) { + this.detailView.reset(); + this.detailView = null; + } + } + } + update({ + scale = 0, + rotation = null, + optionalContentConfigPromise = null, + drawingDelay = -1 + }) { + this.scale = scale || this.scale; + if (typeof rotation === "number") { + this.rotation = rotation; + } + if (optionalContentConfigPromise instanceof Promise) { + this._optionalContentConfigPromise = optionalContentConfigPromise; + optionalContentConfigPromise.then(optionalContentConfig => { + if (optionalContentConfigPromise !== this._optionalContentConfigPromise) { + return; + } + this.#useThumbnailCanvas.initialOptionalContent = optionalContentConfig.hasInitialVisibility; + }); + } + this.#useThumbnailCanvas.directDrawing = true; + const totalRotation = (this.rotation + this.pdfPageRotate) % 360; + this.viewport = this.viewport.clone({ + scale: this.scale * PixelsPerInch.PDF_TO_CSS_UNITS, + rotation: totalRotation + }); + this.#setDimensions(); + if (this._isStandalone) { + this._container?.style.setProperty("--scale-factor", this.viewport.scale); + } + this.#computeScale(); + if (this.canvas) { + const onlyCssZoom = this.#hasRestrictedScaling && this.#needsRestrictedScaling; + const postponeDrawing = drawingDelay >= 0 && drawingDelay < 1000; + if (postponeDrawing || onlyCssZoom) { + if (postponeDrawing && !onlyCssZoom && this.renderingState !== RenderingStates.FINISHED) { + this.cancelRendering({ + keepAnnotationLayer: true, + keepAnnotationEditorLayer: true, + keepXfaLayer: true, + keepTextLayer: true, + cancelExtraDelay: drawingDelay + }); + this.renderingState = RenderingStates.FINISHED; + this.#useThumbnailCanvas.directDrawing = false; + } + this.cssTransform({ + redrawAnnotationLayer: true, + redrawAnnotationEditorLayer: true, + redrawXfaLayer: true, + redrawTextLayer: !postponeDrawing, + hideTextLayer: postponeDrawing + }); + if (!postponeDrawing) { + this.detailView?.update({ + underlyingViewUpdated: true + }); + this.dispatchPageRendered(true, false); + } + return; + } + } + this.cssTransform({}); + this.annotationEditorLayer?.update(this.viewport); + this.reset({ + keepAnnotationLayer: true, + keepAnnotationEditorLayer: true, + keepXfaLayer: true, + keepTextLayer: true, + keepCanvasWrapper: true, + preserveDetailViewState: true + }); + this.detailView?.update({ + underlyingViewUpdated: true + }); + } + #computeScale() { + const { + width, + height + } = this.viewport; + const outputScale = this.outputScale = new OutputScale(); + if (this.maxCanvasPixels === 0) { + const invScale = 1 / this.scale; + outputScale.sx *= invScale; + outputScale.sy *= invScale; + this.#needsRestrictedScaling = true; + } else { + this.#needsRestrictedScaling = outputScale.limitCanvas(width, height, this.maxCanvasPixels, this.maxCanvasDim, this.capCanvasAreaFactor); + if (this.#needsRestrictedScaling && this.enableDetailCanvas) { + const factor = this.enableOptimizedPartialRendering ? 4 : 2; + outputScale.sx /= factor; + outputScale.sy /= factor; + } + } + } + cancelRendering({ + keepAnnotationLayer = false, + keepAnnotationEditorLayer = false, + keepXfaLayer = false, + keepTextLayer = false, + cancelExtraDelay = 0 + } = {}) { + super.cancelRendering({ + cancelExtraDelay + }); + if (this.textLayer && (!keepTextLayer || !this.textLayer.div)) { + this.textLayer.cancel(); + this.textLayer = null; + } + if (this.annotationLayer && (!keepAnnotationLayer || !this.annotationLayer.div)) { + this.annotationLayer.cancel(); + this.annotationLayer = null; + this._annotationCanvasMap = null; + } + if (this.structTreeLayer && !this.textLayer) { + this.structTreeLayer = null; + } + if (this.annotationEditorLayer && (!keepAnnotationEditorLayer || !this.annotationEditorLayer.div || !this.textLayer)) { + if (this.drawLayer) { + this.drawLayer.cancel(); + this.drawLayer = null; + } + this.annotationEditorLayer.cancel(); + this.annotationEditorLayer = null; + } + if (this.drawLayer && !this.textLayer) { + this.drawLayer.cancel(); + this.drawLayer = null; + } + if (this.xfaLayer && (!keepXfaLayer || !this.xfaLayer.div)) { + this.xfaLayer.cancel(); + this.xfaLayer = null; + this._textHighlighter?.disable(); + } + } + cssTransform({ + redrawAnnotationLayer = false, + redrawAnnotationEditorLayer = false, + redrawXfaLayer = false, + redrawTextLayer = false, + hideTextLayer = false + }) { + const { + canvas + } = this; + if (!canvas) { + return; + } + const originalViewport = this.#originalViewport; + if (this.viewport !== originalViewport) { + const relativeRotation = (360 + this.viewport.rotation - originalViewport.rotation) % 360; + if (relativeRotation === 90 || relativeRotation === 270) { + const { + width, + height + } = this.viewport; + const scaleX = height / width; + const scaleY = width / height; + canvas.style.transform = `rotate(${relativeRotation}deg) scale(${scaleX},${scaleY})`; + } else { + canvas.style.transform = relativeRotation === 0 ? "" : `rotate(${relativeRotation}deg)`; + } + } + if (redrawAnnotationLayer && this.annotationLayer) { + this.#renderAnnotationLayer(); + } + if (redrawAnnotationEditorLayer && this.annotationEditorLayer) { + if (this.drawLayer) { + this.#renderDrawLayer(); + } + this.#renderAnnotationEditorLayer(); + } + if (redrawXfaLayer && this.xfaLayer) { + this.#renderXfaLayer(); + } + if (this.textLayer) { + if (hideTextLayer) { + this.textLayer.hide(); + this.structTreeLayer?.hide(); + } else if (redrawTextLayer) { + this.#renderTextLayer(); + } + } + } + get width() { + return this.viewport.width; + } + get height() { + return this.viewport.height; + } + getPagePoint(x, y) { + return this.viewport.convertToPdfPoint(x, y); + } + _ensureCanvasWrapper() { + let canvasWrapper = this.#canvasWrapper; + if (!canvasWrapper) { + canvasWrapper = this.#canvasWrapper = document.createElement("div"); + canvasWrapper.classList.add("canvasWrapper"); + this.#addLayer(canvasWrapper, "canvasWrapper"); + } + return canvasWrapper; + } + _getRenderingContext(canvas, transform, recordOperations, recordImages) { + return { + canvas, + transform, + viewport: this.viewport, + annotationMode: this.#annotationMode, + optionalContentConfigPromise: this._optionalContentConfigPromise, + annotationCanvasMap: this._annotationCanvasMap, + pageColors: this.pageColors, + isEditing: this.#isEditing, + recordOperations, + recordImages + }; + } + async draw() { + if (this.renderingState !== RenderingStates.INITIAL) { + console.error("Must be in new state before drawing"); + this.reset(); + } + const { + div, + l10n, + pdfPage, + viewport + } = this; + if (!pdfPage) { + this.renderingState = RenderingStates.FINISHED; + throw new Error("pdfPage is not loaded"); + } + this.renderingState = RenderingStates.RUNNING; + const canvasWrapper = this._ensureCanvasWrapper(); + if (!this.textLayer && this.#textLayerMode !== TextLayerMode.DISABLE && !pdfPage.isPureXfa) { + this._accessibilityManager ||= new TextAccessibilityManager(); + this.textLayer = new TextLayerBuilder({ + pdfPage, + highlighter: this._textHighlighter, + accessibilityManager: this._accessibilityManager, + enablePermissions: this.#textLayerMode === TextLayerMode.ENABLE_PERMISSIONS, + onAppend: textLayerDiv => { + this.l10n.pause(); + this.#addLayer(textLayerDiv, "textLayer"); + this.l10n.resume(); + }, + abortSignal: this.#abortSignal + }); + if (this.enableSelectionRendering) { + this.textLayer.div.classList.add("selectionRendering"); + } + } + if (!this.annotationLayer && this.#annotationMode !== AnnotationMode.DISABLE) { + const { + annotationStorage, + annotationEditorUIManager, + downloadManager, + enableComment, + enableScripting, + fieldObjectsPromise, + hasJSActionsPromise, + linkService + } = this.#layerProperties; + this._annotationCanvasMap ||= new Map(); + this.annotationLayer = new AnnotationLayerBuilder({ + pdfPage, + annotationStorage, + imageResourcesPath: this.imageResourcesPath, + renderForms: this.#annotationMode === AnnotationMode.ENABLE_FORMS, + linkService, + downloadManager, + enableComment, + enableScripting, + hasJSActionsPromise, + fieldObjectsPromise, + annotationCanvasMap: this._annotationCanvasMap, + accessibilityManager: this._accessibilityManager, + annotationEditorUIManager, + commentManager: this.#commentManager, + onAppend: annotationLayerDiv => { + this.#addLayer(annotationLayerDiv, "annotationLayer"); + } + }); + } + const { + width, + height + } = viewport; + this.#originalViewport = viewport; + const { + canvas, + prevCanvas + } = this._createCanvas(newCanvas => { + canvasWrapper.prepend(newCanvas); + }); + canvas.setAttribute("role", "presentation"); + if (!this.outputScale) { + this.#computeScale(); + } + const { + outputScale + } = this; + this.#hasRestrictedScaling = this.#needsRestrictedScaling; + const sfx = approximateFraction(outputScale.sx); + const sfy = approximateFraction(outputScale.sy); + const canvasWidth = canvas.width = floorToDivide(calcRound(width * outputScale.sx), sfx[0]); + const canvasHeight = canvas.height = floorToDivide(calcRound(height * outputScale.sy), sfy[0]); + const pageWidth = floorToDivide(calcRound(width), sfx[1]); + const pageHeight = floorToDivide(calcRound(height), sfy[1]); + outputScale.sx = canvasWidth / pageWidth; + outputScale.sy = canvasHeight / pageHeight; + if (this.#scaleRoundX !== sfx[1]) { + div.style.setProperty("--scale-round-x", `${sfx[1]}px`); + this.#scaleRoundX = sfx[1]; + } + if (this.#scaleRoundY !== sfy[1]) { + div.style.setProperty("--scale-round-y", `${sfy[1]}px`); + this.#scaleRoundY = sfy[1]; + } + const recordBBoxes = this.enableOptimizedPartialRendering && this.#hasRestrictedScaling && !this.recordedBBoxes; + const recordImages = this.imagesRightClickMinSize !== -1 && !this.imageCoordinates; + const transform = outputScale.scaled ? [outputScale.sx, 0, 0, outputScale.sy, 0, 0] : null; + const resultPromise = this._drawCanvas(this._getRenderingContext(canvas, transform, recordBBoxes, recordImages), () => { + prevCanvas?.remove(); + this._resetCanvas(); + }, renderTask => { + this.#useThumbnailCanvas.regularAnnotations = !renderTask.separateAnnots; + this.dispatchPageRendered(false, false); + }).then(async () => { + if (this.renderingState !== RenderingStates.FINISHED) { + return; + } + this.structTreeLayer ||= new StructTreeLayerBuilder(pdfPage, viewport.rawDims); + const textLayerPromise = this.textLayer ? this.#renderTextLayer() : null; + if (this.annotationLayer) { + await this.#renderAnnotationLayer(textLayerPromise); + } + this.drawLayer ||= new DrawLayerBuilder({ + pageIndex: this.id, + textLayer: this.enableSelectionRendering ? this.textLayer?.div : null, + filterFactory: this.pdfPage?.filterFactory, + pageColors: this.pageColors + }); + await this.#renderDrawLayer(); + this.drawLayer.setParent(canvasWrapper); + const { + annotationEditorUIManager + } = this.#layerProperties; + if (!annotationEditorUIManager) { + return; + } + if (this.annotationLayer || this.#annotationMode === AnnotationMode.DISABLE) { + this.annotationEditorLayer ||= new AnnotationEditorLayerBuilder({ + uiManager: annotationEditorUIManager, + pageIndex: this.id - 1, + l10n, + structTreeLayer: this.structTreeLayer, + accessibilityManager: this._accessibilityManager, + annotationLayer: this.annotationLayer?.annotationLayer, + textLayer: this.textLayer, + drawLayer: this.drawLayer.getDrawLayer(), + onAppend: annotationEditorLayerDiv => { + this.#addLayer(annotationEditorLayerDiv, "annotationEditorLayer"); + } + }); + this.#renderAnnotationEditorLayer(); + } + }); + if (pdfPage.isPureXfa) { + if (!this.xfaLayer) { + const { + annotationStorage, + linkService + } = this.#layerProperties; + this.xfaLayer = new XfaLayerBuilder({ + pdfPage, + annotationStorage, + linkService + }); + } + this.#renderXfaLayer(); + } + div.setAttribute("data-loaded", true); + this.dispatchPageRender(); + return resultPromise; + } + setPageLabel(label) { + this.pageLabel = typeof label === "string" ? label : null; + this.div.setAttribute("data-l10n-args", JSON.stringify({ + page: this.pageLabel ?? this.id + })); + if (this.pageLabel !== null) { + this.div.setAttribute("data-page-label", this.pageLabel); + } else { + this.div.removeAttribute("data-page-label"); + } + } + get thumbnailCanvas() { + const { + directDrawing, + initialOptionalContent, + regularAnnotations + } = this.#useThumbnailCanvas; + return directDrawing && initialOptionalContent && regularAnnotations ? this.canvas : null; + } +} + +;// ./web/pdf_viewer.js + + + + + + + + + + + + + + + + + + + + + + + +const DEFAULT_CACHE_SIZE = 10; +const PagesCountLimit = { + FORCE_SCROLL_MODE_PAGE: 10000, + FORCE_LAZY_PAGE_INIT: 5000, + PAUSE_EAGER_PAGE_INIT: 250 +}; +function isValidAnnotationEditorMode(mode) { + return Object.values(AnnotationEditorType).includes(mode) && mode !== AnnotationEditorType.DISABLE; +} +class PDFPageViewBuffer { + #buf = new Set(); + #size = 0; + constructor(size) { + this.#size = size; + } + push(view) { + const buf = this.#buf; + if (buf.has(view)) { + buf.delete(view); + } + buf.add(view); + if (buf.size > this.#size) { + this.#destroyFirstView(); + } + } + resize(newSize, idsToKeep = null) { + this.#size = newSize; + const buf = this.#buf; + if (idsToKeep) { + const ii = buf.size; + let i = 1; + for (const view of buf) { + if (idsToKeep.has(view.id)) { + buf.delete(view); + buf.add(view); + } + if (++i > ii) { + break; + } + } + } + while (buf.size > this.#size) { + this.#destroyFirstView(); + } + } + has(view) { + return this.#buf.has(view); + } + [Symbol.iterator]() { + return this.#buf.keys(); + } + #destroyFirstView() { + const firstView = this.#buf.keys().next().value; + firstView?.destroy(); + this.#buf.delete(firstView); + } +} +class PDFViewer { + #buffer = null; + #altTextManager = null; + #annotationEditorHighlightColors = null; + #annotationEditorMode = AnnotationEditorType.NONE; + #annotationEditorUIManager = null; + #annotationMode = AnnotationMode.ENABLE_FORMS; + #commentManager = null; + #containerTopLeft = null; + #editorUndoBar = null; + #enableHighlightFloatingButton = false; + #enablePermissions = false; + #enableUpdatedAddImage = false; + #enableNewAltTextWhenAddingImage = false; + #enableAutoLinking = true; + #abortSignal = null; + #eventAC = null; + #minDurationToUpdateCanvas = 0; + #mlManager = null; + #panPosition = [NaN, NaN]; + #printingAllowed = true; + #scrollTimeoutId = null; + #staleLocation = false; + #switchAnnotationEditorModeAC = null; + #switchAnnotationEditorModeTimeoutId = null; + #copyAllInProgress = false; + #hiddenCopyElement = null; + #previousContainerHeight = 0; + #resizeObserver = new ResizeObserver(this.#resizeObserverCallback.bind(this)); + #scrollModePageState = null; + #scaleTimeoutId = null; + #signatureManager = null; + #supportsPinchToZoom = true; + #textLayerMode = TextLayerMode.ENABLE; + #viewerAlert = null; + #copiedPageViews = null; + #savedPageViews = null; + #deletedPageNumbers = null; + constructor(options) { + const viewerVersion = "6.4.299"; + if (pdfjs_version !== viewerVersion) { + throw new Error(`The API version "${pdfjs_version}" does not match the Viewer version "${viewerVersion}".`); + } + this.container = options.container; + this.viewer = options.viewer || options.container.firstElementChild; + this.#viewerAlert = options.viewerAlert || null; + if (this.container?.tagName !== "DIV" || this.viewer?.tagName !== "DIV") { + throw new Error("Invalid `container` and/or `viewer` option."); + } + if (this.container.offsetParent && getComputedStyle(this.container).position !== "absolute") { + throw new Error("The `container` must be absolutely positioned."); + } + this.#resizeObserver.observe(this.container); + this.eventBus = options.eventBus; + this.linkService = options.linkService || new SimpleLinkService(); + this.downloadManager = options.downloadManager || null; + this.findController = options.findController || null; + this.#altTextManager = options.altTextManager || null; + this.#commentManager = options.commentManager || null; + this.#signatureManager = options.signatureManager || null; + this.#editorUndoBar = options.editorUndoBar || null; + if (this.findController) { + this.findController.onIsPageVisible = pageNumber => this._getVisiblePages().ids.has(pageNumber); + } + this._scriptingManager = options.scriptingManager || null; + this.#textLayerMode = options.textLayerMode ?? TextLayerMode.ENABLE; + this.#annotationMode = options.annotationMode ?? AnnotationMode.ENABLE_FORMS; + this.#annotationEditorMode = options.annotationEditorMode ?? AnnotationEditorType.NONE; + this.#annotationEditorHighlightColors = options.annotationEditorHighlightColors || null; + this.#enableHighlightFloatingButton = options.enableHighlightFloatingButton === true; + this.#enableUpdatedAddImage = options.enableUpdatedAddImage === true; + this.#enableNewAltTextWhenAddingImage = options.enableNewAltTextWhenAddingImage === true; + this.imageResourcesPath = options.imageResourcesPath || ""; + this.enablePrintAutoRotate = options.enablePrintAutoRotate || false; + this.removePageBorders = options.removePageBorders || false; + this.maxCanvasPixels = options.maxCanvasPixels; + this.maxCanvasDim = options.maxCanvasDim; + this.capCanvasAreaFactor = options.capCanvasAreaFactor; + this.enableDetailCanvas = options.enableDetailCanvas ?? true; + this.enableOptimizedPartialRendering = options.enableOptimizedPartialRendering ?? false; + this.enableSelectionRendering = options.enableSelectionRendering !== false; + this.imagesRightClickMinSize = options.imagesRightClickMinSize ?? -1; + this.l10n = options.l10n; + this.l10n ||= new genericl10n_GenericL10n(); + this.#enablePermissions = options.enablePermissions || false; + this.pageColors = options.pageColors || null; + this.#mlManager = options.mlManager || null; + this.#supportsPinchToZoom = options.supportsPinchToZoom !== false; + this.#enableAutoLinking = options.enableAutoLinking !== false; + this.#minDurationToUpdateCanvas = options.minDurationToUpdateCanvas ?? 500; + this.defaultRenderingQueue = !options.renderingQueue; + if (this.defaultRenderingQueue) { + this.renderingQueue = new PDFRenderingQueue(); + this.renderingQueue.setViewer(this); + } else { + this.renderingQueue = options.renderingQueue; + } + const { + abortSignal + } = options; + this.#abortSignal = abortSignal || null; + abortSignal?.addEventListener("abort", () => { + this.#resizeObserver.disconnect(); + this.#resizeObserver = null; + }, { + once: true + }); + this.scroll = watchScroll(this.container, this._scrollUpdate.bind(this), abortSignal); + this.presentationModeState = PresentationModeState.UNKNOWN; + this._resetView(); + if (this.removePageBorders) { + this.viewer.classList.add("removePageBorders"); + } + this.#updateContainerHeightCss(); + this.eventBus.on("thumbnailrendered", ({ + pageNumber, + pdfPage + }) => { + const pageView = this._pages[pageNumber - 1]; + if (!this.#buffer.has(pageView)) { + pdfPage?.cleanup(); + } + }, internalOpt); + if (!options.l10n) { + this.l10n.translate(this.container); + } + } + get printingAllowed() { + return this.#printingAllowed; + } + get pagesCount() { + return this._pages.length; + } + getPageView(index) { + return this._pages[index]; + } + getCachedPageViews() { + return new Set(this.#buffer); + } + get pageViewsReady() { + return this._pages.every(pageView => pageView?.pdfPage); + } + clearSelection() { + const selection = document.getSelection(); + if (!selection || selection.isCollapsed) { + return; + } + for (let i = 0, ii = selection.rangeCount; i < ii; i++) { + if (selection.getRangeAt(i).intersectsNode(this.viewer)) { + selection.removeAllRanges?.(); + selection.empty?.(); + return; + } + } + } + get renderForms() { + return this.#annotationMode === AnnotationMode.ENABLE_FORMS; + } + get enableScripting() { + return !!this._scriptingManager; + } + get currentPageNumber() { + return this._currentPageNumber; + } + set currentPageNumber(val) { + if (!Number.isInteger(val)) { + throw new Error("Invalid page number."); + } + if (!this.pdfDocument) { + return; + } + if (this._currentPageNumber !== val) { + this.clearSelection(); + } + if (!this._setCurrentPageNumber(val, true)) { + console.error(`currentPageNumber: "${val}" is not a valid page.`); + } + } + _setCurrentPageNumber(val, resetCurrentPageView = false) { + if (this._currentPageNumber === val) { + if (resetCurrentPageView) { + this.#resetCurrentPageView(); + } + return true; + } + if (!(0 < val && val <= this.pagesCount)) { + return false; + } + const previous = this._currentPageNumber; + this._currentPageNumber = val; + this.eventBus.dispatch("pagechanging", { + source: this, + pageNumber: val, + pageLabel: this._pageLabels?.[val - 1] ?? null, + previous + }); + if (resetCurrentPageView) { + this.#resetCurrentPageView(); + } + return true; + } + get currentPageLabel() { + return this._pageLabels?.[this._currentPageNumber - 1] ?? null; + } + set currentPageLabel(val) { + if (!this.pdfDocument) { + return; + } + let page = val | 0; + if (this._pageLabels) { + const i = this._pageLabels.indexOf(val); + if (i >= 0) { + page = i + 1; + } + } + if (this._currentPageNumber !== page) { + this.clearSelection(); + } + if (!this._setCurrentPageNumber(page, true)) { + console.error(`currentPageLabel: "${val}" is not a valid page.`); + } + } + get currentScale() { + return this._currentScale !== (/* inlined export .UNKNOWN_SCALE */0) ? this._currentScale : (/* inlined export .DEFAULT_SCALE */1); + } + set currentScale(val) { + if (isNaN(val)) { + throw new Error("Invalid numeric scale."); + } + if (!this.pdfDocument) { + return; + } + this.#setScale(val, { + noScroll: false + }); + } + get currentScaleValue() { + return this._currentScaleValue; + } + set currentScaleValue(val) { + if (!this.pdfDocument) { + return; + } + this.#setScale(val, { + noScroll: false + }); + } + get pagesRotation() { + return this._pagesRotation; + } + set pagesRotation(rotation) { + if (!isValidRotation(rotation)) { + throw new Error("Invalid pages rotation angle."); + } + if (!this.pdfDocument) { + return; + } + rotation %= 360; + if (rotation < 0) { + rotation += 360; + } + if (this._pagesRotation === rotation) { + return; + } + this.clearSelection(); + this._pagesRotation = rotation; + const pageNumber = this._currentPageNumber; + this.refresh(true, { + rotation + }); + if (this._currentScaleValue) { + this.#setScale(this._currentScaleValue, { + noScroll: true + }); + } + this.eventBus.dispatch("rotationchanging", { + source: this, + pagesRotation: rotation, + pageNumber + }); + if (this.defaultRenderingQueue) { + this.update(); + } + } + get firstPagePromise() { + return this.pdfDocument ? this._firstPageCapability.promise : null; + } + get onePageRendered() { + return this.pdfDocument ? this._onePageRenderedCapability.promise : null; + } + get pagesPromise() { + return this.pdfDocument ? this._pagesCapability.promise : null; + } + get _layerProperties() { + const self = this; + return pdfjs_shadow(this, "_layerProperties", { + get annotationEditorUIManager() { + return self.#annotationEditorUIManager; + }, + get annotationStorage() { + return self.pdfDocument?.annotationStorage; + }, + get downloadManager() { + return self.downloadManager; + }, + get enableComment() { + return !!self.#commentManager; + }, + get enableScripting() { + return !!self._scriptingManager; + }, + get fieldObjectsPromise() { + return self.pdfDocument?.getFieldObjects(); + }, + get findController() { + return self.findController; + }, + get hasJSActionsPromise() { + return self.pdfDocument?.hasJSActions(); + }, + get linkService() { + return self.linkService; + } + }); + } + #setPrintingAllowed(isAllowed) { + this.#printingAllowed = isAllowed; + this.eventBus.dispatch("printingallowed", { + source: this, + isAllowed + }); + } + #initializePermissions(permissions) { + const params = { + annotationEditorMode: this.#annotationEditorMode, + annotationMode: this.#annotationMode, + textLayerMode: this.#textLayerMode + }; + if (!permissions) { + this.#setPrintingAllowed(true); + return params; + } + this.#setPrintingAllowed(permissions.has(PermissionFlag.PRINT_HIGH_QUALITY) || permissions.has(PermissionFlag.PRINT)); + if (!permissions.has(PermissionFlag.COPY) && this.#textLayerMode === TextLayerMode.ENABLE) { + params.textLayerMode = TextLayerMode.ENABLE_PERMISSIONS; + } + if (!permissions.has(PermissionFlag.MODIFY_CONTENTS)) { + params.annotationEditorMode = AnnotationEditorType.DISABLE; + } + if (!permissions.has(PermissionFlag.MODIFY_ANNOTATIONS) && !permissions.has(PermissionFlag.FILL_INTERACTIVE_FORMS) && this.#annotationMode === AnnotationMode.ENABLE_FORMS) { + params.annotationMode = AnnotationMode.ENABLE; + } + return params; + } + async #onePageRenderedOrForceFetch(signal) { + if (document.visibilityState === "hidden" || !this.container.offsetParent || this._getVisiblePages().views.length === 0) { + return; + } + const hiddenCapability = Promise.withResolvers(), + ac = new AbortController(); + document.addEventListener("visibilitychange", () => { + if (document.visibilityState === "hidden") { + hiddenCapability.resolve(); + } + }, { + signal: AbortSignal.any([signal, ac.signal]) + }); + await Promise.race([this._onePageRenderedCapability.promise, hiddenCapability.promise]); + ac.abort(); + } + async getAllText(interruptSignal = null) { + const texts = []; + const buffer = []; + for (let pageNum = 1, pagesCount = this.pdfDocument.numPages; pageNum <= pagesCount; ++pageNum) { + if (interruptSignal?.aborted) { + return null; + } + buffer.length = 0; + const page = await this.pdfDocument.getPage(pageNum); + const { + items + } = await page.getTextContent(); + for (const item of items) { + if (item.str) { + buffer.push(item.str); + } + if (item.hasEOL) { + buffer.push("\n"); + } + } + texts.push(removeNullCharacters(buffer.join(""))); + } + return texts.join("\n"); + } + #copyCallback(textLayerMode, event) { + const selection = document.getSelection(); + const { + focusNode, + anchorNode + } = selection; + if (anchorNode && focusNode && selection.containsNode(this.#hiddenCopyElement)) { + if (this.#copyAllInProgress || textLayerMode === TextLayerMode.ENABLE_PERMISSIONS) { + stopEvent(event); + return; + } + this.#copyAllInProgress = true; + const { + classList + } = this.viewer; + classList.add("copyAll"); + const keydownAC = new AbortController(), + interruptAC = new AbortController(); + window.addEventListener("keydown", ev => { + if (ev.key === "Escape") { + interruptAC.abort(); + } + }, { + signal: keydownAC.signal + }); + this.getAllText(interruptAC.signal).then(async text => { + if (text !== null) { + await navigator.clipboard.writeText(text); + } + }).catch(reason => { + console.warn(`Something goes wrong when extracting the text: ${reason.message}`); + }).finally(() => { + this.#copyAllInProgress = false; + keydownAC.abort(); + classList.remove("copyAll"); + }); + stopEvent(event); + } + } + setDocument(pdfDocument) { + if (this.pdfDocument) { + this.eventBus.dispatch("pagesdestroy", { + source: this + }); + this._cancelRendering(); + this._resetView(); + this.findController?.setDocument(null); + this._scriptingManager?.setDocument(null); + this.#annotationEditorUIManager?.destroy(); + this.#annotationEditorUIManager = null; + if (this.#annotationEditorMode !== AnnotationEditorType.DISABLE) { + this.#annotationEditorMode = AnnotationEditorType.NONE; + } + this.#printingAllowed = true; + } + this.pdfDocument = pdfDocument; + if (!pdfDocument) { + return; + } + const pagesCount = pdfDocument.numPages; + const firstPagePromise = pdfDocument.getPage(1); + const optionalContentConfigPromise = pdfDocument.getOptionalContentConfig({ + intent: "display" + }); + const permissionsPromise = this.#enablePermissions ? pdfDocument.getPermissions() : Promise.resolve(); + const { + eventBus, + pageColors, + viewer + } = this; + this.#eventAC = new AbortController(); + const { + signal + } = this.#eventAC; + const evtOpts = { + signal, + ...internalOpt + }; + if (pagesCount > PagesCountLimit.FORCE_SCROLL_MODE_PAGE) { + console.warn("Forcing PAGE-scrolling for performance reasons, given the length of the document."); + const mode = this._scrollMode = ScrollMode.PAGE; + eventBus.dispatch("scrollmodechanged", { + source: this, + mode + }); + } + this._pagesCapability.promise.then(() => { + eventBus.dispatch("pagesloaded", { + source: this, + pagesCount + }); + }, () => {}); + const onBeforeDraw = evt => { + const pageView = this._pages[evt.pageNumber - 1]; + if (!pageView) { + return; + } + this.#buffer.push(pageView); + }; + eventBus.on("pagerender", onBeforeDraw, evtOpts); + const onAfterDraw = evt => { + if (evt.cssTransform || evt.isDetailView) { + return; + } + this._onePageRenderedCapability.resolve({ + timestamp: evt.timestamp + }); + eventBus.off("pagerendered", onAfterDraw); + }; + eventBus.on("pagerendered", onAfterDraw, evtOpts); + Promise.all([firstPagePromise, permissionsPromise]).then(([firstPdfPage, permissions]) => { + if (pdfDocument !== this.pdfDocument) { + return; + } + this._firstPageCapability.resolve(firstPdfPage); + this._optionalContentConfigPromise = optionalContentConfigPromise; + const { + annotationEditorMode, + annotationMode, + textLayerMode + } = this.#initializePermissions(permissions); + if (textLayerMode !== TextLayerMode.DISABLE) { + const element = this.#hiddenCopyElement = document.createElement("div"); + element.id = "hiddenCopyElement"; + element.style.cssText = "position:absolute;top:0;left:0;width:0;height:0;display:none"; + viewer.before(element); + } + if (annotationEditorMode !== AnnotationEditorType.DISABLE) { + const mode = annotationEditorMode; + if (pdfDocument.isPureXfa) { + console.warn("Warning: XFA-editing is not implemented."); + } else if (isValidAnnotationEditorMode(mode)) { + this.#annotationEditorUIManager = new AnnotationEditorUIManager(this.container, viewer, this.#viewerAlert, this.#altTextManager, this.#commentManager, this.#signatureManager, eventBus, pdfDocument, pageColors, this.#annotationEditorHighlightColors, this.#enableHighlightFloatingButton, this.#enableUpdatedAddImage, this.#enableNewAltTextWhenAddingImage, this.#mlManager, this.#editorUndoBar, this.#supportsPinchToZoom); + eventBus.dispatch("annotationeditoruimanager", { + source: this, + uiManager: this.#annotationEditorUIManager + }); + if (mode !== AnnotationEditorType.NONE) { + this.#preloadEditingData(mode); + this.#annotationEditorUIManager.updateMode(mode); + } + } else { + console.error(`Invalid AnnotationEditor mode: ${mode}`); + } + } + const viewerElement = this._scrollMode === ScrollMode.PAGE ? null : viewer; + const scale = this.currentScale; + const viewport = firstPdfPage.getViewport({ + scale: scale * PixelsPerInch.PDF_TO_CSS_UNITS + }); + viewer.style.setProperty("--scale-factor", viewport.scale); + if (pageColors?.background) { + viewer.style.setProperty("--page-bg-color", pageColors.background); + } + if (pageColors?.foreground === "CanvasText" || pageColors?.background === "Canvas") { + viewer.style.setProperty("--hcm-highlight-filter", pdfDocument.filterFactory.addHighlightHCMFilter("highlight", "CanvasText", "Canvas", "HighlightText", "Highlight")); + viewer.style.setProperty("--hcm-highlight-selected-filter", pdfDocument.filterFactory.addHighlightHCMFilter("highlight_selected", "CanvasText", "Canvas", "HighlightText", "ButtonText")); + } + for (let pageNum = 1; pageNum <= pagesCount; ++pageNum) { + const pageView = new PDFPageView({ + container: viewerElement, + eventBus, + id: pageNum, + scale, + defaultViewport: viewport.clone(), + optionalContentConfigPromise, + renderingQueue: this.renderingQueue, + textLayerMode, + annotationMode, + imageResourcesPath: this.imageResourcesPath, + maxCanvasPixels: this.maxCanvasPixels, + maxCanvasDim: this.maxCanvasDim, + capCanvasAreaFactor: this.capCanvasAreaFactor, + enableDetailCanvas: this.enableDetailCanvas, + enableOptimizedPartialRendering: this.enableOptimizedPartialRendering, + enableSelectionRendering: this.enableSelectionRendering, + imagesRightClickMinSize: this.imagesRightClickMinSize, + pageColors, + l10n: this.l10n, + layerProperties: this._layerProperties, + enableAutoLinking: this.#enableAutoLinking, + minDurationToUpdateCanvas: this.#minDurationToUpdateCanvas, + commentManager: this.#commentManager, + abortSignal: this.#abortSignal + }); + this._pages.push(pageView); + } + this._pages[0]?.setPdfPage(firstPdfPage); + if (this._scrollMode === ScrollMode.PAGE) { + this.#ensurePageViewVisible(); + } else if (this._spreadMode !== SpreadMode.NONE) { + this._updateSpreadMode(); + } + eventBus.on("annotationeditorlayerrendered", evt => { + if (this.#annotationEditorUIManager) { + eventBus.dispatch("annotationeditormodechanged", { + source: this, + mode: this.#annotationEditorMode + }); + } + }, { + once: true, + signal, + ...internalOpt + }); + this.#onePageRenderedOrForceFetch(signal).then(async () => { + if (pdfDocument !== this.pdfDocument) { + return; + } + this.findController?.setDocument(pdfDocument); + this._scriptingManager?.setDocument(pdfDocument); + if (this.#hiddenCopyElement) { + document.addEventListener("copy", this.#copyCallback.bind(this, textLayerMode), { + signal + }); + } + if (pdfDocument.loadingParams.disableAutoFetch || pagesCount > PagesCountLimit.FORCE_LAZY_PAGE_INIT) { + this._pagesCapability.resolve(); + return; + } + let getPagesLeft = pagesCount - 1; + if (getPagesLeft <= 0) { + this._pagesCapability.resolve(); + return; + } + for (let pageNum = 2; pageNum <= pagesCount; ++pageNum) { + const promise = pdfDocument.getPage(pageNum).then(pdfPage => { + const pageView = this._pages[pageNum - 1]; + if (!pageView.pdfPage) { + pageView.setPdfPage(pdfPage); + } + if (--getPagesLeft === 0) { + this._pagesCapability.resolve(); + } + }, reason => { + console.error(`Unable to get page ${pageNum} to initialize viewer`, reason); + if (--getPagesLeft === 0) { + this._pagesCapability.resolve(); + } + }); + if (pageNum % PagesCountLimit.PAUSE_EAGER_PAGE_INIT === 0) { + await promise; + } + } + }); + eventBus.dispatch("pagesinit", { + source: this + }); + pdfDocument.getMetadata().then(({ + info + }) => { + if (pdfDocument !== this.pdfDocument) { + return; + } + if (info.Language) { + viewer.lang = info.Language; + } + }); + if (this.defaultRenderingQueue) { + this.update(); + } + }).catch(reason => { + console.error("Unable to initialize viewer", reason); + this._pagesCapability.reject(reason); + }); + } + onPagesEdited({ + pagesMapper, + type, + hasBeenCut, + pageNumbers + }) { + if (type === "copy") { + this.#copiedPageViews = new Map(); + for (const pageNum of pageNumbers) { + this.#copiedPageViews.set(pageNum, this._pages[pageNum - 1]); + } + return; + } + if (type === "cancelCopy") { + this.#copiedPageViews = null; + return; + } + const isCut = type === "cut"; + if (isCut || type === "delete") { + this.#savedPageViews = this._pages; + this.#deletedPageNumbers = pageNumbers; + } + if (type === "cancelDelete") { + this.#deletedPageNumbers = null; + if (!this.#savedPageViews) { + return; + } + const viewerElement = this._scrollMode === ScrollMode.PAGE ? null : this.viewer; + if (viewerElement) { + this.#annotationEditorUIManager?.startUpdatePages(); + const fragment = document.createDocumentFragment(); + for (let i = 0, ii = this.#savedPageViews.length; i < ii; i++) { + const page = this.#savedPageViews[i]; + page.updatePageNumber(i + 1); + fragment.append(page.div); + } + viewerElement.replaceChildren(fragment); + this.#annotationEditorUIManager?.endUpdatePages(); + } + this._pages = this.#savedPageViews; + this.#savedPageViews = null; + return; + } + if (type === "cleanSavedData") { + if (this.#deletedPageNumbers) { + if (this.#savedPageViews) { + for (const pageNum of this.#deletedPageNumbers) { + this.#savedPageViews[pageNum - 1].deleteMe(); + } + this.#savedPageViews = null; + } + this.#deletedPageNumbers = null; + } + return; + } + this._currentPageNumber = 0; + const prevPages = this._pages; + const newPages = this._pages = []; + this.#annotationEditorUIManager?.startUpdatePages(); + for (let i = 1, ii = pagesMapper.pagesNumber; i <= ii; i++) { + const prevPageNumber = pagesMapper.getPrevPageNumber(i); + if (prevPageNumber < 0) { + let page = this.#copiedPageViews.get(-prevPageNumber); + if (hasBeenCut) { + page.updatePageNumber(i); + } else { + this.#annotationEditorUIManager?.clonePage(-prevPageNumber - 1, i - 1); + page = page.clone(i); + } + newPages.push(page); + continue; + } + const page = prevPages[prevPageNumber - 1]; + newPages.push(page); + page.updatePageNumber(i); + } + this.#annotationEditorUIManager?.endUpdatePages(); + if (type === "paste") { + this.#copiedPageViews = null; + } + const viewerElement = this._scrollMode === ScrollMode.PAGE ? null : this.viewer; + if (viewerElement) { + const fragment = document.createDocumentFragment(); + for (const { + div + } of newPages) { + fragment.append(div); + } + viewerElement.replaceChildren(fragment); + } + setTimeout(() => { + this.forceRendering(); + }); + } + setPageLabels(labels) { + if (!this.pdfDocument) { + return; + } + if (!labels) { + this._pageLabels = null; + } else if (!(Array.isArray(labels) && this.pdfDocument.numPages === labels.length)) { + this._pageLabels = null; + console.error(`setPageLabels: Invalid page labels.`); + } else { + this._pageLabels = labels; + } + for (let i = 0, ii = this._pages.length; i < ii; i++) { + this._pages[i].setPageLabel(this._pageLabels?.[i] ?? null); + } + } + _resetView() { + this._pages = []; + this._currentPageNumber = 1; + this._currentScale = (/* inlined export .UNKNOWN_SCALE */0); + this._currentScaleValue = null; + this._pageLabels = null; + this.#buffer = new PDFPageViewBuffer(DEFAULT_CACHE_SIZE); + this._location = null; + this._pagesRotation = 0; + this._optionalContentConfigPromise = null; + this._firstPageCapability = Promise.withResolvers(); + this._onePageRenderedCapability = Promise.withResolvers(); + this._pagesCapability = Promise.withResolvers(); + this._scrollMode = ScrollMode.VERTICAL; + this._previousScrollMode = ScrollMode.UNKNOWN; + this._spreadMode = SpreadMode.NONE; + this.#scrollModePageState = { + previousPageNumber: 1, + scrollDown: true, + pages: [] + }; + this.#eventAC?.abort(); + this.#eventAC = null; + this.viewer.textContent = ""; + this._updateScrollMode(); + this.viewer.removeAttribute("lang"); + this.#hiddenCopyElement?.remove(); + this.#hiddenCopyElement = null; + this.#cleanupTimeouts(); + this.#cleanupSwitchAnnotationEditorMode(); + } + #ensurePageViewVisible() { + if (this._scrollMode !== ScrollMode.PAGE) { + throw new Error("#ensurePageViewVisible: Invalid scrollMode value."); + } + const pageNumber = this._currentPageNumber, + state = this.#scrollModePageState, + viewer = this.viewer; + viewer.textContent = ""; + state.pages.length = 0; + if (this._spreadMode === SpreadMode.NONE && !this.isInPresentationMode) { + const pageView = this._pages[pageNumber - 1]; + viewer.append(pageView.div); + state.pages.push(pageView); + } else { + const pageIndexSet = new Set(), + parity = this._spreadMode - 1; + if (parity === -1) { + pageIndexSet.add(pageNumber - 1); + } else if (pageNumber % 2 !== parity) { + pageIndexSet.add(pageNumber - 1); + pageIndexSet.add(pageNumber); + } else { + pageIndexSet.add(pageNumber - 2); + pageIndexSet.add(pageNumber - 1); + } + const spread = document.createElement("div"); + spread.className = "spread"; + if (this.isInPresentationMode) { + const dummyPage = document.createElement("div"); + dummyPage.className = "dummyPage"; + spread.append(dummyPage); + } + for (const i of pageIndexSet) { + const pageView = this._pages[i]; + if (!pageView) { + continue; + } + spread.append(pageView.div); + state.pages.push(pageView); + } + viewer.append(spread); + } + state.scrollDown = pageNumber >= state.previousPageNumber; + state.previousPageNumber = pageNumber; + } + _scrollUpdate() { + if (this.pagesCount === 0) { + return; + } + if (this.#scrollTimeoutId) { + clearTimeout(this.#scrollTimeoutId); + } + this.#scrollTimeoutId = setTimeout(() => { + this.#scrollTimeoutId = null; + this.update(); + }, 100); + this.update(); + } + #scrollIntoView(pageView, pageSpot = null) { + const { + div, + id + } = pageView; + if (this._currentPageNumber !== id) { + this._setCurrentPageNumber(id); + } + if (this._scrollMode === ScrollMode.PAGE) { + this.#ensurePageViewVisible(); + this.update(); + } + if (!pageSpot && !this.isInPresentationMode) { + const left = div.offsetLeft + div.clientLeft, + right = left + div.clientWidth; + const { + scrollLeft, + clientWidth + } = this.container; + if (this._scrollMode === ScrollMode.HORIZONTAL || left < scrollLeft || right > scrollLeft + clientWidth) { + pageSpot = { + left: 0, + top: 0 + }; + } + } + scrollIntoView(div, pageSpot); + if (!this._currentScaleValue && this._location) { + this._location = null; + } + } + #isSameScale(newScale) { + return newScale === this._currentScale || Math.abs(newScale - this._currentScale) < 1e-15; + } + panBy(dx, dy) { + const { + container + } = this; + const position = this.#panPosition; + const { + scrollLeft, + scrollTop + } = container; + const left = (Math.abs(scrollLeft - position[0]) < 1 ? position[0] : scrollLeft) - dx; + const top = (Math.abs(scrollTop - position[1]) < 1 ? position[1] : scrollTop) - dy; + position[0] = left; + position[1] = top; + container.scrollLeft = left; + container.scrollTop = top; + this.#staleLocation = true; + } + #refreshLocation() { + if (!this.#staleLocation) { + return; + } + const { + first + } = this._getVisiblePages(); + if (first) { + this._updateLocation(first); + } + } + #setScaleUpdatePages(newScale, newValue, { + noScroll = false, + preset = false, + drawingDelay = -1, + origin = null, + pan = null + }) { + this._currentScaleValue = newValue.toString(); + if (this.#isSameScale(newScale)) { + if (pan && !noScroll) { + this.panBy(pan[0], pan[1]); + } + if (preset) { + this.eventBus.dispatch("scalechanging", { + source: this, + scale: newScale, + presetValue: newValue + }); + } + return; + } + this.clearSelection(); + this.viewer.style.setProperty("--scale-factor", newScale * PixelsPerInch.PDF_TO_CSS_UNITS); + const postponeDrawing = drawingDelay >= 0 && drawingDelay < 1000; + this.refresh(true, { + scale: newScale, + drawingDelay: postponeDrawing ? drawingDelay : -1 + }); + if (postponeDrawing) { + this.#scaleTimeoutId = setTimeout(() => { + this.#scaleTimeoutId = null; + this.refresh(); + }, drawingDelay); + } + const previousScale = this._currentScale; + this._currentScale = newScale; + if (!noScroll) { + this.#refreshLocation(); + let page = this._currentPageNumber, + dest; + if (this._location && !(this.isInPresentationMode || this.isChangingPresentationMode)) { + page = this._location.pageNumber; + dest = [null, { + name: "XYZ" + }, this._location.left, this._location.top, null]; + } + this.scrollPageIntoView({ + pageNumber: page, + destArray: dest, + allowNegativeOffset: true + }); + let dx = pan?.[0] ?? 0, + dy = pan?.[1] ?? 0; + if (Array.isArray(origin)) { + const scaleDiff = newScale / previousScale - 1; + const [top, left] = this.containerTopLeft; + dx -= (origin[0] - left) * scaleDiff; + dy -= (origin[1] - top) * scaleDiff; + } + if (dx || dy) { + this.panBy(dx, dy); + } + } + this.eventBus.dispatch("scalechanging", { + source: this, + scale: newScale, + presetValue: preset ? newValue : undefined + }); + if (this.defaultRenderingQueue) { + this.update(); + } + } + get #pageWidthScaleFactor() { + return this._spreadMode !== SpreadMode.NONE && this._scrollMode !== ScrollMode.HORIZONTAL ? 2 : 1; + } + #setScale(value, options) { + let scale = parseFloat(value); + if (scale > 0) { + options.preset = false; + this.#setScaleUpdatePages(scale, value, options); + } else { + const currentPage = this._pages[this._currentPageNumber - 1]; + if (!currentPage) { + return; + } + let hPadding = (/* inlined export .SCROLLBAR_PADDING */40), + vPadding = (/* inlined export .VERTICAL_PADDING */5); + if (this.isInPresentationMode) { + hPadding = vPadding = 4; + if (this._spreadMode !== SpreadMode.NONE) { + hPadding *= 2; + } + } else if (this.removePageBorders) { + hPadding = vPadding = 0; + } else if (this._scrollMode === ScrollMode.HORIZONTAL) { + [hPadding, vPadding] = [vPadding, hPadding]; + } + const pageWidthScale = (this.container.clientWidth - hPadding) / currentPage.width * currentPage.scale / this.#pageWidthScaleFactor; + const pageHeightScale = (this.container.clientHeight - vPadding) / currentPage.height * currentPage.scale; + switch (value) { + case "page-actual": + scale = 1; + break; + case "page-width": + scale = pageWidthScale; + break; + case "page-height": + scale = pageHeightScale; + break; + case "page-fit": + scale = Math.min(pageWidthScale, pageHeightScale); + break; + case "auto": + const horizontalScale = isPortraitOrientation(currentPage) ? pageWidthScale : Math.min(pageHeightScale, pageWidthScale); + scale = Math.min((/* inlined export .MAX_AUTO_SCALE */1.25), horizontalScale); + break; + default: + console.error(`#setScale: "${value}" is an unknown zoom value.`); + return; + } + options.preset = true; + this.#setScaleUpdatePages(scale, value, options); + } + } + #resetCurrentPageView() { + const pageView = this._pages[this._currentPageNumber - 1]; + if (this.isInPresentationMode) { + this.#setScale(this._currentScaleValue, { + noScroll: true + }); + } + this.#scrollIntoView(pageView); + } + pageLabelToPageNumber(label) { + if (!this._pageLabels) { + return null; + } + const i = this._pageLabels.indexOf(label); + return i < 0 ? null : i + 1; + } + scrollPageIntoView({ + pageNumber, + destArray = null, + allowNegativeOffset = false, + ignoreDestinationZoom = false, + center = null + }) { + if (!this.pdfDocument) { + return; + } + const pageView = Number.isInteger(pageNumber) && this._pages[pageNumber - 1]; + if (!pageView) { + console.error(`scrollPageIntoView: "${pageNumber}" is not a valid pageNumber parameter.`); + return; + } + if (this.isInPresentationMode || !destArray) { + this._setCurrentPageNumber(pageNumber, true); + return; + } + let x = 0, + y = 0; + let width = 0, + height = 0, + widthScale, + heightScale; + const changeOrientation = pageView.rotation % 180 !== 0; + const pageWidth = (changeOrientation ? pageView.height : pageView.width) / pageView.scale / PixelsPerInch.PDF_TO_CSS_UNITS; + const pageHeight = (changeOrientation ? pageView.width : pageView.height) / pageView.scale / PixelsPerInch.PDF_TO_CSS_UNITS; + let scale = 0; + switch (destArray[1].name) { + case "XYZ": + x = destArray[2]; + y = destArray[3]; + scale = destArray[4]; + x = x !== null ? x : 0; + y = y !== null ? y : pageHeight; + break; + case "Fit": + case "FitB": + scale = "page-fit"; + break; + case "FitH": + case "FitBH": + y = destArray[2]; + scale = "page-width"; + if (y === null && this._location) { + x = this._location.left; + y = this._location.top; + } else if (typeof y !== "number" || y < 0) { + y = pageHeight; + } + break; + case "FitV": + case "FitBV": + x = destArray[2]; + width = pageWidth; + height = pageHeight; + scale = "page-height"; + break; + case "FitR": + x = destArray[2]; + y = destArray[3]; + width = destArray[4] - x; + height = destArray[5] - y; + let hPadding = (/* inlined export .SCROLLBAR_PADDING */40), + vPadding = (/* inlined export .VERTICAL_PADDING */5); + if (this.removePageBorders) { + hPadding = vPadding = 0; + } + widthScale = (this.container.clientWidth - hPadding) / width / PixelsPerInch.PDF_TO_CSS_UNITS; + heightScale = (this.container.clientHeight - vPadding) / height / PixelsPerInch.PDF_TO_CSS_UNITS; + scale = Math.min(Math.abs(widthScale), Math.abs(heightScale)); + break; + default: + console.error(`scrollPageIntoView: "${destArray[1].name}" is not a valid destination type.`); + return; + } + if (!ignoreDestinationZoom) { + if (scale && scale !== this._currentScale) { + this.currentScaleValue = scale; + } else if (this._currentScale === (/* inlined export .UNKNOWN_SCALE */0)) { + this.currentScaleValue = (/* inlined export .DEFAULT_SCALE_VALUE */"auto"); + } + } + if (scale === "page-fit" && !destArray[4]) { + this.#scrollIntoView(pageView); + return; + } + const boundingRect = [pageView.viewport.convertToViewportPoint(x, y), pageView.viewport.convertToViewportPoint(x + width, y + height)]; + let left = Math.min(boundingRect[0][0], boundingRect[1][0]); + let top = Math.min(boundingRect[0][1], boundingRect[1][1]); + if (center) { + if (center === "both" || center === "vertical") { + top -= (this.container.clientHeight - Math.abs(boundingRect[1][1] - boundingRect[0][1])) / 2; + } + if (center === "both" || center === "horizontal") { + left -= (this.container.clientWidth - Math.abs(boundingRect[1][0] - boundingRect[0][0])) / 2; + } + } else if (!allowNegativeOffset) { + left = Math.max(left, 0); + top = Math.max(top, 0); + } + this.#scrollIntoView(pageView, { + left, + top + }); + } + _updateLocation(firstPage) { + this.#staleLocation = false; + const currentScale = this._currentScale; + const currentScaleValue = this._currentScaleValue; + const normalizedScaleValue = parseFloat(currentScaleValue) === currentScale ? Math.round(currentScale * 10000) / 100 : currentScaleValue; + const pageNumber = firstPage.id; + const currentPageView = this._pages[pageNumber - 1]; + const container = this.container; + const topLeft = currentPageView.getPagePoint(container.scrollLeft - firstPage.x, container.scrollTop - firstPage.y); + const [left, top] = topLeft; + let pdfOpenParams = `#page=${pageNumber}`; + if (!this.isInPresentationMode) { + pdfOpenParams += `&zoom=${normalizedScaleValue},` + `${Math.round(left)},${Math.round(top)}`; + } + this._location = { + pageNumber, + scale: normalizedScaleValue, + top, + left, + rotation: this._pagesRotation, + pdfOpenParams + }; + } + update() { + const visible = this._getVisiblePages(); + const visiblePages = visible.views, + numVisiblePages = visiblePages.length; + if (numVisiblePages === 0) { + return; + } + const newCacheSize = Math.max(DEFAULT_CACHE_SIZE, 2 * numVisiblePages + 1); + this.#buffer.resize(newCacheSize, visible.ids); + for (const { + view, + visibleArea + } of visiblePages) { + view.updateVisibleArea(visibleArea); + } + for (const view of this.#buffer) { + if (!visible.ids.has(view.id)) { + view.updateVisibleArea(null); + } + } + this.renderingQueue.renderHighestPriority(visible); + const isSimpleLayout = this._spreadMode === SpreadMode.NONE && (this._scrollMode === ScrollMode.PAGE || this._scrollMode === ScrollMode.VERTICAL); + const currentPageNumber = this._currentPageNumber; + let stillFullyVisible = false; + for (const page of visiblePages) { + if (page.percent < 100) { + break; + } + if (page.id === currentPageNumber && isSimpleLayout) { + stillFullyVisible = true; + break; + } + } + this._setCurrentPageNumber(stillFullyVisible ? this._currentPageNumber : visiblePages[0].id); + this._updateLocation(visible.first); + this.eventBus.dispatch("updateviewarea", { + source: this, + location: this._location + }); + } + #switchToEditAnnotationMode() { + const visible = this._getVisiblePages(); + const pagesToRefresh = []; + const { + ids, + views + } = visible; + for (const page of views) { + const { + view + } = page; + if (!view.hasEditableAnnotations()) { + ids.delete(view.id); + continue; + } + pagesToRefresh.push(page); + } + if (pagesToRefresh.length === 0) { + return null; + } + this.renderingQueue.renderHighestPriority({ + first: pagesToRefresh[0], + last: pagesToRefresh.at(-1), + views: pagesToRefresh, + ids + }); + return ids; + } + containsElement(element) { + return this.container.contains(element); + } + focus() { + this.container.focus(); + } + get _isContainerRtl() { + return getComputedStyle(this.container).direction === "rtl"; + } + get isInPresentationMode() { + return this.presentationModeState === PresentationModeState.FULLSCREEN; + } + get isChangingPresentationMode() { + return this.presentationModeState === PresentationModeState.CHANGING; + } + get isHorizontalScrollbarEnabled() { + return !this.isInPresentationMode && this.container.scrollWidth > this.container.clientWidth; + } + get isVerticalScrollbarEnabled() { + return !this.isInPresentationMode && this.container.scrollHeight > this.container.clientHeight; + } + _getVisiblePages() { + const views = this._scrollMode === ScrollMode.PAGE ? this.#scrollModePageState.pages : this._pages, + horizontal = this._scrollMode === ScrollMode.HORIZONTAL, + rtl = horizontal && this._isContainerRtl; + return getVisibleElements({ + scrollEl: this.container, + views, + sortByVisibility: true, + horizontal, + rtl + }); + } + cleanup() { + for (const pageView of this._pages) { + if (pageView.renderingState !== RenderingStates.FINISHED) { + pageView.reset(); + } + } + } + _cancelRendering() { + for (const pageView of this._pages) { + pageView.cancelRendering(); + } + } + async #ensurePdfPageLoaded(pageView) { + if (pageView.pdfPage) { + return pageView.pdfPage; + } + try { + const pdfPage = await this.pdfDocument.getPage(pageView.id); + if (!pageView.pdfPage) { + pageView.setPdfPage(pdfPage); + } + return pdfPage; + } catch (reason) { + console.error("Unable to get page for page view", reason); + return null; + } + } + #getScrollAhead(visible) { + if (visible.first?.id === 1) { + return true; + } else if (visible.last?.id === this.pagesCount) { + return false; + } + switch (this._scrollMode) { + case ScrollMode.PAGE: + return this.#scrollModePageState.scrollDown; + case ScrollMode.HORIZONTAL: + return this.scroll.right; + } + return this.scroll.down; + } + forceRendering(currentlyVisiblePages) { + const visiblePages = currentlyVisiblePages || this._getVisiblePages(); + const scrollAhead = this.#getScrollAhead(visiblePages); + const preRenderExtra = this._spreadMode !== SpreadMode.NONE && this._scrollMode !== ScrollMode.HORIZONTAL; + const ignoreDetailViews = this.#scaleTimeoutId !== null || this.#scrollTimeoutId !== null && visiblePages.views.some(page => page.detailView?.renderingCancelled); + const pageView = this.renderingQueue.getHighestPriority(visiblePages, this._pages, scrollAhead, preRenderExtra, ignoreDetailViews); + if (pageView) { + this.#ensurePdfPageLoaded(pageView).then(() => { + this.renderingQueue.renderView(pageView); + }); + return true; + } + return false; + } + get hasEqualPageSizes() { + const firstPageView = this._pages[0]; + for (let i = 1, ii = this._pages.length; i < ii; ++i) { + const pageView = this._pages[i]; + if (pageView.width !== firstPageView.width || pageView.height !== firstPageView.height) { + return false; + } + } + return true; + } + getPagesOverview() { + let initialOrientation; + return this._pages.map(pageView => { + const viewport = pageView.pdfPage.getViewport({ + scale: 1 + }); + const orientation = isPortraitOrientation(viewport); + if (initialOrientation === undefined) { + initialOrientation = orientation; + } else if (this.enablePrintAutoRotate && orientation !== initialOrientation) { + return { + width: viewport.height, + height: viewport.width, + rotation: (viewport.rotation - 90) % 360 + }; + } + return { + width: viewport.width, + height: viewport.height, + rotation: viewport.rotation + }; + }); + } + get optionalContentConfigPromise() { + if (!this.pdfDocument) { + return Promise.resolve(null); + } + if (!this._optionalContentConfigPromise) { + console.error("optionalContentConfigPromise: Not initialized yet."); + return this.pdfDocument.getOptionalContentConfig({ + intent: "display" + }); + } + return this._optionalContentConfigPromise; + } + set optionalContentConfigPromise(promise) { + if (!(promise instanceof Promise)) { + throw new Error(`Invalid optionalContentConfigPromise: ${promise}`); + } + if (!this.pdfDocument) { + return; + } + if (!this._optionalContentConfigPromise) { + return; + } + this._optionalContentConfigPromise = promise; + this.refresh(false, { + optionalContentConfigPromise: promise + }); + this.eventBus.dispatch("optionalcontentconfigchanged", { + source: this, + promise + }); + } + get scrollMode() { + return this._scrollMode; + } + set scrollMode(mode) { + if (this._scrollMode === mode) { + return; + } + if (!isValidScrollMode(mode)) { + throw new Error(`Invalid scroll mode: ${mode}`); + } + if (this.pagesCount > PagesCountLimit.FORCE_SCROLL_MODE_PAGE) { + return; + } + this._previousScrollMode = this._scrollMode; + this.clearSelection(); + this._scrollMode = mode; + this.eventBus.dispatch("scrollmodechanged", { + source: this, + mode + }); + this._updateScrollMode(this._currentPageNumber); + } + _updateScrollMode(pageNumber = null) { + const scrollMode = this._scrollMode, + viewer = this.viewer; + viewer.classList.toggle("scrollHorizontal", scrollMode === ScrollMode.HORIZONTAL); + viewer.classList.toggle("scrollWrapped", scrollMode === ScrollMode.WRAPPED); + if (!this.pdfDocument || !pageNumber) { + return; + } + if (scrollMode === ScrollMode.PAGE) { + this.#ensurePageViewVisible(); + } else if (this._previousScrollMode === ScrollMode.PAGE) { + this._updateSpreadMode(); + } + if (this._currentScaleValue && isNaN(this._currentScaleValue)) { + this.#setScale(this._currentScaleValue, { + noScroll: true + }); + } + this._setCurrentPageNumber(pageNumber, true); + this.update(); + } + get spreadMode() { + return this._spreadMode; + } + set spreadMode(mode) { + if (this._spreadMode === mode) { + return; + } + if (!isValidSpreadMode(mode)) { + throw new Error(`Invalid spread mode: ${mode}`); + } + this.clearSelection(); + this._spreadMode = mode; + this.eventBus.dispatch("spreadmodechanged", { + source: this, + mode + }); + this._updateSpreadMode(this._currentPageNumber); + } + _updateSpreadMode(pageNumber = null) { + if (!this.pdfDocument) { + return; + } + const viewer = this.viewer, + pages = this._pages; + if (this._scrollMode === ScrollMode.PAGE) { + this.#ensurePageViewVisible(); + } else { + viewer.textContent = ""; + if (this._spreadMode === SpreadMode.NONE) { + for (const pageView of this._pages) { + viewer.append(pageView.div); + } + } else { + const parity = this._spreadMode - 1; + let spread = null; + for (let i = 0, ii = pages.length; i < ii; ++i) { + if (spread === null) { + spread = document.createElement("div"); + spread.className = "spread"; + viewer.append(spread); + } else if (i % 2 === parity) { + spread = spread.cloneNode(false); + viewer.append(spread); + } + spread.append(pages[i].div); + } + } + } + if (!pageNumber) { + return; + } + if (this._currentScaleValue && isNaN(this._currentScaleValue)) { + this.#setScale(this._currentScaleValue, { + noScroll: true + }); + } + this._setCurrentPageNumber(pageNumber, true); + this.update(); + } + #getPageAdvance(currentPageNumber, previous = false) { + switch (this._scrollMode) { + case ScrollMode.WRAPPED: + { + const { + views + } = this._getVisiblePages(), + pageLayout = new Map(); + for (const { + id, + y, + percent, + widthPercent + } of views) { + if (percent === 0 || widthPercent < 100) { + continue; + } + pageLayout.getOrInsertComputed(y, makeArr).push(id); + } + for (const yArray of pageLayout.values()) { + const currentIndex = yArray.indexOf(currentPageNumber); + if (currentIndex === -1) { + continue; + } + const numPages = yArray.length; + if (numPages === 1) { + break; + } + if (previous) { + for (let i = currentIndex - 1, ii = 0; i >= ii; i--) { + const currentId = yArray[i], + expectedId = yArray[i + 1] - 1; + if (currentId < expectedId) { + return currentPageNumber - expectedId; + } + } + } else { + for (let i = currentIndex + 1; i < numPages; i++) { + const currentId = yArray[i], + expectedId = yArray[i - 1] + 1; + if (currentId > expectedId) { + return expectedId - currentPageNumber; + } + } + } + if (previous) { + const firstId = yArray[0]; + if (firstId < currentPageNumber) { + return currentPageNumber - firstId + 1; + } + } else { + const lastId = yArray[numPages - 1]; + if (lastId > currentPageNumber) { + return lastId - currentPageNumber + 1; + } + } + break; + } + break; + } + case ScrollMode.HORIZONTAL: + { + break; + } + case ScrollMode.PAGE: + case ScrollMode.VERTICAL: + { + if (this._spreadMode === SpreadMode.NONE) { + break; + } + const parity = this._spreadMode - 1; + if (previous && currentPageNumber % 2 !== parity) { + break; + } else if (!previous && currentPageNumber % 2 === parity) { + break; + } + const { + views + } = this._getVisiblePages(), + expectedId = previous ? currentPageNumber - 1 : currentPageNumber + 1; + for (const { + id, + percent, + widthPercent + } of views) { + if (id !== expectedId) { + continue; + } + if (percent > 0 && widthPercent === 100) { + return 2; + } + break; + } + break; + } + } + return 1; + } + nextPage() { + const currentPageNumber = this._currentPageNumber, + pagesCount = this.pagesCount; + if (currentPageNumber >= pagesCount) { + return false; + } + const advance = this.#getPageAdvance(currentPageNumber, false) || 1; + this.currentPageNumber = Math.min(currentPageNumber + advance, pagesCount); + return true; + } + previousPage() { + const currentPageNumber = this._currentPageNumber; + if (currentPageNumber <= 1) { + return false; + } + const advance = this.#getPageAdvance(currentPageNumber, true) || 1; + this.currentPageNumber = Math.max(currentPageNumber - advance, 1); + return true; + } + updateScale({ + drawingDelay, + scaleFactor = null, + steps = null, + origin, + pan = null + }) { + if (steps === null && scaleFactor === null) { + throw new Error("Invalid updateScale options: either `steps` or `scaleFactor` must be provided."); + } + if (!this.pdfDocument) { + return; + } + let newScale = this._currentScale; + if (scaleFactor > 0 && scaleFactor !== 1) { + newScale = Math.round(newScale * scaleFactor * 100) / 100; + } else if (steps) { + const delta = steps > 0 ? (/* inlined export .DEFAULT_SCALE_DELTA */1.1) : 1 / (/* inlined export .DEFAULT_SCALE_DELTA */1.1); + const round = steps > 0 ? Math.ceil : Math.floor; + steps = Math.abs(steps); + do { + newScale = round((newScale * delta).toFixed(2) * 10) / 10; + } while (--steps > 0); + } + newScale = MathClamp(newScale, (/* inlined export .MIN_SCALE */0.1), (/* inlined export .MAX_SCALE */25)); + this.#setScale(newScale, { + noScroll: false, + drawingDelay, + origin, + pan + }); + } + increaseScale(options = {}) { + this.updateScale({ + ...options, + steps: options.steps ?? 1 + }); + } + decreaseScale(options = {}) { + this.updateScale({ + ...options, + steps: -(options.steps ?? 1) + }); + } + #updateContainerHeightCss(height = this.container.clientHeight) { + if (height !== this.#previousContainerHeight) { + this.#previousContainerHeight = height; + docStyle.setProperty("--viewer-container-height", `${height}px`); + } + } + #resizeObserverCallback(entries) { + for (const entry of entries) { + if (entry.target === this.container) { + this.#updateContainerHeightCss(Math.floor(entry.borderBoxSize[0].blockSize)); + this.#containerTopLeft = null; + break; + } + } + } + get containerTopLeft() { + return this.#containerTopLeft ||= [this.container.offsetTop, this.container.offsetLeft]; + } + #cleanupTimeouts() { + if (this.#scaleTimeoutId !== null) { + clearTimeout(this.#scaleTimeoutId); + this.#scaleTimeoutId = null; + } + if (this.#scrollTimeoutId !== null) { + clearTimeout(this.#scrollTimeoutId); + this.#scrollTimeoutId = null; + } + } + #cleanupSwitchAnnotationEditorMode() { + this.#switchAnnotationEditorModeAC?.abort(); + this.#switchAnnotationEditorModeAC = null; + if (this.#switchAnnotationEditorModeTimeoutId !== null) { + clearTimeout(this.#switchAnnotationEditorModeTimeoutId); + this.#switchAnnotationEditorModeTimeoutId = null; + } + } + #preloadEditingData(mode) { + switch (mode) { + case AnnotationEditorType.STAMP: + this.#mlManager?.loadModel("altText"); + break; + case AnnotationEditorType.SIGNATURE: + this.#signatureManager?.loadSignatures(); + break; + } + } + get annotationEditorMode() { + return this.#annotationEditorUIManager ? this.#annotationEditorMode : AnnotationEditorType.DISABLE; + } + set annotationEditorMode({ + mode, + editId = null, + isFromKeyboard = false, + mustEnterInEditMode = false, + editComment = false + }) { + if (!this.#annotationEditorUIManager) { + throw new Error(`The AnnotationEditor is not enabled.`); + } + if (this.#annotationEditorMode === mode) { + return; + } + if (!isValidAnnotationEditorMode(mode)) { + throw new Error(`Invalid AnnotationEditor mode: ${mode}`); + } + if (!this.pdfDocument) { + return; + } + this.#preloadEditingData(mode); + const { + eventBus, + pdfDocument + } = this; + const updater = async () => { + this.#cleanupSwitchAnnotationEditorMode(); + this.#annotationEditorMode = mode; + await this.#annotationEditorUIManager.updateMode(mode, editId, true, isFromKeyboard, mustEnterInEditMode, editComment); + if (mode !== this.#annotationEditorMode || pdfDocument !== this.pdfDocument) { + return; + } + eventBus.dispatch("annotationeditormodechanged", { + source: this, + mode + }); + }; + if (mode === AnnotationEditorType.NONE || this.#annotationEditorMode === AnnotationEditorType.NONE) { + const isEditing = mode !== AnnotationEditorType.NONE; + if (!isEditing) { + this.pdfDocument.annotationStorage.resetModifiedIds(); + } + this.cleanup(); + for (const pageView of this._pages) { + pageView.toggleEditingMode(isEditing); + } + const idsToRefresh = this.#switchToEditAnnotationMode(); + if (isEditing && idsToRefresh) { + this.#cleanupSwitchAnnotationEditorMode(); + this.#switchAnnotationEditorModeAC = new AbortController(); + const signal = AbortSignal.any([this.#eventAC.signal, this.#switchAnnotationEditorModeAC.signal]); + eventBus.on("pagerendered", ({ + pageNumber + }) => { + idsToRefresh.delete(pageNumber); + if (idsToRefresh.size === 0) { + this.#switchAnnotationEditorModeTimeoutId = setTimeout(updater, 0); + } + }, { + signal, + ...internalOpt + }); + return; + } + } + updater(); + } + refresh(noUpdate = false, updateArgs = Object.create(null)) { + if (!this.pdfDocument) { + return; + } + for (const pageView of this._pages) { + pageView.update(updateArgs); + } + this.#cleanupTimeouts(); + if (!noUpdate) { + this.update(); + } + } +} + +;// ./web/secondary_toolbar.js + + + + +class SecondaryToolbar { + #opts; + constructor(options, eventBus) { + this.#opts = options; + const buttons = [{ + element: options.presentationModeButton, + eventName: "presentationmode", + close: true + }, { + element: options.printButton, + eventName: "print", + close: true + }, { + element: options.downloadButton, + eventName: "download", + close: true + }, { + element: options.viewBookmarkButton, + eventName: null, + close: true + }, { + element: options.firstPageButton, + eventName: "firstpage", + close: true + }, { + element: options.lastPageButton, + eventName: "lastpage", + close: true + }, { + element: options.pageRotateCwButton, + eventName: "rotatecw", + close: false + }, { + element: options.pageRotateCcwButton, + eventName: "rotateccw", + close: false + }, { + element: options.cursorSelectToolButton, + eventName: "switchcursortool", + eventDetails: { + tool: CursorTool.SELECT + }, + close: true + }, { + element: options.cursorHandToolButton, + eventName: "switchcursortool", + eventDetails: { + tool: CursorTool.HAND + }, + close: true + }, { + element: options.scrollPageButton, + eventName: "switchscrollmode", + eventDetails: { + mode: ScrollMode.PAGE + }, + close: true + }, { + element: options.scrollVerticalButton, + eventName: "switchscrollmode", + eventDetails: { + mode: ScrollMode.VERTICAL + }, + close: true + }, { + element: options.scrollHorizontalButton, + eventName: "switchscrollmode", + eventDetails: { + mode: ScrollMode.HORIZONTAL + }, + close: true + }, { + element: options.scrollWrappedButton, + eventName: "switchscrollmode", + eventDetails: { + mode: ScrollMode.WRAPPED + }, + close: true + }, { + element: options.spreadNoneButton, + eventName: "switchspreadmode", + eventDetails: { + mode: SpreadMode.NONE + }, + close: true + }, { + element: options.spreadOddButton, + eventName: "switchspreadmode", + eventDetails: { + mode: SpreadMode.ODD + }, + close: true + }, { + element: options.spreadEvenButton, + eventName: "switchspreadmode", + eventDetails: { + mode: SpreadMode.EVEN + }, + close: true + }, { + element: options.imageAltTextSettingsButton, + eventName: "imagealttextsettings", + close: true + }, { + element: options.documentPropertiesButton, + eventName: "documentproperties", + close: true + }]; + buttons.push({ + element: options.openFileButton, + eventName: "openfile", + close: true + }); + this.eventBus = eventBus; + this.opened = false; + this.#bindListeners(buttons); + this.reset(); + } + get isOpen() { + return this.opened; + } + setPageNumber(pageNumber) { + this.pageNumber = pageNumber; + this.#updateUIState(); + } + setPagesCount(pagesCount) { + this.pagesCount = pagesCount; + this.#updateUIState(); + } + reset() { + this.pageNumber = 0; + this.pagesCount = 0; + this.#updateUIState(); + this.eventBus.dispatch("switchcursortool", { + source: this, + reset: true + }); + this.#scrollModeChanged({ + mode: ScrollMode.VERTICAL + }); + this.#spreadModeChanged({ + mode: SpreadMode.NONE + }); + } + #updateUIState() { + const { + firstPageButton, + lastPageButton, + pageRotateCwButton, + pageRotateCcwButton + } = this.#opts; + firstPageButton.disabled = this.pageNumber <= 1; + lastPageButton.disabled = this.pageNumber >= this.pagesCount; + pageRotateCwButton.disabled = this.pagesCount === 0; + pageRotateCcwButton.disabled = this.pagesCount === 0; + } + #bindListeners(buttons) { + const { + eventBus + } = this; + const { + toggleButton + } = this.#opts; + toggleButton.addEventListener("click", this.toggle.bind(this)); + for (const { + element, + eventName, + close, + eventDetails + } of buttons) { + element.addEventListener("click", evt => { + if (eventName !== null) { + eventBus.dispatch(eventName, { + source: this, + ...eventDetails + }); + } + if (close) { + this.close(); + } + eventBus.dispatch("reporttelemetry", { + source: this, + details: { + type: "buttons", + data: { + id: element.id + } + } + }); + }); + } + eventBus.on("cursortoolchanged", this.#cursorToolChanged.bind(this), internalOpt); + eventBus.on("scrollmodechanged", this.#scrollModeChanged.bind(this), internalOpt); + eventBus.on("spreadmodechanged", this.#spreadModeChanged.bind(this), internalOpt); + } + #cursorToolChanged({ + tool, + disabled + }) { + const { + cursorSelectToolButton, + cursorHandToolButton + } = this.#opts; + toggleCheckedBtn(cursorSelectToolButton, tool === CursorTool.SELECT); + toggleCheckedBtn(cursorHandToolButton, tool === CursorTool.HAND); + cursorSelectToolButton.disabled = disabled; + cursorHandToolButton.disabled = disabled; + } + #scrollModeChanged({ + mode + }) { + const { + scrollPageButton, + scrollVerticalButton, + scrollHorizontalButton, + scrollWrappedButton, + spreadNoneButton, + spreadOddButton, + spreadEvenButton + } = this.#opts; + toggleCheckedBtn(scrollPageButton, mode === ScrollMode.PAGE); + toggleCheckedBtn(scrollVerticalButton, mode === ScrollMode.VERTICAL); + toggleCheckedBtn(scrollHorizontalButton, mode === ScrollMode.HORIZONTAL); + toggleCheckedBtn(scrollWrappedButton, mode === ScrollMode.WRAPPED); + const forceScrollModePage = this.pagesCount > PagesCountLimit.FORCE_SCROLL_MODE_PAGE; + scrollPageButton.disabled = forceScrollModePage; + scrollVerticalButton.disabled = forceScrollModePage; + scrollHorizontalButton.disabled = forceScrollModePage; + scrollWrappedButton.disabled = forceScrollModePage; + const isHorizontal = mode === ScrollMode.HORIZONTAL; + spreadNoneButton.disabled = isHorizontal; + spreadOddButton.disabled = isHorizontal; + spreadEvenButton.disabled = isHorizontal; + } + #spreadModeChanged({ + mode + }) { + const { + spreadNoneButton, + spreadOddButton, + spreadEvenButton + } = this.#opts; + toggleCheckedBtn(spreadNoneButton, mode === SpreadMode.NONE); + toggleCheckedBtn(spreadOddButton, mode === SpreadMode.ODD); + toggleCheckedBtn(spreadEvenButton, mode === SpreadMode.EVEN); + } + open() { + if (this.opened) { + return; + } + this.opened = true; + const { + toggleButton, + toolbar + } = this.#opts; + toggleExpandedBtn(toggleButton, true, toolbar); + } + close() { + if (!this.opened) { + return; + } + this.opened = false; + const { + toggleButton, + toolbar + } = this.#opts; + toggleExpandedBtn(toggleButton, false, toolbar); + } + toggle() { + if (this.opened) { + this.close(); + } else { + this.open(); + } + } +} + +;// ./web/signature_manager.js + + + + + + + + +const DEFAULT_HEIGHT_IN_PAGE = 40; +class SignatureManager { + #addButton; + #tabsToAltText = null; + #clearButton; + #clearDescription; + #currentEditor; + #description; + #dialog; + #drawCurves = null; + #drawPlaceholder; + #drawPath = null; + #drawPathString = ""; + #drawPoints = null; + #drawSVG; + #drawThickness; + #errorBar; + #errorDescription; + #errorTitle; + #extractedSignatureData = null; + #imagePath = null; + #imagePicker; + #imagePickerLink; + #imagePlaceholder; + #imageSVG; + #saveCheckbox; + #saveContainer; + #tabButtons; + #addSignatureToolbarButton; + #loadSignaturesPromise = null; + #typeInput; + #currentTab = null; + #currentTabAC = null; + #hasDescriptionChanged = false; + #eventBus; + #isStorageFull = false; + #l10n; + #overlayManager; + #editDescriptionDialog; + #signatureStorage; + #uiManager = null; + static #l10nDescription = null; + constructor({ + dialog, + panels, + typeButton, + typeInput, + drawButton, + drawPlaceholder, + drawSVG, + drawThickness, + imageButton, + imageSVG, + imagePlaceholder, + imagePicker, + imagePickerLink, + description, + clearButton, + cancelButton, + addButton, + errorCloseButton, + errorBar, + errorTitle, + errorDescription, + saveCheckbox, + saveContainer + }, editSignatureElements, addSignatureToolbarButton, overlayManager, l10n, signatureStorage, eventBus) { + this.#addButton = addButton; + this.#clearButton = clearButton; + this.#clearDescription = description.lastElementChild; + this.#description = description.firstElementChild; + this.#dialog = dialog; + this.#drawSVG = drawSVG; + this.#drawPlaceholder = drawPlaceholder; + this.#drawThickness = drawThickness; + this.#errorBar = errorBar; + this.#errorTitle = errorTitle; + this.#errorDescription = errorDescription; + this.#imageSVG = imageSVG; + this.#imagePlaceholder = imagePlaceholder; + this.#imagePicker = imagePicker; + this.#imagePickerLink = imagePickerLink; + this.#overlayManager = overlayManager; + this.#saveCheckbox = saveCheckbox; + this.#saveContainer = saveContainer; + this.#addSignatureToolbarButton = addSignatureToolbarButton; + this.#typeInput = typeInput; + this.#l10n = l10n; + this.#signatureStorage = signatureStorage; + this.#eventBus = eventBus; + this.#editDescriptionDialog = new EditDescriptionDialog(editSignatureElements, overlayManager); + SignatureManager.#l10nDescription ||= Object.freeze({ + signature: "pdfjs-editor-add-signature-description-default-when-drawing", + errorUploadTitle: "pdfjs-editor-add-signature-image-upload-error-title", + errorUploadDescription: "pdfjs-editor-add-signature-image-upload-error-description", + errorNoDataTitle: "pdfjs-editor-add-signature-image-no-data-error-title", + errorNoDataDescription: "pdfjs-editor-add-signature-image-no-data-error-description" + }); + dialog.addEventListener("close", this.#close.bind(this)); + dialog.addEventListener("contextmenu", e => { + const { + target + } = e; + if (target !== this.#typeInput && target !== this.#description) { + e.preventDefault(); + } + }); + dialog.addEventListener("drop", e => { + stopEvent(e); + }); + cancelButton.addEventListener("click", this.#cancel.bind(this)); + addButton.addEventListener("click", this.#add.bind(this)); + clearButton.addEventListener("click", () => { + this.#reportTelemetry({ + type: "signature", + action: "pdfjs.signature.clear", + data: { + type: this.#currentTab + } + }); + this.#initTab(null); + }, { + passive: true + }); + this.#description.addEventListener("input", () => { + this.#clearDescription.disabled = this.#description.value === ""; + }, { + passive: true + }); + this.#clearDescription.addEventListener("click", () => { + this.#description.value = ""; + this.#clearDescription.disabled = true; + }, { + passive: true + }); + errorCloseButton.addEventListener("click", () => { + errorBar.hidden = true; + }, { + passive: true + }); + this.#initTabButtons(typeButton, drawButton, imageButton, panels); + imagePicker.accept = SupportedImageMimeTypes.keys().join(","); + eventBus.on("storedsignatureschanged", this.#signaturesChanged.bind(this), internalOpt); + overlayManager.register(dialog); + } + #initTabButtons(typeButton, drawButton, imageButton, panels) { + const buttons = this.#tabButtons = new Map([["type", typeButton], ["draw", drawButton], ["image", imageButton]]); + const tabCallback = e => { + for (const [name, button] of buttons) { + if (button === e.target) { + button.setAttribute("aria-selected", true); + button.setAttribute("tabindex", 0); + panels.setAttribute("data-selected", name); + this.#initTab(name); + } else { + button.setAttribute("aria-selected", false); + button.setAttribute("tabindex", -1); + } + } + }; + const buttonsArray = Array.from(buttons.values()); + for (let i = 0, ii = buttonsArray.length; i < ii; i++) { + const button = buttonsArray[i]; + button.addEventListener("click", tabCallback, { + passive: true + }); + button.addEventListener("keydown", ({ + key + }) => { + if (key !== "ArrowLeft" && key !== "ArrowRight") { + return; + } + buttonsArray[i + (key === "ArrowLeft" ? -1 : 1)]?.focus(); + }, { + passive: true + }); + } + } + #resetCommon() { + this.#hasDescriptionChanged = false; + this.#description.value = ""; + if (this.#currentTab) { + this.#tabsToAltText.get(this.#currentTab).value = ""; + } + } + #resetTab(name) { + switch (name) { + case "type": + this.#typeInput.value = ""; + break; + case "draw": + this.#drawCurves = null; + this.#drawPoints = null; + this.#drawPathString = ""; + this.#drawPath?.remove(); + this.#drawPath = null; + this.#drawPlaceholder.hidden = false; + this.#drawThickness.value = 1; + break; + case "image": + this.#imagePlaceholder.hidden = false; + this.#imagePath?.remove(); + this.#imagePath = null; + break; + } + } + #initTab(name) { + if (name && this.#currentTab === name) { + return; + } + if (this.#currentTab) { + this.#tabsToAltText.get(this.#currentTab).value = this.#description.value; + } + if (name) { + this.#currentTab = name; + } + this.#errorBar.hidden = true; + const reset = !name; + if (reset) { + this.#resetCommon(); + } else { + this.#description.value = this.#tabsToAltText.get(this.#currentTab).value; + } + this.#clearDescription.disabled = this.#description.value === ""; + this.#currentTabAC?.abort(); + this.#currentTabAC = new AbortController(); + switch (this.#currentTab) { + case "type": + this.#initTypeTab(reset); + break; + case "draw": + this.#initDrawTab(reset); + break; + case "image": + this.#initImageTab(reset); + break; + } + } + #disableButtons(value) { + if (!value || !this.#isStorageFull) { + this.#saveCheckbox.disabled = !value; + } + this.#clearButton.disabled = this.#addButton.disabled = this.#description.disabled = !value; + } + #initTypeTab(reset) { + if (reset) { + this.#resetTab("type"); + } + this.#disableButtons(this.#typeInput.value); + const { + signal + } = this.#currentTabAC; + const options = { + passive: true, + signal + }; + this.#typeInput.addEventListener("input", () => { + const { + value + } = this.#typeInput; + if (!this.#hasDescriptionChanged) { + this.#tabsToAltText.get("type").default = this.#description.value = value; + this.#clearDescription.disabled = value === ""; + } + this.#disableButtons(value); + }, options); + this.#description.addEventListener("input", () => { + this.#hasDescriptionChanged = this.#typeInput.value !== this.#description.value; + }, options); + } + #initDrawTab(reset) { + if (reset) { + this.#resetTab("draw"); + } + this.#disableButtons(this.#drawPath); + const { + signal + } = this.#currentTabAC; + const options = { + signal + }; + let currentPointerId = NaN; + const drawCallback = e => { + const { + pointerId + } = e; + if (!isNaN(currentPointerId) && currentPointerId !== pointerId) { + return; + } + currentPointerId = pointerId; + e.preventDefault(); + this.#drawSVG.setPointerCapture(pointerId); + const { + width: drawWidth, + height: drawHeight + } = this.#drawSVG.getBoundingClientRect(); + let { + offsetX, + offsetY + } = e; + offsetX = Math.round(offsetX); + offsetY = Math.round(offsetY); + if (e.target === this.#drawPlaceholder) { + this.#drawPlaceholder.hidden = true; + } + if (!this.#drawCurves) { + this.#drawCurves = { + width: drawWidth, + height: drawHeight, + thickness: parseInt(this.#drawThickness.value, 10), + curves: [] + }; + this.#disableButtons(true); + const svgFactory = new DOMSVGFactory(); + const path = this.#drawPath = svgFactory.createElement("path"); + path.setAttribute("stroke-width", this.#drawThickness.value); + this.#drawSVG.append(path); + this.#drawSVG.addEventListener("pointerdown", drawCallback, options); + this.#drawPlaceholder.removeEventListener("pointerdown", drawCallback); + if (this.#description.value === "") { + this.#l10n.get(SignatureManager.#l10nDescription.signature).then(description => { + this.#tabsToAltText.get("draw").default = description; + this.#description.value ||= description; + this.#clearDescription.disabled = this.#description.value === ""; + }); + } + } + this.#drawPoints = [offsetX, offsetY]; + this.#drawCurves.curves.push({ + points: this.#drawPoints + }); + this.#drawPathString += `M ${offsetX} ${offsetY}`; + this.#drawPath.setAttribute("d", this.#drawPathString); + const finishDrawAC = new AbortController(); + const listenerDrawOptions = { + signal: AbortSignal.any([signal, finishDrawAC.signal]) + }; + this.#drawSVG.addEventListener("contextmenu", noContextMenu, listenerDrawOptions); + this.#drawSVG.addEventListener("pointermove", evt => { + evt.preventDefault(); + let { + offsetX: x, + offsetY: y + } = evt; + x = Math.round(x); + y = Math.round(y); + const drawPoints = this.#drawPoints; + if (x < 0 || y < 0 || x > drawWidth || y > drawHeight || x === drawPoints.at(-2) && y === drawPoints.at(-1)) { + return; + } + if (drawPoints.length >= 4) { + const [x1, y1, x2, y2] = drawPoints.slice(-4); + this.#drawPathString += `C${(x1 + 5 * x2) / 6} ${(y1 + 5 * y2) / 6} ${(5 * x2 + x) / 6} ${(5 * y2 + y) / 6} ${(x2 + x) / 2} ${(y2 + y) / 2}`; + } else { + this.#drawPathString += `L${x} ${y}`; + } + drawPoints.push(x, y); + this.#drawPath.setAttribute("d", this.#drawPathString); + }, listenerDrawOptions); + this.#drawSVG.addEventListener("pointerup", evt => { + const { + pointerId: pId + } = evt; + if (!isNaN(currentPointerId) && currentPointerId !== pId) { + return; + } + currentPointerId = NaN; + evt.preventDefault(); + this.#drawSVG.releasePointerCapture(pId); + finishDrawAC.abort(); + if (this.#drawPoints.length === 2) { + this.#drawPathString += `L${this.#drawPoints[0]} ${this.#drawPoints[1]}`; + this.#drawPath.setAttribute("d", this.#drawPathString); + } + }, listenerDrawOptions); + }; + if (this.#drawCurves) { + this.#drawSVG.addEventListener("pointerdown", drawCallback, options); + } else { + this.#drawPlaceholder.addEventListener("pointerdown", drawCallback, options); + } + this.#drawThickness.addEventListener("input", () => { + const { + value: thickness + } = this.#drawThickness; + this.#drawThickness.setAttribute("data-l10n-args", JSON.stringify({ + thickness + })); + if (!this.#drawCurves) { + return; + } + this.#drawPath.setAttribute("stroke-width", thickness); + this.#drawCurves.thickness = thickness; + }, options); + } + #showError(type) { + this.#errorTitle.setAttribute("data-l10n-id", SignatureManager.#l10nDescription[`error${type}Title`]); + this.#errorDescription.setAttribute("data-l10n-id", SignatureManager.#l10nDescription[`error${type}Description`]); + this.#errorBar.hidden = false; + } + #initImageTab(reset) { + if (reset) { + this.#resetTab("image"); + } + this.#disableButtons(this.#imagePath); + const { + signal + } = this.#currentTabAC; + const options = { + signal + }; + const passiveOptions = { + passive: true, + signal + }; + this.#imagePickerLink.addEventListener("keydown", e => { + const { + key + } = e; + if (key === "Enter" || key === " ") { + stopEvent(e); + this.#imagePicker.click(); + } + }, options); + this.#imagePicker.addEventListener("click", () => { + this.#dialog.classList.toggle("waiting", true); + }, passiveOptions); + this.#imagePicker.addEventListener("change", async () => { + const file = this.#imagePicker.files?.[0]; + if (!file || !SupportedImageMimeTypes.has(file.type)) { + this.#showError("Upload"); + this.#dialog.classList.toggle("waiting", false); + return; + } + await this.#extractSignature(file); + }, passiveOptions); + this.#imagePicker.addEventListener("cancel", () => { + this.#dialog.classList.toggle("waiting", false); + }, passiveOptions); + this.#imagePlaceholder.addEventListener("dragover", e => { + const { + dataTransfer + } = e; + for (const { + type + } of dataTransfer.items) { + if (!SupportedImageMimeTypes.has(type)) { + continue; + } + dataTransfer.dropEffect = dataTransfer.effectAllowed === "copy" ? "copy" : "move"; + stopEvent(e); + return; + } + dataTransfer.dropEffect = "none"; + }, options); + this.#imagePlaceholder.addEventListener("drop", e => { + const { + dataTransfer: { + files + } + } = e; + if (!files?.length) { + return; + } + for (const file of files) { + if (SupportedImageMimeTypes.has(file.type)) { + this.#extractSignature(file); + break; + } + } + stopEvent(e); + this.#dialog.classList.toggle("waiting", true); + }, options); + } + async #extractSignature(file) { + let data; + try { + data = await this.#uiManager.imageManager.getFromFile(file); + } catch (e) { + console.error("SignatureManager.#extractSignature.", e); + } + if (!data) { + this.#showError("Upload"); + this.#dialog.classList.toggle("waiting", false); + return; + } + const lineData = this.#extractedSignatureData = this.#currentEditor.getFromImage(data.bitmap); + if (!lineData) { + this.#showError("NoData"); + this.#dialog.classList.toggle("waiting", false); + return; + } + const { + outline + } = lineData; + this.#imagePlaceholder.hidden = true; + this.#disableButtons(true); + const svgFactory = new DOMSVGFactory(); + const path = this.#imagePath = svgFactory.createElement("path"); + this.#imageSVG.setAttribute("viewBox", outline.viewBox); + this.#imageSVG.setAttribute("preserveAspectRatio", "xMidYMid meet"); + this.#imageSVG.append(path); + path.setAttribute("d", outline.toSVGPath()); + this.#tabsToAltText.get("image").default = file.name; + if (this.#description.value === "") { + this.#description.value = file.name || ""; + this.#clearDescription.disabled = this.#description.value === ""; + } + this.#dialog.classList.toggle("waiting", false); + } + #getOutlineForType() { + return this.#currentEditor.getFromText(this.#typeInput.value, window.getComputedStyle(this.#typeInput)); + } + #getOutlineForDraw() { + const { + width, + height + } = this.#drawSVG.getBoundingClientRect(); + return this.#currentEditor.getDrawnSignature(this.#drawCurves, width, height); + } + #reportTelemetry(data) { + this.#eventBus.dispatch("reporttelemetry", { + source: this, + details: { + type: "editing", + data + } + }); + } + #addToolbarButton(signatureData, uuid, description) { + const { + curves, + areContours, + thickness, + width, + height + } = signatureData; + const maxDim = Math.max(width, height); + const outlineData = SignatureExtractor.processDrawnLines({ + lines: { + curves, + thickness, + width, + height + }, + pageWidth: maxDim, + pageHeight: maxDim, + rotation: 0, + innerMargin: 0, + mustSmooth: false, + areContours + }); + if (!outlineData) { + return; + } + const { + outline + } = outlineData; + const svgFactory = new DOMSVGFactory(); + const div = document.createElement("div"); + const button = document.createElement("button"); + button.addEventListener("click", () => { + this.#eventBus.dispatch("switchannotationeditorparams", { + source: this, + type: AnnotationEditorParamsType.CREATE, + value: { + signatureData: { + lines: { + curves, + thickness, + width, + height + }, + mustSmooth: false, + areContours, + description, + uuid, + heightInPage: DEFAULT_HEIGHT_IN_PAGE + } + } + }); + }); + div.append(button); + div.classList.add("toolbarAddSignatureButtonContainer"); + const svg = svgFactory.create(1, 1, true); + button.append(svg); + const span = document.createElement("span"); + span.ariaHidden = true; + button.append(span); + button.classList.add("toolbarAddSignatureButton"); + button.type = "button"; + span.textContent = description; + button.setAttribute("data-l10n-id", "pdfjs-editor-add-saved-signature-button"); + button.setAttribute("data-l10n-args", JSON.stringify({ + description + })); + button.tabIndex = 0; + const path = svgFactory.createElement("path"); + svg.append(path); + svg.setAttribute("viewBox", outline.viewBox); + svg.setAttribute("preserveAspectRatio", "xMidYMid meet"); + if (areContours) { + path.classList.add("contours"); + } + path.setAttribute("d", outline.toSVGPath()); + const deleteButton = document.createElement("button"); + div.append(deleteButton); + deleteButton.classList.add("toolbarButton", "deleteButton"); + deleteButton.setAttribute("data-l10n-id", "pdfjs-editor-delete-signature-button1"); + deleteButton.type = "button"; + deleteButton.tabIndex = 0; + deleteButton.addEventListener("click", async () => { + if (await this.#signatureStorage.delete(uuid)) { + div.remove(); + this.#reportTelemetry({ + type: "signature", + action: "pdfjs.signature.delete_saved", + data: { + savedCount: await this.#signatureStorage.size() + } + }); + } + }); + const deleteSpan = document.createElement("span"); + deleteButton.append(deleteSpan); + deleteSpan.setAttribute("data-l10n-id", "pdfjs-editor-delete-signature-button-label1"); + this.#addSignatureToolbarButton.before(div); + } + async #signaturesChanged() { + const parent = this.#addSignatureToolbarButton.parentElement; + while (parent.firstElementChild !== this.#addSignatureToolbarButton) { + parent.firstElementChild.remove(); + } + this.#loadSignaturesPromise = null; + await this.loadSignatures(true); + } + getSignature(params) { + return this.open(params); + } + async loadSignatures(reload = false) { + if (!this.#addSignatureToolbarButton || !reload && this.#addSignatureToolbarButton.previousElementSibling || !this.#signatureStorage) { + return; + } + if (!this.#loadSignaturesPromise) { + this.#loadSignaturesPromise = this.#signatureStorage.getAll().then(async signatures => [signatures, await Promise.all(Array.from(signatures.values(), ({ + signatureData + }) => SignatureExtractor.decompressSignature(signatureData)))]); + if (!reload) { + return; + } + } + const [signatures, signaturesData] = await this.#loadSignaturesPromise; + this.#loadSignaturesPromise = null; + let i = 0; + for (const [uuid, { + description + }] of signatures) { + const data = signaturesData[i++]; + if (!data) { + continue; + } + data.curves = data.outlines.map(points => ({ + points + })); + delete data.outlines; + this.#addToolbarButton(data, uuid, description); + } + } + async renderEditButton(editor) { + const button = document.createElement("button"); + button.classList.add("altText", "editDescription"); + button.tabIndex = 0; + if (editor.description) { + button.title = editor.description; + } + const span = document.createElement("span"); + button.append(span); + span.setAttribute("data-l10n-id", "pdfjs-editor-add-signature-edit-button-label"); + button.addEventListener("click", () => { + this.#editDescriptionDialog.open(editor); + }, { + passive: true + }); + return button; + } + async open({ + uiManager, + editor + }) { + this.#tabsToAltText ||= new Map(this.#tabButtons.keys().map(name => [name, { + value: "", + default: "" + }])); + this.#uiManager = uiManager; + this.#currentEditor = editor; + this.#uiManager.removeEditListeners(); + const isStorageFull = this.#isStorageFull = await this.#signatureStorage.isFull(); + this.#saveContainer.classList.toggle("fullStorage", isStorageFull); + this.#saveCheckbox.checked = !isStorageFull; + await this.#overlayManager.open(this.#dialog); + const tabType = this.#tabButtons.get("type"); + tabType.focus(); + tabType.click(); + } + #cancel() { + this.#finish(); + } + #finish() { + this.#overlayManager.closeIfActive(this.#dialog); + } + #close() { + if (this.#currentEditor._drawId === null) { + this.#currentEditor.remove(); + } + this.#uiManager?.addEditListeners(); + this.#currentTabAC?.abort(); + this.#currentTabAC = null; + this.#uiManager = null; + this.#currentEditor = null; + this.#resetCommon(); + for (const [name] of this.#tabButtons) { + this.#resetTab(name); + } + this.#disableButtons(false); + this.#currentTab = null; + this.#tabsToAltText = null; + } + async #add() { + let data; + const type = this.#currentTab; + switch (type) { + case "type": + data = this.#getOutlineForType(); + break; + case "draw": + data = this.#getOutlineForDraw(); + break; + case "image": + data = this.#extractedSignatureData; + break; + } + let uuid = null; + const description = this.#description.value; + if (this.#saveCheckbox.checked) { + const { + newCurves, + areContours, + thickness, + width, + height + } = data; + const signatureData = await SignatureExtractor.compressSignature({ + outlines: newCurves, + areContours, + thickness, + width, + height + }); + uuid = await this.#signatureStorage.create({ + description, + signatureData + }); + if (uuid) { + this.#addToolbarButton({ + curves: newCurves.map(points => ({ + points + })), + areContours, + thickness, + width, + height + }, uuid, description); + } else { + console.warn("SignatureManager.add: cannot save the signature."); + } + } + const altText = this.#tabsToAltText.get(type); + this.#reportTelemetry({ + type: "signature", + action: "pdfjs.signature.created", + data: { + type, + saved: !!uuid, + savedCount: await this.#signatureStorage.size(), + descriptionChanged: description !== altText.default + } + }); + this.#currentEditor.addSignature(data, DEFAULT_HEIGHT_IN_PAGE, this.#description.value, uuid); + this.#finish(); + } + destroy() { + this.#uiManager = null; + this.#finish(); + } +} +class EditDescriptionDialog { + #currentEditor; + #previousDescription; + #description; + #dialog; + #overlayManager; + #signatureSVG; + #uiManager; + constructor({ + dialog, + description, + cancelButton, + updateButton, + editSignatureView + }, overlayManager) { + const descriptionInput = this.#description = description.firstElementChild; + this.#signatureSVG = editSignatureView; + this.#dialog = dialog; + this.#overlayManager = overlayManager; + dialog.addEventListener("close", this.#close.bind(this)); + dialog.addEventListener("contextmenu", e => { + if (e.target !== this.#description) { + e.preventDefault(); + } + }); + cancelButton.addEventListener("click", this.#cancel.bind(this)); + updateButton.addEventListener("click", this.#update.bind(this)); + const clearDescription = description.lastElementChild; + clearDescription.addEventListener("click", () => { + descriptionInput.value = ""; + clearDescription.disabled = true; + updateButton.disabled = this.#previousDescription === ""; + }); + descriptionInput.addEventListener("input", () => { + const { + value + } = descriptionInput; + clearDescription.disabled = value === ""; + updateButton.disabled = value === this.#previousDescription; + editSignatureView.setAttribute("aria-label", value); + }, { + passive: true + }); + overlayManager.register(dialog); + } + async open(editor) { + this.#uiManager = editor._uiManager; + this.#currentEditor = editor; + this.#previousDescription = this.#description.value = editor.description; + this.#description.dispatchEvent(new Event("input")); + this.#uiManager.removeEditListeners(); + const { + areContours, + outline + } = editor.getSignaturePreview(); + const svgFactory = new DOMSVGFactory(); + const path = svgFactory.createElement("path"); + this.#signatureSVG.append(path); + this.#signatureSVG.setAttribute("viewBox", outline.viewBox); + path.setAttribute("d", outline.toSVGPath()); + if (areContours) { + path.classList.add("contours"); + } + await this.#overlayManager.open(this.#dialog); + } + async #update() { + this.#currentEditor._reportTelemetry({ + action: "pdfjs.signature.edit_description", + data: { + hasBeenChanged: true + } + }); + this.#currentEditor.description = this.#description.value; + this.#finish(); + } + #cancel() { + this.#currentEditor._reportTelemetry({ + action: "pdfjs.signature.edit_description", + data: { + hasBeenChanged: false + } + }); + this.#finish(); + } + #finish() { + this.#overlayManager.closeIfActive(this.#dialog); + } + #close() { + this.#uiManager?.addEditListeners(); + this.#uiManager = null; + this.#currentEditor = null; + this.#signatureSVG.firstElementChild.remove(); + } +} + +;// ./web/digital_signature_properties_manager.js + + + + + + + + + + + + + +const STATUS_ROW_VERIFIED = "pdfjs-digital-signature-properties-status-verified"; +const STATUS_ROW_INVALID = "pdfjs-digital-signature-properties-status-invalid"; +const STATUS_ROW_UNKNOWN = "pdfjs-digital-signature-properties-status-unknown"; +const STATUS_INFO = { + verified: { + priority: 0, + severity: "verified", + bannerId: "pdfjs-digital-signature-properties-banner-verified", + statusId: STATUS_ROW_VERIFIED + }, + unknown: { + priority: 1, + severity: "error", + bannerId: "pdfjs-digital-signature-properties-banner-unknown", + statusId: STATUS_ROW_UNKNOWN + }, + untrusted: { + priority: 2, + severity: "warn", + bannerId: "pdfjs-digital-signature-properties-banner-untrusted", + statusId: STATUS_ROW_VERIFIED + }, + expired: { + priority: 3, + severity: "warn", + bannerId: "pdfjs-digital-signature-properties-banner-expired", + statusId: STATUS_ROW_VERIFIED + }, + revoked: { + priority: 4, + severity: "error", + bannerId: "pdfjs-digital-signature-properties-banner-revoked", + statusId: STATUS_ROW_VERIFIED + }, + invalid: { + priority: 5, + severity: "error", + bannerId: "pdfjs-digital-signature-properties-banner-invalid", + statusId: STATUS_ROW_INVALID + } +}; +const CERT_L10N_IDS = { + trusted: "pdfjs-digital-signature-properties-certificate-trusted", + unknown: "pdfjs-digital-signature-properties-certificate-unknown", + untrusted: "pdfjs-digital-signature-properties-certificate-untrusted", + expired: "pdfjs-digital-signature-properties-certificate-expired", + revoked: "pdfjs-digital-signature-properties-certificate-revoked" +}; +const CERT_EXPIRED_WITH_DATE_L10N_ID = "pdfjs-digital-signature-properties-certificate-expired-with-date"; +function untrustedCertLabel(errorCode, issuerCN) { + const code = (errorCode || "").toUpperCase(); + const args = issuerCN ? { + issuer: issuerCN + } : null; + if (code.includes("UNKNOWN_ISSUER") && args) { + return { + id: "pdfjs-digital-signature-properties-certificate-untrusted-unknown-issuer", + args + }; + } + if (code.includes("SELF_SIGNED") && args) { + return { + id: "pdfjs-digital-signature-properties-certificate-untrusted-self-signed", + args + }; + } + if (code.includes("UNTRUSTED_ISSUER") && args) { + return { + id: "pdfjs-digital-signature-properties-certificate-untrusted-untrusted-issuer", + args + }; + } + return { + id: "pdfjs-digital-signature-properties-certificate-untrusted", + args: null + }; +} +function expirationDateForCert(cert) { + if (!cert) { + return null; + } + const now = Date.now(); + const entries = Array.isArray(cert.chain) && cert.chain.length ? cert.chain : [cert]; + for (const entry of entries) { + if (typeof entry?.notAfter !== "string" || !entry.notAfter) { + continue; + } + const date = new Date(entry.notAfter); + const ts = date.getTime(); + if (Number.isFinite(ts) && ts < now) { + return date; + } + } + return null; +} +class SignaturePropertiesManager { + #appConfig; + #verifier; + #eventBus; + #signatures = []; + #results = new Map(); + #pendingVerify = new Set(); + #isOpen = false; + #isLoading = false; + #needsRender = false; + #pdfDocument = null; + constructor({ + appConfig, + verifier, + eventBus + }) { + this.#appConfig = appConfig; + this.#verifier = verifier; + this.#eventBus = eventBus; + const button = appConfig.signaturePropertiesButton; + for (let i = 0; i < 3; i++) { + const dot = document.createElement("span"); + dot.className = "loadingDot"; + button.append(dot); + } + button.addEventListener("click", () => { + this.#toggle(); + }); + } + get isOpen() { + return this.#isOpen; + } + close() { + if (this.#isOpen) { + this.#close(); + } + } + shouldCloseOnClick(target) { + if (!this.#isOpen) { + return false; + } + return !(this.#appConfig.signaturePropertiesButton.contains(target) || this.#appConfig.signaturePropertiesPanel.contains(target)); + } + async setDocument(pdfDocument) { + if (this.#pdfDocument) { + this.#signatures = []; + this.#results.clear(); + this.#pendingVerify.clear(); + this.#needsRender = false; + this.#hideButton(); + this.#close(); + this.#updateButtonState(); + } + this.#pdfDocument = pdfDocument; + if (!pdfDocument) { + return; + } + this.#isLoading = true; + this.#render(); + let signatures; + try { + signatures = await pdfDocument.getSignatures(); + } catch (ex) { + console.warn("getSignatures failed:", ex); + } + if (pdfDocument !== this.#pdfDocument) { + return; + } + this.#signatures = signatures || []; + this.#isLoading = false; + if (this.#signatures.length === 0) { + this.#hideButton(); + return; + } + this.#showButton(); + for (const sig of this.#signatures) { + this.#results.set(sig.id, { + status: "unknown", + errorCode: null, + message: null, + certificate: null, + documentModifiedAfterSigning: !sig.coversWholeDocument, + modificationsAfterSignature: sig.modificationsAfterSignature + }); + } + this.#render(); + this.#updateButtonState(); + for (const sig of this.#signatures) { + this.#verify(sig, pdfDocument); + } + } + #showButton() { + const root = this.#appConfig.signaturePropertiesButton.parentElement; + if (root) { + root.hidden = false; + } + const sep = this.#appConfig.signaturePropertiesSeparator; + if (sep) { + sep.hidden = false; + } + } + #hideButton() { + const root = this.#appConfig.signaturePropertiesButton.parentElement; + if (root) { + root.hidden = true; + } + const sep = this.#appConfig.signaturePropertiesSeparator; + if (sep) { + sep.hidden = true; + } + } + #toggle() { + if (this.#isOpen) { + this.#close(); + } else { + this.#open(); + } + } + #open() { + this.#isOpen = true; + this.#eventBus?.dispatch("switchannotationeditormode", { + source: this, + mode: AnnotationEditorType.NONE + }); + this.#eventBus?.dispatch("findbarclose", { + source: this + }); + this.#appConfig.signaturePropertiesPanel.classList.remove("hidden"); + this.#appConfig.signaturePropertiesButton.setAttribute("aria-expanded", "true"); + if (this.#needsRender) { + this.#render(); + } + } + #close() { + this.#isOpen = false; + this.#appConfig.signaturePropertiesPanel.classList.add("hidden"); + this.#appConfig.signaturePropertiesButton.setAttribute("aria-expanded", "false"); + } + get #worst() { + let worst = "verified"; + for (const r of this.#results.values()) { + if (r?.status && STATUS_INFO[r.status].priority > STATUS_INFO[worst].priority) { + worst = r.status; + } + } + return worst; + } + get #bannerState() { + if (this.#results.size === 0) { + return { + worst: "unknown", + severity: "error", + count: 0 + }; + } + const worst = this.#worst; + let count = 0; + for (const r of this.#results.values()) { + if (r?.status === worst) { + count++; + } + } + return { + worst, + severity: STATUS_INFO[worst].severity, + count + }; + } + #render() { + if (!this.#isOpen) { + this.#needsRender = true; + return; + } + this.#needsRender = false; + const list = this.#appConfig.signaturePropertiesList; + const banner = this.#appConfig.signaturePropertiesBanner; + const fragment = document.createDocumentFragment(); + if (this.#isLoading) { + banner.hidden = true; + list.replaceChildren(); + return; + } + const { + worst, + severity, + count + } = this.#bannerState; + banner.replaceChildren(); + banner.hidden = false; + banner.className = `sigBanner ${severity}`; + banner.setAttribute("data-l10n-id", STATUS_INFO[worst].bannerId); + banner.setAttribute("data-l10n-args", JSON.stringify({ + count + })); + const byParent = new Map(); + const topLevel = []; + for (const sig of this.#signatures) { + if (sig.parentId) { + byParent.getOrInsertComputed(sig.parentId, makeArr).push(sig); + } else { + topLevel.push(sig); + } + } + const everythingFine = severity === "verified"; + for (const sig of topLevel) { + fragment.append(this.#renderCard(sig, byParent, 0, everythingFine)); + } + list.replaceChildren(fragment); + } + #renderCard(sig, byParent, depth, everythingFine) { + const subs = byParent.get(sig.id) || []; + const li = document.createElement("li"); + li.classList.add("sigCard"); + if (depth === 0 && everythingFine) { + li.classList.add("sigCard--top-allfine"); + } + const result = this.#results.get(sig.id); + const subjectCN = result?.certificate?.subjectCN; + if (subjectCN) { + const signer = document.createElement("div"); + signer.className = "signer"; + signer.textContent = subjectCN; + li.append(signer); + } + const statusRow = document.createElement("div"); + statusRow.classList.add("row", `status--${result.status}`); + const statusLabel = document.createElement("span"); + statusLabel.setAttribute("data-l10n-id", STATUS_INFO[result.status].statusId); + statusRow.append(statusLabel); + li.append(statusRow); + if (result.status === "invalid" && result.message) { + const reason = document.createElement("div"); + reason.className = "detail"; + reason.setAttribute("data-l10n-id", "pdfjs-digital-signature-properties-reason"); + reason.setAttribute("data-l10n-args", JSON.stringify({ + reason: result.message + })); + li.append(reason); + } + const cert = result.certificate; + let certKind = "unknown"; + if (cert) { + switch (result.status) { + case "verified": + certKind = "trusted"; + break; + case "expired": + certKind = "expired"; + break; + case "revoked": + certKind = "revoked"; + break; + case "untrusted": + certKind = "untrusted"; + break; + default: + certKind = "unknown"; + } + } + if (result.status !== "invalid") { + const certRow = document.createElement("div"); + certRow.classList.add("row", `cert--${certKind}`); + const certLabel = document.createElement("span"); + let l10nId = CERT_L10N_IDS[certKind]; + let l10nArgs = null; + if (cert?.issuerCN && certKind === "trusted") { + l10nArgs = { + issuer: cert.issuerCN + }; + } else if (certKind === "expired") { + const date = expirationDateForCert(cert); + if (date) { + l10nId = CERT_EXPIRED_WITH_DATE_L10N_ID; + l10nArgs = { + dateObj: date.valueOf() + }; + } + } else if (certKind === "untrusted") { + const label = untrustedCertLabel(result.errorCode, cert?.issuerCN); + l10nId = label.id; + l10nArgs = label.args; + } + certLabel.setAttribute("data-l10n-id", l10nId); + if (l10nArgs) { + certLabel.setAttribute("data-l10n-args", JSON.stringify(l10nArgs)); + } + certRow.append(certLabel); + li.append(certRow); + } + if (result.status === "untrusted" && result.message) { + const detail = document.createElement("div"); + detail.className = "detail"; + detail.textContent = result.message; + li.append(detail); + } + if (result.status === "expired" && result.message) { + const detail = document.createElement("div"); + detail.className = "detail"; + detail.textContent = result.message; + li.append(detail); + } + const signingDate = PDFDateString.toDateObject(sig.signingTime); + if (signingDate) { + const ts = document.createElement("div"); + ts.className = "detail"; + ts.setAttribute("data-l10n-id", "pdfjs-digital-signature-properties-timestamp"); + ts.setAttribute("data-l10n-args", JSON.stringify({ + dateObj: signingDate.valueOf() + })); + li.append(ts); + } + if (cert && typeof this.#verifier?.viewCertificate === "function") { + const viewCert = document.createElement("button"); + viewCert.className = "viewCert"; + viewCert.type = "button"; + viewCert.setAttribute("data-l10n-id", "pdfjs-digital-signature-properties-view-certificate"); + viewCert.addEventListener("click", e => { + e.stopPropagation(); + this.#verifier.viewCertificate(cert); + }); + li.append(viewCert); + } + if (subs.length > 0) { + const subList = document.createElement("ul"); + subList.classList.add("signaturePropertiesList", "nested"); + for (const sub of subs) { + subList.append(this.#renderCard(sub, byParent, depth + 1, everythingFine)); + } + if (depth === 0) { + const details = document.createElement("details"); + details.className = "subSignatures"; + details.open = true; + const summary = document.createElement("summary"); + summary.setAttribute("data-l10n-id", "pdfjs-digital-signature-properties-sub-signatures"); + summary.setAttribute("data-l10n-args", JSON.stringify({ + count: this.#countDescendants(sig.id, byParent) + })); + details.append(summary); + details.append(subList); + li.append(details); + } else { + li.append(subList); + } + } + return li; + } + #countDescendants(id, byParent) { + const direct = byParent.get(id); + if (!direct) { + return 0; + } + let total = direct.length; + for (const sub of direct) { + total += this.#countDescendants(sub.id, byParent); + } + return total; + } + async #verify(signature, pdfDocument) { + if (!this.#verifier || this.#pendingVerify.has(signature.id)) { + return; + } + this.#pendingVerify.add(signature.id); + this.#render(); + let result; + try { + const bytes = await pdfDocument.getSignatureData(signature.id); + if (pdfDocument !== this.#pdfDocument) { + return; + } + if (!bytes) { + throw new Error("missing signature data"); + } + result = await this.#verifier.verify({ + ...signature, + ...bytes + }); + } catch (ex) { + console.warn("signature verify failed:", ex); + result = { + status: "unknown", + errorCode: "BRIDGE_ERROR", + message: ex?.message ?? null, + certificate: null, + documentModifiedAfterSigning: !signature.coversWholeDocument, + modificationsAfterSignature: signature.modificationsAfterSignature + }; + } + this.#pendingVerify.delete(signature.id); + if (pdfDocument !== this.#pdfDocument) { + return; + } + this.#results.set(signature.id, result); + this.#render(); + this.#updateButtonState(); + } + #updateButtonState() { + const button = this.#appConfig.signaturePropertiesButton; + button.classList.remove("state-loading", "state-verified", "state-warn", "state-error"); + if (this.#signatures.length === 0) { + return; + } + if (this.#pendingVerify.size > 0) { + button.classList.add("state-loading"); + return; + } + switch (this.#worst) { + case "invalid": + case "revoked": + case "unknown": + button.classList.add("state-error"); + break; + case "expired": + case "untrusted": + button.classList.add("state-warn"); + break; + default: + button.classList.add("state-verified"); + } + } +} + +;// ./web/toolbar.js + + + + +class Toolbar { + #colorPicker = null; + #opts; + constructor(options, eventBus, toolbarDensity = 0) { + this.#opts = options; + this.eventBus = eventBus; + const buttons = [{ + element: options.previous, + eventName: "previouspage" + }, { + element: options.next, + eventName: "nextpage" + }, { + element: options.zoomIn, + eventName: "zoomin" + }, { + element: options.zoomOut, + eventName: "zoomout" + }, { + element: options.print, + eventName: "print" + }, { + element: options.download, + eventName: "download" + }, { + element: options.editorCommentButton, + eventName: "switchannotationeditormode", + eventDetails: { + get mode() { + const { + classList + } = options.editorCommentButton; + return classList.contains("toggled") ? AnnotationEditorType.NONE : AnnotationEditorType.POPUP; + } + } + }, { + element: options.editorFreeTextButton, + eventName: "switchannotationeditormode", + eventDetails: { + get mode() { + const { + classList + } = options.editorFreeTextButton; + return classList.contains("toggled") ? AnnotationEditorType.NONE : AnnotationEditorType.FREETEXT; + } + } + }, { + element: options.editorHighlightButton, + eventName: "switchannotationeditormode", + eventDetails: { + get mode() { + const { + classList + } = options.editorHighlightButton; + return classList.contains("toggled") ? AnnotationEditorType.NONE : AnnotationEditorType.HIGHLIGHT; + } + } + }, { + element: options.editorInkButton, + eventName: "switchannotationeditormode", + eventDetails: { + get mode() { + const { + classList + } = options.editorInkButton; + return classList.contains("toggled") ? AnnotationEditorType.NONE : AnnotationEditorType.INK; + } + } + }, { + element: options.editorStampButton, + eventName: "switchannotationeditormode", + eventDetails: { + get mode() { + const { + classList + } = options.editorStampButton; + return classList.contains("toggled") ? AnnotationEditorType.NONE : AnnotationEditorType.STAMP; + } + }, + telemetry: { + type: "editing", + data: { + action: "pdfjs.image.icon_click" + } + } + }, { + element: options.editorSignatureButton, + eventName: "switchannotationeditormode", + eventDetails: { + get mode() { + const { + classList + } = options.editorSignatureButton; + return classList.contains("toggled") ? AnnotationEditorType.NONE : AnnotationEditorType.SIGNATURE; + } + } + }]; + this.#bindListeners(buttons); + this.#updateToolbarDensity({ + value: toolbarDensity + }); + this.reset(); + } + #updateToolbarDensity({ + value + }) { + let name = "normal"; + switch (value) { + case 1: + name = "compact"; + break; + case 2: + name = "touch"; + break; + } + document.documentElement.setAttribute("data-toolbar-density", name); + } + setPageNumber(pageNumber, pageLabel) { + this.pageNumber = pageNumber; + this.pageLabel = pageLabel; + this.#updateUIState(false); + } + setPagesCount(pagesCount, hasPageLabels) { + this.pagesCount = pagesCount; + this.hasPageLabels = hasPageLabels; + this.#updateUIState(true); + } + setPageScale(pageScaleValue, pageScale) { + this.pageScaleValue = (pageScaleValue || pageScale).toString(); + this.pageScale = pageScale; + this.#updateUIState(false); + } + reset() { + this.#colorPicker = null; + this.pageNumber = 0; + this.pageLabel = null; + this.hasPageLabels = false; + this.pagesCount = 0; + this.pageScaleValue = (/* inlined export .DEFAULT_SCALE_VALUE */"auto"); + this.pageScale = (/* inlined export .DEFAULT_SCALE */1); + this.#updateUIState(true); + this.updateLoadingIndicatorState(); + this.#editorModeChanged({ + mode: AnnotationEditorType.DISABLE + }); + } + #bindListeners(buttons) { + const { + eventBus + } = this; + const { + editorHighlightColorPicker, + editorHighlightButton, + pageNumber, + scaleSelect + } = this.#opts; + const self = this; + for (const { + element, + eventName, + eventDetails, + telemetry + } of buttons) { + element.addEventListener("click", evt => { + if (eventName !== null) { + eventBus.dispatch(eventName, { + source: this, + ...eventDetails, + isFromKeyboard: evt.detail === 0 + }); + } + if (telemetry) { + eventBus.dispatch("reporttelemetry", { + source: this, + details: telemetry + }); + } + }); + } + pageNumber.addEventListener("click", function () { + this.select(); + }); + pageNumber.addEventListener("change", function () { + eventBus.dispatch("pagenumberchanged", { + source: self, + value: this.value + }); + }); + eventBus.on("pagesedited", ({ + pagesMapper + }) => { + const pagesCount = pagesMapper.pagesNumber; + if (pagesCount !== this.pagesCount) { + this.setPagesCount(pagesCount, this.hasPageLabels); + } + }, internalOpt); + scaleSelect.addEventListener("change", function () { + if (this.value === "custom") { + return; + } + eventBus.dispatch("scalechanged", { + source: self, + value: this.value + }); + }); + scaleSelect.addEventListener("click", function ({ + target + }) { + if (this.value === self.pageScaleValue && target.tagName.toUpperCase() === "OPTION") { + this.blur(); + } + }); + scaleSelect.oncontextmenu = noContextMenu; + eventBus.on("annotationeditormodechanged", this.#editorModeChanged.bind(this), internalOpt); + eventBus.on("showannotationeditorui", ({ + mode + }) => { + switch (mode) { + case AnnotationEditorType.HIGHLIGHT: + editorHighlightButton.click(); + break; + } + }, internalOpt); + eventBus.on("toolbardensity", this.#updateToolbarDensity.bind(this), internalOpt); + if (editorHighlightColorPicker) { + eventBus.on("annotationeditoruimanager", ({ + uiManager + }) => { + const cp = this.#colorPicker = new ColorPicker({ + uiManager + }); + uiManager.setMainHighlightColorPicker(cp); + editorHighlightColorPicker.append(cp.renderMainDropdown()); + }, internalOpt); + eventBus.on("mainhighlightcolorpickerupdatecolor", ({ + value + }) => { + this.#colorPicker?.update(value); + }, internalOpt); + } + } + #editorModeChanged({ + mode + }) { + const { + editorCommentButton, + editorCommentParamsToolbar, + editorFreeTextButton, + editorFreeTextParamsToolbar, + editorHighlightButton, + editorHighlightParamsToolbar, + editorInkButton, + editorInkParamsToolbar, + editorStampButton, + editorStampParamsToolbar, + editorSignatureButton, + editorSignatureParamsToolbar + } = this.#opts; + toggleExpandedBtn(editorCommentButton, mode === AnnotationEditorType.POPUP, editorCommentParamsToolbar); + toggleExpandedBtn(editorFreeTextButton, mode === AnnotationEditorType.FREETEXT, editorFreeTextParamsToolbar); + toggleExpandedBtn(editorHighlightButton, mode === AnnotationEditorType.HIGHLIGHT, editorHighlightParamsToolbar); + toggleExpandedBtn(editorInkButton, mode === AnnotationEditorType.INK, editorInkParamsToolbar); + toggleExpandedBtn(editorStampButton, mode === AnnotationEditorType.STAMP, editorStampParamsToolbar); + toggleExpandedBtn(editorSignatureButton, mode === AnnotationEditorType.SIGNATURE, editorSignatureParamsToolbar); + editorCommentButton.disabled = editorFreeTextButton.disabled = editorHighlightButton.disabled = editorInkButton.disabled = editorStampButton.disabled = editorSignatureButton.disabled = mode === AnnotationEditorType.DISABLE; + } + #updateUIState(resetNumPages = false) { + const { + pageNumber, + pagesCount, + pageScaleValue, + pageScale + } = this; + const opts = this.#opts; + if (resetNumPages) { + if (this.hasPageLabels) { + opts.pageNumber.type = "text"; + opts.numPages.setAttribute("data-l10n-id", "pdfjs-page-of-pages"); + } else { + opts.pageNumber.type = "number"; + opts.numPages.setAttribute("data-l10n-id", "pdfjs-of-pages"); + opts.numPages.setAttribute("data-l10n-args", JSON.stringify({ + pagesCount + })); + } + opts.pageNumber.max = pagesCount; + } + if (this.hasPageLabels) { + opts.pageNumber.value = this.pageLabel; + opts.numPages.setAttribute("data-l10n-args", JSON.stringify({ + pageNumber, + pagesCount + })); + } else { + opts.pageNumber.value = pageNumber; + } + opts.previous.disabled = pageNumber <= 1; + opts.next.disabled = pageNumber >= pagesCount; + opts.zoomOut.disabled = pageScale <= (/* inlined export .MIN_SCALE */0.1); + opts.zoomIn.disabled = pageScale >= (/* inlined export .MAX_SCALE */25); + let predefinedValueFound = false; + for (const option of opts.scaleSelect.options) { + if (option.value !== pageScaleValue) { + option.selected = false; + continue; + } + option.selected = true; + predefinedValueFound = true; + } + if (!predefinedValueFound) { + opts.customScaleOption.selected = true; + opts.customScaleOption.setAttribute("data-l10n-args", JSON.stringify({ + scale: Math.round(pageScale * 10000) / 100 + })); + } + } + updateLoadingIndicatorState(loading = false) { + const { + pageNumber + } = this.#opts; + pageNumber.classList.toggle("loading", loading); + } +} + +;// ./web/view_history.js + + + +const DEFAULT_VIEW_HISTORY_CACHE_SIZE = 20; +class ViewHistory { + constructor(fingerprint, cacheSize = DEFAULT_VIEW_HISTORY_CACHE_SIZE) { + this._initializedPromise = this._readFromStorage().then(databaseStr => { + const database = JSON.parse(databaseStr || "{}"); + let index = -1; + if (!Array.isArray(database.files)) { + database.files = []; + } else { + while (database.files.length >= cacheSize) { + database.files.shift(); + } + index = database.files.findIndex(branch => branch.fingerprint === fingerprint); + } + if (index === -1) { + index = database.files.push({ + fingerprint + }) - 1; + } + this.file = database.files[index]; + this.database = database; + }); + } + async _writeToStorage() { + const databaseStr = JSON.stringify(this.database); + localStorage.setItem("pdfjs.history", databaseStr); + } + async _readFromStorage() { + return localStorage.getItem("pdfjs.history"); + } + async setMultiple(properties) { + await this._initializedPromise; + for (const name in properties) { + this.file[name] = properties[name]; + } + return this._writeToStorage(); + } + async getMultiple(properties) { + await this._initializedPromise; + const values = Object.create(null); + for (const name in properties) { + const val = this.file[name]; + values[name] = val !== undefined ? val : properties[name]; + } + return values; + } +} + +;// ./web/views_manager.js + + + + +const SIDEBAR_WIDTH_VAR = "--viewsManager-width"; +const SIDEBAR_RESIZING_CLASS = "viewsManagerResizing"; +const UI_NOTIFICATION_CLASS = "pdfSidebarNotification"; +class ViewsManager extends Sidebar { + static #l10nDescription = null; + #hasAnimations = !window.matchMedia("(prefers-reduced-motion: reduce)").matches; + constructor({ + elements: { + outerContainer, + sidebarContainer, + toggleButton, + resizer, + thumbnailButton, + outlineButton, + attachmentsButton, + layersButton, + thumbnailsView, + outlinesView, + attachmentsView, + layersView, + viewsManagerAddFile: { + button: viewsManagerAddFileButton + }, + viewsManagerCurrentOutlineButton, + viewsManagerSelectorButton, + viewsManagerSelectorOptions, + viewsManagerHeaderLabel, + viewsManagerStatus + }, + eventBus, + l10n, + enableMerge = false, + enableSplitMerge = false, + globalAbortSignal + }) { + super({ + sidebar: sidebarContainer, + resizer, + toggleButton + }, l10n.getDirection() === "ltr", false, globalAbortSignal); + this.isOpen = false; + this.active = SidebarView.THUMBS; + this.isInitialViewSet = false; + this.isInitialEventDispatched = false; + this.onToggled = null; + this.onUpdateThumbnails = null; + this.outerContainer = outerContainer; + this.sidebarContainer = sidebarContainer; + this.toggleButton = toggleButton; + this.resizer = resizer; + this.thumbnailButton = thumbnailButton; + this.outlineButton = outlineButton; + this.attachmentsButton = attachmentsButton; + this.layersButton = layersButton; + this.thumbnailsView = thumbnailsView; + this.outlinesView = outlinesView; + this.attachmentsView = attachmentsView; + this.layersView = layersView; + this.viewsManagerAddFileButton = viewsManagerAddFileButton; + this.viewsManagerCurrentOutlineButton = viewsManagerCurrentOutlineButton; + this.viewsManagerHeaderLabel = viewsManagerHeaderLabel; + this.viewsManagerStatus = viewsManagerStatus; + this.eventBus = eventBus; + if (!enableSplitMerge) { + viewsManagerStatus.hidden = true; + } + this._enableSplitMerge = enableSplitMerge; + this._enableMerge = enableMerge; + if (!enableMerge) { + viewsManagerAddFileButton.hidden = true; + } + this.menu = new Menu(viewsManagerSelectorOptions, viewsManagerSelectorButton, [thumbnailButton, outlineButton, attachmentsButton, layersButton]); + ViewsManager.#l10nDescription ||= Object.freeze({ + pagesTitle: "pdfjs-views-manager-pages-title", + outlinesTitle: "pdfjs-views-manager-outlines-title1", + attachmentsTitle: "pdfjs-views-manager-attachments-title", + layersTitle: "pdfjs-views-manager-layers-title1", + notificationButton: "pdfjs-toggle-views-manager-notification-button", + toggleButton: "pdfjs-toggle-views-manager-button1" + }); + this.#addEventListeners(); + } + reset() { + this.isInitialViewSet = false; + this.isInitialEventDispatched = false; + this.#hideUINotification(true); + this.switchView(SidebarView.THUMBS); + this.outlineButton.disabled = this.attachmentsButton.disabled = this.layersButton.disabled = false; + this.viewsManagerCurrentOutlineButton.disabled = true; + } + get visibleView() { + return this.isOpen ? this.active : SidebarView.NONE; + } + setInitialView(view = SidebarView.NONE) { + if (this.isInitialViewSet) { + return; + } + this.isInitialViewSet = true; + if (view === SidebarView.NONE || view === SidebarView.UNKNOWN) { + this.#dispatchEvent(); + return; + } + this.switchView(view, true); + if (!this.isInitialEventDispatched) { + this.#dispatchEvent(); + } + } + switchView(view, forceOpen = false) { + const isViewChanged = view !== this.active; + let forceRendering = false; + let titleL10nId = null; + switch (view) { + case SidebarView.NONE: + if (this.isOpen) { + this.close(); + } + return; + case SidebarView.THUMBS: + titleL10nId = "pagesTitle"; + if (this.isOpen && isViewChanged) { + forceRendering = true; + } + break; + case SidebarView.OUTLINE: + titleL10nId = "outlinesTitle"; + if (this.outlineButton.disabled) { + return; + } + break; + case SidebarView.ATTACHMENTS: + titleL10nId = "attachmentsTitle"; + if (this.attachmentsButton.disabled) { + return; + } + break; + case SidebarView.LAYERS: + titleL10nId = "layersTitle"; + if (this.layersButton.disabled) { + return; + } + break; + default: + console.error(`PDFSidebar.switchView: "${view}" is not a valid view.`); + return; + } + this.viewsManagerStatus.hidden = !this._enableSplitMerge || view !== SidebarView.THUMBS; + this.viewsManagerAddFileButton.hidden = !this._enableMerge || view !== SidebarView.THUMBS; + this.viewsManagerCurrentOutlineButton.hidden = view !== SidebarView.OUTLINE; + this.viewsManagerHeaderLabel.setAttribute("data-l10n-id", ViewsManager.#l10nDescription[titleL10nId] || ""); + this.active = view; + toggleSelectedBtn(this.thumbnailButton, view === SidebarView.THUMBS, this.thumbnailsView); + toggleSelectedBtn(this.outlineButton, view === SidebarView.OUTLINE, this.outlinesView); + toggleSelectedBtn(this.attachmentsButton, view === SidebarView.ATTACHMENTS, this.attachmentsView); + toggleSelectedBtn(this.layersButton, view === SidebarView.LAYERS, this.layersView); + if (forceOpen && !this.isOpen) { + this.open(); + return; + } + if (forceRendering) { + this.onUpdateThumbnails(); + this.onToggled(); + } + if (isViewChanged) { + this.#dispatchEvent(); + } + } + open() { + if (this.isOpen) { + return; + } + this.isOpen = true; + this.onResizing(this.width); + this._sidebar.hidden = false; + toggleExpandedBtn(this.toggleButton, true); + this.switchView(this.active); + if (this.#hasAnimations) { + queueMicrotask(() => { + this.outerContainer.classList.add("viewsManagerMoving", "viewsManagerOpen"); + }); + } else { + this.outerContainer.classList.add("viewsManagerOpen"); + this.eventBus.dispatch("resize", { + source: this + }); + } + if (this.active === SidebarView.THUMBS) { + this.onUpdateThumbnails(); + } + this.onToggled(); + this.#dispatchEvent(); + this.#hideUINotification(); + } + close(evt = null) { + if (!this.isOpen) { + return; + } + this.isOpen = false; + this._sidebar.hidden = true; + toggleExpandedBtn(this.toggleButton, false); + this.outerContainer.classList.add("viewsManagerMoving"); + this.outerContainer.classList.remove("viewsManagerOpen"); + this.onToggled(); + this.#dispatchEvent(); + if (evt?.detail > 0) { + this.toggleButton.blur(); + } + } + toggle(evt = null) { + super.toggle(); + if (this.isOpen) { + this.close(evt); + } else { + this.open(); + } + } + #dispatchEvent() { + if (this.isInitialViewSet) { + this.isInitialEventDispatched ||= true; + } + this.eventBus.dispatch("sidebarviewchanged", { + source: this, + view: this.visibleView + }); + } + #showUINotification() { + this.toggleButton.setAttribute("data-l10n-id", ViewsManager.#l10nDescription.notificationButton); + if (!this.isOpen) { + this.toggleButton.classList.add(UI_NOTIFICATION_CLASS); + } + } + #hideUINotification(reset = false) { + if (this.isOpen || reset) { + this.toggleButton.classList.remove(UI_NOTIFICATION_CLASS); + } + if (reset) { + this.toggleButton.setAttribute("data-l10n-id", ViewsManager.#l10nDescription.toggleButton); + } + } + #addEventListeners() { + const { + eventBus, + outerContainer + } = this; + if (this.#hasAnimations) { + this.sidebarContainer.addEventListener("transitionend", evt => { + if (evt.target === this.sidebarContainer) { + outerContainer.classList.remove("viewsManagerMoving"); + eventBus.dispatch("resize", { + source: this + }); + } + }); + } + this.viewsManagerHeaderLabel.addEventListener("dblclick", e => { + if (this.active === SidebarView.OUTLINE) { + eventBus.dispatch("toggleoutlinetree", { + source: this + }); + return; + } + if (this.active === SidebarView.LAYERS) { + eventBus.dispatch("resetlayers", { + source: this + }); + } + }); + this.thumbnailButton.addEventListener("click", () => { + this.switchView(SidebarView.THUMBS); + }); + this.outlineButton.addEventListener("click", () => { + this.switchView(SidebarView.OUTLINE); + }); + this.attachmentsButton.addEventListener("click", () => { + this.switchView(SidebarView.ATTACHMENTS); + }); + this.layersButton.addEventListener("click", () => { + this.switchView(SidebarView.LAYERS); + }); + this.viewsManagerCurrentOutlineButton.addEventListener("click", () => { + eventBus.dispatch("currentoutlineitem", { + source: this + }); + }); + const onTreeLoaded = (count, button, view) => { + button.disabled = !count; + if (count) { + this.#showUINotification(); + } else if (this.active === view) { + this.switchView(SidebarView.THUMBS); + } + }; + eventBus.on("outlineloaded", evt => { + onTreeLoaded(evt.outlineCount, this.outlineButton, SidebarView.OUTLINE); + evt.currentOutlineItemPromise.then(enabled => { + if (!this.isInitialViewSet) { + return; + } + this.viewsManagerCurrentOutlineButton.disabled = !enabled; + }); + }, internalOpt); + eventBus.on("attachmentsloaded", evt => { + onTreeLoaded(evt.attachmentsCount, this.attachmentsButton, SidebarView.ATTACHMENTS); + }, internalOpt); + eventBus.on("layersloaded", evt => { + onTreeLoaded(evt.layersCount, this.layersButton, SidebarView.LAYERS); + }, internalOpt); + eventBus.on("presentationmodechanged", evt => { + if (evt.state === PresentationModeState.NORMAL && this.visibleView === SidebarView.THUMBS) { + this.onUpdateThumbnails(); + } + }, internalOpt); + } + onStartResizing() { + this.outerContainer.classList.add(SIDEBAR_RESIZING_CLASS); + } + onStopResizing() { + this.eventBus.dispatch("resize", { + source: this + }); + this.outerContainer.classList.remove(SIDEBAR_RESIZING_CLASS); + } + onResizing(newWidth) { + docStyle.setProperty(SIDEBAR_WIDTH_VAR, `${newWidth}px`); + } +} + +;// ./web/app.js + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +const FORCE_PAGES_LOADED_TIMEOUT = 10000; +const ViewOnLoad = { + UNKNOWN: -1, + PREVIOUS: 0, + INITIAL: 1 +}; +const PDFViewerApplication = { + initialBookmark: document.location.hash.substring(1), + _initializedCapability: { + ...Promise.withResolvers(), + settled: false + }, + appConfig: null, + pdfDocument: null, + pdfLoadingTask: null, + printService: null, + pdfViewer: null, + pdfThumbnailViewer: null, + pdfRenderingQueue: null, + pdfPresentationMode: null, + pdfDocumentProperties: null, + pdfLinkService: null, + pdfTextExtractor: null, + pdfHistory: null, + viewsManager: null, + pdfOutlineViewer: null, + pdfAttachmentViewer: null, + pdfLayerViewer: null, + pdfCursorTools: null, + pdfScriptingManager: null, + store: null, + downloadManager: null, + overlayManager: null, + preferences: new Preferences(), + toolbar: null, + secondaryToolbar: null, + eventBus: null, + l10n: null, + annotationEditorParams: null, + signaturePropertiesManager: null, + imageAltTextSettings: null, + isInitialViewSet: false, + isViewerEmbedded: window.parent !== window, + url: "", + baseUrl: "", + mlManager: null, + _downloadUrl: "", + _eventBusAC: null, + _windowAC: null, + _globalAbortController: new AbortController(), + documentInfo: null, + metadata: null, + _contentDispositionFilename: null, + _contentLength: null, + _saveInProgress: false, + _wheelUnusedTicks: 0, + _wheelUnusedFactor: 1, + _touchManager: null, + _touchUnusedTicks: 0, + _touchUnusedFactor: 1, + _PDFBug: null, + _hasAnnotationEditors: false, + _title: document.title, + _printAnnotationStoragePromise: null, + _isCtrlKeyDown: false, + _caretBrowsing: null, + _isScrolling: false, + editorUndoBar: null, + _printPermissionPromise: null, + async initialize(appConfig) { + this.appConfig = appConfig; + try { + await this.preferences.initializedPromise; + } catch (ex) { + console.error("initialize:", ex); + } + if (AppOptions.get("pdfBugEnabled")) { + await this._parseHashParams(); + } + let mode; + switch (AppOptions.get("viewerCssTheme")) { + case 1: + mode = "light"; + break; + case 2: + mode = "dark"; + break; + } + if (mode) { + docStyle.setProperty("color-scheme", mode); + } + this.l10n = await this.externalServices.createL10n(); + document.getElementsByTagName("html")[0].dir = this.l10n.getDirection(); + this.l10n.translate(appConfig.appContainer || document.documentElement); + if (this.isViewerEmbedded && AppOptions.get("externalLinkTarget") === LinkTarget.NONE) { + AppOptions.set("externalLinkTarget", LinkTarget.TOP); + } + await this._initializeViewerComponents(); + this.bindEvents(); + this.bindWindowEvents(); + this._initializedCapability.settled = true; + this._initializedCapability.resolve(); + }, + async _parseHashParams() { + const hash = document.location.hash.substring(1); + if (!hash) { + return; + } + const { + mainContainer, + viewerContainer + } = this.appConfig, + params = parseQueryString(hash); + const loadPDFBug = async () => { + if (this._PDFBug) { + return; + } + const { + PDFBug + } = await import( + /*webpackIgnore: true*/ + /*@vite-ignore*/ + AppOptions.get("debuggerSrc")); + this._PDFBug = PDFBug; + }; + if (params.get("disableworker") === "true") { + try { + GlobalWorkerOptions.workerSrc ||= AppOptions.get("workerSrc"); + await import( + /*webpackIgnore: true*/ + /*@vite-ignore*/ + PDFWorker.workerSrc); + AppOptions.set("workerPort", null); + } catch (ex) { + console.error("_parseHashParams:", ex); + } + } + if (params.has("textlayer")) { + switch (params.get("textlayer")) { + case "off": + AppOptions.set("textLayerMode", TextLayerMode.DISABLE); + break; + case "visible": + case "shadow": + case "hover": + viewerContainer.classList.add(`textLayer-${params.get("textlayer")}`); + try { + await loadPDFBug(); + this._PDFBug.loadCSS(); + } catch (ex) { + console.error("_parseHashParams:", ex); + } + break; + } + } + if (params.has("pdfbug")) { + const enabled = params.get("pdfbug").split(","); + try { + await loadPDFBug(); + this._PDFBug.init(mainContainer, enabled); + } catch (ex) { + console.error("_parseHashParams:", ex); + } + const debugOpts = { + pdfBug: true, + fontExtraProperties: true + }; + if (globalThis.StepperManager?.enabled) { + debugOpts.minDurationToUpdateCanvas = 0; + } + AppOptions.setAll(debugOpts); + } + if (params.has("locale")) { + AppOptions.set("localeProperties", { + lang: params.get("locale") + }); + } + const opts = { + disableAutoFetch: x => x === "true", + disableFontFace: x => x === "true", + disableHistory: x => x === "true", + disableRange: x => x === "true", + disableStream: x => x === "true", + verbosity: x => x | 0 + }; + for (const name in opts) { + const check = opts[name], + key = name.toLowerCase(); + if (params.has(key)) { + AppOptions.set(name, check(params.get(key))); + } + } + }, + async _initializeViewerComponents() { + const { + appConfig, + externalServices, + l10n, + mlManager + } = this; + const abortSignal = this._globalAbortController.signal; + const eventBus = new EventBus(); + this.eventBus = AppOptions.eventBus = eventBus; + mlManager?.setEventBus(eventBus, abortSignal); + const overlayManager = this.overlayManager = new OverlayManager(); + const renderingQueue = this.pdfRenderingQueue = new PDFRenderingQueue(); + renderingQueue.onIdle = this._cleanup.bind(this); + const linkService = this.pdfLinkService = new PDFLinkService({ + eventBus, + externalLinkTarget: AppOptions.get("externalLinkTarget"), + externalLinkRel: AppOptions.get("externalLinkRel"), + ignoreDestinationZoom: AppOptions.get("ignoreDestinationZoom") + }); + const supportsDownloading = AppOptions.get("supportsDownloading"); + const downloadManager = this.downloadManager = supportsDownloading ? new DownloadManager() : null; + if (appConfig.secondaryToolbar?.downloadButton) { + appConfig.secondaryToolbar.downloadButton.hidden = !supportsDownloading; + } + if (appConfig.toolbar?.download) { + appConfig.toolbar.download.hidden = !supportsDownloading; + } + const findController = this.findController = new PDFFindController({ + linkService, + eventBus, + updateMatchesCountOnProgress: true + }); + const pdfScriptingManager = this.pdfScriptingManager = new PDFScriptingManager({ + eventBus, + externalServices, + docProperties: this._scriptingDocProperties.bind(this) + }); + const container = appConfig.mainContainer, + viewer = appConfig.viewerContainer; + const annotationEditorMode = AppOptions.get("annotationEditorMode"); + const hasForcedColors = AppOptions.get("forcePageColors") || window.matchMedia("(forced-colors: active)").matches; + const pageColors = hasForcedColors ? { + background: AppOptions.get("pageColorsBackground"), + foreground: AppOptions.get("pageColorsForeground") + } : null; + const enableMerge = AppOptions.get("enableMerge"); + const enableSplitMerge = AppOptions.get("enableSplitMerge"); + let altTextManager; + if (AppOptions.get("enableUpdatedAddImage")) { + altTextManager = appConfig.newAltTextDialog ? new NewAltTextManager(appConfig.newAltTextDialog, overlayManager, eventBus) : null; + } else { + altTextManager = appConfig.altTextDialog ? new AltTextManager(appConfig.altTextDialog, container, overlayManager, eventBus) : null; + } + if (appConfig.editorUndoBar) { + this.editorUndoBar = new EditorUndoBar(appConfig.editorUndoBar, eventBus); + } + let signatureManager = null; + if (AppOptions.get("enableSignatureEditor")) { + if (appConfig.addSignatureDialog) { + signatureManager = new SignatureManager(appConfig.addSignatureDialog, appConfig.editSignatureDialog, appConfig.annotationEditorParams?.editorSignatureAddSignature || null, overlayManager, l10n, externalServices.createSignatureStorage(eventBus, abortSignal), eventBus); + } + } + const commentManager = AppOptions.get("enableComment") && appConfig.editCommentDialog ? new CommentManager(appConfig.editCommentDialog, { + learnMoreUrl: AppOptions.get("commentLearnMoreUrl"), + sidebar: appConfig.annotationEditorParams?.editorCommentsSidebar || null, + sidebarResizer: appConfig.annotationEditorParams?.editorCommentsSidebarResizer || null, + commentsList: appConfig.annotationEditorParams?.editorCommentsSidebarList || null, + commentCount: appConfig.annotationEditorParams?.editorCommentsSidebarCount || null, + sidebarTitle: appConfig.annotationEditorParams?.editorCommentsSidebarTitle || null, + closeButton: appConfig.annotationEditorParams?.editorCommentsSidebarCloseButton || null, + commentToolbarButton: appConfig.toolbar?.editorCommentButton || null + }, eventBus, linkService, overlayManager, l10n.getDirection() === "ltr", hasForcedColors, abortSignal) : null; + const maxCanvasPixels = AppOptions.get("maxCanvasPixels"), + maxCanvasDim = AppOptions.get("maxCanvasDim"), + capCanvasAreaFactor = AppOptions.get("capCanvasAreaFactor"); + const pdfViewer = this.pdfViewer = new PDFViewer({ + container, + viewer, + viewerAlert: appConfig.viewerAlert, + eventBus, + renderingQueue, + linkService, + downloadManager, + altTextManager, + commentManager, + signatureManager, + editorUndoBar: this.editorUndoBar, + findController, + scriptingManager: AppOptions.get("enableScripting") && pdfScriptingManager, + l10n, + textLayerMode: AppOptions.get("textLayerMode"), + annotationMode: AppOptions.get("annotationMode"), + annotationEditorMode, + annotationEditorHighlightColors: AppOptions.get("highlightEditorColors"), + enableHighlightFloatingButton: AppOptions.get("enableHighlightFloatingButton"), + enableUpdatedAddImage: AppOptions.get("enableUpdatedAddImage"), + enableNewAltTextWhenAddingImage: AppOptions.get("enableNewAltTextWhenAddingImage"), + imageResourcesPath: AppOptions.get("imageResourcesPath"), + enablePrintAutoRotate: AppOptions.get("enablePrintAutoRotate"), + maxCanvasPixels, + maxCanvasDim, + capCanvasAreaFactor, + enableDetailCanvas: AppOptions.get("enableDetailCanvas"), + enablePermissions: AppOptions.get("enablePermissions"), + enableOptimizedPartialRendering: AppOptions.get("enableOptimizedPartialRendering"), + enableSelectionRendering: AppOptions.get("enableSelectionRendering"), + imagesRightClickMinSize: AppOptions.get("imagesRightClickMinSize"), + pageColors, + mlManager, + abortSignal, + supportsPinchToZoom: this.supportsPinchToZoom, + enableAutoLinking: AppOptions.get("enableAutoLinking"), + minDurationToUpdateCanvas: AppOptions.get("minDurationToUpdateCanvas") + }); + renderingQueue.setViewer(pdfViewer); + linkService.setViewer(pdfViewer); + pdfScriptingManager.setViewer(pdfViewer); + if (appConfig.viewsManager?.thumbnailsView) { + const { + viewsManager + } = appConfig; + this.pdfThumbnailViewer = new PDFThumbnailViewer({ + container: viewsManager.thumbnailsView, + eventBus, + renderingQueue, + linkService, + maxCanvasPixels, + maxCanvasDim, + pageColors, + abortSignal, + enableSplitMerge, + enableMerge, + enableNewBadge: AppOptions.get("enableNewBadge"), + statusBar: viewsManager.viewsManagerStatusBar, + undoBar: viewsManager.viewsManagerUndoBar, + manageMenu: viewsManager.manageMenu, + waitingBar: viewsManager.viewsManagerWaitingBar, + addFileComponent: viewsManager.viewsManagerAddFile + }); + renderingQueue.setThumbnailViewer(this.pdfThumbnailViewer); + } + if (!this.isViewerEmbedded && !AppOptions.get("disableHistory")) { + this.pdfHistory = new PDFHistory({ + linkService, + eventBus + }); + linkService.setHistory(this.pdfHistory); + } + if (!this.supportsIntegratedFind && appConfig.findBar) { + this.findBar = new PDFFindBar(appConfig.findBar, appConfig.principalContainer, eventBus); + } + if (appConfig.annotationEditorParams) { + if (annotationEditorMode !== AnnotationEditorType.DISABLE) { + const editorSignatureButton = appConfig.toolbar?.editorSignatureButton; + if (editorSignatureButton && AppOptions.get("enableSignatureEditor")) { + editorSignatureButton.parentElement.hidden = false; + } + const editorCommentButton = appConfig.toolbar?.editorCommentButton; + if (editorCommentButton && AppOptions.get("enableComment")) { + editorCommentButton.parentElement.hidden = false; + } + this.annotationEditorParams = new AnnotationEditorParams(appConfig.annotationEditorParams, eventBus); + } else { + for (const id of ["editorModeButtons", "editorModeSeparator"]) { + document.getElementById(id)?.classList.add("hidden"); + } + } + } + if (mlManager && appConfig.secondaryToolbar?.imageAltTextSettingsButton) { + this.imageAltTextSettings = new ImageAltTextSettings(appConfig.altTextSettingsDialog, overlayManager, eventBus, mlManager); + } + if (appConfig.documentProperties) { + this.pdfDocumentProperties = new PDFDocumentProperties(appConfig.documentProperties, overlayManager, eventBus, l10n, () => this._docFilename, () => this._docTitle); + } + if (appConfig.secondaryToolbar?.cursorHandToolButton) { + this.pdfCursorTools = new PDFCursorTools({ + container, + eventBus, + cursorToolOnLoad: AppOptions.get("cursorToolOnLoad") + }); + } + if (appConfig.toolbar) { + this.toolbar = new Toolbar(appConfig.toolbar, eventBus, AppOptions.get("toolbarDensity")); + } + if (appConfig.secondaryToolbar) { + if (AppOptions.get("enableAltText") && this.imageAltTextSettings) { + appConfig.secondaryToolbar.imageAltTextSettingsButton?.classList.remove("hidden"); + appConfig.secondaryToolbar.imageAltTextSettingsSeparator?.classList.remove("hidden"); + } + this.secondaryToolbar = new SecondaryToolbar(appConfig.secondaryToolbar, eventBus); + } + if (this.supportsFullscreen && appConfig.secondaryToolbar?.presentationModeButton) { + this.pdfPresentationMode = new PDFPresentationMode({ + container, + pdfViewer, + eventBus + }); + } + if (appConfig.passwordOverlay) { + this.passwordPrompt = new PasswordPrompt(appConfig.passwordOverlay, overlayManager, this.isViewerEmbedded); + } + if (appConfig.viewsManager?.outlinesView) { + this.pdfOutlineViewer = new PDFOutlineViewer({ + container: appConfig.viewsManager.outlinesView, + eventBus, + l10n, + linkService, + downloadManager + }); + } + if (appConfig.viewsManager?.attachmentsView) { + this.pdfAttachmentViewer = new PDFAttachmentViewer({ + container: appConfig.viewsManager.attachmentsView, + eventBus, + l10n, + downloadManager, + linkService + }); + } + if (appConfig.viewsManager?.layersView) { + this.pdfLayerViewer = new PDFLayerViewer({ + container: appConfig.viewsManager.layersView, + eventBus, + l10n + }); + } + if (appConfig.viewsManager) { + this.viewsManager = new ViewsManager({ + elements: appConfig.viewsManager, + eventBus, + l10n, + enableMerge, + enableSplitMerge, + globalAbortSignal: abortSignal + }); + this.viewsManager.onToggled = this.forceRendering.bind(this); + this.viewsManager.onUpdateThumbnails = () => { + for (const pageView of pdfViewer.getCachedPageViews()) { + if (pageView.renderingState === RenderingStates.FINISHED) { + this.pdfThumbnailViewer.getThumbnail(pageView.id - 1)?.setImage(pageView); + } + } + this.pdfThumbnailViewer.scrollThumbnailIntoView(pdfViewer.currentPageNumber); + }; + } + }, + async run(config) { + await this.initialize(config); + const { + appConfig, + eventBus + } = this; + let file; + const queryString = document.location.search.substring(1); + const params = parseQueryString(queryString); + file = params.get("file") ?? AppOptions.get("defaultUrl"); + file = URL.parse(file)?.href ?? file.replaceAll("#", "%23"); + validateFileURL(file); + const fileInput = this._openFileInput = document.createElement("input"); + fileInput.id = "fileInput"; + fileInput.hidden = true; + fileInput.type = "file"; + fileInput.value = null; + document.body.append(fileInput); + fileInput.addEventListener("change", function (evt) { + const { + files + } = evt.target; + if (!files?.length) { + return; + } + eventBus.dispatch("fileinputchange", { + source: this, + fileInput: evt.target + }); + }); + appConfig.mainContainer.addEventListener("dragover", function (evt) { + for (const item of evt.dataTransfer.items) { + if (item.type === "application/pdf") { + evt.dataTransfer.dropEffect = evt.dataTransfer.effectAllowed === "copy" ? "copy" : "move"; + stopEvent(evt); + return; + } + } + }); + appConfig.mainContainer.addEventListener("drop", function (evt) { + if (evt.dataTransfer.files?.[0].type !== "application/pdf") { + return; + } + stopEvent(evt); + eventBus.dispatch("fileinputchange", { + source: this, + fileInput: evt.dataTransfer + }); + }); + if (!AppOptions.get("supportsDocumentFonts")) { + AppOptions.set("disableFontFace", true); + this.l10n.get("pdfjs-web-fonts-disabled").then(msg => { + console.warn(msg); + }); + } + const togglePrintingButtons = visible => { + appConfig.toolbar?.print?.classList.toggle("hidden", !visible); + appConfig.secondaryToolbar?.printButton.classList.toggle("hidden", !visible); + }; + if (!this.supportsPrinting) { + togglePrintingButtons(false); + } else { + eventBus.on("printingallowed", ({ + isAllowed + }) => togglePrintingButtons(isAllowed), internalOpt); + } + if (!this.supportsFullscreen) { + appConfig.secondaryToolbar?.presentationModeButton.classList.add("hidden"); + } + if (this.supportsIntegratedFind) { + appConfig.findBar?.toggleButton?.classList.add("hidden"); + } + if (file) { + this.open({ + url: file + }); + } else { + this._hideViewBookmark(); + } + }, + get externalServices() { + return pdfjs_shadow(this, "externalServices", new ExternalServices()); + }, + get initialized() { + return this._initializedCapability.settled; + }, + get initializedPromise() { + return this._initializedCapability.promise; + }, + updateZoom(steps, scaleFactor, origin, pan = null) { + if (this.pdfViewer.isInPresentationMode) { + return; + } + this.pdfViewer.updateScale({ + drawingDelay: AppOptions.get("defaultZoomDelay"), + steps, + scaleFactor, + origin, + pan + }); + }, + zoomIn() { + this.updateZoom(1); + }, + zoomOut() { + this.updateZoom(-1); + }, + zoomReset() { + if (this.pdfViewer.isInPresentationMode) { + return; + } + this.pdfViewer.currentScaleValue = (/* inlined export .DEFAULT_SCALE_VALUE */"auto"); + }, + touchPinchCallback(origin, prevDistance, distance, panX, panY) { + const pan = [panX, panY]; + if (this.supportsPinchToZoom) { + const newScaleFactor = this._accumulateFactor(this.pdfViewer.currentScale, distance / prevDistance, "_touchUnusedFactor"); + this.updateZoom(null, newScaleFactor, origin, pan); + } else { + const PIXELS_PER_LINE_SCALE = 30; + const ticks = this._accumulateTicks((distance - prevDistance) / PIXELS_PER_LINE_SCALE, "_touchUnusedTicks"); + this.updateZoom(ticks, null, origin, pan); + } + }, + touchPanCallback(dx, dy) { + const { + pdfViewer + } = this; + if (!this.pdfDocument || pdfViewer.isInPresentationMode) { + return; + } + pdfViewer.panBy(dx, dy); + }, + touchPinchEndCallback() { + this._touchUnusedTicks = 0; + this._touchUnusedFactor = 1; + }, + get pagesCount() { + return this.pdfDocument ? this.pdfDocument.numPages : 0; + }, + get page() { + return this.pdfViewer.currentPageNumber; + }, + set page(val) { + this.pdfViewer.currentPageNumber = val; + }, + get supportsPrinting() { + return pdfjs_shadow(this, "supportsPrinting", AppOptions.get("supportsPrinting") && PDFPrintServiceFactory.supportsPrinting); + }, + get supportsFullscreen() { + return pdfjs_shadow(this, "supportsFullscreen", document.fullscreenEnabled); + }, + get supportsPinchToZoom() { + return pdfjs_shadow(this, "supportsPinchToZoom", AppOptions.get("supportsPinchToZoom")); + }, + get supportsIntegratedFind() { + return pdfjs_shadow(this, "supportsIntegratedFind", AppOptions.get("supportsIntegratedFind")); + }, + get loadingBar() { + const barElement = document.getElementById("loadingBar"); + const bar = barElement ? new ProgressBar(barElement) : null; + return pdfjs_shadow(this, "loadingBar", bar); + }, + get supportsMouseWheelZoomCtrlKey() { + return pdfjs_shadow(this, "supportsMouseWheelZoomCtrlKey", AppOptions.get("supportsMouseWheelZoomCtrlKey")); + }, + get supportsMouseWheelZoomMetaKey() { + return pdfjs_shadow(this, "supportsMouseWheelZoomMetaKey", AppOptions.get("supportsMouseWheelZoomMetaKey")); + }, + get supportsCaretBrowsingMode() { + return AppOptions.get("supportsCaretBrowsingMode"); + }, + moveCaret(isUp, select) { + this._caretBrowsing ||= new CaretBrowsingMode(this._globalAbortController.signal, this.appConfig.mainContainer, this.appConfig.viewerContainer, this.appConfig.toolbar?.container); + this._caretBrowsing.moveCaret(isUp, select); + }, + setTitleUsingUrl(url = "", downloadUrl = null) { + this.url = url; + this.baseUrl = updateUrlHash(url, "", true); + if (downloadUrl) { + this._downloadUrl = downloadUrl === url ? this.baseUrl : updateUrlHash(downloadUrl, "", true); + } + if (isDataScheme(url)) { + this._hideViewBookmark(); + } + let title = getPdfFilenameFromUrl(url, ""); + if (!title) { + try { + title = decodeURIComponent(getFilenameFromUrl(url)); + } catch {} + } + this.setTitle(title || url); + }, + setTitle(title = this._title) { + this._title = title; + if (this.isViewerEmbedded) { + return; + } + const hasChangesIndicator = this._hasChanges() && !this.pdfRenderingQueue.printing; + document.title = `${hasChangesIndicator ? "* " : ""}${title}`; + }, + get _docFilename() { + return this._contentDispositionFilename || getPdfFilenameFromUrl(this.url); + }, + get _docTitle() { + const { + documentInfo, + metadata + } = this; + const title = metadata?.get("dc:title"); + if (title) { + if (title !== "Untitled" && !/[\uFFF0-\uFFFF]/.test(title)) { + return title; + } + } + return documentInfo.Title; + }, + _hideViewBookmark() { + const { + secondaryToolbar + } = this.appConfig; + secondaryToolbar?.viewBookmarkButton.classList.add("hidden"); + if (secondaryToolbar?.presentationModeButton.classList.contains("hidden")) { + document.getElementById("viewBookmarkSeparator")?.classList.add("hidden"); + } + }, + async close() { + this._unblockDocumentLoadEvent(); + this._hideViewBookmark(); + if (!this.pdfLoadingTask) { + return; + } + if (this._hasChanges() && this._annotationStorageModified) { + try { + await this.downloadOrSave(); + } catch {} + } + const promises = []; + promises.push(this.pdfLoadingTask.destroy()); + this.pdfLoadingTask = null; + if (this.pdfDocument) { + this.pdfDocument = null; + this.pdfThumbnailViewer?.setDocument(null); + this.pdfViewer.setDocument(null); + this.pdfLinkService.setDocument(null); + this.pdfDocumentProperties?.setDocument(null); + this.signaturePropertiesManager?.setDocument(null); + } + this.pdfLinkService.externalLinkEnabled = true; + this.store = null; + this.isInitialViewSet = false; + this.url = ""; + this.baseUrl = ""; + this._downloadUrl = ""; + this.documentInfo = null; + this.metadata = null; + this._contentDispositionFilename = null; + this._contentLength = null; + this._saveInProgress = false; + this._hasAnnotationEditors = false; + promises.push(this.pdfScriptingManager.destroyPromise, this.passwordPrompt.close()); + this.setTitle(); + this.viewsManager?.reset(); + this.pdfOutlineViewer?.reset(); + this.pdfAttachmentViewer?.reset(); + this.pdfLayerViewer?.reset(); + this.pdfHistory?.reset(); + this.findBar?.reset(); + this.toolbar?.reset(); + this.secondaryToolbar?.reset(); + this._PDFBug?.cleanup(); + await Promise.all(promises); + }, + async open(args) { + if (this.pdfLoadingTask) { + await this.close(); + } + const workerParams = AppOptions.getAll(OptionKind.WORKER); + Object.assign(GlobalWorkerOptions, workerParams); + if (args.data && isPdfFile(args.filename)) { + this._contentDispositionFilename = args.filename; + } else if (args.url) { + this.setTitleUsingUrl(args.originalUrl || args.url, args.url); + } + const apiParams = AppOptions.getAll(OptionKind.API); + const loadingTask = getDocument({ + ...apiParams, + ...args + }); + this.pdfLoadingTask = loadingTask; + loadingTask.onPassword = (updateCallback, reason) => { + if (this.isViewerEmbedded) { + this._unblockDocumentLoadEvent(); + } + this.pdfLinkService.externalLinkEnabled = false; + this.passwordPrompt.setUpdateCallback(updateCallback, reason); + this.passwordPrompt.open(); + }; + loadingTask.onProgress = evt => this.progress(evt.percent); + return loadingTask.promise.then(pdfDocument => { + this.load(pdfDocument); + }, reason => { + if (loadingTask !== this.pdfLoadingTask) { + return undefined; + } + if (this.loadingBar) { + this.loadingBar.percent ||= 0; + } + let key = "pdfjs-loading-error"; + if (reason instanceof InvalidPDFException) { + key = "pdfjs-invalid-file-error"; + } else if (reason instanceof ResponseException) { + key = reason.missing ? "pdfjs-missing-file-error" : "pdfjs-unexpected-response-error"; + } + return this._documentError(key, { + message: reason.message + }).then(() => { + throw reason; + }); + }); + }, + async download() { + if (!this.downloadManager) { + return; + } + let data; + try { + data = await (this.pdfDocument ? this.pdfDocument.getData() : this.pdfLoadingTask.getData()); + } catch {} + this.downloadManager.download(data, this._downloadUrl, this._docFilename); + }, + async save() { + if (!this.downloadManager) { + return; + } + if (this._saveInProgress) { + return; + } + this._saveInProgress = true; + await this.pdfScriptingManager.dispatchWillSave(); + try { + const data = await this.pdfDocument.saveDocument(this.externalServices.printToPDF); + this.downloadManager.download(data, this._downloadUrl, this._docFilename); + } catch (reason) { + console.error(`Error when saving the document:`, reason); + await this.download(); + } finally { + await this.pdfScriptingManager.dispatchDidSave(); + this._saveInProgress = false; + } + const editorStats = this.pdfDocument?.annotationStorage.editorStats; + if (editorStats) { + this.externalServices.reportTelemetry({ + type: "editing", + data: { + type: "save", + stats: editorStats + } + }); + } + }, + async downloadOrSave() { + if (!this.downloadManager) { + return; + } + this.pdfViewer._layerProperties.annotationEditorUIManager?.endCurrentEditing(); + const { + classList + } = this.appConfig.appContainer; + classList.add("wait"); + if (this.pdfThumbnailViewer?.hasStructuralChanges()) { + this.externalServices.reportTelemetry({ + type: "pageOrganization", + data: { + action: "save" + } + }); + await this.onSavePages({ + data: this.pdfThumbnailViewer.getStructuralChanges() + }); + } else { + await (this.pdfDocument?.annotationStorage.size > 0 ? this.save() : this.download()); + } + delete this._mergedDocumentNeedsSaving; + this.setTitle(); + classList.remove("wait"); + }, + async _documentError(key, moreInfo = null) { + this._unblockDocumentLoadEvent(); + const message = await this._otherError(key || "pdfjs-loading-error", moreInfo); + this.eventBus.dispatch("documenterror", { + source: this, + message, + reason: moreInfo?.message ?? null + }); + }, + async _otherError(key, moreInfo = null) { + const message = await this.l10n.get(key); + const moreInfoText = [`PDF.js v${pdfjs_version || "?"} (build: ${build || "?"})`]; + if (moreInfo) { + moreInfoText.push(`Message: ${moreInfo.message}`); + if (moreInfo.stack) { + moreInfoText.push(`Stack: ${moreInfo.stack}`); + } else { + if (moreInfo.filename) { + moreInfoText.push(`File: ${moreInfo.filename}`); + } + if (moreInfo.lineNumber) { + moreInfoText.push(`Line: ${moreInfo.lineNumber}`); + } + } + } + console.error(`${message}\n\n${moreInfoText.join("\n")}`); + return message; + }, + progress(percent) { + if (!this.loadingBar || percent <= this.loadingBar.percent) { + return; + } + this.loadingBar.percent = percent; + if (this.pdfDocument?.loadingParams.disableAutoFetch ?? AppOptions.get("disableAutoFetch")) { + this.loadingBar.setDisableAutoFetch(); + } + }, + load(pdfDocument) { + this.pdfDocument = pdfDocument; + this._printPermissionPromise = new Promise(resolve => { + this.eventBus.on("printingallowed", ({ + isAllowed + }) => { + resolve(isAllowed); + }, { + once: true, + ...internalOpt + }); + }); + pdfDocument.getDownloadInfo().then(({ + length + }) => { + this._contentLength = length; + this.loadingBar?.hide(); + firstPagePromise.then(() => { + this.eventBus.dispatch("documentloaded", { + source: this + }); + }); + }); + const pageLayoutPromise = pdfDocument.getPageLayout().catch(() => {}); + const pageModePromise = pdfDocument.getPageMode().catch(() => {}); + const openActionPromise = pdfDocument.getOpenAction().catch(() => {}); + this.toolbar?.setPagesCount(pdfDocument.numPages, false); + this.secondaryToolbar?.setPagesCount(pdfDocument.numPages); + this.pdfLinkService.setDocument(pdfDocument); + this.pdfDocumentProperties?.setDocument(pdfDocument); + const pdfViewer = this.pdfViewer; + pdfViewer.setDocument(pdfDocument); + const { + firstPagePromise, + onePageRendered, + pagesPromise + } = pdfViewer; + this.pdfThumbnailViewer?.setDocument(pdfDocument); + const storedPromise = (this.store = new ViewHistory(pdfDocument.fingerprints[0])).getMultiple({ + page: null, + zoom: (/* inlined export .DEFAULT_SCALE_VALUE */"auto"), + scrollLeft: "0", + scrollTop: "0", + rotation: null, + sidebarView: SidebarView.UNKNOWN, + scrollMode: ScrollMode.UNKNOWN, + spreadMode: SpreadMode.UNKNOWN + }).catch(() => {}); + firstPagePromise.then(pdfPage => { + this.loadingBar?.setWidth(this.appConfig.viewerContainer); + this._initializeAnnotationStorageCallbacks(pdfDocument); + Promise.all([animationStarted, storedPromise, pageLayoutPromise, pageModePromise, openActionPromise]).then(async ([timeStamp, stored, pageLayout, pageMode, openAction]) => { + const viewOnLoad = AppOptions.get("viewOnLoad"); + this._initializePdfHistory({ + fingerprint: pdfDocument.fingerprints[0], + viewOnLoad, + initialDest: openAction?.get("dest") + }); + const initialBookmark = this.initialBookmark; + const zoom = AppOptions.get("defaultZoomValue"); + let hash = zoom ? `zoom=${zoom}` : null; + let rotation = null; + let sidebarView = AppOptions.get("sidebarViewOnLoad"); + let scrollMode = AppOptions.get("scrollModeOnLoad"); + let spreadMode = AppOptions.get("spreadModeOnLoad"); + if (stored?.page && viewOnLoad !== ViewOnLoad.INITIAL) { + hash = `page=${stored.page}&zoom=${zoom || stored.zoom},` + `${stored.scrollLeft},${stored.scrollTop}`; + rotation = parseInt(stored.rotation, 10); + if (sidebarView === SidebarView.UNKNOWN) { + sidebarView = stored.sidebarView | 0; + } + if (scrollMode === ScrollMode.UNKNOWN) { + scrollMode = stored.scrollMode | 0; + } + if (spreadMode === SpreadMode.UNKNOWN) { + spreadMode = stored.spreadMode | 0; + } + } + if (pageMode && sidebarView === SidebarView.UNKNOWN) { + sidebarView = apiPageModeToSidebarView(pageMode); + } + if (pageLayout && scrollMode === ScrollMode.UNKNOWN && spreadMode === SpreadMode.UNKNOWN) { + const modes = apiPageLayoutToViewerModes(pageLayout); + spreadMode = modes.spreadMode; + } + this.setInitialView(hash, { + rotation, + sidebarView, + scrollMode, + spreadMode + }); + this.eventBus.dispatch("documentinit", { + source: this + }); + await Promise.race([pagesPromise, new Promise(resolve => { + setTimeout(resolve, FORCE_PAGES_LOADED_TIMEOUT); + })]); + if (!initialBookmark && !hash) { + return; + } + if (pdfViewer.hasEqualPageSizes) { + return; + } + this.initialBookmark = initialBookmark; + pdfViewer.currentScaleValue = pdfViewer.currentScaleValue; + this.setInitialView(hash); + }).catch(() => { + this.setInitialView(); + }).then(function () { + pdfViewer.update(); + }); + }); + pagesPromise.then(() => { + this._unblockDocumentLoadEvent(); + this._initializeAutoPrint(pdfDocument, openActionPromise); + }, reason => { + this._documentError("pdfjs-loading-error", { + message: reason.message + }); + }); + onePageRendered.then(data => { + this.externalServices.reportTelemetry({ + type: "pageInfo", + timestamp: data.timestamp + }); + if (this.pdfOutlineViewer) { + pdfDocument.getOutline().then(outline => { + if (pdfDocument !== this.pdfDocument) { + return; + } + this.pdfOutlineViewer.render({ + outline, + pdfDocument + }); + }); + } + if (this.pdfAttachmentViewer) { + pdfDocument.getAttachments().then(attachments => { + if (pdfDocument !== this.pdfDocument) { + return; + } + this.pdfAttachmentViewer.render({ + attachments + }); + }); + } + if (this.pdfLayerViewer) { + pdfViewer.optionalContentConfigPromise.then(optionalContentConfig => { + if (pdfDocument !== this.pdfDocument) { + return; + } + this.pdfLayerViewer.render({ + optionalContentConfig, + pdfDocument + }); + }); + } + }); + this._initializePageLabels(pdfDocument); + this._initializeMetadata(pdfDocument); + }, + async _scriptingDocProperties(pdfDocument) { + if (!this.documentInfo) { + await new Promise(resolve => { + this.eventBus.on("metadataloaded", resolve, { + once: true, + ...internalOpt + }); + }); + if (pdfDocument !== this.pdfDocument) { + return null; + } + } + if (!this._contentLength) { + await new Promise(resolve => { + this.eventBus.on("documentloaded", resolve, { + once: true, + ...internalOpt + }); + }); + if (pdfDocument !== this.pdfDocument) { + return null; + } + } + return { + ...this.documentInfo, + baseURL: this.baseUrl, + filesize: this._contentLength, + filename: this._docFilename, + metadata: this.metadata?.getRaw(), + authors: this.metadata?.get("dc:creator"), + numPages: this.pagesCount, + URL: this.url + }; + }, + async _initializeAutoPrint(pdfDocument, openActionPromise) { + const [openAction, jsActions] = await Promise.all([openActionPromise, this.pdfViewer.enableScripting ? null : pdfDocument.getJSActions()]); + if (pdfDocument !== this.pdfDocument) { + return; + } + let triggerAutoPrint = openAction?.get("action") === "Print"; + if (jsActions) { + console.warn("Warning: JavaScript support is not enabled"); + for (const [name, actions] of jsActions) { + if (triggerAutoPrint) { + break; + } + switch (name) { + case "WillClose": + case "WillSave": + case "DidSave": + case "WillPrint": + case "DidPrint": + continue; + } + triggerAutoPrint = actions.some(js => AutoPrintRegExp.test(js)); + } + } + if (triggerAutoPrint) { + this.triggerPrinting(); + } + }, + async _initializeMetadata(pdfDocument) { + const { + info, + metadata, + contentDispositionFilename, + contentLength, + hasStructTree + } = await pdfDocument.getMetadata(); + if (pdfDocument !== this.pdfDocument) { + return; + } + this.externalServices.reportTelemetry({ + type: "taggedPDF", + data: hasStructTree + }); + this.documentInfo = info; + this.metadata = metadata; + this._contentDispositionFilename ??= contentDispositionFilename; + this._contentLength ??= contentLength; + console.log(`PDF ${pdfDocument.fingerprints[0]} [${info.PDFFormatVersion} ` + `${(metadata?.get("pdf:producer") || info.Producer || "-").trim()} / ` + `${(metadata?.get("xmp:creatortool") || info.Creator || "-").trim()}` + `] (PDF.js: ${pdfjs_version || "?"} [${build || "?"}])`); + const pdfTitle = this._docTitle; + if (pdfTitle) { + this.setTitle(`${pdfTitle} - ${this._contentDispositionFilename || this._title}`); + } else if (this._contentDispositionFilename) { + this.setTitle(this._contentDispositionFilename); + } + if (info.IsXFAPresent && !info.IsAcroFormPresent && !pdfDocument.isPureXfa) { + if (pdfDocument.loadingParams.enableXfa) { + console.warn("Warning: XFA Foreground documents are not supported"); + } else { + console.warn("Warning: XFA support is not enabled"); + } + } else if ((info.IsAcroFormPresent || info.IsXFAPresent) && !this.pdfViewer.renderForms) { + console.warn("Warning: Interactive form support is not enabled"); + } + if (info.IsSignaturesPresent) { + const success = this._maybeInitSignatureProperties(pdfDocument); + if (!success) { + console.warn("Warning: Digital signatures validation is not supported"); + } + } + this.eventBus.dispatch("metadataloaded", { + source: this + }); + }, + _maybeInitSignatureProperties(pdfDocument) { + if (!AppOptions.get("enableSignatureVerification")) { + return false; + } + const verifier = this.externalServices.createSignatureVerifier(); + if (!verifier) { + return false; + } + if (pdfDocument !== this.pdfDocument) { + return true; + } + this.signaturePropertiesManager ??= new SignaturePropertiesManager({ + appConfig: this.appConfig.toolbar, + verifier, + eventBus: this.eventBus + }); + this.signaturePropertiesManager.setDocument(pdfDocument); + return true; + }, + async _initializePageLabels(pdfDocument) { + const labels = await pdfDocument.getPageLabels(); + if (pdfDocument !== this.pdfDocument) { + return; + } + if (!labels || AppOptions.get("disablePageLabels")) { + return; + } + const numLabels = labels.length; + let standardLabels = 0, + emptyLabels = 0; + for (let i = 0; i < numLabels; i++) { + const label = labels[i]; + if (label === (i + 1).toString()) { + standardLabels++; + } else if (label === "") { + emptyLabels++; + } else { + break; + } + } + if (standardLabels >= numLabels || emptyLabels >= numLabels) { + return; + } + const { + pdfViewer, + pdfThumbnailViewer, + toolbar + } = this; + pdfViewer.setPageLabels(labels); + pdfThumbnailViewer?.setPageLabels(labels); + toolbar?.setPagesCount(numLabels, true); + toolbar?.setPageNumber(pdfViewer.currentPageNumber, pdfViewer.currentPageLabel); + }, + _initializePdfHistory({ + fingerprint, + viewOnLoad, + initialDest = null + }) { + if (!this.pdfHistory) { + return; + } + this.pdfHistory.initialize({ + fingerprint, + resetHistory: viewOnLoad === ViewOnLoad.INITIAL || !!this._mergedDocumentNeedsSaving, + updateUrl: AppOptions.get("historyUpdateUrl") + }); + if (this.pdfHistory.initialBookmark) { + this.initialBookmark = this.pdfHistory.initialBookmark; + this.initialRotation = this.pdfHistory.initialRotation; + } + if (initialDest && !this.initialBookmark && viewOnLoad === ViewOnLoad.UNKNOWN) { + this.initialBookmark = JSON.stringify(initialDest); + this.pdfHistory.push({ + explicitDest: initialDest, + pageNumber: null + }); + } + }, + _hasChanges() { + return this.pdfDocument?.annotationStorage.size > 0 || this.pdfThumbnailViewer?.hasStructuralChanges() || this._mergedDocumentNeedsSaving === true; + }, + _initializeAnnotationStorageCallbacks(pdfDocument) { + if (pdfDocument !== this.pdfDocument) { + return; + } + const { + annotationStorage + } = pdfDocument; + annotationStorage.onSetModified = () => { + this._annotationStorageModified = true; + }; + annotationStorage.onResetModified = () => { + delete this._annotationStorageModified; + }; + annotationStorage.onAnnotationEditor = typeStr => { + this._hasAnnotationEditors = !!typeStr; + this.setTitle(); + }; + }, + setInitialView(storedHash, { + rotation, + sidebarView, + scrollMode, + spreadMode + } = {}) { + const setRotation = angle => { + if (isValidRotation(angle)) { + this.pdfViewer.pagesRotation = angle; + } + }; + const setViewerModes = (scroll, spread) => { + if (isValidScrollMode(scroll)) { + this.pdfViewer.scrollMode = scroll; + } + if (isValidSpreadMode(spread)) { + this.pdfViewer.spreadMode = spread; + } + }; + this.isInitialViewSet = true; + this.viewsManager?.setInitialView(sidebarView); + setViewerModes(scrollMode, spreadMode); + if (this.initialBookmark) { + setRotation(this.initialRotation); + delete this.initialRotation; + this.pdfLinkService.setHash(this.initialBookmark); + this.initialBookmark = null; + } else if (storedHash) { + setRotation(rotation); + this.pdfLinkService.setHash(storedHash); + } + this.toolbar?.setPageNumber(this.pdfViewer.currentPageNumber, this.pdfViewer.currentPageLabel); + this.secondaryToolbar?.setPageNumber(this.pdfViewer.currentPageNumber); + this.pdfViewer.currentScaleValue ||= (/* inlined export .DEFAULT_SCALE_VALUE */"auto"); + }, + _cleanup() { + if (!this.pdfDocument) { + return; + } + this.pdfViewer.cleanup(); + this.pdfThumbnailViewer?.cleanup(); + this.pdfDocument.cleanup(AppOptions.get("fontExtraProperties")); + }, + forceRendering() { + this.pdfRenderingQueue.printing = !!this.printService; + this.pdfRenderingQueue.isThumbnailViewEnabled = this.viewsManager?.visibleView === SidebarView.THUMBS; + this.pdfRenderingQueue.renderHighestPriority(); + }, + beforePrint() { + this._printAnnotationStoragePromise = this.pdfScriptingManager.dispatchWillPrint().catch(() => {}).then(() => this.pdfDocument?.annotationStorage.print); + if (this.printService) { + return; + } + if (!this.supportsPrinting || !this.pdfViewer.printingAllowed) { + this._otherError("pdfjs-printing-not-supported"); + return; + } + if (!this.pdfViewer.pageViewsReady) { + this.l10n.get("pdfjs-printing-not-ready").then(msg => { + window.alert(msg); + }); + return; + } + this.printService = PDFPrintServiceFactory.createPrintService({ + pdfDocument: this.pdfDocument, + pagesOverview: this.pdfViewer.getPagesOverview(), + printContainer: this.appConfig.printContainer, + printResolution: AppOptions.get("printResolution"), + printAnnotationStoragePromise: this._printAnnotationStoragePromise + }); + this.forceRendering(); + this.setTitle(); + this.printService.layout(); + if (this._hasAnnotationEditors) { + this.externalServices.reportTelemetry({ + type: "editing", + data: { + type: "print", + stats: this.pdfDocument?.annotationStorage.editorStats + } + }); + } + }, + afterPrint() { + if (this._printAnnotationStoragePromise) { + this._printAnnotationStoragePromise.then(() => { + this.pdfScriptingManager.dispatchDidPrint(); + }); + this._printAnnotationStoragePromise = null; + } + if (this.printService) { + this.printService.destroy(); + this.printService = null; + this.pdfDocument?.annotationStorage.resetModified(); + } + this.forceRendering(); + this.setTitle(); + }, + rotatePages(delta) { + this.pdfViewer.pagesRotation += delta; + }, + requestPresentationMode() { + this.pdfPresentationMode?.request(); + }, + async triggerPrinting() { + if (this.supportsPrinting && (await this._printPermissionPromise)) { + window.print(); + } + }, + bindEvents() { + if (this._eventBusAC) { + return; + } + const ac = this._eventBusAC = new AbortController(); + const opts = { + signal: ac.signal, + ...internalOpt + }; + const { + eventBus, + externalServices, + pdfDocumentProperties, + pdfViewer, + preferences + } = this; + eventBus.on("resize", onResize.bind(this), opts); + eventBus.on("hashchange", onHashchange.bind(this), opts); + eventBus.on("beforeprint", this.beforePrint.bind(this), opts); + eventBus.on("afterprint", this.afterPrint.bind(this), opts); + eventBus.on("pagerender", onPageRender.bind(this), opts); + eventBus.on("pagerendered", onPageRendered.bind(this), opts); + eventBus.on("updateviewarea", onUpdateViewarea.bind(this), opts); + eventBus.on("pagechanging", onPageChanging.bind(this), opts); + eventBus.on("scalechanging", onScaleChanging.bind(this), opts); + eventBus.on("rotationchanging", onRotationChanging.bind(this), opts); + eventBus.on("sidebarviewchanged", onSidebarViewChanged.bind(this), opts); + eventBus.on("pagemode", onPageMode.bind(this), opts); + eventBus.on("namedaction", onNamedAction.bind(this), opts); + eventBus.on("presentationmodechanged", evt => pdfViewer.presentationModeState = evt.state, opts); + eventBus.on("presentationmode", this.requestPresentationMode.bind(this), opts); + eventBus.on("switchannotationeditormode", evt => pdfViewer.annotationEditorMode = evt, opts); + eventBus.on("print", this.triggerPrinting.bind(this), opts); + eventBus.on("download", this.downloadOrSave.bind(this), opts); + eventBus.on("firstpage", () => this.page = 1, opts); + eventBus.on("lastpage", () => this.page = this.pagesCount, opts); + eventBus.on("nextpage", () => pdfViewer.nextPage(), opts); + eventBus.on("previouspage", () => pdfViewer.previousPage(), opts); + eventBus.on("zoomin", this.zoomIn.bind(this), opts); + eventBus.on("zoomout", this.zoomOut.bind(this), opts); + eventBus.on("zoomreset", this.zoomReset.bind(this), opts); + eventBus.on("pagenumberchanged", onPageNumberChanged.bind(this), opts); + eventBus.on("scalechanged", evt => pdfViewer.currentScaleValue = evt.value, opts); + eventBus.on("rotatecw", this.rotatePages.bind(this, 90), opts); + eventBus.on("rotateccw", this.rotatePages.bind(this, -90), opts); + eventBus.on("optionalcontentconfig", evt => pdfViewer.optionalContentConfigPromise = evt.promise, opts); + eventBus.on("switchscrollmode", evt => pdfViewer.scrollMode = evt.mode, opts); + eventBus.on("scrollmodechanged", onViewerModesChanged.bind(this, "scrollMode"), opts); + eventBus.on("switchspreadmode", evt => pdfViewer.spreadMode = evt.mode, opts); + eventBus.on("spreadmodechanged", onViewerModesChanged.bind(this, "spreadMode"), opts); + eventBus.on("imagealttextsettings", onImageAltTextSettings.bind(this), opts); + eventBus.on("documentproperties", () => pdfDocumentProperties?.open(), opts); + eventBus.on("findfromurlhash", onFindFromUrlHash.bind(this), opts); + eventBus.on("updatefindmatchescount", onUpdateFindMatchesCount.bind(this), opts); + eventBus.on("updatefindcontrolstate", onUpdateFindControlState.bind(this), opts); + eventBus.on("fileinputchange", onFileInputChange.bind(this), opts); + eventBus.on("openfile", onOpenFile.bind(this), opts); + eventBus.on("pagesedited", this.onPagesEdited.bind(this), opts); + eventBus.on("saveextractedpages", this.onSavePages.bind(this), opts); + eventBus.on("saveandload", this.onSaveAndLoad.bind(this), opts); + }, + bindWindowEvents() { + if (this._windowAC) { + return; + } + this._windowAC = new AbortController(); + const { + eventBus, + appConfig: { + mainContainer + }, + pdfViewer, + _windowAC: { + signal + } + } = this; + this._touchManager = new TouchManager({ + container: window, + isPinchingDisabled: () => pdfViewer.isInPresentationMode, + isPinchingStopped: () => this.overlayManager?.active, + onPinching: this.touchPinchCallback.bind(this), + onPinchEnd: this.touchPinchEndCallback.bind(this), + onPanning: this.touchPanCallback.bind(this), + signal + }); + function addWindowResolutionChange(evt = null) { + if (evt) { + pdfViewer.refresh(); + } + const mediaQueryList = window.matchMedia(`(resolution: ${OutputScale.pixelRatio}dppx)`); + mediaQueryList.addEventListener("change", addWindowResolutionChange, { + once: true, + signal + }); + } + addWindowResolutionChange(); + window.addEventListener("wheel", onWheel.bind(this), { + passive: false, + signal + }); + window.addEventListener("click", onClick.bind(this), { + signal + }); + window.addEventListener("keydown", onKeyDown.bind(this), { + signal + }); + window.addEventListener("keyup", onKeyUp.bind(this), { + signal + }); + window.addEventListener("resize", () => eventBus.dispatch("resize", { + source: window + }), { + signal + }); + window.addEventListener("hashchange", () => { + eventBus.dispatch("hashchange", { + source: window, + hash: document.location.hash.substring(1) + }); + }, { + signal + }); + window.addEventListener("beforeprint", () => eventBus.dispatch("beforeprint", { + source: window + }), { + signal + }); + window.addEventListener("afterprint", () => eventBus.dispatch("afterprint", { + source: window + }), { + signal + }); + window.addEventListener("updatefromsandbox", evt => { + eventBus.dispatch("updatefromsandbox", { + source: window, + detail: evt.detail + }); + }, { + signal + }); + window.addEventListener("beforeunload", onBeforeUnload.bind(this), { + signal + }); + if (!("onscrollend" in document.documentElement)) { + return; + } + ({ + scrollTop: this._lastScrollTop, + scrollLeft: this._lastScrollLeft + } = mainContainer); + let scrollendTimeoutID, scrollAbortController; + const scrollend = () => { + ({ + scrollTop: this._lastScrollTop, + scrollLeft: this._lastScrollLeft + } = mainContainer); + clearTimeout(scrollendTimeoutID); + if (this._isScrolling) { + scrollAbortController.abort(); + scrollAbortController = null; + this._isScrolling = false; + } + }; + const scroll = () => { + if (this._isCtrlKeyDown) { + return; + } + if (this._lastScrollTop === mainContainer.scrollTop && this._lastScrollLeft === mainContainer.scrollLeft) { + return; + } + if (!this._isScrolling) { + scrollAbortController = new AbortController(); + const abortSignal = AbortSignal.any([scrollAbortController.signal, signal]); + mainContainer.addEventListener("scrollend", scrollend, { + signal: abortSignal + }); + mainContainer.addEventListener("blur", scrollend, { + signal: abortSignal + }); + this._isScrolling = true; + } + clearTimeout(scrollendTimeoutID); + scrollendTimeoutID = setTimeout(scrollend, 100); + }; + mainContainer.addEventListener("scroll", scroll, { + passive: true, + signal + }); + }, + unbindEvents() { + this._eventBusAC?.abort(); + this._eventBusAC = null; + }, + unbindWindowEvents() { + this._windowAC?.abort(); + this._windowAC = null; + this._touchManager = null; + }, + async testingClose() { + this.unbindEvents(); + this.unbindWindowEvents(); + this._globalAbortController?.abort(); + this._globalAbortController = null; + this.findBar?.close(); + await Promise.all([this.l10n?.destroy(), this.close()]); + }, + onPagesEdited(data) { + this.pdfViewer.onPagesEdited(data); + }, + async onSavePages({ + data: { + pageInfos, + copyLevels + } + }) { + if (!this.downloadManager || !this.pdfDocument) { + return; + } + const modifiedPdfBytes = await this.pdfDocument.extractPages(pageInfos, copyLevels); + if (!modifiedPdfBytes) { + console.error("Something wrong happened when saving the edited PDF.\nPlease file a bug."); + return; + } + this.downloadManager.download(modifiedPdfBytes, this._downloadUrl, this._docFilename); + }, + async onSaveAndLoad({ + data: { + pageInfos, + copyLevels + } + }) { + if (!this.pdfDocument) { + return; + } + const modifiedPdfBytes = await this.pdfDocument.extractPages(pageInfos, copyLevels); + if (!modifiedPdfBytes) { + console.error("Something wrong happened when saving the edited PDF.\nPlease file a bug."); + return; + } + this._mergedDocumentNeedsSaving = true; + this.open({ + data: modifiedPdfBytes, + filename: this._docFilename + }); + }, + _accumulateTicks(ticks, prop) { + if (this[prop] > 0 && ticks < 0 || this[prop] < 0 && ticks > 0) { + this[prop] = 0; + } + this[prop] += ticks; + const wholeTicks = Math.trunc(this[prop]); + this[prop] -= wholeTicks; + return wholeTicks; + }, + _accumulateFactor(previousScale, factor, prop) { + if (factor === 1) { + return 1; + } + const target = MathClamp(previousScale * factor * this[prop], (/* inlined export .MIN_SCALE */0.1), (/* inlined export .MAX_SCALE */25)); + const newScale = Math.round(target * 100) / 100; + this[prop] = target / newScale; + return newScale / previousScale; + }, + _unblockDocumentLoadEvent() { + document.blockUnblockOnload?.(false); + this._unblockDocumentLoadEvent = () => {}; + }, + get scriptingReady() { + return this.pdfScriptingManager.ready; + } +}; +initCom(PDFViewerApplication); +PDFPrintServiceFactory.initGlobals(PDFViewerApplication); +{ + const HOSTED_VIEWER_ORIGINS = new Set(["null", "http://mozilla.github.io", "https://mozilla.github.io"]); + var validateFileURL = function (file) { + if (!file) { + return; + } + const viewerOrigin = URL.parse(window.location)?.origin || "null"; + if (HOSTED_VIEWER_ORIGINS.has(viewerOrigin)) { + return; + } + const fileOrigin = URL.parse(file, window.location)?.origin; + if (fileOrigin === viewerOrigin) { + return; + } + const ex = new Error("file origin does not match viewer's"); + PDFViewerApplication._documentError("pdfjs-loading-error", { + message: ex.message + }); + throw ex; + }; + var onFileInputChange = function (evt) { + if (this.pdfViewer?.isInPresentationMode) { + return; + } + const file = evt.fileInput.files[0]; + this.open({ + url: URL.createObjectURL(file), + originalUrl: encodeURIComponent(file.name) + }); + }; + var onOpenFile = function (evt) { + this._openFileInput?.click(); + }; +} +function onPageRender({ + pageNumber +}) { + if (pageNumber === this.page) { + this.toolbar?.updateLoadingIndicatorState(true); + } +} +function onPageRendered({ + pageNumber, + isDetailView, + error +}) { + if (pageNumber === this.page) { + this.toolbar?.updateLoadingIndicatorState(false); + } + if (!isDetailView && this.viewsManager?.visibleView === SidebarView.THUMBS) { + const pageView = this.pdfViewer.getPageView(pageNumber - 1); + const thumbnailView = this.pdfThumbnailViewer?.getThumbnail(pageNumber - 1); + if (pageView) { + thumbnailView?.setImage(pageView); + } + } + if (error) { + this._otherError("pdfjs-rendering-error", error); + } +} +function onPageMode({ + mode +}) { + let view; + switch (mode) { + case "thumbs": + view = SidebarView.THUMBS; + break; + case "bookmarks": + case "outline": + view = SidebarView.OUTLINE; + break; + case "attachments": + view = SidebarView.ATTACHMENTS; + break; + case "layers": + view = SidebarView.LAYERS; + break; + case "none": + view = SidebarView.NONE; + break; + default: + console.error('Invalid "pagemode" hash parameter: ' + mode); + return; + } + this.viewsManager?.switchView(view, true); +} +function onNamedAction(evt) { + switch (evt.action) { + case "GoToPage": + this.appConfig.toolbar?.pageNumber.select(); + break; + case "Find": + if (!this.supportsIntegratedFind) { + this.findBar?.toggle(); + } + break; + case "Print": + this.triggerPrinting(); + break; + case "SaveAs": + this.downloadOrSave(); + break; + } +} +function onSidebarViewChanged({ + view +}) { + this.pdfRenderingQueue.isThumbnailViewEnabled = view === SidebarView.THUMBS; + if (this.isInitialViewSet) { + this.store?.setMultiple({ + sidebarView: view + }).catch(() => {}); + } +} +function onUpdateViewarea({ + location +}) { + if (this.isInitialViewSet) { + this.store?.setMultiple({ + page: location.pageNumber, + zoom: location.scale, + scrollLeft: location.left, + scrollTop: location.top, + rotation: location.rotation + }).catch(() => {}); + } + if (this.appConfig.secondaryToolbar) { + this.appConfig.secondaryToolbar.viewBookmarkButton.href = this.pdfLinkService.getAnchorUrl(location.pdfOpenParams); + } +} +function onViewerModesChanged(name, evt) { + if (this.isInitialViewSet && !this.pdfViewer.isInPresentationMode) { + this.store?.setMultiple({ + [name]: evt.mode + }).catch(() => {}); + } +} +function onResize() { + const { + pdfDocument, + pdfViewer, + pdfRenderingQueue + } = this; + if (pdfRenderingQueue.printing && window.matchMedia("print").matches) { + return; + } + if (!pdfDocument) { + return; + } + const currentScaleValue = pdfViewer.currentScaleValue; + if (currentScaleValue === "auto" || currentScaleValue === "page-fit" || currentScaleValue === "page-width") { + pdfViewer.currentScaleValue = currentScaleValue; + } + pdfViewer.update(); +} +function onHashchange(evt) { + const hash = evt.hash; + if (!hash) { + return; + } + if (!this.isInitialViewSet) { + this.initialBookmark = hash; + } else if (!this.pdfHistory?.popStateInProgress) { + this.pdfLinkService.setHash(hash); + } +} +function onPageNumberChanged(evt) { + const { + pdfViewer + } = this; + if (evt.value !== "") { + this.pdfLinkService.goToPage(evt.value); + } + if (evt.value !== pdfViewer.currentPageNumber.toString() && evt.value !== pdfViewer.currentPageLabel) { + this.toolbar?.setPageNumber(pdfViewer.currentPageNumber, pdfViewer.currentPageLabel); + } +} +function onImageAltTextSettings() { + this.imageAltTextSettings?.open({ + enableGuessAltText: AppOptions.get("enableGuessAltText"), + enableNewAltTextWhenAddingImage: AppOptions.get("enableNewAltTextWhenAddingImage") + }); +} +function onFindFromUrlHash(evt) { + this.eventBus.dispatch("find", { + source: evt.source, + type: "", + query: evt.query, + caseSensitive: false, + entireWord: false, + highlightAll: true, + findPrevious: false, + matchDiacritics: true + }); +} +function onUpdateFindMatchesCount({ + matchesCount +}) { + if (this.supportsIntegratedFind) { + this.externalServices.updateFindMatchesCount(matchesCount); + } else { + this.findBar?.updateResultsCount(matchesCount); + } +} +function onUpdateFindControlState({ + state, + previous, + entireWord, + matchesCount, + rawQuery +}) { + if (this.supportsIntegratedFind) { + this.externalServices.updateFindControlState({ + result: state, + findPrevious: previous, + entireWord, + matchesCount, + rawQuery + }); + } else { + this.findBar?.updateUIState(state, previous, matchesCount); + } +} +function onScaleChanging(evt) { + this.toolbar?.setPageScale(evt.presetValue, evt.scale); + this.pdfViewer.update(); +} +function onRotationChanging(evt) { + if (this.pdfThumbnailViewer) { + this.pdfThumbnailViewer.pagesRotation = evt.pagesRotation; + } + this.forceRendering(); + this.pdfViewer.currentPageNumber = evt.pageNumber; +} +function onPageChanging({ + pageNumber, + pageLabel +}) { + this.toolbar?.setPageNumber(pageNumber, pageLabel); + this.secondaryToolbar?.setPageNumber(pageNumber); + if (this.viewsManager?.visibleView === SidebarView.THUMBS) { + this.pdfThumbnailViewer?.scrollThumbnailIntoView(pageNumber); + } + const currentPage = this.pdfViewer.getPageView(pageNumber - 1); + this.toolbar?.updateLoadingIndicatorState(currentPage?.renderingState === RenderingStates.RUNNING); +} +function onWheel(evt) { + const { + pdfViewer, + supportsMouseWheelZoomCtrlKey, + supportsMouseWheelZoomMetaKey, + supportsPinchToZoom + } = this; + if (pdfViewer.isInPresentationMode) { + return; + } + const deltaMode = evt.deltaMode; + let scaleFactor = Math.exp(-evt.deltaY / 100); + const isBuiltInMac = false; + const isPinchToZoom = evt.ctrlKey && !this._isCtrlKeyDown && deltaMode === WheelEvent.DOM_DELTA_PIXEL && evt.deltaX === 0 && (Math.abs(scaleFactor - 1) < 0.05 || isBuiltInMac) && evt.deltaZ === 0; + const origin = [evt.clientX, evt.clientY]; + if (isPinchToZoom || evt.ctrlKey && supportsMouseWheelZoomCtrlKey || evt.metaKey && supportsMouseWheelZoomMetaKey) { + evt.preventDefault(); + if (this._isScrolling || document.visibilityState === "hidden" || this.overlayManager.active) { + return; + } + if (isPinchToZoom && supportsPinchToZoom) { + scaleFactor = this._accumulateFactor(pdfViewer.currentScale, scaleFactor, "_wheelUnusedFactor"); + this.updateZoom(null, scaleFactor, origin); + } else { + const delta = normalizeWheelEventDirection(evt); + let ticks = 0; + if (deltaMode === WheelEvent.DOM_DELTA_LINE || deltaMode === WheelEvent.DOM_DELTA_PAGE) { + ticks = Math.abs(delta) >= 1 ? Math.sign(delta) : this._accumulateTicks(delta, "_wheelUnusedTicks"); + } else { + const PIXELS_PER_LINE_SCALE = 30; + ticks = this._accumulateTicks(delta / PIXELS_PER_LINE_SCALE, "_wheelUnusedTicks"); + } + this.updateZoom(ticks, null, origin); + } + } +} +function closeSecondaryToolbar({ + target +}) { + if (!this.secondaryToolbar?.isOpen) { + return; + } + const { + toolbar, + secondaryToolbar + } = this.appConfig; + if (this.pdfViewer.containsElement(target) || toolbar?.container.contains(target) && !secondaryToolbar?.toolbar.contains(target) && !secondaryToolbar?.toggleButton.contains(target)) { + this.secondaryToolbar.close(); + } +} +function closeEditorUndoBar(evt) { + if (!this.editorUndoBar?.isOpen) { + return; + } + if (this.appConfig.secondaryToolbar?.toolbar.contains(evt.target)) { + this.editorUndoBar.hide(); + } +} +function closeSignatureProperties({ + target +}) { + if (this.signaturePropertiesManager?.shouldCloseOnClick(target)) { + this.signaturePropertiesManager.close(); + } +} +function onBeforeUnload(evt) { + if (this._hasChanges()) { + evt.preventDefault(); + evt.returnValue = ""; + return false; + } + return true; +} +function onClick(evt) { + closeSecondaryToolbar.call(this, evt); + closeEditorUndoBar.call(this, evt); + closeSignatureProperties.call(this, evt); +} +function onKeyUp(evt) { + if (evt.key === "Control") { + this._isCtrlKeyDown = false; + } +} +function onKeyDown(evt) { + this._isCtrlKeyDown = evt.key === "Control"; + if (this.editorUndoBar?.isOpen && evt.keyCode !== 9 && evt.keyCode !== 16 && !((evt.keyCode === 13 || evt.keyCode === 32) && getActiveOrFocusedElement() === this.appConfig.editorUndoBar.undoButton)) { + this.editorUndoBar.hide(); + } + if (this.overlayManager.active) { + return; + } + const { + eventBus, + pdfViewer + } = this; + const isViewerInPresentationMode = pdfViewer.isInPresentationMode; + let handled = false, + ensureViewerFocused = false; + const cmd = (evt.ctrlKey ? 1 : 0) | (evt.altKey ? 2 : 0) | (evt.shiftKey ? 4 : 0) | (evt.metaKey ? 8 : 0); + if (cmd === 1 || cmd === 8 || cmd === 5 || cmd === 12) { + switch (evt.keyCode) { + case 70: + if (!this.supportsIntegratedFind && !evt.shiftKey) { + this.findBar?.open(); + handled = true; + } + break; + case 71: + if (!this.supportsIntegratedFind) { + const { + state + } = this.findController; + if (state) { + const newState = { + source: window, + type: "again", + findPrevious: cmd === 5 || cmd === 12 + }; + eventBus.dispatch("find", { + ...state, + ...newState + }); + } + handled = true; + } + break; + case 61: + case 107: + case 187: + case 171: + this.zoomIn(); + handled = true; + break; + case 173: + case 109: + case 189: + this.zoomOut(); + handled = true; + break; + case 48: + case 96: + if (!isViewerInPresentationMode) { + setTimeout(() => { + this.zoomReset(); + }); + handled = false; + } + break; + case 38: + if (isViewerInPresentationMode || this.page > 1) { + this.page = 1; + handled = true; + ensureViewerFocused = true; + } + break; + case 40: + if (isViewerInPresentationMode || this.page < this.pagesCount) { + this.page = this.pagesCount; + handled = true; + ensureViewerFocused = true; + } + break; + } + } + if (cmd === 1 || cmd === 8) { + switch (evt.keyCode) { + case 83: + eventBus.dispatch("download", { + source: window + }); + handled = true; + break; + case 79: + { + eventBus.dispatch("openfile", { + source: window + }); + handled = true; + } + break; + } + } + if (cmd === 3 || cmd === 10) { + switch (evt.keyCode) { + case 80: + this.requestPresentationMode(); + handled = true; + this.externalServices.reportTelemetry({ + type: "buttons", + data: { + id: "presentationModeKeyboard" + } + }); + break; + case 71: + if (this.appConfig.toolbar) { + this.appConfig.toolbar.pageNumber.select(); + handled = true; + } + break; + } + } + if (handled) { + if (ensureViewerFocused && !isViewerInPresentationMode) { + pdfViewer.focus(); + } + evt.preventDefault(); + return; + } + const curElement = getActiveOrFocusedElement(); + const curElementTagName = curElement?.tagName.toUpperCase(); + if (curElementTagName === "INPUT" || curElementTagName === "TEXTAREA" || curElementTagName === "SELECT" || curElementTagName === "BUTTON" && evt.keyCode === 32 || curElement?.isContentEditable) { + if (evt.keyCode !== 27) { + return; + } + } + if (cmd === 0) { + let turnPage = 0, + turnOnlyIfPageFit = false; + switch (evt.keyCode) { + case 38: + if (this.supportsCaretBrowsingMode) { + this.moveCaret(true, false); + handled = true; + break; + } + case 33: + if (pdfViewer.isVerticalScrollbarEnabled) { + turnOnlyIfPageFit = true; + } + turnPage = -1; + break; + case 8: + if (!isViewerInPresentationMode) { + turnOnlyIfPageFit = true; + } + turnPage = -1; + break; + case 37: + if (this.supportsCaretBrowsingMode) { + return; + } + if (pdfViewer.isHorizontalScrollbarEnabled) { + turnOnlyIfPageFit = true; + } + case 75: + case 80: + turnPage = -1; + break; + case 27: + if (this.secondaryToolbar?.isOpen) { + this.secondaryToolbar.close(); + handled = true; + } + if (this.signaturePropertiesManager?.isOpen) { + this.signaturePropertiesManager.close(); + handled = true; + } + if (!this.supportsIntegratedFind && this.findBar?.opened) { + this.findBar.close(); + handled = true; + } + break; + case 40: + if (this.supportsCaretBrowsingMode) { + this.moveCaret(false, false); + handled = true; + break; + } + case 34: + if (pdfViewer.isVerticalScrollbarEnabled) { + turnOnlyIfPageFit = true; + } + turnPage = 1; + break; + case 32: + if (!isViewerInPresentationMode) { + turnOnlyIfPageFit = true; + } + turnPage = 1; + break; + case 39: + if (this.supportsCaretBrowsingMode) { + return; + } + if (pdfViewer.isHorizontalScrollbarEnabled) { + turnOnlyIfPageFit = true; + } + case 74: + case 78: + turnPage = 1; + break; + case 36: + if (isViewerInPresentationMode || this.page > 1) { + this.page = 1; + handled = true; + ensureViewerFocused = true; + } + break; + case 35: + if (isViewerInPresentationMode || this.page < this.pagesCount) { + this.page = this.pagesCount; + handled = true; + ensureViewerFocused = true; + } + break; + case 83: + this.pdfCursorTools?.switchTool(CursorTool.SELECT); + break; + case 72: + this.pdfCursorTools?.switchTool(CursorTool.HAND); + break; + case 82: + this.rotatePages(90); + break; + case 115: + this.viewsManager?.toggle(); + break; + } + if (turnPage !== 0 && (!turnOnlyIfPageFit || pdfViewer.currentScaleValue === "page-fit")) { + if (turnPage > 0) { + pdfViewer.nextPage(); + } else { + pdfViewer.previousPage(); + } + handled = true; + } + } + if (cmd === 4) { + switch (evt.keyCode) { + case 32: + if (!isViewerInPresentationMode && pdfViewer.currentScaleValue !== "page-fit") { + break; + } + pdfViewer.previousPage(); + handled = true; + break; + case 38: + this.moveCaret(true, true); + handled = true; + break; + case 40: + this.moveCaret(false, true); + handled = true; + break; + case 82: + this.rotatePages(-90); + break; + } + } + if (!handled && !isViewerInPresentationMode) { + if (evt.keyCode >= 33 && evt.keyCode <= 40 || evt.keyCode === 32 && curElementTagName !== "BUTTON") { + ensureViewerFocused = true; + } + } + if (ensureViewerFocused && !pdfViewer.containsElement(curElement)) { + pdfViewer.focus(); + } + if (handled) { + evt.preventDefault(); + } +} + +;// ./web/viewer.js + + + + + +const AppConstants = { + LinkTarget: LinkTarget, + RenderingStates: RenderingStates, + ScrollMode: ScrollMode, + SpreadMode: SpreadMode +}; +window.PDFViewerApplication = PDFViewerApplication; +window.PDFViewerApplicationConstants = AppConstants; +window.PDFViewerApplicationOptions = AppOptions; +function getViewerConfiguration() { + return { + appContainer: document.body, + principalContainer: document.getElementById("mainContainer"), + mainContainer: document.getElementById("viewerContainer"), + viewerContainer: document.getElementById("viewer"), + viewerAlert: document.getElementById("viewer-alert"), + toolbar: { + container: document.getElementById("toolbarContainer"), + numPages: document.getElementById("numPages"), + pageNumber: document.getElementById("pageNumber"), + scaleSelect: document.getElementById("scaleSelect"), + customScaleOption: document.getElementById("customScaleOption"), + previous: document.getElementById("previous"), + next: document.getElementById("next"), + zoomIn: document.getElementById("zoomInButton"), + zoomOut: document.getElementById("zoomOutButton"), + print: document.getElementById("printButton"), + editorCommentButton: document.getElementById("editorCommentButton"), + editorCommentParamsToolbar: document.getElementById("editorCommentParamsToolbar"), + editorFreeTextButton: document.getElementById("editorFreeTextButton"), + editorFreeTextParamsToolbar: document.getElementById("editorFreeTextParamsToolbar"), + editorHighlightButton: document.getElementById("editorHighlightButton"), + editorHighlightParamsToolbar: document.getElementById("editorHighlightParamsToolbar"), + editorHighlightColorPicker: document.getElementById("editorHighlightColorPicker"), + editorInkButton: document.getElementById("editorInkButton"), + editorInkParamsToolbar: document.getElementById("editorInkParamsToolbar"), + editorStampButton: document.getElementById("editorStampButton"), + editorStampParamsToolbar: document.getElementById("editorStampParamsToolbar"), + editorSignatureButton: document.getElementById("editorSignatureButton"), + editorSignatureParamsToolbar: document.getElementById("editorSignatureParamsToolbar"), + signaturePropertiesButton: document.getElementById("signaturePropertiesButton"), + signaturePropertiesPanel: document.getElementById("signaturePropertiesPanel"), + signaturePropertiesContainer: document.getElementById("signaturePropertiesContainer"), + signaturePropertiesBanner: document.getElementById("signaturePropertiesBanner"), + signaturePropertiesList: document.getElementById("signaturePropertiesList"), + signaturePropertiesSeparator: document.getElementById("signaturePropertiesSeparator"), + download: document.getElementById("downloadButton") + }, + secondaryToolbar: { + toolbar: document.getElementById("secondaryToolbar"), + toggleButton: document.getElementById("secondaryToolbarToggleButton"), + presentationModeButton: document.getElementById("presentationMode"), + openFileButton: document.getElementById("secondaryOpenFile"), + printButton: document.getElementById("secondaryPrint"), + downloadButton: document.getElementById("secondaryDownload"), + viewBookmarkButton: document.getElementById("viewBookmark"), + firstPageButton: document.getElementById("firstPage"), + lastPageButton: document.getElementById("lastPage"), + pageRotateCwButton: document.getElementById("pageRotateCw"), + pageRotateCcwButton: document.getElementById("pageRotateCcw"), + cursorSelectToolButton: document.getElementById("cursorSelectTool"), + cursorHandToolButton: document.getElementById("cursorHandTool"), + scrollPageButton: document.getElementById("scrollPage"), + scrollVerticalButton: document.getElementById("scrollVertical"), + scrollHorizontalButton: document.getElementById("scrollHorizontal"), + scrollWrappedButton: document.getElementById("scrollWrapped"), + spreadNoneButton: document.getElementById("spreadNone"), + spreadOddButton: document.getElementById("spreadOdd"), + spreadEvenButton: document.getElementById("spreadEven"), + imageAltTextSettingsButton: document.getElementById("imageAltTextSettings"), + imageAltTextSettingsSeparator: document.getElementById("imageAltTextSettingsSeparator"), + documentPropertiesButton: document.getElementById("documentProperties") + }, + viewsManager: { + outerContainer: document.getElementById("outerContainer"), + toggleButton: document.getElementById("viewsManagerToggleButton"), + sidebarContainer: document.getElementById("viewsManager"), + resizer: document.getElementById("viewsManagerResizer"), + thumbnailButton: document.getElementById("thumbnailsViewMenu"), + outlineButton: document.getElementById("outlinesViewMenu"), + attachmentsButton: document.getElementById("attachmentsViewMenu"), + layersButton: document.getElementById("layersViewMenu"), + viewsManagerSelectorButton: document.getElementById("viewsManagerSelectorButton"), + viewsManagerSelectorOptions: document.getElementById("viewsManagerSelectorOptions"), + thumbnailsView: document.getElementById("thumbnailsView"), + outlinesView: document.getElementById("outlinesView"), + attachmentsView: document.getElementById("attachmentsView"), + layersView: document.getElementById("layersView"), + viewsManagerAddFile: { + button: document.getElementById("viewsManagerAddFileButton"), + picker: document.getElementById("viewsManagerAddFilePicker") + }, + viewsManagerCurrentOutlineButton: document.getElementById("viewsManagerCurrentOutlineButton"), + viewsManagerHeaderLabel: document.getElementById("viewsManagerHeaderLabel"), + viewsManagerStatus: document.getElementById("viewsManagerStatus"), + viewsManagerStatusBar: { + viewsManagerStatusAction: document.getElementById("viewsManagerStatusAction"), + viewsManagerStatusActionDeselectButton: document.getElementById("viewsManagerStatusActionDeselectButton"), + viewsManagerStatusActionLabel: document.getElementById("viewsManagerStatusActionLabel") + }, + viewsManagerUndoBar: { + viewsManagerStatusUndo: document.getElementById("viewsManagerStatusUndo"), + viewsManagerStatusUndoLabel: document.getElementById("viewsManagerStatusUndoLabel"), + viewsManagerStatusUndoButton: document.getElementById("viewsManagerStatusUndoButton"), + viewsManagerStatusUndoCloseButton: document.getElementById("viewsManagerStatusUndoCloseButton") + }, + viewsManagerWaitingBar: { + container: document.getElementById("viewsManagerStatusWaiting"), + closeButton: document.getElementById("viewsManagerStatusWaitingCloseButton"), + label: document.getElementById("viewsManagerStatusWaitingLabel") + }, + manageMenu: { + button: document.getElementById("viewsManagerStatusActionButton"), + menu: document.getElementById("viewsManagerStatusActionOptions"), + copy: document.getElementById("viewsManagerStatusActionCopy"), + cut: document.getElementById("viewsManagerStatusActionCut"), + delete: document.getElementById("viewsManagerStatusActionDelete"), + exportSelected: document.getElementById("viewsManagerStatusActionExport") + } + }, + findBar: { + bar: document.getElementById("findbar"), + toggleButton: document.getElementById("viewFindButton"), + findField: document.getElementById("findInput"), + highlightAllCheckbox: document.getElementById("findHighlightAll"), + caseSensitiveCheckbox: document.getElementById("findMatchCase"), + matchDiacriticsCheckbox: document.getElementById("findMatchDiacritics"), + entireWordCheckbox: document.getElementById("findEntireWord"), + findMsg: document.getElementById("findMsg"), + findResultsCount: document.getElementById("findResultsCount"), + findPreviousButton: document.getElementById("findPreviousButton"), + findNextButton: document.getElementById("findNextButton") + }, + passwordOverlay: { + dialog: document.getElementById("passwordDialog"), + label: document.getElementById("passwordText"), + input: document.getElementById("password"), + submitButton: document.getElementById("passwordSubmit"), + cancelButton: document.getElementById("passwordCancel") + }, + documentProperties: { + dialog: document.getElementById("documentPropertiesDialog"), + closeButton: document.getElementById("documentPropertiesClose"), + fields: { + fileName: document.getElementById("fileNameField"), + fileSize: document.getElementById("fileSizeField"), + title: document.getElementById("titleField"), + author: document.getElementById("authorField"), + subject: document.getElementById("subjectField"), + keywords: document.getElementById("keywordsField"), + creationDate: document.getElementById("creationDateField"), + modificationDate: document.getElementById("modificationDateField"), + creator: document.getElementById("creatorField"), + producer: document.getElementById("producerField"), + version: document.getElementById("versionField"), + pageCount: document.getElementById("pageCountField"), + pageSize: document.getElementById("pageSizeField"), + linearized: document.getElementById("linearizedField") + } + }, + altTextDialog: { + dialog: document.getElementById("altTextDialog"), + optionDescription: document.getElementById("descriptionButton"), + optionDecorative: document.getElementById("decorativeButton"), + textarea: document.getElementById("descriptionTextarea"), + cancelButton: document.getElementById("altTextCancel"), + saveButton: document.getElementById("altTextSave") + }, + newAltTextDialog: { + dialog: document.getElementById("newAltTextDialog"), + title: document.getElementById("newAltTextTitle"), + descriptionContainer: document.getElementById("newAltTextDescriptionContainer"), + textarea: document.getElementById("newAltTextDescriptionTextarea"), + disclaimer: document.getElementById("newAltTextDisclaimer"), + learnMore: document.getElementById("newAltTextLearnMore"), + imagePreview: document.getElementById("newAltTextImagePreview"), + createAutomatically: document.getElementById("newAltTextCreateAutomatically"), + createAutomaticallyButton: document.getElementById("newAltTextCreateAutomaticallyButton"), + downloadModel: document.getElementById("newAltTextDownloadModel"), + downloadModelDescription: document.getElementById("newAltTextDownloadModelDescription"), + error: document.getElementById("newAltTextError"), + errorCloseButton: document.getElementById("newAltTextCloseButton"), + cancelButton: document.getElementById("newAltTextCancel"), + notNowButton: document.getElementById("newAltTextNotNow"), + saveButton: document.getElementById("newAltTextSave") + }, + altTextSettingsDialog: { + dialog: document.getElementById("altTextSettingsDialog"), + createModelButton: document.getElementById("createModelButton"), + learnMore: document.getElementById("altTextSettingsLearnMore"), + showAltTextDialogButton: document.getElementById("showAltTextDialogButton"), + altTextSettingsCloseButton: document.getElementById("altTextSettingsCloseButton"), + closeButton: document.getElementById("altTextSettingsCloseButton") + }, + addSignatureDialog: { + dialog: document.getElementById("addSignatureDialog"), + panels: document.getElementById("addSignatureActionContainer"), + typeButton: document.getElementById("addSignatureTypeButton"), + typeInput: document.getElementById("addSignatureTypeInput"), + drawButton: document.getElementById("addSignatureDrawButton"), + drawSVG: document.getElementById("addSignatureDraw"), + drawPlaceholder: document.getElementById("addSignatureDrawPlaceholder"), + drawThickness: document.getElementById("addSignatureDrawThickness"), + imageButton: document.getElementById("addSignatureImageButton"), + imageSVG: document.getElementById("addSignatureImage"), + imagePlaceholder: document.getElementById("addSignatureImagePlaceholder"), + imagePicker: document.getElementById("addSignatureFilePicker"), + imagePickerLink: document.getElementById("addSignatureImageBrowse"), + description: document.getElementById("addSignatureDescription"), + clearButton: document.getElementById("clearSignatureButton"), + saveContainer: document.getElementById("addSignatureSaveContainer"), + saveCheckbox: document.getElementById("addSignatureSaveCheckbox"), + errorBar: document.getElementById("addSignatureError"), + errorTitle: document.getElementById("addSignatureErrorTitle"), + errorDescription: document.getElementById("addSignatureErrorDescription"), + errorCloseButton: document.getElementById("addSignatureErrorCloseButton"), + cancelButton: document.getElementById("addSignatureCancelButton"), + addButton: document.getElementById("addSignatureAddButton") + }, + editSignatureDialog: { + dialog: document.getElementById("editSignatureDescriptionDialog"), + description: document.getElementById("editSignatureDescription"), + editSignatureView: document.getElementById("editSignatureView"), + cancelButton: document.getElementById("editSignatureCancelButton"), + updateButton: document.getElementById("editSignatureUpdateButton") + }, + annotationEditorParams: { + editorCommentsSidebar: document.getElementById("editorCommentsSidebar"), + editorCommentsSidebarCount: document.getElementById("editorCommentsSidebarCount"), + editorCommentsSidebarTitle: document.getElementById("editorCommentsSidebarTitle"), + editorCommentsSidebarCloseButton: document.getElementById("editorCommentsSidebarCloseButton"), + editorCommentsSidebarList: document.getElementById("editorCommentsSidebarList"), + editorCommentsSidebarResizer: document.getElementById("editorCommentsSidebarResizer"), + editorFreeTextFontSize: document.getElementById("editorFreeTextFontSize"), + editorFreeTextColor: document.getElementById("editorFreeTextColor"), + editorInkColor: document.getElementById("editorInkColor"), + editorInkThickness: document.getElementById("editorInkThickness"), + editorInkOpacity: document.getElementById("editorInkOpacity"), + editorStampAddImage: document.getElementById("editorStampAddImage"), + editorSignatureAddSignature: document.getElementById("editorSignatureAddSignature"), + editorFreeHighlightThickness: document.getElementById("editorFreeHighlightThickness"), + editorHighlightShowAll: document.getElementById("editorHighlightShowAll") + }, + printContainer: document.getElementById("printContainer"), + editorUndoBar: { + container: document.getElementById("editorUndoBar"), + message: document.getElementById("editorUndoBarMessage"), + undoButton: document.getElementById("editorUndoBarUndoButton"), + closeButton: document.getElementById("editorUndoBarCloseButton") + }, + ...{}, + editCommentDialog: { + dialog: document.getElementById("commentManagerDialog"), + toolbar: document.getElementById("commentManagerToolbar"), + title: document.getElementById("commentManagerTitle"), + textInput: document.getElementById("commentManagerTextInput"), + cancelButton: document.getElementById("commentManagerCancelButton"), + saveButton: document.getElementById("commentManagerSaveButton") + } + }; +} +function webViewerLoad() { + const config = getViewerConfiguration(); + const event = new CustomEvent("webviewerloaded", { + bubbles: true, + cancelable: true, + detail: { + source: window + } + }); + try { + parent.document.dispatchEvent(event); + } catch (ex) { + console.error("webviewerloaded:", ex); + document.dispatchEvent(event); + } + PDFViewerApplication.run(config); +} +document.blockUnblockOnload?.(true); +if (document.readyState === "interactive" || document.readyState === "complete") { + webViewerLoad(); +} else { + document.addEventListener("DOMContentLoaded", webViewerLoad, true); +} + +export { PDFViewerApplication, AppConstants as PDFViewerApplicationConstants, AppOptions as PDFViewerApplicationOptions }; + +//# sourceMappingURL=viewer.mjs.map \ No newline at end of file diff --git a/public/assets/vendor/pdfjs-6.4.299/web/wasm/LICENSE_JBIG2 b/public/assets/vendor/pdfjs-6.4.299/web/wasm/LICENSE_JBIG2 new file mode 100644 index 000000000..37a329c63 --- /dev/null +++ b/public/assets/vendor/pdfjs-6.4.299/web/wasm/LICENSE_JBIG2 @@ -0,0 +1,196 @@ +// Copyright 2014 The PDFium Authors +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + Apache License + Version 2.0, January 2004 + https://www.apache.org/licenses/ + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + 1. Definitions. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + END OF TERMS AND CONDITIONS + APPENDIX: How to apply the Apache License to your work. + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + Copyright [yyyy] [name of copyright owner] + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + https://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/public/assets/vendor/pdfjs-6.4.299/web/wasm/LICENSE_OPENJPEG b/public/assets/vendor/pdfjs-6.4.299/web/wasm/LICENSE_OPENJPEG new file mode 100644 index 000000000..e8fa41040 --- /dev/null +++ b/public/assets/vendor/pdfjs-6.4.299/web/wasm/LICENSE_OPENJPEG @@ -0,0 +1,39 @@ +/* + * The copyright in this software is being made available under the 2-clauses + * BSD License, included below. This software may be subject to other third + * party and contributor rights, including patent rights, and no such rights + * are granted under this license. + * + * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2014, Professor Benoit Macq + * Copyright (c) 2003-2014, Antonin Descampe + * Copyright (c) 2003-2009, Francois-Olivier Devaux + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France + * Copyright (c) 2012, CS Systemes d'Information, France + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ diff --git a/public/assets/vendor/pdfjs-6.4.299/web/wasm/LICENSE_PDFJS_JBIG2 b/public/assets/vendor/pdfjs-6.4.299/web/wasm/LICENSE_PDFJS_JBIG2 new file mode 100644 index 000000000..f1845baf6 --- /dev/null +++ b/public/assets/vendor/pdfjs-6.4.299/web/wasm/LICENSE_PDFJS_JBIG2 @@ -0,0 +1,13 @@ +Copyright 2026 Mozilla Foundation + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/public/assets/vendor/pdfjs-6.4.299/web/wasm/LICENSE_PDFJS_OPENJPEG b/public/assets/vendor/pdfjs-6.4.299/web/wasm/LICENSE_PDFJS_OPENJPEG new file mode 100644 index 000000000..623929b84 --- /dev/null +++ b/public/assets/vendor/pdfjs-6.4.299/web/wasm/LICENSE_PDFJS_OPENJPEG @@ -0,0 +1,22 @@ +Copyright (c) 2024, Mozilla Foundation + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/public/assets/vendor/pdfjs-6.4.299/web/wasm/LICENSE_PDFJS_QCMS b/public/assets/vendor/pdfjs-6.4.299/web/wasm/LICENSE_PDFJS_QCMS new file mode 100644 index 000000000..9cf106272 --- /dev/null +++ b/public/assets/vendor/pdfjs-6.4.299/web/wasm/LICENSE_PDFJS_QCMS @@ -0,0 +1,19 @@ +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/public/assets/vendor/pdfjs-6.4.299/web/wasm/LICENSE_QCMS b/public/assets/vendor/pdfjs-6.4.299/web/wasm/LICENSE_QCMS new file mode 100644 index 000000000..eec8246df --- /dev/null +++ b/public/assets/vendor/pdfjs-6.4.299/web/wasm/LICENSE_QCMS @@ -0,0 +1,21 @@ +qcms +Copyright (C) 2009-2024 Mozilla Corporation +Copyright (C) 1998-2007 Marti Maria + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/public/assets/vendor/pdfjs-6.4.299/web/wasm/jbig2.wasm b/public/assets/vendor/pdfjs-6.4.299/web/wasm/jbig2.wasm new file mode 100644 index 0000000000000000000000000000000000000000..0f600760ccaa6e7cfee1ce406807a8c6f7a22cb9 GIT binary patch literal 103671 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 Y3H|AA=Jzdp)*P{3((2k={throw toThrow};var _scriptName=import.meta.url;var scriptDirectory="";var readAsync;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){try{scriptDirectory=new URL(".",_scriptName).href}catch{}{readAsync=async url=>{var response=await fetch(url,{credentials:"same-origin"});if(response.ok){return response.arrayBuffer()}throw new Error(response.status+" : "+response.url)}}}else{}var out=console.log.bind(console);var err=console.error.bind(console);var wasmBinary;var WebAssembly={Memory:function(opts){this.buffer=new ArrayBuffer(opts["initial"]*65536)},Module:function(binary){},Instance:function(module,info){this.exports=( +// EMSCRIPTEN_START_ASM +function instantiate(ha){var a;var b=new Uint8Array(123);for(var c=25;c>=0;--c){b[48+c]=52+c;b[65+c]=c;b[97+c]=26+c}b[43]=62;b[47]=63;function i(j,k,l){var d,e,c=0,f=k,g=l.length,h=k+(g*3>>2)-(l[g-2]=="=")-(l[g-1]=="=");for(;c>4;if(f>2;if(f>>0;s=s>>>0;if(q+s>a.length)throw"trap: invalid memory.fill";a.fill(u,q,q+s)}function ga(n){var v=new ArrayBuffer(16777216);var w=new Int8Array(v);var x=new Int16Array(v);var y=new Int32Array(v);var z=new Uint8Array(v);var A=new Uint16Array(v);var B=new Uint32Array(v);var C=new Float32Array(v);var D=new Float64Array(v);var E=Math.imul;var F=Math.fround;var G=Math.abs;var H=Math.clz32;var I=Math.min;var J=Math.max;var K=Math.floor;var L=Math.ceil;var M=Math.trunc;var N=Math.sqrt;var O=n.a;var P=O.a;var Q=O.b;var R=O.c;var S=O.d;var T=O.e;var U=O.f;var V=O.g;var W=O.h;var X=O.i;var Y=72384;var Z=0; +// EMSCRIPTEN_START_FUNCS +function yc(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,q=0,r=0,s=0,u=0,v=0,C=0,D=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,Ia=0,Ma=0,Pa=0,Qa=0,Ta=0,Xa=0,Ya=0,gb=0,hb=0,qb=0,rb=0,sb=0,tb=0,ub=0;T=Y-16|0;Y=T;b=y[a+4>>2];c=y[b+8>>2];b=y[b+4>>2];i=b;a:{b:{c:{d:{e:{if(b>>>0>>0){break e}if((b|0)==(c|0)){sb=2;break c}ba=a+80|0;while(1){if(c>>>0>i>>>0){break e}if(i-c>>>0<11){break c}f:{g:{h:{n=y[ba>>2];i:{if(!n){b=na(72);w[b+4|0]=0;y[b>>2]=0;t(b+8|0,0,64);y[T+4>>2]=0;eb(ba,b);Vb(T+4|0);j:{i=y[a+80>>2];k:{if(qa(y[a+4>>2],i)){break k}if(wa(y[a+4>>2],i+4|0)){break k}g=y[a+4>>2];d=y[g+8>>2];b=y[g>>2];l:{m:{if(B[g+4>>2]<=d>>>0){w[T+15|0]=0;break m}b=z[b+d|0];w[T+15|0]=b;if(b>>>0<224){break m}if(qa(g,i+8|0)){break k}c=y[i+8>>2]&536870911;y[i+8>>2]=c;if(c>>>0>64){break k}d=y[a+4>>2];b=y[d+8>>2];g=b+(c+8>>>3|0)|0;if(b>>>0>g>>>0){break l}b=y[d+4>>2];y[d+8>>2]=b>>>0>g>>>0?g:b;break l}if(wa(g,T+15|0)){break k}c=z[T+15|0]>>>5|0;y[i+8>>2]=c}d=z[i+4|0];n:{if(!c){break n}b=y[i>>2];Rb(i+12|0,c);c=0;b=(b>>>0>65536?4:b>>>0>256?2:1)-1|0;while(1){if(y[i+8>>2]<=(c|0)){break n}o:{p:{switch(b-1|0){default:if(wa(y[a+4>>2],T+15|0)){break k}n=z[T+15|0];y[y[i+12>>2]+(c<<2)>>2]=n;break o;case 0:if(Sa(y[a+4>>2],T+12|0)){break k}n=A[T+12>>1];y[y[i+12>>2]+(c<<2)>>2]=n;break o;case 1:break e;case 2:break p}}if(qa(y[a+4>>2],T+8|0)){break k}n=y[T+8>>2];y[y[i+12>>2]+(c<<2)>>2]=n}c=c+1|0;if(B[i>>2]>n>>>0){continue}break}break k}b=y[a+4>>2];q:{if(!(d&64)){if(wa(b,T+15|0)){break k}y[i+24>>2]=z[T+15|0];break q}if(qa(b,i+24|0)){break k}}if(!qa(y[a+4>>2],i+28|0)){break j}}eb(ba,0);break i}c=y[a+4>>2];b=y[c+20>>2];y[i+40>>2]=y[c+16>>2];y[i+44>>2]=b;b=y[c+8>>2];y[i+48>>2]=1;y[i+36>>2]=b;y[a+84>>2]=b;n=y[a+80>>2]}r:{while(1){g=0;m=0;c=0;f=Y-304|0;Y=f;b=2;s:{t:{u:{v:{w:{x:{y:{z:{A:{B:{C:{D:{E:{F:{G:{H:{I:{J:{K:{L:{M:{N:{O:{P:{Q:{R:{S:{d=z[n+4|0]&63;switch(d-16|0){case 0:break R;case 1:case 2:case 3:case 5:case 8:case 9:case 10:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 21:case 25:case 28:case 29:case 30:case 31:break B;case 4:case 6:case 7:break Q;case 20:case 22:case 23:break P;case 24:case 26:case 27:break O;case 32:break N;case 33:break K;case 34:break J;case 35:break u;case 36:break I;case 37:break H;default:break S}}T:{switch(d|0){case 0:b=0;h=0;q=0;e=Y-432|0;Y=e;c=1;if(!Sa(y[a+4>>2],e+210|0)){l=na(56);y[l+40>>2]=0;y[l+32>>2]=0;y[l+36>>2]=0;y[l+24>>2]=0;y[l+28>>2]=0;y[l+16>>2]=0;y[l+20>>2]=0;u=A[e+210>>1];i=u&1;w[l|0]=i;g=u>>>10&3;w[l+3|0]=g;d=u&12288;w[l+2|0]=(d|0)!=0;c=(u&254)>>>1&1;w[l+1|0]=c;ga=l+16|0;U:{V:{W:{if(!i){i=g?2:8;g=l+44|0;while(1){if((b|0)!=(i|0)){c=1;d=b+g|0;b=b+1|0;if(!wa(y[a+4>>2],d)){continue}break U}break}if(z[l+1|0]!=1){break V}if(!z[l+2|0]){break W}break V}if(d|!c){break V}}g=l+52|0;b=0;while(1){if((b|0)==4){break V}c=1;d=b+g|0;b=b+1|0;if(!wa(y[a+4>>2],d)){continue}break}break U}c=1;if(qa(y[a+4>>2],l+12|0)){break U}if(qa(y[a+4>>2],l+8|0)|B[l+12>>2]>1048576|B[l+8>>2]>1048576){break U}b=y[n+8>>2];k=(b|0)>0?b:0;b=0;while(1){if((b|0)==(k|0)){I=1;b=0;while(1)if((b|0)==(k|0)){X:{Y:{Z:{_:{$:{aa:{ba:{ca:{da:{ea:{fa:{if(!(I&1)){break fa}y[l+4>>2]=h;gb=Kb(e+196|0,h);k=y[gb>>2];ga:{if((k|0)==y[gb+4>>2]){break ga}b=y[n+8>>2];d=(b|0)>0?b:0;I=1;h=0;g=0;while(1){if((d|0)==(g|0)){break ga}ha:{b=Ka(a,y[y[n+12>>2]+(g<<2)>>2]);if(z[b+4|0]&63){break ha}b=y[b+56>>2];i=y[b+24>>2];m=y[b+28>>2]-i>>2;b=0;while(1){if((b|0)==(m|0)){j=0;i=0;if(I&1){b=h+m|0;c=b>>>0>=m>>>0;j=c;i=c?b:0}h=i;I=j;break ha}c=b+h|0;if(!(c>>>0>=b>>>0&I)){break fa}y[k+(c<<2)>>2]=y[i+(b<<2)>>2];b=b+1|0;continue}}g=g+1|0;continue}}$a(ga,gb);c=1;ia:{if(z[l|0]!=1){break ia}b=u>>>2&3;if((b|0)==2){break X}d=u>>>4&3;if((d|0)==2){break X}ja:{ka:{switch(b|0){case 0:I=ra(a,4);b=0;break ja;case 1:I=ra(a,5);b=0;break ja;default:break ka}}b=Ga(a,n,0);if(!b){break X}I=y[b+68>>2];b=1}y[l+28>>2]=I;la:{ma:{switch(d|0){case 0:d=ra(a,2);break la;case 1:d=ra(a,3);break la;default:break ma}}d=Ga(a,n,b);if(!d){break X}b=b+1|0;d=y[d+68>>2]}y[l+32>>2]=d;na:{if(!(u&64)){d=ra(a,1);break na}d=Ga(a,n,b);if(!d){break X}b=b+1|0;d=y[d+68>>2]}y[l+36>>2]=d;if(z[l+1|0]!=1){break ia}oa:{if(!(u&128)){b=ra(a,1);break oa}b=Ga(a,n,b);if(!b){break X}b=y[b+68>>2]}y[l+40>>2]=b}O=z[l+1|0];hb=z[l|0];c=z[l+3|0];b=z[l+2|0];y[e+192>>2]=0;y[e+184>>2]=0;y[e+188>>2]=0;y[e+180>>2]=0;y[e+172>>2]=0;y[e+176>>2]=0;g=b?1024:8192;d=c?(c|0)==1?8192:1024:65536;pa:{if(!(!(u&256)|!q)){c=1;if(!(hb&1)){b=Jb(e+184|0,y[q+56>>2]);if((d|0)!=y[e+188>>2]-y[b>>2]>>1){break Y}}if(!(O&1)){break pa}b=Jb(e+172|0,y[q+56>>2]+12|0);if((g|0)==y[e+176>>2]-y[b>>2]>>1){break pa}break Y}if(!(hb&1)){fb(e+184|0,d)}if(!(O&1)){break pa}fb(e+172|0,g)}d=y[n+44>>2];k=d;c=y[n+40>>2];y[e+152>>2]=c;y[e+156>>2]=d;i=y[n+36>>2];y[e+160>>2]=i;y[n+52>>2]=2;qa:{if(!(c|d)|z[a+48|0]!=1){break qa}g=y[a+108>>2];b=g;while(1){b=y[b+4>>2];if((g|0)==(b|0)){break qa}if((c|0)!=y[b+8>>2]|(k|0)!=y[b+12>>2]|(i|0)!=y[b+16>>2]){continue}break}c=Dd(y[b+24>>2]);y[e+232>>2]=0;Ib(n+56|0,c);Va(e+232|0);Cd(y[a+108>>2],e+152|0,b+24|0);g=y[a+108>>2];d=y[b>>2];c=y[b+4>>2];y[d+4>>2]=c;y[c>>2]=d;y[g+8>>2]=y[g+8>>2]-1;pc(b);break _}if(!(hb&1)){v=Na(y[a+4>>2]);y[e+344>>2]=v;g=y[e+172>>2];c=y[e+176>>2];b=y[e+188>>2];Q=y[e+184>>2];qb=Da();y[e+428>>2]=qb;ca=Da();y[e+400>>2]=ca;L=Da();y[e+396>>2]=L;M=Da();y[e+392>>2]=M;aa=Q+810|0;da=Q+79434|0;ha=Q+3882|0;Ma=Q+458|0;Pa=g;ea=c-g>>1;Qa=Fd(e+232|0,ib(y[l+8>>2]+y[l+4>>2]|0));Ia=cb(e+416|0,y[l+8>>2]);R=b-Q>>1;Ta=R>>>0>405;Xa=R>>>0>39717;Ya=R>>>0>1941;rb=R>>>0>229;q=0;I=0;while(1){ra:{sa:{ta:{b=y[l+8>>2];if(b>>>0>I>>>0){y[e+388>>2]=0;Aa(qb,v,e+384|0);q=y[e+384>>2]+q|0;if(q>>>0<=65535){fa=0;while(1){if(!Aa(ca,v,e+380|0)){break ra}if(B[l+8>>2]<=I>>>0){break ta}fa=y[e+380>>2]+fa|0;if(fa>>>0>65535){break ta}if(!(!q|!fa)){ua:{va:{wa:{xa:{ya:{za:{Aa:{if(!z[l+1|0]){D=lb();y[e+376>>2]=D;y[D+8>>2]=q;y[D+4>>2]=fa;w[D|0]=0;b=z[l+3|0];w[D+1|0]=0;w[D+2|0]=0;w[D+3|0]=b;w[D+16|0]=z[l+44|0];w[D+17|0]=z[l+45|0];w[D+18|0]=z[l+46|0];w[D+19|0]=z[l+47|0];w[D+20|0]=z[l+48|0];w[D+21|0]=z[l+49|0];w[D+22|0]=z[l+50|0];w[D+23|0]=z[l+51|0];U=D+8|0;V=D+4|0;Ba:{switch(b|0){case 0:break Ba;case 1:break ya;case 2:break za;default:break Aa}}if(!Bd(D)){break xa}C=ua(V,U);y[e+212>>2]=C;if(!y[C+16>>2]){break wa}b=y[V>>2];if(!b){break fa}P=y[U>>2]&2147483647;b=b-1|0;N=b>>>3|0;W=(b&7)+1|0;b=0;d=0;h=0;i=0;u=0;c=0;while(1){m=d;F=b;Ca:{Da:{if((u|0)!=(P|0)){ja(e+404|0,C,u);b=y[e+408>>2];d=y[e+404>>2];if(z[D+1|0]!=1){g=c;break Da}if(z[v|0]){break wa}if(!Xa){break fa}g=0;k=ka(v,da);if((k|0)==(c|0)){break Da}y[e+332>>2]=b;y[e+328>>2]=d;y[e+224>>2]=F;y[e+220>>2]=m;g=y[e+332>>2];y[e+40>>2]=y[e+328>>2];y[e+44>>2]=g;g=y[e+224>>2];y[e+32>>2]=y[e+220>>2];y[e+36>>2]=g;Ca(e+40|0,e+32|0);c=c^k;break Ca}y[e+212>>2]=0;break va}Ea:{Fa:{Ga:{if(u>>>0<=1){J=0;r=0;k=(u|0)!=1;if(!k){if(!F){break fa}r=z[m|0]}h=r&240;while(1){if((J|0)!=(N|0)){if(!k){c=J+1|0;if(c>>>0>=F>>>0){break fa}r=z[c+m|0]|r<<8}c=7;s=0;while(1){if((c|0)>=0){if(z[v|0]){break wa}if(h>>>0>=R>>>0){break fa}i=h<<1;j=ka(v,i+Q|0);h=j|(r>>>c&16|i&63470);s=j<>>0>=R>>>0){break fa}k=h<<1;K=ka(v,k+Q|0);i=7-c|0;h=K|(j>>>i&16|k&63470);s=K<>>0>>0|N>>>0>F-1>>>0)|N>>>0>h-1>>>0){break fa}r=z[m|0];J=z[i|0]<<6;h=r&240|J&14336;H=d+N|0;k=m;j=d;while(1){Ha:{K=J<<8;if((j|0)==(H|0)){break Ha}k=k+1|0;r=z[k|0]|r<<8;i=i+1|0;J=K|z[i|0]<<6;c=7;s=0;while(1){if((c|0)>=0){if(z[v|0]){break wa}if(h>>>0>=R>>>0){break fa}h=h<<1;K=ka(v,h+Q|0);h=K|(r>>>c&16|(J>>>c&2048|h&63470));s=K<>>0>=R>>>0){break fa}i=h<<1;c=ka(v,i+Q|0);j=7-s|0;G=c<>>j&16|(K>>>j&2048|i&63470));s=s+1|0;continue}}if(b>>>0<=N>>>0){break fa}w[d+N|0]=s;break Ea}if(b>>>0<=N>>>0){break fa}w[H|0]=G}c=g}u=u+1|0;h=F;i=m;continue}}Aa(L,v,e+328|0);c=y[e+328>>2];if(c>>>0>=2){F=xa(6);y[e+220>>2]=F;u=xa(8);y[e+212>>2]=u;m=xa(11);y[e+376>>2]=m;h=xa(15);y[e+372>>2]=h;j=xa(15);y[e+368>>2]=j;k=xa(15);y[e+364>>2]=k;i=xa(15);y[e+360>>2]=i;g=xa(1);y[e+356>>2]=g;H=Qb();y[e+352>>2]=H;b=z[l|0];y[H+20>>2]=1;y[H+16>>2]=c;y[H+12>>2]=q;y[H+8>>2]=fa;w[H+1|0]=1;w[H|0]=b;b=y[l+4>>2]+I|0;y[H+24>>2]=b;K=Kb(e+404|0,b);b=y[l+4>>2];c=y[l+16>>2];if(b>>>0>y[l+20>>2]-c>>2>>>0){break fa}P=y[K>>2];zd(c,b,P,y[e+408>>2]-P>>2);d=y[Ia>>2];b=0;while(1)if((b|0)==(I|0)){$a(H+124|0,K);x[H+4>>1]=0;y[H+136>>2]=0;y[H+140>>2]=1;w[H+3|0]=0;y[H+172>>2]=g;y[H+168>>2]=i;y[H+164>>2]=k;y[H+160>>2]=j;y[H+156>>2]=h;y[H+152>>2]=m;y[H+148>>2]=u;y[H+144>>2]=F;w[H+2|0]=z[l+2|0];w[H+176|0]=z[l+52|0];w[H+177|0]=z[l+53|0];w[H+178|0]=z[l+54|0];w[H+179|0]=z[l+55|0];b=Ed(H,v,Pa,ea,Qa);y[e+348>>2]=0;oa(e+388|0,b);la(e+348|0);b=y[e+388>>2];va(K);qc(e+352|0);pa(e+356|0);pa(e+360|0);pa(e+364|0);pa(e+368|0);pa(e+372|0);pa(e+376|0);pa(e+212|0);pa(e+220|0);if(!b){break ta}break ua}else{c=b<<2;y[(c+P|0)+(y[l+4>>2]<<2)>>2]=y[c+d>>2];b=b+1|0;continue}}b=0;if((c|0)!=1){break ua}b=y[l+4>>2];Ac(y[Qa+36>>2],v,e+404|0);d=y[e+404>>2];if(d>>>0>=b+I>>>0){break ta}b=y[l+4>>2];if(b>>>0>d>>>0){b=y[ga>>2]+(d<<2)|0}else{b=d-b|0;c=y[Ia>>2];if(b>>>0>=y[Ia+4>>2]-c>>2>>>0){break fa}b=c+(b<<2)|0}c=y[b>>2];if(!c){break ta}Aa(y[Qa+28>>2],v,e+220|0);Aa(y[Qa+32>>2],v,e+212|0);d=kb();y[e+376>>2]=d;y[d+8>>2]=q;y[d+4>>2]=fa;b=z[l+2|0];y[d+20>>2]=c;w[d|0]=b;y[d+12>>2]=y[e+220>>2];b=y[e+212>>2];w[d+1|0]=0;y[d+16>>2]=b;w[d+24|0]=z[l+52|0];w[d+25|0]=z[l+53|0];w[d+26|0]=z[l+54|0];w[d+27|0]=z[l+55|0];b=jb(d,v,Pa,ea);y[e+372>>2]=0;oa(e+388|0,b);la(e+372|0);b=y[e+388>>2];Ua(e+376|0);if(!b){break ta}break ua}Ia:{Ja:{if(Hb(D)){C=ua(V,U);y[e+212>>2]=C;if(!y[C+16>>2]){break Ja}b=y[V>>2];if(!b){break fa}b=b-1|0;K=b>>>3|0;P=(b&7)+1|0;h=0;g=0;d=0;c=0;while(1){Ka:{La:{if(B[U>>2]>d>>>0){ja(e+404|0,C,d);j=y[e+408>>2];i=y[e+404>>2];if(z[D+1|0]!=1){k=c;break La}if(z[v|0]){break Ja}if(!Ta){break fa}k=0;m=ka(v,aa);if((m|0)==(c|0)){break La}y[e+332>>2]=j;y[e+328>>2]=i;y[e+224>>2]=h;y[e+220>>2]=g;b=y[e+332>>2];y[e+8>>2]=y[e+328>>2];y[e+12>>2]=b;b=y[e+224>>2];y[e>>2]=y[e+220>>2];y[e+4>>2]=b;Ca(e+8|0,e);c=c^m;break Ka}y[e+212>>2]=0;break Ia}c=0;r=0;Ma:{if(!d){Na:{while(1){h=7;s=0;if((r|0)==(K|0)){break Na}Oa:{while(1){if((h|0)>=0){if(z[v|0]){break Oa}if(c>>>0>=R>>>0){break fa}b=c<<1;g=ka(v,b+Q|0);c=g|b&1006;s=g<>>0>>0){break Ja}}h=0;s=0;while(1){if((h|0)==(P|0)){break Ma}if(z[v|0]){break Ja}if(c>>>0>=R>>>0){break fa}b=c<<1;g=ka(v,b+Q|0);c=g|b&1006;s=g<<7-h|s;h=h+1|0;continue}}if(!h){break fa}m=h-1|0;r=z[g|0];h=r>>>1&112;u=0;while(1){Pa:{if((u|0)!=(K|0)){if((m|0)==(u|0)){break fa}b=u+1|0;r=z[b+g|0]|r<<8;c=7;s=0;while(1){if((c|0)<0){break Pa}if(z[v|0]){break Ja}if(h>>>0>=R>>>0){break fa}h=h<<1;F=ka(v,h+Q|0);h=F|(r>>>c+1&16|h&1006);s=F<>>0>=R>>>0){break fa}b=h<<1;m=ka(v,b+Q|0);h=m|(g>>>8-c&16|b&1006);s=m<<7-c|s;c=c+1|0;continue}break}break Ma}if((j|0)==(u|0)){break fa}w[i+u|0]=s;u=b;continue}}if(j>>>0<=K>>>0){break fa}w[i+K|0]=s;c=k}d=d+1|0;h=j;g=i;continue}}C=ua(V,U);y[e+212>>2]=C;Qa:{Ra:{c=y[C+16>>2];if(!c){break Ra}h=y[C+12>>2];while(1){if((c|0)>0){w[h|0]=0;c=c-1|0;h=h+1|0;continue}break}b=0;u=0;c=0;_=0;while(1){Sa:{Ta:{if(B[U>>2]>_>>>0){ja(e+404|0,C,_);g=y[e+408>>2];d=y[e+404>>2];if(z[D+1|0]!=1){m=c;break Ta}if(z[v|0]){break Ra}if(!Ta){break fa}m=0;i=ka(v,aa);if((i|0)==(c|0)){break Ta}y[e+332>>2]=g;y[e+328>>2]=d;y[e+224>>2]=u;y[e+220>>2]=b;b=y[e+332>>2];y[e+24>>2]=y[e+328>>2];y[e+28>>2]=b;b=y[e+224>>2];y[e+16>>2]=y[e+220>>2];y[e+20>>2]=b;c=c^i;Ca(e+24|0,e+16|0);break Sa}y[e+212>>2]=0;break Qa}G=0;j=0;i=0;if(z[D+2|0]==1){ja(e+404|0,y[D+12>>2],_);j=y[e+408>>2];i=y[e+404>>2]}ja(e+404|0,C,w[D+17|0]+_|0);P=y[e+408>>2];F=y[e+404>>2];h=y[C+20>>2];G=!u|(h|0)<2?G:z[b|0]>>>6&1;G=!u|(h|0)<=0?G:z[b|0]>>>6&2|G;r=0;c=0;while(1){if(B[V>>2]<=c>>>0){c=m;break Sa}Ua:{Va:{if(z[D+2|0]==1){if(ia(y[y[D+12>>2]+20>>2],c,i,j)){break Va}}k=ia(h,w[D+16|0]+c|0,F,P);if(z[v|0]){break Ra}k=G<<5|k<<4|r;if(k>>>0>=R>>>0){break fa}k=ka(v,Q+(k<<1)|0);h=y[C+20>>2];if(!k){break Va}Ea(h,c,d,g,1);h=y[C+20>>2];k=1;break Ua}k=0}G=ia(h,c+2|0,b,u)|G<<1&30;c=c+1|0;r=r<<1&14|k;continue}}_=_+1|0;b=d;u=g;continue}}C=0}break va}C=0}break va}Wa:{Xa:{if(Hb(D)){C=ua(V,U);y[e+212>>2]=C;if(!y[C+16>>2]){break Xa}b=y[V>>2];if(!b){break fa}b=b-1|0;N=b>>>3|0;W=(b&7)+1|0;P=y[U>>2];b=0;d=0;h=0;i=0;u=0;c=0;while(1){m=d;F=b;Ya:{Za:{if((u|0)!=(P|0)){ja(e+404|0,C,u);b=y[e+408>>2];d=y[e+404>>2];if(z[D+1|0]!=1){g=c;break Za}if(z[v|0]){break Xa}if(!rb){break fa}g=0;k=ka(v,Ma);if((k|0)==(c|0)){break Za}y[e+332>>2]=b;y[e+328>>2]=d;y[e+224>>2]=F;y[e+220>>2]=m;g=y[e+332>>2];y[e+104>>2]=y[e+328>>2];y[e+108>>2]=g;g=y[e+224>>2];y[e+96>>2]=y[e+220>>2];y[e+100>>2]=g;Ca(e+104|0,e+96|0);c=c^k;break Ya}y[e+212>>2]=0;break Wa}_a:{$a:{ab:{if(u>>>0<=1){J=0;r=0;k=(u|0)!=1;if(!k){if(!F){break fa}r=z[m|0]}h=r>>>3&28;while(1){if((J|0)!=(N|0)){if(!k){c=J+1|0;if(c>>>0>=F>>>0){break fa}r=z[c+m|0]|r<<8}c=7;s=0;while(1){if((c|0)>=0){if(z[v|0]){break Xa}if(h>>>0>=R>>>0){break fa}i=h<<1;j=ka(v,i+Q|0);h=j|(r>>>c+3&4|i&890);s=j<>>0>=R>>>0){break fa}i=h<<1;j=ka(v,i+Q|0);h=j|(k>>>10-c&4|i&890);s=j<<7-c|s;c=c+1|0;continue}}if(!h|!F|(b>>>0>>0|N>>>0>F-1>>>0)|N>>>0>h-1>>>0){break fa}r=z[m|0];J=z[i|0]<<1;h=r>>>3&28|J&384;H=d+N|0;k=m;j=d;while(1){bb:{K=J<<8;if((j|0)==(H|0)){break bb}k=k+1|0;r=z[k|0]|r<<8;i=i+1|0;J=K|z[i|0]<<1;c=7;s=0;while(1){if((c|0)>=0){if(z[v|0]){break Xa}if(h>>>0>=R>>>0){break fa}h=h<<1;K=ka(v,h+Q|0);h=K|(r>>>c+3&4|(J>>>c&128|h&890));s=K<>>0>=R>>>0){break fa}k=h<<1;i=ka(v,k+Q|0);c=7-s|0;G=i<>>10-s&4|(K>>>c&128|k&890));s=s+1|0;continue}}if(b>>>0<=N>>>0){break fa}w[d+N|0]=s;break _a}if(b>>>0<=N>>>0){break fa}w[H|0]=G}c=g}u=u+1|0;h=F;i=m;continue}}C=ua(V,U);y[e+212>>2]=C;cb:{db:{c=y[C+16>>2];if(!c){break db}h=y[C+12>>2];while(1){if((c|0)>0){w[h|0]=0;c=c-1|0;h=h+1|0;continue}break}i=0;d=0;g=0;b=0;c=0;S=0;while(1){eb:{fb:{if(B[U>>2]>S>>>0){ja(e+404|0,C,S);u=y[e+408>>2];j=y[e+404>>2];if(z[D+1|0]!=1){k=c;break fb}if(z[v|0]){break db}if(!rb){break fa}k=0;h=ka(v,Ma);if((h|0)==(c|0)){break fb}y[e+332>>2]=u;y[e+328>>2]=j;y[e+224>>2]=b;y[e+220>>2]=g;d=y[e+332>>2];y[e+120>>2]=y[e+328>>2];y[e+124>>2]=d;d=y[e+224>>2];y[e+112>>2]=y[e+220>>2];y[e+116>>2]=d;c=c^h;Ca(e+120|0,e+112|0);break eb}y[e+212>>2]=0;break cb}G=0;_=0;m=0;if(z[D+2|0]==1){ja(e+404|0,y[D+12>>2],S);_=y[e+408>>2];m=y[e+404>>2]}ja(e+404|0,C,w[D+17|0]+S|0);K=y[e+408>>2];P=y[e+404>>2];h=y[C+20>>2];G=!d|(h|0)<2?G:z[i|0]>>>6&1;G=!d|(h|0)<=0?G:z[i|0]>>>6&2|G;r=0;r=!b|(h|0)<2?r:z[g|0]>>>6&1;r=!b|(h|0)<=0?r:z[g|0]>>>6&2|r;J=0;c=0;while(1){if(B[V>>2]<=c>>>0){c=k;break eb}gb:{hb:{if(z[D+2|0]==1){if(ia(y[y[D+12>>2]+20>>2],c,m,_)){break hb}}if(z[v|0]){break db}h=r<<3|G<<7|ia(h,w[D+16|0]+c|0,P,K)<<2|J;if(h>>>0>=R>>>0){break fa}F=ka(v,Q+(h<<1)|0);h=y[C+20>>2];if(!F){break hb}Ea(h,c,j,u,1);h=y[C+20>>2];H=1;break gb}H=0}F=c+2|0;G=ia(h,F,i,d)|G<<1&6;r=ia(h,F,g,b)|r<<1&14;c=c+1|0;J=J<<1&2|H;continue}}S=S+1|0;i=g;d=b;g=j;b=u;continue}}C=0}break va}C=0}break va}ib:{jb:{if(yd(D)){C=ua(V,U);y[e+212>>2]=C;if(!y[C+16>>2]){break jb}b=y[V>>2];if(!b){break fa}b=b-1|0;N=b>>>3|0;W=(b&7)+1|0;P=y[U>>2];b=0;d=0;h=0;i=0;u=0;c=0;while(1){m=d;F=b;kb:{lb:{if((u|0)!=(P|0)){ja(e+404|0,C,u);b=y[e+408>>2];d=y[e+404>>2];if(z[D+1|0]!=1){g=c;break lb}if(z[v|0]){break jb}if(!Ya){break fa}g=0;k=ka(v,ha);if((k|0)==(c|0)){break lb}y[e+332>>2]=b;y[e+328>>2]=d;y[e+224>>2]=F;y[e+220>>2]=m;g=y[e+332>>2];y[e+72>>2]=y[e+328>>2];y[e+76>>2]=g;g=y[e+224>>2];y[e+64>>2]=y[e+220>>2];y[e+68>>2]=g;Ca(e+72|0,e- -64|0);c=c^k;break kb}y[e+212>>2]=0;break ib}mb:{nb:{ob:{if(u>>>0<=1){J=0;r=0;k=(u|0)!=1;if(!k){if(!F){break fa}r=z[m|0]}h=r>>>1&120;while(1){if((J|0)!=(N|0)){if(!k){c=J+1|0;if(c>>>0>=F>>>0){break fa}r=z[c+m|0]|r<<8}c=7;s=0;while(1){if((c|0)>=0){if(z[v|0]){break jb}if(h>>>0>=R>>>0){break fa}i=h<<1;j=ka(v,i+Q|0);h=j|(r>>>c+1&8|i&7670);s=j<>>0>=R>>>0){break fa}i=h<<1;j=ka(v,i+Q|0);h=j|(k>>>8-c&8|i&7670);s=j<<7-c|s;c=c+1|0;continue}}if(!h|!F|(b>>>0>>0|N>>>0>F-1>>>0)|N>>>0>h-1>>>0){break fa}r=z[m|0];J=z[i|0]<<4;h=r>>>1&120|J&3584;H=d+N|0;k=m;j=d;while(1){pb:{K=J<<8;if((j|0)==(H|0)){break pb}k=k+1|0;r=z[k|0]|r<<8;i=i+1|0;J=K|z[i|0]<<4;c=7;s=0;while(1){if((c|0)>=0){if(z[v|0]){break jb}if(h>>>0>=R>>>0){break fa}h=h<<1;K=ka(v,h+Q|0);h=K|(r>>>c+1&8|(J>>>c&512|h&7670));s=K<>>0>=R>>>0){break fa}k=h<<1;i=ka(v,k+Q|0);c=7-s|0;G=i<>>8-s&8|(K>>>c&512|k&7670));s=s+1|0;continue}}if(b>>>0<=N>>>0){break fa}w[d+N|0]=s;break mb}if(b>>>0<=N>>>0){break fa}w[H|0]=G}c=g}u=u+1|0;h=F;i=m;continue}}C=ua(V,U);y[e+212>>2]=C;qb:{rb:{c=y[C+16>>2];if(!c){break rb}h=y[C+12>>2];while(1){if((c|0)>0){w[h|0]=0;c=c-1|0;h=h+1|0;continue}break}i=0;g=0;d=0;b=0;c=0;S=0;while(1){sb:{tb:{if(B[U>>2]>S>>>0){ja(e+404|0,C,S);u=y[e+408>>2];j=y[e+404>>2];if(z[D+1|0]!=1){k=c;break tb}if(z[v|0]){break rb}if(!Ya){break fa}k=0;h=ka(v,ha);if((h|0)==(c|0)){break tb}y[e+332>>2]=u;y[e+328>>2]=j;y[e+224>>2]=b;y[e+220>>2]=d;g=y[e+332>>2];y[e+88>>2]=y[e+328>>2];y[e+92>>2]=g;g=y[e+224>>2];y[e+80>>2]=y[e+220>>2];y[e+84>>2]=g;c=c^h;Ca(e+88|0,e+80|0);break sb}y[e+212>>2]=0;break qb}G=0;_=0;m=0;if(z[D+2|0]==1){ja(e+404|0,y[D+12>>2],S);_=y[e+408>>2];m=y[e+404>>2]}ja(e+404|0,C,w[D+17|0]+S|0);K=y[e+408>>2];P=y[e+404>>2];h=y[C+20>>2];G=!g|(h|0)<3?G:z[i|0]>>>5&1;G=!g|(h|0)<2?G:z[i|0]>>>5&2|G;G=!g|(h|0)<=0?G:z[i|0]>>>5&4|G;r=0;r=!b|(h|0)<3?r:z[d|0]>>>5&1;r=!b|(h|0)<2?r:z[d|0]>>>5&2|r;r=!b|(h|0)<=0?r:z[d|0]>>>5&4|r;J=0;c=0;while(1){if(B[V>>2]<=c>>>0){c=k;break sb}ub:{vb:{if(z[D+2|0]==1){if(ia(y[y[D+12>>2]+20>>2],c,m,_)){break vb}}if(z[v|0]){break rb}h=r<<4|G<<9|ia(h,w[D+16|0]+c|0,P,K)<<3|J;if(h>>>0>=R>>>0){break fa}F=ka(v,Q+(h<<1)|0);h=y[C+20>>2];if(!F){break vb}Ea(h,c,j,u,1);h=y[C+20>>2];H=1;break ub}H=0}F=c+3|0;G=ia(h,F,i,g)|G<<1&14;r=ia(h,F,d,b)|r<<1&30;c=c+1|0;J=J<<1&6|H;continue}}S=S+1|0;i=d;g=b;d=j;b=u;continue}}C=0}break va}C=0}break va}C=ua(V,U);y[e+212>>2]=C;wb:{xb:{c=y[C+16>>2];if(!c){break xb}h=y[C+12>>2];while(1){if((c|0)>0){w[h|0]=0;c=c-1|0;h=h+1|0;continue}break}j=0;g=0;b=0;d=0;c=0;S=0;while(1){yb:{zb:{if(B[U>>2]>S>>>0){ja(e+404|0,C,S);u=y[e+408>>2];m=y[e+404>>2];if(z[D+1|0]!=1){i=c;break zb}if(z[v|0]){break xb}if(!Xa){break fa}i=0;k=ka(v,da);if((k|0)==(c|0)){break zb}y[e+332>>2]=u;y[e+328>>2]=m;y[e+224>>2]=d;y[e+220>>2]=b;g=y[e+332>>2];y[e+56>>2]=y[e+328>>2];y[e+60>>2]=g;g=y[e+224>>2];y[e+48>>2]=y[e+220>>2];y[e+52>>2]=g;c=c^k;Ca(e+56|0,e+48|0);break yb}y[e+212>>2]=0;break wb}r=0;k=0;_=0;if(z[D+2|0]==1){ja(e+404|0,y[D+12>>2],S);_=y[e+408>>2];k=y[e+404>>2]}c=e+404|0;ja(c,C,w[D+17|0]+S|0);X=y[e+408>>2];$=y[e+404>>2];ja(c,C,w[D+19|0]+S|0);s=y[e+408>>2];N=y[e+404>>2];ja(c,C,w[D+21|0]+S|0);W=y[e+408>>2];H=y[e+404>>2];ja(c,C,w[D+23|0]+S|0);K=y[e+408>>2];P=y[e+404>>2];h=y[C+20>>2];r=!g|(h|0)<2?r:z[j|0]>>>6&1;r=!g|(h|0)<=0?r:z[j|0]>>>6&2|r;G=0;G=!d|(h|0)<3?G:z[b|0]>>>5&1;G=!d|(h|0)<2?G:z[b|0]>>>5&2|G;G=!d|(h|0)<=0?G:z[b|0]>>>5&4|G;J=0;c=0;while(1){if(B[V>>2]<=c>>>0){c=i;break yb}Ab:{Bb:{if(z[D+2|0]==1){if(ia(y[y[D+12>>2]+20>>2],c,k,_)){break Bb}}if(z[v|0]){break xb}h=G<<5|r<<12|ia(h,w[D+16|0]+c|0,$,X)<<4|ia(h,w[D+18|0]+c|0,N,s)<<10|ia(h,w[D+20|0]+c|0,H,W)<<11|ia(h,w[D+22|0]+c|0,P,K)<<15|J;if(h>>>0>=R>>>0){break fa}F=ka(v,Q+(h<<1)|0);h=y[C+20>>2];if(!F){break Bb}Ea(h,c,m,u,1);h=y[C+20>>2];F=1;break Ab}F=0}r=ia(h,c+2|0,j,g)|r<<1&6;G=ia(h,c+3|0,b,d)|G<<1&30;c=c+1|0;J=J<<1&14|F;continue}}S=S+1|0;j=b;g=d;b=m;d=u;continue}}C=0}break va}C=0}la(e+212|0);y[e+404>>2]=0;oa(e+388|0,C);la(e+404|0);b=y[e+388>>2];ta(e+376|0);if(b){break ua}break ta}c=y[Ia>>2];y[e+388>>2]=0;oa((I<<2)+c|0,b)}I=I+1|0;continue}}break ta}y[e+412>>2]=0;y[e+404>>2]=0;y[e+408>>2]=0;xd(e+404|0,b+y[l+4>>2]|0);k=y[e+404>>2];I=0;b=0;s=0;Cb:{while(1){if(y[l+8>>2]+y[l+4>>2]>>>0>b>>>0){Aa(M,v,e+212|0);g=y[e+212>>2];c=g+b|0;if(!(c>>>0<=y[l+8>>2]+y[l+4>>2]>>>0&c>>>0>=g>>>0)){b=0;break Cb}y[e+328>>2]=k;y[e+332>>2]=0;d=oc(e+328|0,b);wd(e+220|0,y[d>>2],y[d+4>>2],g,I);s=(I&1?g:0)+s|0;I=I^1;b=c;continue}break}b=0;if(B[l+12>>2]>>0){break Cb}b=nc();i=y[Ia>>2];c=0;I=0;while(1){d=y[l+4>>2];if(d+y[l+8>>2]>>>0<=c>>>0){break Cb}if(!(!(y[k+(c>>>3&536870908)>>2]>>>c&1)|B[l+12>>2]<=I>>>0)){Db:{if(c>>>0>>0){d=y[y[ga>>2]+(c<<2)>>2];if(!d){d=0;break Db}d=mc(d);break Db}g=i+(c-d<<2)|0;d=y[g>>2];y[g>>2]=0}ud(b,d);I=I+1|0}c=c+1|0;continue}}lc(e+404|0);break sa}la(e+388|0);b=0}Za(Ia);rc(Qa);Ba(e+392|0);Ba(e+396|0);Ba(e+400|0);Ba(e+428|0);y[e+232>>2]=0;Ib(n+56|0,b);Va(e+232|0);if(y[n+56>>2]){sa(y[a+4>>2]);d=y[a+4>>2];b=y[d+8>>2];if(b>>>0<=4294967293){c=b+2|0;b=y[d+4>>2];y[d+8>>2]=b>>>0>c>>>0?c:b}ta(e+344|0);break $}ta(e+344|0);break Z}la(e+388|0);continue}}c=y[e+172>>2];b=y[e+176>>2];M=y[a+4>>2];X=td(M);y[e+428>>2]=X;$=cb(e+416|0,y[l+8>>2]);y[e+412>>2]=0;y[e+404>>2]=0;y[e+408>>2]=0;if(!z[l+1|0]){Rb(e+404|0,y[l+8>>2])}N=c;i=b-c>>1;y[e+400>>2]=0;y[e+396>>2]=0;g=0;q=0;Eb:{while(1){if(B[l+8>>2]>q>>>0){if(ya(X,y[l+28>>2],e+212|0)){break ba}g=y[e+212>>2]+g|0;y[e+400>>2]=g;if(g>>>0>65535){break ba}I=0;y[e+392>>2]=0;k=0;c=q;while(1){Fb:{b=ya(X,y[l+32>>2],e+388|0);y[e+384>>2]=b;Gb:{switch(b|0){case 0:break Gb;case 1:break Fb;default:break ca}}if(B[l+8>>2]<=c>>>0){break ca}I=y[e+388>>2]+I|0;if(I>>>0>65535){break ca}k=k+I|0;Hb:{if(!I|!g){break Hb}if(z[l+1|0]==1){if(ya(X,y[l+40>>2],e+380|0)){break ca}oa(e+396|0,0);d=y[e+380>>2];Ib:{if(d>>>0>=2){H=xa(6);y[e+376>>2]=H;K=xa(8);y[e+372>>2]=K;P=xa(11);y[e+368>>2]=P;ea=xa(15);y[e+364>>2]=ea;F=xa(15);y[e+360>>2]=F;u=xa(15);y[e+356>>2]=u;m=xa(15);y[e+352>>2]=m;j=xa(1);y[e+348>>2]=j;L=Qb();y[e+344>>2]=L;b=z[l|0];y[L+20>>2]=1;y[L+16>>2]=d;y[L+12>>2]=g;y[L+8>>2]=I;w[L+1|0]=1;w[L|0]=b;b=y[l+4>>2];h=b+c|0;y[L+24>>2]=h;d=ib(b+y[l+8>>2]|0);y[e+336>>2]=0;y[e+328>>2]=0;y[e+332>>2]=0;b=e+328|0;y[e+232>>2]=b;if(h){d=d>>>0<=1?1:d;Kd(b,h);b=y[e+332>>2];h=h+b|0;while(1){if((b|0)!=(h|0)){w[b|0]=d;b=b+1|0;continue}break}y[e+332>>2]=h}w[e+236|0]=1;d=e+232|0;gc(d);b=y[e+328>>2];b=tc(d,b,y[e+332>>2]-b|0);Id(L+28|0,b);Oa(b);s=Kb(d,y[L+24>>2]);b=y[l+4>>2];d=y[l+16>>2];if(b>>>0>y[l+20>>2]-d>>2>>>0){break ea}W=y[s>>2];zd(d,b,W,y[e+236>>2]-W>>2);h=y[$>>2];b=0;while(1)if((b|0)==(c|0)){$a(L+124|0,s);x[L+4>>1]=0;y[L+136>>2]=0;y[L+140>>2]=1;w[L+3|0]=0;y[L+172>>2]=j;y[L+168>>2]=m;y[L+164>>2]=u;y[L+160>>2]=F;y[L+156>>2]=ea;y[L+152>>2]=P;y[L+148>>2]=K;y[L+144>>2]=H;w[L+2|0]=z[l+2|0];w[L+176|0]=z[l+52|0];w[L+177|0]=z[l+53|0];w[L+178|0]=z[l+54|0];w[L+179|0]=z[l+55|0];b=Gd(L,M,N,i);y[e+228>>2]=0;oa(e+396|0,b);la(e+228|0);b=y[e+396>>2];va(s);va(e+328|0);qc(e+344|0);pa(e+348|0);pa(e+352|0);pa(e+356|0);pa(e+360|0);pa(e+364|0);pa(e+368|0);pa(e+372|0);pa(e+376|0);if(b){break Ib}break ca}else{d=b<<2;y[(d+W|0)+(y[l+4>>2]<<2)>>2]=y[d+h>>2];b=b+1|0;continue}}if((d|0)!=1){h=y[$>>2];b=y[e+396>>2];break Ib}d=y[l+4>>2];b=y[l+8>>2];y[e+232>>2]=0;b=ib(b+d|0);if(Fa(M,b>>>0<=1?1:b,e+232|0)){break ca}d=y[e+232>>2];b=y[l+4>>2];if(d>>>0>=b+c>>>0){break ca}h=y[$>>2];if(b>>>0>d>>>0){b=y[ga>>2]+(d<<2)|0}else{b=d-b|0;if(b>>>0>=y[$+4>>2]-h>>2>>>0){break ea}b=(b<<2)+h|0}d=y[b>>2];if(!d){break ca}j=xa(15);y[e+328>>2]=j;b=xa(1);y[e+376>>2]=b;Jb:{Kb:{if(ya(X,j,e+372|0)){break Kb}if(ya(X,j,e+368|0)){break Kb}if(!ya(X,b,e+384|0)){break Jb}}y[e+392>>2]=k;pa(e+376|0);pa(e+328|0);break ba}sa(M);m=y[M+8>>2];j=kb();y[e+364>>2]=j;y[j+8>>2]=g;y[j+4>>2]=I;b=z[l+2|0];y[j+20>>2]=d;w[j|0]=b;y[j+12>>2]=y[e+372>>2];b=y[e+368>>2];d=0;w[j+1|0]=0;y[j+16>>2]=b;w[j+24|0]=z[l+52|0];w[j+25|0]=z[l+53|0];w[j+26|0]=z[l+54|0];w[j+27|0]=z[l+55|0];b=Na(M);y[e+360>>2]=b;b=jb(j,b,N,i);y[e+356>>2]=0;oa(e+396|0,b);la(e+356|0);b=y[e+396>>2];if(b){sa(M);d=y[M+8>>2];if(d>>>0<=4294967293){j=d+2|0;d=y[M+4>>2];d=d>>>0>j>>>0?j:d;y[M+8>>2]=d}d=y[e+384>>2]==(d-m|0)}ta(e+360|0);Ua(e+364|0);pa(e+376|0);pa(e+328|0);if(!d){break ca}}y[e+396>>2]=0;oa((c<<2)+h|0,b);if(z[l+1|0]){break Hb}}y[y[e+404>>2]+(c<<2)>>2]=I}c=c+1|0;continue}break}y[e+392>>2]=k;if(!z[l+1|0]){if(ya(X,y[l+36>>2],e+232|0)){break ba}sa(M);y[e+328>>2]=0;Lb:{if(!y[e+232>>2]){if((k|0)>65535){break Eb}j=k+7>>>3|0;b=ze(j,0,g,0);if(Z){break Eb}k=y[M+4>>2];d=y[M+8>>2];if(k>>>0>>0){break fa}if(b>>>0>k-d>>>0){break Eb}I=0;b=ua(e+392|0,e+400|0);y[e+388>>2]=0;oa(e+328|0,b);la(e+388|0);s=y[e+328>>2];while(1){if((g|0)==(I|0)){break Lb}ja(e+220|0,s,I);d=y[M+8>>2];b=y[M+4>>2];if(d>>>0>b>>>0|j>>>0>b-d>>>0|j>>>0>B[e+224>>2]){break fa}if(j){if(j){p(y[e+220>>2],y[M>>2]+d|0,j)}d=y[M+8>>2]}b=d;d=d+j|0;if(b>>>0<=d>>>0){b=y[M+4>>2];y[M+8>>2]=b>>>0>d>>>0?d:b}I=I+1|0;continue}}b=lb();y[e+388>>2]=b;y[b+8>>2]=g;y[b+4>>2]=k;w[b|0]=1;db(b,e+328|0,M);sa(M);ta(e+388|0);s=y[e+328>>2]}Mb:{if(!s){break Mb}u=c>>>0>>0?q:c;m=y[$>>2];b=0;h=y[e+404>>2];while(1){if((q|0)==(u|0)){break Mb}j=q<<2;k=j+h|0;d=nb(s,b,0,y[k>>2],g);y[e+388>>2]=0;oa(j+m|0,d);q=q+1|0;la(e+388|0);b=y[k>>2]+b|0;continue}}la(e+328|0)}q=c;continue}break}i=xa(1);y[e+392>>2]=i;y[e+240>>2]=0;y[e+232>>2]=0;y[e+236>>2]=0;xd(e+232|0,y[l+8>>2]+y[l+4>>2]|0);k=y[e+232>>2];c=0;b=0;h=0;while(1){if(y[l+8>>2]+y[l+4>>2]>>>0>b>>>0){Nb:{Ob:{if(ya(X,i,e+388|0)){break Ob}j=y[e+388>>2];d=j+b|0;if(d>>>0>>0){break Ob}if(d>>>0<=y[l+8>>2]+y[l+4>>2]>>>0){break Nb}}b=0;break da}y[e+328>>2]=k;y[e+332>>2]=0;g=oc(e+328|0,b);wd(e+212|0,y[g>>2],y[g+4>>2],j,c);h=(c&1?j:0)+h|0;c=c^1;b=d;continue}break}b=0;if(B[l+12>>2]>>0){break da}b=nc();i=y[$>>2];c=0;I=0;while(1){d=y[l+4>>2];if(d+y[l+8>>2]>>>0<=c>>>0){break da}if(!(!(y[k+(c>>>3&536870908)>>2]>>>c&1)|B[l+12>>2]<=I>>>0)){Pb:{if(c>>>0>>0){d=y[y[ga>>2]+(c<<2)>>2];if(!d){d=0;break Pb}d=mc(d);break Pb}g=i+(c-d<<2)|0;d=y[g>>2];y[g>>2]=0}ud(b,d);I=I+1|0}c=c+1|0;continue}}la(e+328|0);break ba}o()}y[e+392>>2]=k;o()}lc(e+232|0);pa(e+392|0);break aa}y[e+392>>2]=k}b=0}la(e+396|0);va(e+404|0);Za($);Ua(e+428|0);y[e+232>>2]=0;Ib(n+56|0,b);Va(e+232|0);if(!y[n+56>>2]){break Z}sa(y[a+4>>2])}if(z[a+48|0]!=1){break _}tb=e,ub=Dd(y[n+56>>2]),y[tb+232>>2]=ub;b=y[a+108>>2];c=y[b+8>>2];while(1){if(c>>>0>=2){i=y[b>>2];g=y[i>>2];d=y[i+4>>2];y[g+4>>2]=d;y[d>>2]=g;y[b+8>>2]=y[b+8>>2]-1;pc(i);c=c-1|0;b=y[a+108>>2];continue}break}c=b;b=e+232|0;Cd(c,e+152|0,b);Va(b)}c=0;if(!(z[e+211|0]&2)){break Y}if(!(hb&1)){g=y[n+56>>2];y[e+140>>2]=y[e+184>>2];d=y[e+188>>2];b=y[e+192>>2];y[e+188>>2]=0;y[e+192>>2]=0;y[e+144>>2]=d;y[e+148>>2]=b;y[e+184>>2]=0;b=e+140|0;_a(g,b);Ha(b)}if(!(O&1)){break Y}g=y[n+56>>2];y[e+128>>2]=y[e+172>>2];d=y[e+176>>2];b=y[e+180>>2];y[e+176>>2]=0;y[e+180>>2]=0;y[e+132>>2]=d;y[e+136>>2]=b;y[e+172>>2]=0;b=e+128|0;_a(g+12|0,b);Ha(b);break Y}c=1}Ha(e+172|0);Ha(e+184|0)}va(gb);break U}else{c=Ka(a,y[y[n+12>>2]+(b<<2)>>2]);if(!(z[c+4|0]&63)){j=0;i=0;if(I&1){d=y[c+56>>2];g=y[d+28>>2]-y[d+24>>2]>>2;d=g+h|0;i=d;d=d>>>0>=g>>>0;i=d?i:0}else{d=j}I=d;q=c;h=i}b=b+1|0;continue}}d=b<<2;b=b+1|0;if(Ka(a,y[d+y[n+12>>2]>>2])){continue}break}}va(ga);ma(l)}Y=e+432|0;b=c;break u;case 1:case 2:case 3:case 5:break B;case 4:case 6:case 7:break T;default:break G}}b=1;if(z[a+49|0]!=1){break u}if(ob(a,f+120|0)){break u}i=f+142|0;if(Sa(y[a+4>>2],i)){break u}c=y[f+120>>2];if(c-1>>>0>65534){break u}u=y[f+124>>2];if(u-1>>>0>65534){break u}h=Qb();y[f+116>>2]=h;y[h+12>>2]=u;y[h+8>>2]=c;k=A[f+142>>1];g=k&1;w[h|0]=g;w[h+2|0]=k>>>15;y[h+140>>2]=k>>>4&3;y[h+136>>2]=k>>>7&3;w[h+3|0]=k>>>6&1;w[h+4|0]=k>>>9&1;y[h+20>>2]=1<<(k>>>2&3);d=(k&254)>>>1&1;w[h+1|0]=d;c=k>>>10&31;w[h+5|0]=(c>>>0>15?-32:0)|c;Qb:{if(g){if(Sa(y[a+4>>2],i)){break v}if(z[h+1|0]!=1){break w}if(!z[h+2|0]){break Qb}break w}if(!d|k<<16>>16<0){break w}}g=h+176|0;c=0;while(1){if((c|0)==4){break w}d=c+g|0;c=c+1|0;if(!wa(y[a+4>>2],d)){continue}break}break v}h=na(12);y[h+8>>2]=0;y[h>>2]=0;y[h+4>>2]=0;if(wa(y[a+4>>2],f+292|0)){break y}b=1;if(wa(y[a+4>>2],h+1|0)){break x}if(wa(y[a+4>>2],h+2|0)){break x}if(qa(y[a+4>>2],h+4|0)){break x}j=y[h+4>>2];if(j>>>0>65535){break x}c=z[f+292|0];b=c&1;w[h|0]=b;k=c>>>1&3;w[h+8|0]=k;y[n+52>>2]=3;if(b){b=y[a+4>>2];c=xc(h);y[f+160>>2]=c;if(c){y[f+8>>2]=0;db(c,f+8|0,b);Rb:{i=y[f+8>>2];if(!i){break Rb}g=wc(j+1|0);b=0;while(1){if(b>>>0>j>>>0){break Rb}c=z[h+1|0];d=nb(i,E(c,b),0,c,z[h+2|0]);c=y[g+4>>2];y[f+256>>2]=0;oa((b<<2)+c|0,d);b=b+1|0;la(f+256|0);continue}}la(f+8|0)}ta(f+160|0);y[f+8>>2]=0;Pb(n+60|0,g);Sb(f+8|0);if(!y[n+60>>2]){break y}sa(y[a+4>>2]);b=0;break x}mb(f+8|0,k?(k|0)==1?8192:1024:65536);d=Na(y[a+4>>2]);y[f+104>>2]=d;b=y[f+8>>2];c=y[f+12>>2];m=xc(h);y[f+256>>2]=m;if(!m){break z}w[m+1|0]=0;w[m+2|0]=0;w[m+3|0]=k;i=z[h+1|0];w[m+17|0]=0;w[m+16|0]=0-i;if(!k){x[m+22>>1]=65278;x[m+18>>1]=65533;x[m+20>>1]=65026}y[f+120>>2]=0;y[f+176>>2]=0;y[f+168>>2]=b;y[f+172>>2]=c;y[f+164>>2]=d;y[f+160>>2]=f+120;b=Ob(m,f+160|0);y[f+176>>2]=0;while(1){if((b|0)==3){b=Nb(m,f+160|0);continue}break}y[m+44>>2]=0;y[m+48>>2]=0;y[m+36>>2]=0;y[m+40>>2]=0;y[m+28>>2]=0;y[m+32>>2]=0;if(!y[f+120>>2]){break A}g=wc(j+1|0);b=0;while(1){if(b>>>0>j>>>0){break A}d=nb(y[f+120>>2],E(b,i),0,i,z[h+2|0]);c=y[g+4>>2];y[f+148>>2]=0;oa((b<<2)+c|0,d);b=b+1|0;la(f+148|0);continue}}b=1;if(z[a+49|0]!=1){break u}O=na(56);y[O+16>>2]=0;Sb:{if(ob(a,f+256|0)){break Sb}if(wa(y[a+4>>2],f+144|0)){break Sb}q=O+32|0;if(qa(y[a+4>>2],q)){break Sb}h=O+36|0;if(qa(y[a+4>>2],h)){break Sb}if(qa(y[a+4>>2],O+40|0)){break Sb}if(qa(y[a+4>>2],O+44|0)){break Sb}if(Sa(y[a+4>>2],O+48|0)){break Sb}if(Sa(y[a+4>>2],O+50|0)){break Sb}H=y[q>>2];if(H-1>>>0>65534){break Sb}K=y[h>>2];if(K-1>>>0>65534){break Sb}k=y[f+256>>2];if(k-1>>>0>65534){break Sb}X=y[f+260>>2];if(X-1>>>0>65534){break Sb}y[O+4>>2]=X;y[O>>2]=k;g=z[f+144|0];ha=g&1;w[O+8|0]=ha;w[O+20|0]=g>>>7;j=g>>>3|0;Xa=j&1;w[O+28|0]=Xa;aa=g>>>1&3;w[O+9|0]=aa;d=g>>>4|0;y[O+24>>2]=(d&7)==4?4:d&3;if(y[n+8>>2]!=1){break Sb}d=Ka(a,y[y[n+12>>2]>>2]);if(!d|(z[d+4|0]&63)!=16){break Sb}d=y[d+60>>2];if(!d){break Sb}da=y[d>>2];if(!da){break Sb}y[O+12>>2]=da;y[O+16>>2]=d+4;b=y[y[d+4>>2]>>2];i=y[b+20>>2];w[O+52|0]=i;d=y[b+24>>2];w[O+53|0]=d;y[n+52>>2]=1;Tb:{Ub:{Vb:{if(g&1){j=y[a+4>>2];b=1;while(1){c=b;b=b+1|0;if(da>>>0>1<>>0){continue}break}x[f+216>>1]=0;y[f+172>>2]=0;y[f+184>>2]=0;y[f+188>>2]=0;y[f+192>>2]=0;y[f+196>>2]=0;y[f+200>>2]=0;y[f+204>>2]=0;y[f+208>>2]=0;y[f+220>>2]=0;y[f+224>>2]=0;y[f+228>>2]=0;y[f+232>>2]=0;y[f+236>>2]=0;y[f+168>>2]=K;y[f+164>>2]=H;w[f+160|0]=ha;d=c&255;i=cb(f+8|0,d);g=y[i>>2];b=(g+(d<<2)|0)-4|0;db(f+160|0,b,j);c=0;Wb:{if(!y[b>>2]){break Wb}sa(j);b=y[j+8>>2];if(b>>>0<=4294967292){c=b+3|0;b=y[j+4>>2];y[j+8>>2]=b>>>0>c>>>0?c:b}b=d-2|0;while(1){if((b|0)>=0){k=g+(b<<2)|0;db(f+160|0,k,j);c=0;if(!y[k>>2]){break Wb}sa(j);c=y[j+8>>2];if(c>>>0<=4294967292){d=c+3|0;c=y[j+4>>2];y[j+8>>2]=c>>>0>d>>>0?d:c}bb(y[k>>2],0,0,0,0,y[k+4>>2],2);b=b-1|0;continue}break}c=vc(O,i)}Za(i);y[f+120>>2]=0;oa(n- -64|0,c);la(f+120|0);if(!y[n+64>>2]){break Tb}sa(y[a+4>>2]);break Vb}mb(f+148|0,aa?(aa|0)==1?8192:1024:65536);Ya=Na(y[a+4>>2]);y[f+300>>2]=Ya;s=y[f+148>>2];rb=y[f+152>>2];g=0;y[f+104>>2]=0;Xb:{if(!(j&1)){break Xb}b=ua(q,h);y[f+160>>2]=0;oa(f+104|0,b);b=d&255;N=1-b|0;Ma=0-(b>>>0>1)|0;b=i&255;W=1-b|0;Pa=0-(b>>>0>1)|0;la(f+160|0);h=X;g=y[f+104>>2];Yb:while(1){if(!c&(m|0)==(K|0)){break Xb}ja(f+160|0,g,m);b=y[O+44>>2];P=A[O+48>>1];d=ze(m,c,P,0);$=b+d|0;b=Z+(b>>31)|0;ea=d>>>0>$>>>0?b+1|0:b;d=y[O+40>>2];I=A[O+50>>1];b=ze(m,c,I,0);F=d+b|0;d=Z+(d>>31)|0;l=b>>>0>F>>>0?d+1|0:d;j=0;i=0;q=y[f+164>>2];u=y[f+160>>2];while(1)if(!i&(j|0)==(H|0)){b=c;d=m+1|0;b=d?b:b+1|0;m=d;c=b;continue Yb}else{qb=y[g+20>>2];b=ze(j,i,I,0);d=$-b|0;M=ea-(Z+(b>>>0>$>>>0)|0)|0;b=M>>8;ca=(M&255)<<24|d>>>8;d=ca;L=(b|0)>=0&d>>>0>=h>>>0|(b|0)>0;M=ze(j,i,P,0);Ta=M+F|0;d=Z+l|0;d=M>>>0>Ta>>>0?d+1|0:d;M=d>>8;d=(d&255)<<24|Ta>>>8;ca=(M|0)<=(Pa|0)&W>>>0>d>>>0|(M|0)<(Pa|0)|((b|0)<=(Ma|0)&N>>>0>ca>>>0|(b|0)<(Ma|0));b=M;if((b|0)>0){b=1}else{b=(b|0)>=0&d>>>0>=k>>>0}Ea(qb,j,u,q,ca|b|L);j=j+1|0;i=j?i:i+1|0;continue}}}b=1;while(1){c=b;b=b+1|0;if(da>>>0>1<>>0){continue}break}y[f+184>>2]=0;y[f+188>>2]=0;x[f+216>>1]=0;y[f+192>>2]=0;y[f+196>>2]=0;y[f+200>>2]=0;y[f+204>>2]=0;y[f+208>>2]=0;y[f+220>>2]=0;y[f+224>>2]=0;y[f+228>>2]=0;y[f+232>>2]=0;y[f+236>>2]=0;y[f+168>>2]=K;y[f+164>>2]=H;w[f+160|0]=ha;y[f+172>>2]=g;w[f+162|0]=Xa;w[f+161|0]=0;w[f+163|0]=aa;Zb:{if(aa>>>0>=2){x[f+176>>1]=65282;break Zb}x[f+176>>1]=65283;if(aa){break Zb}x[f+182>>1]=65278;x[f+178>>1]=65533;x[f+180>>1]=65026}b=c&255;k=cb(f+120|0,b);g=y[k>>2];c=b-1|0;d=c;_b:{$b:{while(1){if((d|0)>=0){y[f+292>>2]=0;y[f+24>>2]=0;y[f+16>>2]=s;y[f+20>>2]=rb;y[f+12>>2]=Ya;y[f+8>>2]=f+292;b=Ob(f+160|0,f+8|0);y[f+24>>2]=0;while(1){if((b|0)==3){b=Nb(f+160|0,f+8|0);continue}break}y[f+204>>2]=0;y[f+208>>2]=0;y[f+196>>2]=0;y[f+200>>2]=0;y[f+188>>2]=0;y[f+192>>2]=0;b=y[f+292>>2];if(!b){break $b}y[f+292>>2]=0;i=g+(d<<2)|0;oa(i,b);if((c|0)>(d|0)){bb(y[i>>2],0,0,0,0,y[i+4>>2],2)}d=d-1|0;la(f+292|0);continue}break}b=vc(O,k);break _b}la(f+292|0);b=0}Za(k);la(f+104|0);y[f+160>>2]=0;oa(n- -64|0,b);la(f+160|0);if(!y[n+64>>2]){break Ub}sa(y[a+4>>2]);d=y[a+4>>2];b=y[d+8>>2];if(b>>>0<=4294967293){c=b+2|0;b=y[d+4>>2];y[d+8>>2]=b>>>0>c>>>0?c:b}ta(f+300|0);Ja(f+148|0)}if((z[n+4|0]&63)==20){b=0;break Sb}ac:{if(z[a+50|0]){break ac}d=y[y[a+24>>2]-4>>2];if(z[d+17|0]!=1){break ac}b=X+y[f+268>>2]|0;c=y[a+32>>2];if((b|0)<=y[c+24>>2]){break ac}ab(c,b,z[d+16|0])}b=y[f+264>>2];c=b;g=b>>31;b=y[f+268>>2];d=b;i=b>>31;b=z[f+272|0];bb(y[a+32>>2],c,g,d,i,y[n+64>>2],(b&7)==4?4:b&3);b=0;oa(n- -64|0,0);break Sb}ta(f+300|0);Ja(f+148|0)}b=1}ma(O);break u}b=1;if(z[a+49|0]!=1){break u}k=a+76|0;c=y[a+76>>2];if(!c){i=lb();y[f+160>>2]=i;bc:{cc:{if(ob(a,a+88|0)){break cc}if(wa(y[a+4>>2],f+8|0)){break cc}d=y[a+92>>2];if((d|0)<0){break cc}c=y[a+88>>2];if((c|0)<0){break cc}y[i+8>>2]=d;y[i+4>>2]=c;g=z[f+8|0];c=g&1;w[i|0]=c;d=g>>>1&3;w[i+3|0]=d;w[i+1|0]=g>>>3&1;if(c){break bc}g=i+16|0;c=0;if(!d){while(1){if((c|0)==8){break bc}d=c+g|0;c=c+1|0;if(!wa(y[a+4>>2],d)){continue}break cc}}while(1){if((c|0)==2){break bc}d=c+g|0;c=c+1|0;if(!wa(y[a+4>>2],d)){continue}break}}ta(f+160|0);break u}w[i+2|0]=0;y[f+160>>2]=0;Ra(k,i);ta(f+160|0);c=y[k>>2]}y[n+52>>2]=1;dc:{if(z[c|0]==1){db(c,n- -64|0,y[a+4>>2]);if(!y[n+64>>2]){Ra(k,0);break M}sa(y[a+4>>2]);break dc}if(y[a+60>>2]==y[a+64>>2]){b=z[c+3|0];fb(a+60|0,b?(b|0)==1?8192:1024:65536)}i=a+72|0;d=y[a+72>>2];if(d){b=d}else{c=Na(y[a+4>>2]);y[f+160>>2]=0;Ra(i,c);ta(f+160|0);b=y[a+72>>2]}y[f+164>>2]=b;g=n- -64|0;y[f+160>>2]=g;b=y[a+64>>2];c=y[a+60>>2];y[f+176>>2]=0;y[f+168>>2]=c;y[f+172>>2]=b-c>>1;b=y[a+76>>2];ec:{if(!d){b=Ob(b,f+160|0);break ec}b=Nb(b,f+160|0)}y[a+56>>2]=b;if((b|0)==3){if((z[n+4|0]&63)==36){break B}fc:{if(z[a+50|0]){break fc}d=y[y[a+24>>2]-4>>2];if(z[d+17|0]!=1){break fc}b=y[a+92>>2]+y[a+100>>2]|0;c=y[a+32>>2];if((b|0)<=y[c+24>>2]){break fc}ab(c,b,z[d+16|0])}c=y[a+76>>2];b=y[c+64>>2]+y[a+96>>2]|0;d=b;j=b>>31;b=y[c+68>>2]+y[a+100>>2]|0;i=b;h=b>>31;b=z[a+104|0];uc(y[a+32>>2],d,j,i,h,y[g>>2],c- -64|0,(b&7)==4?4:b&3);break B}b=y[a+76>>2];y[b+44>>2]=0;y[b+48>>2]=0;y[b+36>>2]=0;y[b+40>>2]=0;y[b+28>>2]=0;y[b+32>>2]=0;Ra(i,0);y[a+64>>2]=y[a+60>>2];if(!y[g>>2]){y[a+56>>2]=-1;Ra(k,0);break M}sa(y[a+4>>2]);d=y[a+4>>2];b=y[d+8>>2];if(b>>>0>4294967293){break dc}c=b+2|0;b=y[d+4>>2];y[d+8>>2]=b>>>0>c>>>0?c:b}if((z[n+4|0]&63)!=36){gc:{if(z[a+50|0]){break gc}d=y[y[a+24>>2]-4>>2];if(z[d+17|0]!=1){break gc}b=y[a+92>>2]+y[a+100>>2]|0;c=y[a+32>>2];if((b|0)<=y[c+24>>2]){break gc}ab(c,b,z[d+16|0])}c=y[a+76>>2];b=y[c+64>>2]+y[a+96>>2]|0;d=b;i=b>>31;b=y[c+68>>2]+y[a+100>>2]|0;g=b;j=b>>31;b=z[a+104|0];uc(y[a+32>>2],d,i,g,j,y[n+64>>2],c- -64|0,(b&7)==4?4:b&3);oa(n- -64|0,0)}b=0;Ra(k,0);break u}b=1;if(z[a+49|0]!=1){break u}if(ob(a,f+160|0)){break u}if(wa(y[a+4>>2],f+292|0)){break u}i=y[f+160>>2];if(i-1>>>0>65534){break u}k=y[f+164>>2];if(k-1>>>0>65534){break u}y[f+256>>2]=0;j=kb();y[f+120>>2]=j;y[j+8>>2]=k;y[j+4>>2]=i;d=z[f+292|0];b=d&1;w[j|0]=b;w[j+1|0]=d>>>1&1;hc:{ic:{if(b){break ic}g=j+24|0;while(1){if((c|0)==4){break ic}b=1;d=c+g|0;c=c+1|0;if(!wa(y[a+4>>2],d)){continue}break}break hc}g=y[n+8>>2];jc:{if((g|0)>0){c=0;b=1;while(1){if((c|0)==(g|0)){break hc}i=Ka(a,y[y[n+12>>2]>>2]);if(!i){break hc}d=z[i+4|0];d=(d<<6|d>>>2)&207;if(!(1<>>0<=10:0)){c=c+1|0;continue}break}b=i- -64|0;break jc}c=nb(y[a+32>>2],y[f+168>>2],y[f+172>>2],i,k);y[f+8>>2]=0;b=f+256|0;oa(b,c);la(f+8|0)}b=y[b>>2];y[j+12>>2]=0;y[j+16>>2]=0;y[j+20>>2]=b;mb(f+8|0,z[j|0]?1024:8192);c=Na(y[a+4>>2]);y[f+148>>2]=c;y[n+52>>2]=1;b=jb(j,c,y[f+8>>2],y[f+12>>2]);y[f+104>>2]=0;g=n- -64|0;oa(g,b);la(f+104|0);b=1;kc:{if(!y[n+64>>2]){break kc}sa(y[a+4>>2]);d=y[a+4>>2];b=y[d+8>>2];if(b>>>0<=4294967293){c=b+2|0;b=y[d+4>>2];y[d+8>>2]=b>>>0>c>>>0?c:b}b=0;if((z[n+4|0]&63)==40){break kc}lc:{if(z[a+50|0]){break lc}d=y[y[a+24>>2]-4>>2];if(z[d+17|0]!=1){break lc}b=k+y[f+172>>2]|0;c=y[a+32>>2];if((b|0)<=y[c+24>>2]){break lc}ab(c,b,z[d+16|0])}b=y[f+168>>2];c=b;i=b>>31;b=y[f+172>>2];d=b;j=b>>31;b=z[f+176|0];bb(y[a+32>>2],c,i,d,j,y[g>>2],(b&7)==4?4:b&3);oa(g,0);b=0}ta(f+148|0);Ja(f+8|0)}Ua(f+120|0);la(f+256|0);break u}j=na(20);y[j+16>>2]=0;y[j+8>>2]=0;y[j+12>>2]=0;y[j>>2]=0;y[j+4>>2]=0;y[f+160>>2]=j;mc:{if(qa(y[a+4>>2],j)){break mc}if(qa(y[a+4>>2],j+4|0)){break mc}if(qa(y[a+4>>2],j+8|0)){break mc}if(qa(y[a+4>>2],j+12|0)){break mc}if(wa(y[a+4>>2],f+148|0)){break mc}if(Sa(y[a+4>>2],f+120|0)){break mc}w[j+16|0]=z[f+148|0]>>>2&1;d=A[f+120>>1];b=d&32767;x[j+18>>1]=b;w[j+17|0]=d>>>15;c=y[j+4>>2];nc:{oc:{if((c|0)==-1){if(d<<16>>16>=0){w[j+17|0]=1}if(z[a+50|0]){break nc}c=b;break oc}if(z[a+50|0]){break nc}}y[f+8>>2]=c;b=ua(j,f+8|0);y[f+256>>2]=0;oa(a+32|0,b);la(f+256|0)}c=y[a+32>>2];b=y[c+16>>2];if(b){break L}y[a+56>>2]=-1}Ub(f+160|0)}b=1;break u}Mb(y[c+12>>2],b,z[j+16|0]);b=y[a+24>>2];c=y[a+28>>2];pc:{if(b>>>0>>0){y[f+160>>2]=0;y[b>>2]=j;b=b+4|0;break pc}d=y[a+20>>2];b=b-d|0;k=b>>2;i=k+1|0;if(i>>>0>=1073741824){break F}g=c-d|0;c=g>>1;i=g>>>0>=2147483644?1073741823:c>>>0>i>>>0?c:i;qc:{if(!i){g=b;h=0;break qc}if(i>>>0>=1073741824){break E}h=na(i<<2);d=y[a+20>>2];g=y[a+24>>2]-d|0;k=g>>2}y[f+160>>2]=0;b=b+h|0;y[b>>2]=j;c=b-(k<<2)|0;if(g){p(c,d,g)}y[a+28>>2]=(i<<2)+h;b=b+4|0;y[a+24>>2]=b;y[a+20>>2]=c;if(!d){break pc}ma(d)}w[a+49|0]=1;y[a+24>>2]=b;Ub(f+160|0);break B}w[a+49|0]=0;break u}c=y[a+4>>2];b=y[c+8>>2];d=b+y[n+28>>2]|0;if(b>>>0>d>>>0){break B}b=y[c+4>>2];y[c+8>>2]=b>>>0>d>>>0?d:b;break B}c=y[a+4>>2];b=y[c+8>>2];d=b+y[n+28>>2]|0;if(b>>>0>d>>>0){break B}b=y[c+4>>2];y[c+8>>2]=b>>>0>d>>>0?d:b;break B}y[n+52>>2]=4;k=n+68|0;pb(k,0);m=y[a+4>>2];q=na(96);x[q>>1]=0;t(q+4|0,0,92);if((wa(m,f+120|0)|0)==-1){break D}b=1;d=z[f+120|0];w[q+1|0]=d&1;rc:{sc:{if((qa(m,f+8|0)|0)==-1){break sc}if((qa(m,f+256|0)|0)==-1){break sc}c=y[f+8>>2];j=y[f+256>>2];if((c|0)>(j|0)){break sc}i=(d>>>4&7)+1|0;h=(d>>>1&7)+1|0;Lb(q,0);y[f+164>>2]=c;w[f+160|0]=1;b=c;while(1){if((Fa(m,h,y[q+8>>2]+(y[q+4>>2]<<3)|0)|0)==-1){break rc}if((Fa(m,i,y[q+20>>2]+(y[q+4>>2]<<2)|0)|0)==-1){break rc}g=y[q+20>>2];d=y[q+4>>2]<<2;if(B[g+d>>2]>63){break rc}y[d+y[q+32>>2]>>2]=b;b=y[g+(y[q+4>>2]<<2)>>2];if((b|0)>31){break rc}if(z[La(f+160|0,1<>2];if((j|0)>(b|0)){continue}break}if((Fa(m,h,y[q+8>>2]+(y[q+4>>2]<<3)|0)|0)==-1){break rc}y[y[q+20>>2]+(y[q+4>>2]<<2)>>2]=32;if((c|0)==-2147483648){break rc}y[y[q+32>>2]+(y[q+4>>2]<<2)>>2]=c-1;Lb(q,1);if((Fa(m,h,y[q+8>>2]+(y[q+4>>2]<<3)|0)|0)==-1){break rc}y[y[q+20>>2]+(y[q+4>>2]<<2)>>2]=32;y[y[q+32>>2]+(y[q+4>>2]<<2)>>2]=j;Lb(q,1);if(z[q+1|0]==1){if((Fa(m,h,y[q+8>>2]+(y[q+4>>2]<<3)|0)|0)==-1){break rc}y[q+4>>2]=y[q+4>>2]+1}c=Ld(q);w[q|0]=c;y[f+160>>2]=q;b=1;if(!c){break C}b=0;y[f+160>>2]=0;pb(k,q);sa(y[a+4>>2]);break C}w[q|0]=0;y[f+160>>2]=q;break C}break D}if((d|0)!=62){break B}c=y[a+4>>2];b=y[c+8>>2];d=b+y[n+28>>2]|0;if(b>>>0>d>>>0){break B}b=y[c+4>>2];y[c+8>>2]=b>>>0>d>>>0?d:b;break B}za();o()}Wa();o()}w[q|0]=0;y[f+160>>2]=q;b=1}pa(f+160|0);break u}b=0;break u}la(f+120|0)}ta(f+256|0);y[f+160>>2]=0;Pb(n+60|0,g);Sb(f+160|0);if(y[n+60>>2]){sa(y[a+4>>2]);d=y[a+4>>2];b=y[d+8>>2];if(b>>>0<=4294967293){c=b+2|0;b=y[d+4>>2];y[d+8>>2]=b>>>0>c>>>0?c:b}ta(f+104|0);Ja(f+8|0);b=0;break x}ta(f+104|0);Ja(f+8|0)}b=1}ma(h);break u}if(qa(y[a+4>>2],h+16|0)){break v}c=y[a+4>>2];d=y[c>>2];c=y[c+4>>2];if((c|0)<0){break t}d=((c&134217727)<<5|d>>>27)&-32;c=c>>>27&15;if(!c&d>>>0>=2147483648|c){break t}if(!c&B[h+16>>2]>d>>>0){break v}k=0;b=y[n+8>>2];g=(b|0)>0?b:0;c=0;while(1){if((c|0)==(g|0)){d=1;b=0;while(1)if((b|0)==(g|0)){if(!(d&1)){break t}y[h+24>>2]=k;F=Kb(f+104|0,k);q=y[F>>2];tc:{if((q|0)==y[F+4>>2]){break tc}b=y[n+8>>2];m=(b|0)>0?b:0;d=1;k=0;g=0;while(1){if((g|0)==(m|0)){break tc}uc:{b=Ka(a,y[y[n+12>>2]+(g<<2)>>2]);if(z[b+4|0]&63){break uc}b=y[b+56>>2];i=y[b+24>>2];l=y[b+28>>2]-i>>2;b=0;while(1){if((b|0)==(l|0)){j=0;i=0;if(d&1){b=k+l|0;c=b>>>0>=l>>>0;j=c;i=c?b:0}k=i;d=j;break uc}c=b+k|0;if(!(c>>>0>=b>>>0&d)){break t}y[q+(c<<2)>>2]=y[i+(b<<2)>>2];b=b+1|0;continue}}g=g+1|0;continue}}$a(h+124|0,F);vc:{wc:{if(z[h|0]==1){q=y[h+24>>2];b=0;xc:{yc:{while(1){if((b|0)==35){break yc}if(!Fa(y[a+4>>2],4,f+160|0)){w[(f+256|0)+b|0]=y[f+160>>2];b=b+1|0;continue}break}x[f+8>>1]=0;t(f+12|0,0,92);break xc}m=tc(f+160|0,f+256|0,35);if(!z[m|0]){x[f+8>>1]=0;t(f+12|0,0,92);Oa(m);break xc}y[f+300>>2]=y[a+4>>2];d=0;y[f+156>>2]=0;y[f+148>>2]=0;y[f+152>>2]=0;b=f+148|0;y[f+292>>2]=b;if(q){Kd(b,q);b=y[f+152>>2];c=q+b|0;while(1){if((b|0)!=(c|0)){w[b|0]=0;b=b+1|0;continue}break}y[f+152>>2]=c}w[f+296|0]=1;gc(f+292|0);k=0;zc:while(1){Ac:{Bc:{if((d|0)<(q|0)){if(ya(f+300|0,m,f+292|0)){break Bc}g=y[f+292>>2];if((g|0)<=31){w[y[f+148>>2]+d|0]=g;k=0;break Ac}Cc:{Dc:{switch(g-32|0){case 0:if(Fa(y[a+4>>2],2,f+144|0)){break Bc}k=y[f+144>>2]+3|0;break Cc;case 1:if(Fa(y[a+4>>2],3,f+144|0)){break Bc}k=y[f+144>>2]+3|0;break Cc;case 2:break Dc;default:break Cc}}if(Fa(y[a+4>>2],7,f+144|0)){break Bc}k=y[f+144>>2]+11|0}if((k|0)<=0){break Ac}c=d+k|0;if((c|0)>(q|0)){break Bc}b=0;j=(g|0)==32&(d|0)>0;while(1)if((b|0)==(k|0)){d=c;continue zc}else{i=y[f+148>>2]+d|0;w[i+b|0]=j?z[i-1|0]:0;b=b+1|0;continue}}b=y[f+148>>2];c=tc(f+8|0,b,y[f+152>>2]-b|0);b=z[c|0];va(f+148|0);Oa(m);if(!b){break xc}sa(y[a+4>>2]);Id(h+28|0,c);Oa(c);b=1;c=0;if(z[h|0]!=1){break wc}q=A[f+142>>1];m=q>>>12&3;if((m|0)==2){break vc}j=q>>>10&3;if((j|0)==2){break vc}k=q>>>8&3;if((k|0)==2){break vc}d=q&3;if((d|0)==2){break vc}i=q>>>6&3;if((i|0)==2){break vc}Ec:{Fc:{switch(d|0){case 0:g=ra(a,6);d=0;break Ec;case 1:g=ra(a,7);d=0;break Ec;default:break Fc}}d=Ga(a,n,0);if(!d){break vc}g=y[d+68>>2];d=1}y[h+144>>2]=g;Gc:{Hc:{switch((q>>>2&3)-1|0){default:g=ra(a,8);break Gc;case 0:g=ra(a,9);break Gc;case 1:g=ra(a,10);break Gc;case 2:break Hc}}g=Ga(a,n,d);if(!g){break vc}d=d+1|0;g=y[g+68>>2]}y[h+148>>2]=g;Ic:{Jc:{switch((q>>>4&3)-1|0){default:g=ra(a,11);break Ic;case 0:g=ra(a,12);break Ic;case 1:g=ra(a,13);break Ic;case 2:break Jc}}g=Ga(a,n,d);if(!g){break vc}d=d+1|0;g=y[g+68>>2]}y[h+152>>2]=g;Kc:{Lc:{switch(i|0){case 0:g=ra(a,14);break Kc;case 1:g=ra(a,15);break Kc;default:break Lc}}g=Ga(a,n,d);if(!g){break vc}d=d+1|0;g=y[g+68>>2]}y[h+156>>2]=g;Mc:{Nc:{switch(k|0){case 0:g=ra(a,14);break Mc;case 1:g=ra(a,15);break Mc;default:break Nc}}g=Ga(a,n,d);if(!g){break vc}d=d+1|0;g=y[g+68>>2]}y[h+160>>2]=g;Oc:{Pc:{switch(j|0){case 0:g=ra(a,14);break Oc;case 1:g=ra(a,15);break Oc;default:break Pc}}g=Ga(a,n,d);if(!g){break vc}d=d+1|0;g=y[g+68>>2]}y[h+164>>2]=g;Qc:{Rc:{switch(m|0){case 0:g=ra(a,14);break Qc;case 1:g=ra(a,15);break Qc;default:break Rc}}g=Ga(a,n,d);if(!g){break vc}d=d+1|0;g=y[g+68>>2]}y[h+168>>2]=g;Sc:{if(!(q&16384)){b=ra(a,1);break Sc}d=Ga(a,n,d);if(!d){break vc}b=y[d+68>>2]}y[h+172>>2]=b;break wc}x[f+8>>1]=0;t(f+12|0,0,92);va(f+148|0);Oa(m);break xc}d=d+1|0;continue}}Oa(f+8|0);b=1;break vc}c=ib(y[h+24>>2])}j=0;i=0;y[f+8>>2]=0;y[f+12>>2]=0;if(z[h+1|0]==1){g=f+160|0;mb(g,z[h+2|0]?1024:8192);b=y[f+160>>2];y[f+160>>2]=0;Hd(f+8|0,b);d=y[f+164>>2];y[f+12>>2]=d;y[f+164>>2]=0;Ja(g);i=d}y[n+52>>2]=1;Tc:{Uc:{Vc:{Wc:{if(z[h|0]==1){b=Gd(h,y[a+4>>2],y[f+8>>2]|j,i);y[f+160>>2]=0;oa(n- -64|0,b);la(f+160|0);if(!y[n+64>>2]){break Uc}sa(y[a+4>>2]);break Wc}b=Na(y[a+4>>2]);y[f+256>>2]=b;g=Fd(f+160|0,c);b=Ed(h,b,y[f+8>>2]|j,i,g);y[f+148>>2]=0;oa(n- -64|0,b);la(f+148|0);if(!y[n+64>>2]){break Vc}sa(y[a+4>>2]);d=y[a+4>>2];b=y[d+8>>2];if(b>>>0<=4294967293){c=b+2|0;b=y[d+4>>2];y[d+8>>2]=b>>>0>c>>>0?c:b}rc(g);ta(f+256|0)}b=0;if((z[n+4|0]&63)==4){break Tc}Xc:{if(z[a+50|0]){break Xc}d=y[y[a+24>>2]-4>>2];if(z[d+17|0]!=1){break Xc}b=u+y[f+132>>2]|0;c=y[a+32>>2];if((b|0)<=y[c+24>>2]){break Xc}ab(c,b,z[d+16|0])}b=y[f+128>>2];c=b;g=b>>31;b=y[f+132>>2];d=b;i=b>>31;b=z[f+136|0];bb(y[a+32>>2],c,g,d,i,y[n+64>>2],(b&7)==4?4:b&3);oa(n- -64|0,0);b=0;break Tc}rc(g);ta(f+256|0)}b=1}Ja(f+8|0)}va(F);break v}else{c=Ka(a,y[y[n+12>>2]+(b<<2)>>2]);if(!(z[c+4|0]&63)){j=0;i=0;if(d&1){c=y[c+56>>2];d=y[c+28>>2]-y[c+24>>2]>>2;c=d+k|0;i=c;c=c>>>0>=d>>>0;d=c?i:0;j=c}else{d=i}k=d;d=j}b=b+1|0;continue}}b=1;d=c<<2;c=c+1|0;if(Ka(a,y[d+y[n+12>>2]>>2])){continue}break}}qc(f+116|0)}Y=f+304|0;break s}o()}if(y[a+56>>2]!=3){break r}b=y[a+4>>2];c=y[b+8>>2];b=y[b+4>>2];if(c>>>0>b>>>0){break e}if((b|0)!=(c|0)){continue}break}y[a+52>>2]=2;break c}Yc:{switch(b|0){default:eb(ba,0);break i;case 0:break Yc;case 2:break d}}n=y[ba>>2];b=y[n+28>>2];if((b|0)==-1){break g}c=b;b=y[a+84>>2];c=c+b|0;if(b>>>0<=c>>>0){break h}}sb=1;break c}y[a+84>>2]=c;d=y[a+4>>2];b=y[d+4>>2];y[d+8>>2]=b>>>0>c>>>0?c:b;break f}d=y[a+4>>2];b=y[d+8>>2];if(b>>>0>4294967291){break f}c=b+4|0;b=y[d+4>>2];y[d+8>>2]=b>>>0>c>>>0?c:b}b=y[a+12>>2];c=y[a+16>>2];Zc:{if(b>>>0>>0){y[ba>>2]=0;y[b>>2]=n;c=b+4|0;break Zc}d=y[a+8>>2];b=b-d|0;h=b>>2;i=h+1|0;if(i>>>0>=1073741824){break b}g=c-d|0;c=g>>1;k=g>>>0>=2147483644?1073741823:c>>>0>i>>>0?c:i;_c:{if(!k){g=0;c=b;break _c}if(k>>>0>=1073741824){break a}g=na(k<<2);d=y[a+8>>2];c=y[a+12>>2]-d|0;h=c>>2;n=y[a+80>>2]}y[a+80>>2]=0;i=b+g|0;y[i>>2]=n;b=i-(h<<2)|0;if(c){p(b,d,c)}y[a+16>>2]=(k<<2)+g;c=i+4|0;y[a+12>>2]=c;y[a+8>>2]=b;if(d){ma(d)}d=y[a+4>>2]}y[a+12>>2]=c;b=y[d+4>>2];i=b;c=y[d+8>>2];if(b>>>0>=c>>>0){continue}break}}o()}eb(ba,0)}Y=T+16|0;return sb}za();o()}Wa();o()}function jb(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,A=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;e=Y-96|0;Y=e;D=a+8|0;p=a+4|0;a:{b:{m=y[a+4>>2];if(m-1>>>0<=65534){s=y[a+8>>2];if(s-1>>>0<65535){break b}}l=ua(p,D);break a}c:{d:{e:{f:{g:{h:{i:{j:{k:{l:{if(!z[a|0]){m:{if(z[a+24|0]!=255|z[a+25|0]!=255|(z[a+26|0]!=255|z[a+27|0]!=255)){break m}if(y[a+12>>2]){break m}j=y[a+20>>2];if((m|0)!=y[j+20>>2]){break m}if(!y[j+16>>2]){break c}l=hc(m,s);y[e+44>>2]=l;if(!y[l+16>>2]){break e}u=d;E=c;c=y[a+20>>2];F=y[c+20>>2];q=y[c+24>>2];c=y[a+16>>2];if(!((1-q|0)<=(c|0)&(c|0)<(q|0))){y[a+16>>2]=0}L=q+1|0;I=q-1|0;J=E+32|0;p=0;while(1){if((p|0)!=(s|0)){if(z[a+1|0]==1){if(z[b|0]){break e}if((d|0)==16|d>>>0<16){break l}v=ka(b,J)^v}ja(e+32|0,l,p);i=0;n:{if(!p){D=0;t=0;j=0;break n}ja(e+72|0,l,p-1|0);t=y[e+76>>2];if(!t){break l}D=y[e+72>>2];j=z[D|0]<<4}c=y[a+16>>2];y[e+88>>2]=0;y[e+92>>2]=0;y[e+80>>2]=0;y[e+84>>2]=0;y[e+72>>2]=0;y[e+76>>2]=0;y[e+16>>2]=0;y[e+8>>2]=0;y[e+12>>2]=0;h=p-c|0;if(!((h|0)<=0|(h|0)>(q|0))){ja(e+48|0,y[a+20>>2],h-1|0);c=y[e+52>>2];y[e+76>>2]=c;f=y[e+48>>2];y[e+72>>2]=f;if(!c){break l}c=z[f|0];y[e+8>>2]=c;i=c&192}k=0;c=0;o:{if((h|0)<0){break o}c=0;if((h|0)>=(q|0)){break o}ja(e+48|0,y[a+20>>2],h);c=y[e+52>>2];y[e+84>>2]=c;f=y[e+48>>2];y[e+80>>2]=f;if(!c){break l}c=z[f|0];y[e+12>>2]=c;c=c>>>3&24}if(!((h|0)<-1|(h|0)>=(I|0))){ja(e+48|0,y[a+20>>2],h+1|0);h=y[e+52>>2];y[e+92>>2]=h;f=y[e+48>>2];y[e+88>>2]=f;if(!h){break l}h=z[f|0];y[e+16>>2]=h;k=h>>>6|0}p:{if(!v){g=c|(j&3072|i)|k;n=0;x=y[e+32>>2];A=y[e+36>>2];k=0;q:while(1){if((k|0)>=(m|0)){break p}r:{if(!p){break r}j=j<<8;if((m|0)<=(k+8|0)){break r}c=(k>>>3|0)+1|0;if(c>>>0>=t>>>0){break l}j=z[c+D|0]<<4|j}s:{if((L+y[a+16>>2]|0)<(p|0)){h=0;y[e+16>>2]=0;y[e+8>>2]=0;y[e+12>>2]=0;r=0;c=0;break s}c=(k>>>3|0)+1|0;f=0;i=e+8|0;h=(F|0)<=(k+8|0);while(1){if((f|0)!=24){r=(e+72|0)+f|0;G=y[r+4>>2];t:{if(!G){break t}C=y[i>>2]<<8;y[i>>2]=C;if(h){break t}if(c>>>0>=G>>>0){break l}y[i>>2]=C|z[c+y[r>>2]|0]}i=i+4|0;f=f+8|0;continue}break}h=y[e+16>>2];r=y[e+8>>2];c=y[e+12>>2]}f=0;i=n+m|0;i=(i|0)>0?i:0;G=(i|0)>=8?8:i;i=0;while(1){if((f|0)==(G|0)){c=k>>>3|0;if(c>>>0>=A>>>0){break l}w[c+x|0]=i;n=n-8|0;k=k+8|0;continue q}if(g>>>0>=u>>>0){break l}C=g<<1;H=ka(b,C+E|0);g=f^7;i=H<>>13-f&1|(c>>>10-f&8|(r>>>g&64|(j>>>g&1024|C&6582|H<<9)));f=f+1|0;continue}}}Cb(e+48|0,y[a+20>>2],p);i=c|(j&3072|i)|k;h=0;A=y[e+32>>2];G=y[e+36>>2];C=y[e+60>>2];H=y[e+56>>2];k=0;while(1){if((h|0)>=(m|0)){break p}u:{if(!p){c=h+8|0;break u}j=j<<8;c=h+8|0;if((m|0)<=(c|0)){break u}f=(h>>>3|0)+1|0;if(f>>>0>=t>>>0){break l}j=z[f+D|0]<<4|j}r=h>>>3|0;n=r+1|0;f=0;g=e+8|0;while(1){v:{if((f|0)==24){f=0;g=k+m|0;g=(g|0)>0?g:0;K=(g|0)>=8?8:g;N=y[e+16>>2];M=y[e+12>>2];O=y[e+8>>2];n=0;while(1){if((f|0)==(K|0)){break v}x=y[y[a+20>>2]+20>>2];P=f+h|0;g=ia(x,P,H,C);w:{if(z[a+1|0]==1){if(Bb(x,P,g,e+48|0)){break w}}if(z[b|0]){break e}if(i>>>0>=u>>>0){break l}g=ka(b,E+(i<<1)|0)}x=f^7;i=N>>>13-f&1|(M>>>10-f&8|(j>>>x&1024|i<<1&6582|g<<9|O>>>x&64));f=f+1|0;n=g<>2];x:{if(!K){break x}N=y[g>>2]<<8;y[g>>2]=N;if((c|0)>=(F|0)){break x}if(n>>>0>=K>>>0){break l}y[g>>2]=N|z[n+y[x>>2]|0]}g=g+4|0;f=f+8|0;continue}break}if(r>>>0>=G>>>0){break l}w[r+A|0]=n;k=k-8|0;h=c;continue}}p=p+1|0;continue}break}y[e+44>>2]=0;break d}l=ua(p,D);y[e+44>>2]=l;f=y[l+16>>2];if(!f){break g}E=c;g=y[l+12>>2];while(1){if((f|0)>0){w[g|0]=0;f=f-1|0;g=g+1|0;continue}break}t=E+32|0;while(1){if(B[D>>2]>h>>>0){if(z[a+1|0]==1){if(z[b|0]){break g}if((d|0)==16|d>>>0<16){break l}k=ka(b,t)^k}ja(e+32|0,l,h);c=e+72|0;ja(c,l,h-1|0);j=y[e+76>>2];u=y[e+72>>2];v=y[a+16>>2];i=y[a+20>>2];jd(c,v,i,h);f=0;c=y[l+20>>2];f=!j|(c|0)<2?f:z[u|0]>>>6&1;if(!(!j|(c|0)<=0)){f=z[u|0]>>>6&2|f}y[e+8>>2]=f;y[e+12>>2]=0;c=y[i+20>>2];f=y[a+12>>2];g=1-f|0;m=y[e+72>>2];q=y[e+76>>2];n=0-f|0;Q=e,R=ia(c,g,m,q)|ia(c,n,m,q)<<1,y[Q+16>>2]=R;m=y[e+80>>2];q=y[e+84>>2];s=ia(c,g,m,q);r=s|ia(c,n,m,q)<<1;s=f^-1;Q=e,R=r|ia(c,s,m,q)<<2,y[Q+20>>2]=R;m=g;f=y[e+88>>2];g=y[e+92>>2];m=ia(c,m,f,g);Q=e,R=m|ia(c,n,f,g)<<1|ia(c,s,f,g)<<2,y[Q+24>>2]=R;c=e+48|0;ja(c,i,w[a+27|0]+(h-v|0)|0);f=y[e+52>>2];g=y[e+48>>2];ja(c,l,w[a+25|0]+h|0);c=y[e+52>>2];n=y[e+48>>2];y:{if(!k){m=u;u=j;j=c;c=f;q=g;f=0;i=y[e+32>>2];v=y[e+36>>2];while(1){if(B[p>>2]<=f>>>0){break y}s=e+8|0;g=id(a,y[l+20>>2],s,f,q,c,n,j);if(z[b|0]){break g}if(d>>>0<=g>>>0){break l}hd(a,l,s,f,ka(b,E+(g<<1)|0),e+72|0,m,u,i,v);f=f+1|0;continue}}Cb(e+48|0,i,h);m=u;u=j;j=c;c=f;q=g;f=0;i=y[e+32>>2];v=y[e+36>>2];s=y[e+60>>2];F=y[e+56>>2];while(1){if(B[p>>2]<=f>>>0){break y}r=y[y[a+20>>2]+20>>2];g=ia(r,f,F,s);z:{if(z[a+1|0]==1){if(Bb(r,f,g,e+48|0)){break z}}g=id(a,y[l+20>>2],e+8|0,f,q,c,n,j);if(z[b|0]==1){break g}if(d>>>0<=g>>>0){break l}g=ka(b,E+(g<<1)|0)}hd(a,l,e+8|0,f,g,e+72|0,m,u,i,v);f=f+1|0;continue}}h=h+1|0;continue}break}y[e+44>>2]=0;break f}A:{if(y[a+12>>2]){break A}j=y[a+20>>2];if((m|0)!=y[j+20>>2]){break A}if(!y[j+16>>2]){break c}l=hc(m,s);y[e+44>>2]=l;if(!y[l+16>>2]){break i}u=d;E=c;c=y[a+20>>2];r=y[c+20>>2];v=y[c+24>>2];c=y[a+16>>2];if(!((1-v|0)<=(c|0)&(c|0)<(v|0))){y[a+16>>2]=0}x=v-1|0;L=E+16|0;p=0;while(1){B:{C:{if((p|0)!=(s|0)){if(z[a+1|0]==1){if(z[b|0]){break i}if((d|0)==8|d>>>0<8){break l}q=ka(b,L)^q}ja(e+32|0,l,p);i=0;D:{if(!p){t=0;F=0;j=0;break D}ja(e+72|0,l,p-1|0);F=y[e+76>>2];if(!F){break l}t=y[e+72>>2];j=z[t|0]<<1}c=y[a+16>>2];y[e+88>>2]=0;y[e+92>>2]=0;y[e+80>>2]=0;y[e+84>>2]=0;y[e+72>>2]=0;y[e+76>>2]=0;y[e+16>>2]=0;y[e+8>>2]=0;y[e+12>>2]=0;h=p-c|0;if(!((h|0)<=0|(h|0)>(v|0))){ja(e+48|0,y[a+20>>2],h-1|0);c=y[e+52>>2];y[e+76>>2]=c;f=y[e+48>>2];y[e+72>>2]=f;if(!c){break l}c=z[f|0];y[e+8>>2]=c;i=c>>>2&32}k=0;c=0;E:{if((h|0)<0){break E}c=0;if((h|0)>=(v|0)){break E}ja(e+48|0,y[a+20>>2],h);c=y[e+52>>2];y[e+84>>2]=c;f=y[e+48>>2];y[e+80>>2]=f;if(!c){break l}c=z[f|0];y[e+12>>2]=c;c=c>>>4&12}if(!((h|0)<-1|(h|0)>=(x|0))){ja(e+48|0,y[a+20>>2],h+1|0);h=y[e+52>>2];y[e+92>>2]=h;f=y[e+48>>2];y[e+88>>2]=f;if(!h){break l}h=z[f|0];y[e+16>>2]=h;k=h>>>6|0}if(q){break C}i=c|(j&384|i)|k;f=0;D=y[e+32>>2];I=y[e+36>>2];n=0;F:while(1){if((f|0)>=(m|0)){break B}G:{if(!p){c=f+8|0;break G}j=j<<8;c=f+8|0;if((m|0)<=(c|0)){break G}h=(f>>>3|0)+1|0;if(h>>>0>=F>>>0){break l}j=z[h+t|0]<<1|j}h=f>>>3|0;k=h+1|0;f=0;g=e+8|0;while(1){if((f|0)==24){f=0;g=n+m|0;g=(g|0)>0?g:0;k=(g|0)>=8?8:g;J=y[e+16>>2];A=y[e+12>>2];G=y[e+8>>2];g=0;while(1){if((f|0)==(k|0)){if(h>>>0>=I>>>0){break l}w[h+D|0]=g;n=n-8|0;f=c;continue F}if(i>>>0>=u>>>0){break l}i=i<<1;C=ka(b,i+E|0);H=f^7;g=C<>>13-f&1|(A>>>11-f&4|(G>>>9-f&32|(j>>>H&128|i&794|C<<6)));f=f+1|0;continue}}J=(e+72|0)+f|0;A=y[J+4>>2];H:{if(!A){break H}G=y[g>>2]<<8;y[g>>2]=G;if((c|0)>=(r|0)){break H}if(k>>>0>=A>>>0){break l}y[g>>2]=G|z[k+y[J>>2]|0]}g=g+4|0;f=f+8|0;continue}}}y[e+44>>2]=0;break h}Cb(e+48|0,y[a+20>>2],p);i=c|(j&384|i)|k;h=0;I=y[e+32>>2];J=y[e+36>>2];A=y[e+60>>2];G=y[e+56>>2];D=0;while(1){if((h|0)>=(m|0)){break B}I:{if(!p){c=h+8|0;break I}j=j<<8;c=h+8|0;if((m|0)<=(c|0)){break I}f=(h>>>3|0)+1|0;if(f>>>0>=F>>>0){break l}j=z[f+t|0]<<1|j}n=h>>>3|0;k=n+1|0;f=0;g=e+8|0;while(1){J:{if((f|0)==24){f=0;g=m+D|0;g=(g|0)>0?g:0;C=(g|0)>=8?8:g;H=y[e+16>>2];K=y[e+12>>2];N=y[e+8>>2];k=0;while(1){if((f|0)==(C|0)){break J}M=y[y[a+20>>2]+20>>2];O=f+h|0;g=ia(M,O,G,A);K:{if(z[a+1|0]==1){if(Bb(M,O,g,e+48|0)){break K}}if(z[b|0]){break i}if(i>>>0>=u>>>0){break l}g=ka(b,E+(i<<1)|0)}M=f^7;i=H>>>13-f&1|(K>>>11-f&4|(N>>>9-f&32|(j>>>M&128|i<<1&794|g<<6)));f=f+1|0;k=g<>2];L:{if(!H){break L}K=y[g>>2]<<8;y[g>>2]=K;if((c|0)>=(r|0)){break L}if(k>>>0>=H>>>0){break l}y[g>>2]=K|z[k+y[C>>2]|0]}g=g+4|0;f=f+8|0;continue}break}if(n>>>0>=J>>>0){break l}w[n+I|0]=k;D=D-8|0;h=c;continue}}p=p+1|0;continue}}l=ua(p,D);y[e+32>>2]=l;f=y[l+16>>2];if(!f){break k}E=c;g=y[l+12>>2];while(1){if((f|0)>0){w[g|0]=0;f=f-1|0;g=g+1|0;continue}break}J=E+16|0;while(1){if(B[D>>2]>q>>>0){if(z[a+1|0]==1){if(z[b|0]){break k}if((d|0)==8|d>>>0<8){break l}v=ka(b,J)^v}ja(e+8|0,l,q);c=e+72|0;ja(c,l,q-1|0);u=y[e+76>>2];m=y[e+72>>2];j=y[a+20>>2];jd(c,y[a+16>>2],j,q);i=0;t=y[l+20>>2];i=!u|(t|0)<2?i:z[m|0]>>>6&1;i=!u|(t|0)<=0?i:z[m|0]>>>6&2|i;g=y[j+20>>2];f=y[a+12>>2];c=0-f|0;r=y[e+72>>2];x=y[e+76>>2];ia(g,c,r,x);h=ia(g,c,r,x);n=1-f|0;s=y[e+80>>2];F=y[e+84>>2];k=ia(g,n,s,F)|ia(g,c,s,F)<<1|ia(g,f^-1,s,F)<<2;L=y[e+88>>2];I=y[e+92>>2];n=ia(g,n,L,I)|ia(g,c,L,I)<<1;M:{if(!v){g=0;j=y[e+12>>2];t=y[e+8>>2];f=0;while(1){if(B[p>>2]<=f>>>0){break M}if(z[b|0]){break k}c=k<<2|h<<5|g<<6|i<<7|n;if(c>>>0>=d>>>0){break l}g=ka(b,E+(c<<1)|0);Ea(y[l+20>>2],f,t,j,g);h=y[a+12>>2];i=ia(y[l+20>>2],f+2|0,m,u)|i<<1&6;c=y[y[a+20>>2]+20>>2];A=f-h|0;h=ia(c,A+1|0,r,x);A=A+2|0;k=ia(c,A,s,F)|k<<1&6;n=ia(c,A,L,I)|n<<1&2;f=f+1|0;continue}}Cb(e+48|0,j,q);c=0;A=y[e+12>>2];G=y[e+8>>2];C=y[e+60>>2];H=y[e+56>>2];f=0;while(1){if(B[p>>2]<=f>>>0){break M}j=ia(g,f,H,C);N:{if(z[a+1|0]==1){if(Bb(g,f,j,e+48|0)){break N}}if(z[b|0]==1){break k}c=k<<2|h<<5|c<<6|i<<7|n;if(c>>>0>=d>>>0){break l}j=ka(b,E+(c<<1)|0);t=y[l+20>>2]}Ea(t,f,G,A,j);c=y[a+12>>2];t=y[l+20>>2];i=ia(t,f+2|0,m,u)|i<<1&6;g=y[y[a+20>>2]+20>>2];c=f-c|0;h=ia(g,c+1|0,r,x);c=c+2|0;k=ia(g,c,s,F)|k<<1&6;n=ia(g,c,L,I)|n<<1&2;f=f+1|0;c=j;continue}}q=q+1|0;continue}break}y[e+32>>2]=0;break j}o()}l=0}la(e+32|0);break a}l=0}la(e+44|0);break a}l=0}la(e+44|0);break a}l=0}la(e+44|0)}}Y=e+96|0;return l}function cd(a,b,c,d,e,f,g,h){var i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,A=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;i=Y-32|0;Y=i;a:{b:{d=d-(c>>>0<1048577)|0;k=(d|0)==-1&c-1048577>>>0<4292870143|(d|0)!=-1;d=f-(e>>>0<1048577)|0;if(k|((d|0)==-1&e-1048577>>>0<4292870143|(d|0)!=-1)){break b}k=y[h+4>>2];l=y[h+12>>2];j=y[h>>2];p=y[h+8>>2];y[i+28>>2]=y[b+20>>2];w[i+24|0]=1;d=c;f=bd(i+24|0,c);q=z[f|0];h=y[i+28>>2];m=y[b+24>>2];y[f>>2]=1;y[f+4>>2]=m;m=bd(f,e);f=l-k|0;l=y[i+28>>2];m=z[m|0]?(f|0)<(l|0)?f:l:f;l=e&e>>31;f=p-j|0;A=q?(f|0)<(h|0)?f:h:f;c=c&c>>31;r=0-c|0;if(!((m|0)>(0-l|0)&(A|0)>(r|0))){break b}f=j-c|0;if((f|0)<0){break a}c=y[a+28>>2];x=(c|0)/4|0;p=f>>>5|0;if(x>>>0<=p>>>0){break a}h=y[b+28>>2];s=(h|0)/4|0;f=(d|0)>0?d:0;q=f>>>5|0;if(s>>>0<=q>>>0){break a}j=i+16|0;n=k-l|0;k=l+m|0;cc(j,a,n,k);l=y[i+20>>2];m=y[i+16>>2];cc(j,b,(e|0)>0?e:0,k);j=y[i+20>>2];if(!j){break a}F=-1>>>f|0;k=d+A|0;G=-1<<0-k;e=r&31;n=f&31;t=x-p|0;if((f^k-1)>>>0<=31){d=F&G;if((r^A-1)>>>0>=32){k=e-n|0;n=32-k|0;r=p<<2;while(1){if(!j){break b}if(l>>>0

>>0|t>>>0>l-p>>>0){break a}y[i+12>>2]=t;y[i+8>>2]=m+r;e=(h|0)/4|0;if(e>>>0>j>>>0){break a}f=y[i+16>>2];c=Ya(i+8|0);if(!y[i+12>>2]|e>>>0>>0|(e|0)==(q|0)){break a}e=(((Ae(c,16)^c)&-16711936)>>>8^Ae(c,8))<>2]>>2];h=e|(((Ae(c,16)^c)&-16711936)>>>8^Ae(c,8))>>>n;e=f+(q<<2)|0;c=y[e>>2];c=Ma(g,h,((Ae(c,16)^c)&-16711936)>>>8^Ae(c,8),d);h=((Ae(c,16)^c)&-16711936)>>>8|0;K=e,L=Ae(c,8)^h,y[K>>2]=L;c=y[a+28>>2]/4|0;if(c>>>0>l>>>0){break a}h=y[b+28>>2];e=(h|0)/4|0;if(e>>>0>j>>>0){break a}y[i+16>>2]=f+(e<<2);j=j-e|0;l=l-c|0;m=(c<<2)+m|0;continue}}if(e>>>0>n>>>0){k=e-n|0;n=p<<2;while(1){if(!j){break b}c=(c|0)/4|0;if(c>>>0>l>>>0){break a}e=(h|0)/4|0;if(c>>>0

>>0|e>>>0>j>>>0|((c|0)==(p|0)|e>>>0>>0)|(e|0)==(q|0)){break a}t=y[i+16>>2];e=t+(q<<2)|0;c=y[m+n>>2];f=(((Ae(c,16)^c)&-16711936)>>>8^Ae(c,8))<>2];c=Ma(g,f,((Ae(c,16)^c)&-16711936)>>>8^Ae(c,8),d);K=e,L=((Ae(c,16)^c)&-16711936)>>>8^Ae(c,8),y[K>>2]=L;c=y[a+28>>2];e=(c|0)/4|0;if(e>>>0>l>>>0){break a}h=y[b+28>>2];f=(h|0)/4|0;if(f>>>0>j>>>0){break a}y[i+16>>2]=t+(f<<2);j=j-f|0;l=l-e|0;m=(e<<2)+m|0;continue}}k=n-e|0;n=p<<2;while(1){if(!j){break b}c=(c|0)/4|0;if(c>>>0>l>>>0){break a}e=(h|0)/4|0;if(c>>>0

>>0|e>>>0>j>>>0|((c|0)==(p|0)|e>>>0>>0)|(e|0)==(q|0)){break a}t=y[i+16>>2];e=t+(q<<2)|0;c=y[m+n>>2];f=(((Ae(c,16)^c)&-16711936)>>>8^Ae(c,8))>>>k|0;c=y[e>>2];c=Ma(g,f,((Ae(c,16)^c)&-16711936)>>>8^Ae(c,8),d);K=e,L=((Ae(c,16)^c)&-16711936)>>>8^Ae(c,8),y[K>>2]=L;c=y[a+28>>2];e=(c|0)/4|0;if(e>>>0>l>>>0){break a}h=y[b+28>>2];f=(h|0)/4|0;if(f>>>0>j>>>0){break a}y[i+16>>2]=t+(f<<2);j=j-f|0;l=l-e|0;m=(e<<2)+m|0;continue}}A=k&31;d=s-q|0;x=x-(r>>>5|0)|0;if(e>>>0<=n>>>0){if((e|0)==(n|0)){k=((k|0)/32|0)-(f+31>>>5|0)|0;if((k|0)<0){break a}C=p<<2;c:while(1){if(!j){break b}if(l>>>0

>>0|t>>>0>l-p>>>0){break a}y[i+12>>2]=t;y[i+8>>2]=m+C;if(j>>>0>>0|d>>>0>j-q>>>0){break a}y[i+4>>2]=d;u=y[i+16>>2];y[i>>2]=u+(q<<2);f=d;if(n){c=Ya(i+8|0);e=bc(i);f=((Ae(c,16)^c)&-16711936)>>>8^Ae(c,8);c=y[e>>2];c=Ma(g,f,((Ae(c,16)^c)&-16711936)>>>8^Ae(c,8),F);K=e,L=((Ae(c,16)^c)&-16711936)>>>8^Ae(c,8),y[K>>2]=L;f=y[i+4>>2]}if(f>>>0>>0){break a}c=y[i+8>>2];if(B[i+12>>2]>>0){break a}h=y[i>>2];D=k<<2;r=h+D|0;x=y[i+12>>2];e=c;while(1)if((h|0)==(r|0)){if(A){if((k|0)==(x|0)|k>>>0>x>>>0|(f|0)==(k|0)){break a}c=y[e+D>>2];e=((Ae(c,16)^c)&-16711936)>>>8^Ae(c,8);c=y[r>>2];c=Ma(g,e,((Ae(c,16)^c)&-16711936)>>>8^Ae(c,8),G);K=r,L=((Ae(c,16)^c)&-16711936)>>>8^Ae(c,8),y[K>>2]=L}c=y[a+28>>2]/4|0;if(c>>>0>l>>>0){break a}e=y[b+28>>2]/4|0;if(e>>>0>j>>>0){break a}y[i+16>>2]=u+(e<<2);j=j-e|0;l=l-c|0;m=(c<<2)+m|0;continue c}else{s=y[c>>2];v=((Ae(s,16)^s)&-16711936)>>>8^Ae(s,8);s=y[h>>2];s=yb(g,v,((Ae(s,16)^s)&-16711936)>>>8^Ae(s,8));K=h,L=((Ae(s,16)^s)&-16711936)>>>8^Ae(s,8),y[K>>2]=L;c=c+4|0;h=h+4|0;continue}}}k=((k|0)/32|0)-(f+31>>>5|0)|0;if((k|0)<0){break a}n=n-e|0;s=32-n|0;D=p<<2;d:while(1){if(!j){break b}if(l>>>0

>>0|t>>>0>l-p>>>0){break a}y[i+12>>2]=t;c=m+D|0;y[i+8>>2]=c;if(j>>>0>>0|d>>>0>j-q>>>0){break a}y[i+4>>2]=d;v=y[i+16>>2];y[i>>2]=v+(q<<2);if(A){if(t>>>0>>0){break a}y[i+12>>2]=x;y[i+8>>2]=c}c=Ya(i+8|0);e=bc(i);f=((Ae(c,16)^c)&-16711936)>>>8^Ae(c,8);c=y[e>>2];c=Ma(g,f>>>n|0,((Ae(c,16)^c)&-16711936)>>>8^Ae(c,8),F);K=e,L=((Ae(c,16)^c)&-16711936)>>>8^Ae(c,8),y[K>>2]=L;H=y[i+4>>2];if(H>>>0>>0){break a}c=y[i+8>>2];if(B[i+12>>2]>>0){break a}h=y[i>>2];E=k<<2;r=h+E|0;C=y[i+12>>2];e=c;while(1)if((h|0)==(r|0)){if(A){if(k>>>0>C>>>0){break a}h=f<>2];h=(((Ae(c,16)^c)&-16711936)>>>8^Ae(c,8))>>>n|h}if((k|0)==(H|0)){break a}c=y[r>>2];c=Ma(g,h,((Ae(c,16)^c)&-16711936)>>>8^Ae(c,8),G);K=r,L=((Ae(c,16)^c)&-16711936)>>>8^Ae(c,8),y[K>>2]=L}c=y[a+28>>2]/4|0;if(c>>>0>l>>>0){break a}e=y[b+28>>2]/4|0;if(e>>>0>j>>>0){break a}y[i+16>>2]=v+(e<<2);j=j-e|0;l=l-c|0;m=(c<<2)+m|0;continue d}else{I=f<>2];f=((Ae(f,16)^f)&-16711936)>>>8^Ae(f,8);u=y[h>>2];u=yb(g,I|f>>>n,((Ae(u,16)^u)&-16711936)>>>8^Ae(u,8));K=h,L=((Ae(u,16)^u)&-16711936)>>>8^Ae(u,8),y[K>>2]=L;c=c+4|0;h=h+4|0;continue}}}r=((k|0)/32|0)-(f+31>>>5|0)|0;if((r|0)<0){break a}s=e-n|0;C=32-s|0;H=p<<2;e:while(1){if(!j){break b}if(l>>>0

>>0|t>>>0>l-p>>>0){break a}y[i+12>>2]=t;c=m+H|0;y[i+8>>2]=c;if(j>>>0>>0|d>>>0>j-q>>>0){break a}y[i+4>>2]=d;E=y[i+16>>2];y[i>>2]=E+(q<<2);if(A){if(t>>>0>>0){break a}y[i+12>>2]=x;y[i+8>>2]=c}e=i+8|0;c=Ya(e);f=((Ae(c,16)^c)&-16711936)>>>8^Ae(c,8);if(n){c=Ya(e);e=bc(i);h=f<>>8^Ae(c,8);c=y[e>>2];c=Ma(g,h|f>>>C,((Ae(c,16)^c)&-16711936)>>>8^Ae(c,8),F);K=e,L=((Ae(c,16)^c)&-16711936)>>>8^Ae(c,8),y[K>>2]=L;e=y[i+4>>2]}else{e=d}if(e>>>0>>0){break a}c=y[i+8>>2];if(B[i+12>>2]>>0){break a}h=y[i>>2];I=r<<2;u=h+I|0;D=y[i+12>>2];k=c;while(1)if((h|0)==(u|0)){if(A){if(r>>>0>D>>>0){break a}h=f<>2];h=(((Ae(c,16)^c)&-16711936)>>>8^Ae(c,8))>>>C|h}if((e|0)==(r|0)){break a}c=y[u>>2];c=Ma(g,h,((Ae(c,16)^c)&-16711936)>>>8^Ae(c,8),G);K=u,L=((Ae(c,16)^c)&-16711936)>>>8^Ae(c,8),y[K>>2]=L}c=y[a+28>>2]/4|0;if(c>>>0>l>>>0){break a}e=y[b+28>>2]/4|0;if(e>>>0>j>>>0){break a}y[i+16>>2]=E+(e<<2);j=j-e|0;l=l-c|0;m=(c<<2)+m|0;continue e}else{J=f<>2];f=((Ae(f,16)^f)&-16711936)>>>8^Ae(f,8);v=y[h>>2];v=yb(g,J|f>>>C,((Ae(v,16)^v)&-16711936)>>>8^Ae(v,8));K=h,L=((Ae(v,16)^v)&-16711936)>>>8^Ae(v,8),y[K>>2]=L;c=c+4|0;h=h+4|0;continue}}}Y=i+32|0;return}o()}function Gd(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;e=Y-128|0;Y=e;m=ua(a+8|0,a+12|0);y[e+124>>2]=m;f=y[m+16>>2];a:{if(!f){break a}Mb(y[m+12>>2],f,z[a+4|0]);j=td(b);y[e+116>>2]=j;g=0;b:{if(ya(j,y[a+152>>2],e+120|0)){break b}y[e+108>>2]=y[e+120>>2];w[e+104|0]=1;q=xb(e+104|0,y[a+20>>2]);g=q;h=y[e+108>>2];f=0-h|0;y[g>>2]=z[g|0]&(h|0)!=-2147483648;y[g+4>>2]=f;y[e+100>>2]=0;w[e+96|0]=1;t=a+28|0;c:{d:{e:while(1){if(B[a+16>>2]>r>>>0){if(ya(j,y[a+152>>2],e+92|0)){break c}y[e+84>>2]=y[e+92>>2];g=1;w[e+80|0]=1;h=xb(e+80|0,y[a+20>>2]);s=Zc(q,y[h>>2],y[h+4>>2]);y[e+76>>2]=0;w[e+72|0]=1;while(1){f:{if(g&1){if(ya(j,y[a+144>>2],e+12|0)){break c}g=La(e+96|0,y[e+12>>2]);f=y[g+4>>2];y[e+72>>2]=y[g>>2];y[e+76>>2]=f;break f}g:{switch(ya(j,y[a+148>>2],e+12|0)|0){case 0:break g;case 1:continue e;default:break c}}La(La(e+72|0,y[e+12>>2]),w[a+5|0])}g=0;f=y[a+20>>2];if((f|0)!=1){f=ib(f);if(Fa(b,f>>>0<=1?1:f,e+12|0)){break c}g=z[e+12|0]}f=y[s+4>>2];if(!(y[s>>2]&1)){break c}p=f+g|0;if((p&(f^-1))<0){break c}if(ya(j,t,e+68|0)){break c}h:{i:{j:{if(!z[a+1|0]){w[e+64|0]=0;y[e+60>>2]=0;break j}f=y[b>>2];g=y[b+8>>2];if(g>>>0>=B[b+4>>2]){break c}g=z[f+g|0];f=y[b+12>>2];Tb(b);w[e+64|0]=0;y[e+60>>2]=0;if(g>>>7-f&1){break i}}Yc(e+60|0,y[y[a+124>>2]+(y[e+68>>2]<<2)>>2]);break h}if(ya(j,y[a+156>>2],e+56|0)){break d}if(ya(j,y[a+160>>2],e+52|0)){break d}if(ya(j,y[a+164>>2],e+48|0)){break d}if(ya(j,y[a+168>>2],e+44|0)){break d}if(ya(j,y[a+172>>2],e+40|0)){break d}sa(b);k=y[y[a+124>>2]+(y[e+68>>2]<<2)>>2];if(!k){break d}l=y[e+56>>2];g=l>>31;f=y[k+20>>2]+l|0;if(f>>>0>>0?g+1|0:g){break d}i=y[e+52>>2];h=i>>31;g=i+y[k+24>>2]|0;if(g>>>0>>0?h+1|0:h){break d}h=y[b+8>>2];wb(e+12|0,l,2,y[e+48>>2]);wb(e+32|0,i,2,y[e+44>>2]);if(!(w[e+36|0]&1)|z[e+16|0]!=1){break d}i=kb();y[e+28>>2]=i;y[i+8>>2]=g;y[i+4>>2]=f;f=z[a+2|0];y[i+20>>2]=k;w[i|0]=f;y[i+12>>2]=y[e+12>>2];f=y[e+32>>2];g=0;w[i+1|0]=0;y[i+16>>2]=f;w[i+24|0]=z[a+176|0];w[i+25|0]=z[a+177|0];w[i+26|0]=z[a+178|0];w[i+27|0]=z[a+179|0];f=Na(b);y[e+24>>2]=f;if(ac(Xc(e+60|0,jb(i,f,c,d)))){sa(b);g=y[b+8>>2];if(g>>>0<=4294967293){g=g+2|0;f=y[b+4>>2];g=f>>>0>g>>>0?g:f;y[b+8>>2]=g}g=y[e+40>>2]==(g-h|0)}ta(e+24|0);Ua(e+28|0);if(!g){break d}}f=e+60|0;if(ac(f)){k=y[Ta(f)+20>>2];f=Ta(f);n=y[a+140>>2];l=y[f+24>>2];k:{l:{i=z[a+3|0];if(!i){f=z[e+72|0];if((n&-2)!=2){break l}if(!(f&1)){break d}h=y[e+76>>2];g=h>>31;f=k-1|0;o=f;f=f+h|0;g=o>>>0>f>>>0?g+1|0:g;h=f>>>0<2147483648&(g|0)<=0|(g|0)<0;y[e+72>>2]=0|h;y[e+76>>2]=h?f:0;if(!h){break d}break k}f=z[e+72|0];m:{switch(n|0){default:if(!(f&1)){break d}break k;case 0:case 2:break m}}if(!(f&1)){break d}h=y[e+76>>2];g=h>>31;f=l-1|0;o=f;f=f+h|0;g=o>>>0>f>>>0?g+1|0:g;h=f>>>0<2147483648&(g|0)<=0|(g|0)<0;y[e+72>>2]=0|h;y[e+76>>2]=h?f:0;if(h){break k}break d}if(!(f&1)){break d}}f=y[e+76>>2];Wc(e+12|0,i,n,f,p,k,l);n=Ta(e+60|0);g=y[e+12>>2];o=g;p=g>>31;g=y[e+16>>2];Ab(n,m,o,p,g,g>>31,y[a+136>>2]);h=y[e+20>>2];if(h){g=f;f=f>>31;g=g+h|0;f=g>>>0>>0?f+1|0:f;h=g>>>0<2147483648&(f|0)<=0|(f|0)<0;f=0;y[e+72>>2]=f|h;y[e+76>>2]=h?g:0}r=r+1|0}Xa(e+60|0);g=0;continue}}break}y[e+124>>2]=0;g=m;break b}Xa(e+60|0)}g=0}Ua(e+116|0)}la(e+124|0);Y=e+128|0;return g}function Ed(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,A=0,C=0,D=0,E=0,F=0,G=0;f=Y-112|0;Y=f;m=ua(a+8|0,a+12|0);y[f+108>>2]=m;a:{b:{if(!y[m+16>>2]){break b}q=y[e>>2];g=0;if(!Aa(q,b,f+104|0)){break a}t=y[e+36>>2];u=y[e+32>>2];v=y[e+28>>2];x=y[e+24>>2];A=y[e+20>>2];C=y[e+16>>2];D=y[e+12>>2];E=y[e+8>>2];F=y[e+4>>2];Mb(y[m+12>>2],y[m+16>>2],z[a+4|0]);y[f+100>>2]=y[f+104>>2];w[f+96|0]=1;r=xb(f+96|0,y[a+20>>2]);g=r;h=y[f+100>>2];e=0-h|0;y[g>>2]=z[g|0]&(h|0)!=-2147483648;y[g+4>>2]=e;y[f+92>>2]=0;w[f+88|0]=1;c:{d:while(1){if(B[a+16>>2]>n>>>0){y[f+84>>2]=0;w[f+80|0]=1;if(!Aa(q,b,f+76|0)){break b}y[f+68>>2]=y[f+76>>2];e=1;w[f+64|0]=1;h=xb(f- -64|0,y[a+20>>2]);g=Zc(r,y[h>>2],y[h+4>>2]);h=y[g>>2];s=y[g+4>>2];G=h&1;while(1){e:{if(e&1){Aa(F,b,f+4|0);g=La(f+88|0,y[f+4>>2]);e=y[g+4>>2];y[f+80>>2]=y[g>>2];y[f+84>>2]=e;break e}if(!Aa(E,b,f+4|0)){continue d}La(La(f+80|0,y[f+4>>2]),w[a+5|0])}if(B[a+16>>2]<=n>>>0){continue d}y[f+60>>2]=0;if(y[a+20>>2]!=1){Aa(D,b,f+60|0)}if(!G){break b}e=y[f+60>>2];o=e+s|0;if(((o^s)&(e^o))<0){break b}Ac(t,b,f+56|0);g=y[f+56>>2];if(g>>>0>=B[a+24>>2]){break b}f:{g:{h:{if(!z[a+1|0]){y[f+52>>2]=0;w[f+48|0]=0;y[f+44>>2]=0;break h}Aa(C,b,f+52|0);e=y[f+52>>2];w[f+48|0]=0;y[f+44>>2]=0;if(e){break g}}Yc(f+44|0,y[y[a+124>>2]+(g<<2)>>2]);break f}Aa(A,b,f+40|0);Aa(x,b,f+36|0);Aa(v,b,f+32|0);Aa(u,b,f+28|0);i=y[y[a+124>>2]+(g<<2)>>2];if(!i){break c}j=y[f+40>>2];g=j>>31;e=y[i+20>>2]+j|0;if(e>>>0>>0?g+1|0:g){break c}k=y[f+36>>2];h=k>>31;g=k+y[i+24>>2]|0;if(g>>>0>>0?h+1|0:h){break c}wb(f+4|0,j,1,y[f+32>>2]);wb(f+20|0,k,1,y[f+28>>2]);if(!(w[f+24|0]&1)|z[f+8|0]!=1){break c}h=kb();y[f+16>>2]=h;y[h+8>>2]=g;y[h+4>>2]=e;e=z[a+2|0];y[h+20>>2]=i;w[h|0]=e;y[h+12>>2]=y[f+4>>2];e=y[f+20>>2];w[h+1|0]=0;y[h+16>>2]=e;w[h+24|0]=z[a+176|0];w[h+25|0]=z[a+177|0];w[h+26|0]=z[a+178|0];w[h+27|0]=z[a+179|0];Xc(f+44|0,jb(h,b,c,d));Ua(f+16|0)}e=f+44|0;if(!ac(e)){break c}j=y[Ta(e)+20>>2];e=Ta(e);p=y[a+140>>2];i=y[e+24>>2];i:{j:{k=z[a+3|0];if(!k){e=z[f+80|0];if((p&-2)!=2){break j}if(!(e&1)){break c}h=y[f+84>>2];e=h>>31;g=j-1|0;l=g;g=h+g|0;e=l>>>0>g>>>0?e+1|0:e;h=g>>>0<2147483648&(e|0)<=0|(e|0)<0;y[f+80>>2]=0|h;y[f+84>>2]=h?g:0;if(!h){break c}break i}e=z[f+80|0];k:{switch(p|0){default:if(!(e&1)){break c}break i;case 0:case 2:break k}}if(!(e&1)){break c}h=y[f+84>>2];g=h>>31;e=i-1|0;l=e;e=e+h|0;g=l>>>0>e>>>0?g+1|0:g;h=e>>>0<2147483648&(g|0)<=0|(g|0)<0;y[f+80>>2]=0|h;y[f+84>>2]=h?e:0;if(h){break i}break c}if(!(e&1)){break c}}h=y[f+84>>2];Wc(f+4|0,k,p,h,o,j,i);l=Ta(f+44|0);e=y[f+4>>2];g=e;i=e>>31;e=y[f+8>>2];Ab(l,m,g,i,e,e>>31,y[a+136>>2]);e=y[f+12>>2];if(e){g=h>>31;l=e;e=e+h|0;g=l>>>0>e>>>0?g+1|0:g;h=e>>>0<2147483648&(g|0)<=0|(g|0)<0;g=0;y[f+80>>2]=h|g;y[f+84>>2]=h?e:0}n=n+1|0;Xa(f+44|0);e=0;continue}}break}y[f+108>>2]=0;g=m;break a}Xa(f+44|0)}g=0}la(f+108|0);Y=f+112|0;return g}function he(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0;g=Y-96|0;Y=g;w[g+72|0]=0;y[g+68>>2]=0;i=c+31>>>3&536870908;k=E(i,d);j=vd(k,1);y[g+76>>2]=0;y[g>>2]=j;h=g+68|0;Uc(h);w[g+72|0]=1;y[g+68>>2]=j;y[g>>2]=0;Ja(g);Ja(g+76|0);a:{b:{if(!$b(h)){break b}j=$b(h);h=g+56|0;y[g+60>>2]=h;y[g+56>>2]=h;y[g+64>>2]=0;y[g+48>>2]=0;y[g+52>>2]=0;h=a;a=0;h=h|a;y[g+32>>2]=h;y[g+36>>2]=b;y[g>>2]=c;l=a|e;y[g+24>>2]=l;y[g+28>>2]=f;y[g+16>>2]=0;y[g+20>>2]=0;y[g+40>>2]=a|j;y[g+44>>2]=k;y[g+8>>2]=0;y[g+12>>2]=0;y[g+4>>2]=d;y[g+48>>2]=i;a=ze(i,0,d,0);if(Z|a>>>0>k>>>0){break a}e=j;while(1){if((a|0)>0){w[e|0]=0;a=a-1|0;e=e+1|0;continue}break}a=b;b=g+56|0;a=zc(na(116),h,a,b,0);if(f){b=zc(na(116),l,f,b,1);y[g+76>>2]=0;rb(a,b);sb(g+76|0)}f=c+7>>>3|0;y[g+76>>2]=0;h=g+52|0;rb(h,a);sb(g+76|0);c:{d:{b=y[g+52>>2];a=y[b>>2];if(!a){break d}if(!yc(a)){break d}y[b+56>>2]=-1;a=0;break c}y[b+52>>2]=0;e=na(32);a=e;y[a+24>>2]=0;y[a+28>>2]=0;y[a+16>>2]=0;y[a+20>>2]=0;y[a+8>>2]=0;y[a+12>>2]=0;y[a>>2]=0;y[a+4>>2]=0;e:{if((c|d)<0|i>>>0>268435452){break e}l=i<<3;if((l|0)<(c|0)|(!(!i|(d|0)<=0|k)|(2147483616/(l>>>0)|0)<(d|0))){break e}y[a+28>>2]=i;y[a+24>>2]=d;y[a+20>>2]=c;a=ze(i,0,d,d>>31);c=Z;if((c|0)==1|c>>>0>1|a>>>0>k>>>0){break a}y[g+92>>2]=a;y[g+88>>2]=j;y[g+84>>2]=0;y[g+76>>2]=0;y[g+80>>2]=0;a=g+76|0;ec(e,a);va(a)}y[g+76>>2]=0;oa(b+32|0,e);la(g+76|0);w[b+50|0]=1;a=od(b)}f:{while(1){g:{a=a&1;h:{i:{b=y[y[g+52>>2]+56>>2];if((b|0)!=4){break h}rb(g+52|0,0);b=-1;if(!a){break h}b=E(y[g+48>>2],y[g+4>>2]);if(b>>>0>B[g+44>>2]){break i}a=y[g+40>>2];if(a&3){break i}c=(b&-4)+a|0;b=4;while(1){if((a|0)==(c|0)){break h}y[a>>2]=y[a>>2]^-1;a=a+4|0;continue}}o()}j:{switch(b-3|0){case 0:break j;case 1:break g;default:break f}}a=od(y[g+52>>2]);continue}break}X($b(g+68|0)|0,f|0,i|0,d|0)}sb(h);if(!y[g+64>>2]){break b}a=y[g+60>>2];b=y[a>>2];c=y[y[g+56>>2]+4>>2];y[b+4>>2]=c;y[c>>2]=b;y[g+64>>2]=0;while(1){if((g+56|0)==(a|0)){break b}b=y[a+4>>2];pc(a);a=b;continue}}Uc(g+68|0);Y=g+96|0;return}o()}function jc(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;a:{b:{c:{d:{if(!z[a+1|0]){g=y[a+60>>2];break d}f=y[b+4>>2];if(z[f|0]){break a}h=y[c>>2];if(h>>>0>=B[b+12>>2]){break c}g=y[a+60>>2]^ka(f,y[b+8>>2]+(h<<1)|0);y[a+60>>2]=g}if(g){ld(a,y[y[b>>2]>>2]);break b}f=y[a+24>>2];if(f>>>0<=1){if((f|0)==1){if(!y[a+40>>2]){break c}j=z[y[a+36>>2]]}i=y[c+12>>2]&j>>>y[c+8>>2];h=(f|0)!=1;while(1){if((d|0)!=(k|0)){if(!h){f=k+1|0;if(f>>>0>=B[a+40>>2]){break c}j=z[f+y[a+36>>2]|0]|j<<8}g=7;l=0;while(1){if((g|0)>=0){f=y[b+4>>2];if(z[f|0]){break a}if(B[b+12>>2]<=i>>>0){break c}f=ka(f,y[b+8>>2]+(i<<1)|0);i=f|(y[c+16>>2]&j>>>y[c+8>>2]+g|(y[c+4>>2]&i)<<1);l=f<>2]<=k>>>0){break c}w[y[a+44>>2]+k|0]=l;k=k+1|0;continue}break}f=j<<8;g=0;l=0;while(1){if((e|0)!=(g|0)){h=y[b+4>>2];if(z[h|0]){break a}if(B[b+12>>2]<=i>>>0){break c}h=ka(h,y[b+8>>2]+(i<<1)|0);j=7-g|0;l=h<>2]&f>>>j+y[c+8>>2]|(y[c+4>>2]&i)<<1);g=g+1|0;continue}break}if(B[a+48>>2]<=d>>>0){break c}w[y[a+44>>2]+d|0]=l;break b}if(!y[a+32>>2]|!y[a+40>>2]){break c}j=z[y[a+36>>2]];k=z[y[a+28>>2]]<>2];i=y[c+12>>2]&j>>>y[c+8>>2]|k&y[c+24>>2];f=0;while(1){e:{if((d|0)!=(f|0)){h=f+1|0;if(h>>>0>=B[a+32>>2]|h>>>0>=B[a+40>>2]){break c}k=z[h+y[a+28>>2]|0]<>2]|k<<8;j=z[h+y[a+36>>2]|0]|j<<8;g=7;l=0;while(1){if((g|0)<0){break e}m=y[b+4>>2];if(z[m|0]){break a}if(B[b+12>>2]<=i>>>0){break c}m=ka(m,y[b+8>>2]+(i<<1)|0);i=m|(y[c+16>>2]&j>>>y[c+8>>2]+g|(y[c+28>>2]&k>>>g|(y[c+4>>2]&i)<<1));l=m<>2];if(z[h|0]){break a}if(B[b+12>>2]<=i>>>0){break c}k=ka(h,y[b+8>>2]+(i<<1)|0);h=7-g|0;f=k<>2]&l>>>h+y[c+8>>2]|(y[c+28>>2]&j>>>h|(y[c+4>>2]&i)<<1));g=g+1|0;continue}break}if(B[a+48>>2]<=d>>>0){break c}w[y[a+44>>2]+d|0]=f;break b}if(B[a+48>>2]<=f>>>0){break c}w[y[a+44>>2]+f|0]=l;f=h;continue}}o()}return 1}return 0}function we(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,A=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;c=Y-48|0;Y=c;m=y[b+4>>2];t=y[b+12>>2];u=y[b+8>>2];h=y[y[b>>2]>>2];d=y[a+24>>2];ja(c+40|0,h,d-1|0);ja(c+32|0,h,d-2|0);A=u+79434|0;n=y[c+36>>2];p=y[c+32>>2];C=t>>>0>39717;q=4;a:{while(1){b:{c:{if(B[a+8>>2]>d>>>0){j=y[c+44>>2];k=y[c+40>>2];ja(c+32|0,h,d);f=y[c+36>>2];r=y[c+32>>2];y[c+40>>2]=r;y[c+44>>2]=f;d:{e:{f:{if(!z[a+1|0]){d=y[a+60>>2];break f}if(z[m|0]){break b}if(!C){break e}d=y[a+60>>2]^ka(m,A);y[a+60>>2]=d}if(d){y[c+20>>2]=j;y[c+16>>2]=k;y[c+24>>2]=r;y[c+28>>2]=f;y[c+8>>2]=r;y[c+12>>2]=f;f=y[c+20>>2];y[c>>2]=y[c+16>>2];y[c+4>>2]=f;Ca(c+8|0,c);break d}d=y[a+24>>2];i=0;v=0;x=0;if(z[a+2|0]==1){ja(c+32|0,y[a+12>>2],d);x=y[c+32>>2];v=y[c+36>>2]}e=c+32|0;ja(e,h,d+w[a+17|0]|0);D=y[c+36>>2];E=y[c+32>>2];ja(e,h,d+w[a+19|0]|0);F=y[c+36>>2];G=y[c+32>>2];ja(e,h,d+w[a+21|0]|0);H=y[c+36>>2];I=y[c+32>>2];ja(e,h,d+w[a+23|0]|0);J=y[c+36>>2];K=y[c+32>>2];e=y[h+20>>2];i=!n|(e|0)<2?i:z[p|0]>>>6&1;i=!n|(e|0)<=0?i:z[p|0]>>>6&2|i;g=0;g=!j|(e|0)<3?g:z[k|0]>>>5&1;g=!j|(e|0)<2?g:z[k|0]>>>5&2|g;g=!j|(e|0)<=0?g:z[k|0]>>>5&4|g;s=0;d=0;while(1){if(B[a+4>>2]<=d>>>0){break d}g:{h:{if(z[a+2|0]==1){if(ia(y[y[a+12>>2]+20>>2],d,x,v)){break h}}l=ia(e,w[a+16|0]+d|0,E,D);L=ia(e,w[a+18|0]+d|0,G,F);M=ia(e,w[a+20|0]+d|0,I,H);e=ia(e,w[a+22|0]+d|0,K,J);if(z[m|0]){break b}e=g<<5|i<<12|l<<4|L<<10|M<<11|e<<15|s;if(e>>>0>=t>>>0){break e}l=ka(m,(e<<1)+u|0);e=y[h+20>>2];if(!l){break h}Ea(e,d,r,f,1);e=y[h+20>>2];l=1;break g}l=0}i=ia(e,d+2|0,p,n)|i<<1&6;g=ia(e,d+3|0,k,j)|g<<1&30;d=d+1|0;s=s<<1&14|l;continue}}o()}f=y[b+16>>2];if(!f){d=y[a+24>>2];break c}f=_[y[y[f>>2]+8>>2]](f)|0;d=y[a+24>>2];if(!f){break c}y[a+24>>2]=d+1;q=3}y[a+52>>2]=q;break a}d=d+1|0;y[a+24>>2]=d;p=k;n=j;continue}break}q=-1}Y=c+48|0;return q|0}function re(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0;i=y[b+4>>2];k=y[b+12>>2];l=y[b+8>>2];m=y[y[b>>2]>>2];if(!y[a+48>>2]){c=y[m+16>>2];y[a+44>>2]=y[m+12>>2];y[a+48>>2]=c}a:{b:{c=y[a+4>>2];if(!c){break b}q=l+810|0;c=c-1|0;j=c>>>3|0;n=(c&7)+1|0;d=y[a+24>>2];r=k>>>0>405;while(1){c:{if(B[a+8>>2]<=d>>>0){b=4}else{d:{if(!z[a+1|0]){d=y[a+60>>2];break d}if(z[i|0]){break a}if(!r){break b}d=y[a+60>>2]^ka(i,q);y[a+60>>2]=d}e:{if(d){ld(a,m);break e}d=0;g=0;f:{if(!y[a+24>>2]){g:{while(1){e=7;f=0;if((g|0)==(j|0)){break g}h:{while(1){if((e|0)>=0){if(z[i|0]){break h}if(d>>>0>=k>>>0){break b}h=d<<1;c=ka(i,h+l|0);d=c|h&1006;f=c<>2]<=g>>>0){break b}w[y[a+44>>2]+g|0]=f;g=g+1|0;continue}break}if(g>>>0>>0){break a}}e=0;f=0;while(1){if((e|0)==(n|0)){break f}if(z[i|0]){break a}if(d>>>0>=k>>>0){break b}h=d<<1;c=ka(i,h+l|0);d=c|h&1006;f=c<<7-e|f;e=e+1|0;continue}}if(!y[a+40>>2]){break b}g=z[y[a+36>>2]];e=g>>>1&112;c=0;while(1){i:{if((c|0)!=(j|0)){h=c+1|0;if(h>>>0>=B[a+40>>2]){break b}g=z[h+y[a+36>>2]|0]|g<<8;d=7;f=0;while(1){if((d|0)<0){break i}if(z[i|0]){break a}if(e>>>0>=k>>>0){break b}e=e<<1;p=ka(i,e+l|0);e=p|(g>>>d+1&16|e&1006);f=p<>>0>=k>>>0){break b}e=e<<1;c=ka(i,e+l|0);e=c|(h>>>8-d&16|e&1006);f=c<<7-d|f;d=d+1|0;continue}break}if(B[a+48>>2]<=j>>>0){break b}w[y[a+44>>2]+j|0]=f;break e}if(B[a+48>>2]<=c>>>0){break b}w[y[a+44>>2]+c|0]=f;c=h;continue}}if(B[a+48>>2]<=j>>>0){break b}w[y[a+44>>2]+j|0]=f}Db(a,m);c=y[b+16>>2];if(!c){break c}if(!(_[y[y[c>>2]+8>>2]](c)|0)){break c}y[a+24>>2]=y[a+24>>2]+1;b=3}y[a+52>>2]=b;return b|0}d=y[a+24>>2]+1|0;y[a+24>>2]=d;continue}}o()}return-1}function hb(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;a:{b:{while(1){if(a>>>0>4294967239){break b}b=y[1691];c=b;f=y[1690];a=a>>>0<=8?8:a+3&-4;c:{if(a>>>0<=127){d=(a>>>3|0)-1|0;break c}e=H(a);d=((a>>>29-e^4)-(e<<2)|0)+110|0;if(a>>>0<=4095){break c}e=((a>>>30-e^2)-(e<<1)|0)+71|0;d=e>>>0>=63?63:e}g=d;d=g&31;if((g&63)>>>0>=32){e=0;b=b>>>d|0}else{e=b>>>d|0;b=((1<>>d}if(b|e){while(1){d=e;d:{if(d|b){c=d-1|0;e=c+1|0;f=c;c=b-1|0;f=(c|0)!=-1?e:f;e=H(d^f);e=(e|0)==32?H(b^c)+32|0:e;c=63-e|0;Z=0-(e>>>0>63)|0;break d}Z=0;c=64}f=c;c=f&31;if((f&63)>>>0>=32){e=0;h=d>>>c|0}else{e=d>>>c|0;h=((1<>>c}g=f+g|0;b=g<<4;d=y[b+5736>>2];c=b+5728|0;e:{if((d|0)!=(c|0)){b=_b(d,a);if(b){break a}b=y[d+4>>2];f=y[d+8>>2];y[b+8>>2]=f;y[f+4>>2]=b;y[d+8>>2]=c;y[d+4>>2]=y[c+4>>2];y[c+4>>2]=d;y[y[d+4>>2]+8>>2]=d;g=g+1|0;b=(e&1)<<31|h>>>1;e=e>>>1|0;break e}j=y[1691];f=g&63;b=f;d=b&31;if(b>>>0>=32){b=0;c=-1>>>d|0}else{b=-1>>>d|0;c=b|(1<>>0>=32){b=c<>>32-d|b<>>0>=32){b=-1<>>32-b}k=c&-2;c=f&31;if(f>>>0>=32){f=0;c=b>>>c|0}else{f=b>>>c|0;c=((1<>>c}b=c|i;Z=d|f;y[1690]=y[1690]&b;y[1691]=Z&j;b=h^1}if(b|e){continue}break}f=y[1690];c=y[1691]}e=H(c);d=63-((e|0)==32?H(f)+32|0:e)|0;f:{if(!(c|f)){g=0;break f}b=d<<4;g=y[b+5736>>2];if(!c&f>>>0<1073741824){break f}e=98;c=b+5728|0;if((c|0)==(g|0)){break f}while(1){b=_b(g,a);if(b){break a}g=y[g+8>>2];if((c|0)==(g|0)){break f}b=e;e=b-1|0;if(b){continue}break}}if(Md(a+48|0)){continue}break}if(!g){break b}e=(d<<4)+5728|0;if((e|0)==(g|0)){break b}while(1){b=_b(g,a);if(b){break a}g=y[g+8>>2];if((e|0)!=(g|0)){continue}break}}b=0}return b}function nb(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;g=Y-32|0;Y=g;a:{i=hc(d,e);if(!y[i+16>>2]|(b|0)<0|(!y[a+16>>2]|(c|0)<0)|y[a+20>>2]<=(b|0)){break a}f=y[a+24>>2];if((f|0)<=(c|0)){break a}b:{if(!(b&7)){e=y[a+28>>2];d=b>>>3|0;if(e>>>0<=d>>>0){break b}b=e-d|0;e=y[i+28>>2];h=b>>>0>>0?b:e;if(!h){break b}e=0;b=f-c|0;f=y[i+24>>2];b=(b|0)<(f|0)?b:f;k=(b|0)>0?b:0;while(1){if((e|0)==(k|0)){break a}dc(g+24|0,a,c+e|0);f=0;b=0;if(z[g+28|0]==1){j=y[a+16>>2];b=y[g+24>>2];if(j>>>0>>0){break b}f=y[a+28>>2];if(f>>>0>j-b>>>0){break b}b=b+y[a+12>>2]|0}if(d>>>0>f>>>0|h>>>0>f-d>>>0){break b}ja(g+16|0,i,e);if(h>>>0>B[g+20>>2]){break b}if(h){p(y[g+16>>2],b+d|0,h)}e=e+1|0;continue}}d=y[a+28>>2]/4|0;j=b>>>5|0;if(d>>>0<=j>>>0){break b}n=d-j|0;d=y[i+28>>2]/4|0;l=d>>>0>n>>>0?n:d;if(!l){break b}e=c;c=f-c|0;d=y[i+24>>2];c=(c|0)<(d|0)?c:d;ad(g+24|0,a,e,c);cc(g+16|0,i,0,c);h=y[g+20>>2];if(!h){break b}t=b&31;k=y[g+28>>2];u=j<<2;v=b^-1;c:while(1){if(!h){break a}if(k>>>0>>0|k-j>>>0>>0){break b}y[g+12>>2]=n;r=y[g+24>>2];y[g+8>>2]=r+u;if(h>>>0>>0){break b}c=y[g+16>>2];e=Ya(g+8|0);d=y[g+8>>2];q=y[g+12>>2];f=l>>>0>q>>>0?q:l;if(f>>>0>B[g+12>>2]){break b}s=c+(f<<2)|0;f=((Ae(e,16)^e)&-16711936)>>>8^Ae(e,8);e=c;while(1)if((e|0)==(s|0)){if(l>>>0>q>>>0){d=f<>>8^Ae(d,8),y[w>>2]=x}d=y[a+28>>2]/4|0;if(d>>>0>k>>>0){break b}y[g+24>>2]=(d<<2)+r;e=y[i+28>>2]/4|0;if(e>>>0>h>>>0){break b}y[g+16>>2]=c+(e<<2);h=h-e|0;k=k-d|0;continue c}else{m=f<>2];f=((Ae(f,16)^f)&-16711936)>>>8^Ae(f,8);m=m|f>>>1>>>v;w=e,x=((m^Ae(m,16))&-16711936)>>>8^Ae(m,8),y[w>>2]=x;d=d+4|0;e=e+4|0;continue}}}o()}Y=g+32|0;return i}function ue(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,A=0,C=0,D=0,E=0,F=0;c=Y-48|0;Y=c;n=y[b+4>>2];t=y[b+12>>2];u=y[b+8>>2];i=y[y[b>>2]>>2];d=y[a+24>>2];ja(c+40|0,i,d-1|0);ja(c+32|0,i,d-2|0);C=u+3882|0;l=y[c+36>>2];m=y[c+32>>2];D=t>>>0>1941;p=4;a:{while(1){b:{c:{if(B[a+8>>2]>d>>>0){j=y[c+44>>2];k=y[c+40>>2];ja(c+32|0,i,d);f=y[c+36>>2];q=y[c+32>>2];y[c+40>>2]=q;y[c+44>>2]=f;d:{e:{f:{if(!z[a+1|0]){d=y[a+60>>2];break f}if(z[n|0]){break b}if(!D){break e}d=y[a+60>>2]^ka(n,C);y[a+60>>2]=d}if(d){y[c+20>>2]=j;y[c+16>>2]=k;y[c+24>>2]=q;y[c+28>>2]=f;y[c+8>>2]=q;y[c+12>>2]=f;f=y[c+20>>2];y[c>>2]=y[c+16>>2];y[c+4>>2]=f;Ca(c+8|0,c);break d}d=y[a+24>>2];g=0;v=0;x=0;if(z[a+2|0]==1){ja(c+32|0,y[a+12>>2],d);x=y[c+32>>2];v=y[c+36>>2]}ja(c+32|0,i,d+w[a+17|0]|0);E=y[c+36>>2];F=y[c+32>>2];e=y[i+20>>2];g=!l|(e|0)<3?g:z[m|0]>>>5&1;g=!l|(e|0)<2?g:z[m|0]>>>5&2|g;g=!l|(e|0)<=0?g:z[m|0]>>>5&4|g;h=0;h=!j|(e|0)<3?h:z[k|0]>>>5&1;h=!j|(e|0)<2?h:z[k|0]>>>5&2|h;h=!j|(e|0)<=0?h:z[k|0]>>>5&4|h;s=0;d=0;while(1){if(B[a+4>>2]<=d>>>0){break d}g:{h:{if(z[a+2|0]==1){if(ia(y[y[a+12>>2]+20>>2],d,x,v)){break h}}e=ia(e,w[a+16|0]+d|0,F,E);if(z[n|0]){break b}e=h<<4|g<<9|e<<3|s;if(e>>>0>=t>>>0){break e}r=ka(n,(e<<1)+u|0);e=y[i+20>>2];if(!r){break h}Ea(e,d,q,f,1);e=y[i+20>>2];r=1;break g}r=0}A=d+3|0;g=ia(e,A,m,l)|g<<1&14;h=ia(e,A,k,j)|h<<1&30;d=d+1|0;s=s<<1&6|r;continue}}o()}f=y[b+16>>2];if(!f){d=y[a+24>>2];break c}f=_[y[y[f>>2]+8>>2]](f)|0;d=y[a+24>>2];if(!f){break c}y[a+24>>2]=d+1;p=3}y[a+52>>2]=p;break a}d=d+1|0;y[a+24>>2]=d;m=k;l=j;continue}break}p=-1}Y=c+48|0;return p|0}function Sd(a,b){a=a|0;b=+b;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;c=a<<3;o=c+6784|0;j=D[c+6816>>3];if(j!=0){l=D[o>>3];m=J(l,b);b=m-l;d=~~b>>>0;if(G(b)>=1){c=~~(b>0?I(K(b*2.3283064365386963e-10),4294967295):L((b-+(~~b>>>0>>>0))*2.3283064365386963e-10))>>>0}else{c=0}h=~~j>>>0;if(G(j)>=1){f=~~(j>0?I(K(j*2.3283064365386963e-10),4294967295):L((j-+(~~j>>>0>>>0))*2.3283064365386963e-10))>>>0}else{f=0}a:{b:{c:{d:{e:{f:{g:{h:{i:{j:{k:{if(c){if(!h){break k}if(!f){break j}e=H(f)-H(c)|0;if(e>>>0<=31){break i}break c}if((f|0)==1|f>>>0>1){break c}Z=0;c=(d>>>0)/(h>>>0)|0;break a}if(!d){break h}if(!f|f-1&f){break g}c=c>>>Be(f)|0;Z=0;break a}if(!(h-1&h)){break f}k=(H(h)+33|0)-H(c)|0;i=0-k|0;break d}k=e+1|0;i=63-e|0;break d}Z=0;c=(c>>>0)/(f>>>0)|0;break a}e=H(f)-H(c)|0;if(e>>>0<31){break e}break c}if((h|0)==1){break b}h=Be(h);f=h&31;if((h&63)>>>0>=32){c=c>>>f|0}else{e=c>>>f|0;c=((1<>>f}Z=e;break a}k=e+1|0;i=63-e|0}e=k&63;g=e&31;if(e>>>0>=32){e=0;n=c>>>g|0}else{e=c>>>g|0;n=((1<>>g}i=i&63;g=i&31;if(i>>>0>=32){c=d<>>32-g|c<>>31;e=n<<1|c>>>31;g=s-(p+(e>>>0>i>>>0)|0)>>31;q=g&h;n=e-q|0;e=p-((f&g)+(e>>>0>>0)|0)|0;c=c<<1|d>>>31;d=r|d<<1;r=g&1;k=k-1|0;if(k){continue}break}}Z=c<<1|d>>>31;c=r|d<<1;break a}d=0;c=0}Z=c;c=d}d=Z;c=c+1|0;d=c?d:d+1|0;l=(+(c>>>0)+ +(d>>>0)*4294967296)*j+l;m=l-m}D[o>>3]=l;Q(a|0,+m)|0;a=(a|0)==2?27:(a|0)==1?26:14;c=a-1|0;l:{if(y[1692]>>>c&1){y[1694]=y[1694]|1<>2];if(c){_[c|0](a)}}}function se(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,A=0,C=0,D=0,E=0;c=Y-48|0;Y=c;l=y[b+4>>2];s=y[b+12>>2];t=y[b+8>>2];i=y[y[b>>2]>>2];d=y[a+24>>2];ja(c+40|0,i,d-1|0);ja(c+32|0,i,d-2|0);A=t+458|0;m=y[c+36>>2];n=y[c+32>>2];C=s>>>0>229;a:{while(1){b:{c:{if(B[a+8>>2]<=d>>>0){d=4}else{j=y[c+44>>2];k=y[c+40>>2];ja(c+32|0,i,d);f=y[c+36>>2];p=y[c+32>>2];y[c+40>>2]=p;y[c+44>>2]=f;d:{e:{f:{if(!z[a+1|0]){d=y[a+60>>2];break f}if(z[l|0]){break b}if(!C){break e}d=y[a+60>>2]^ka(l,A);y[a+60>>2]=d}if(d){y[c+20>>2]=j;y[c+16>>2]=k;y[c+24>>2]=p;y[c+28>>2]=f;y[c+8>>2]=p;y[c+12>>2]=f;f=y[c+20>>2];y[c>>2]=y[c+16>>2];y[c+4>>2]=f;Ca(c+8|0,c);break d}d=y[a+24>>2];g=0;u=0;v=0;if(z[a+2|0]==1){ja(c+32|0,y[a+12>>2],d);v=y[c+32>>2];u=y[c+36>>2]}ja(c+32|0,i,d+w[a+17|0]|0);D=y[c+36>>2];E=y[c+32>>2];e=y[i+20>>2];g=!m|(e|0)<2?g:z[n|0]>>>6&1;g=!m|(e|0)<=0?g:z[n|0]>>>6&2|g;h=0;h=!j|(e|0)<2?h:z[k|0]>>>6&1;h=!j|(e|0)<=0?h:z[k|0]>>>6&2|h;r=0;d=0;while(1){if(B[a+4>>2]<=d>>>0){break d}g:{h:{if(z[a+2|0]==1){if(ia(y[y[a+12>>2]+20>>2],d,v,u)){break h}}e=ia(e,w[a+16|0]+d|0,E,D);if(z[l|0]){break b}e=h<<3|g<<7|e<<2|r;if(e>>>0>=s>>>0){break e}q=ka(l,(e<<1)+t|0);e=y[i+20>>2];if(!q){break h}Ea(e,d,p,f,1);e=y[i+20>>2];q=1;break g}q=0}x=d+2|0;g=ia(e,x,n,m)|g<<1&6;h=ia(e,x,k,j)|h<<1&14;d=d+1|0;r=r<<1&2|q;continue}}o()}f=y[b+16>>2];if(!f){d=y[a+24>>2];break c}f=_[y[y[f>>2]+8>>2]](f)|0;d=y[a+24>>2];if(!f){break c}y[a+24>>2]=d+1;d=3}y[a+52>>2]=d;break a}d=d+1|0;y[a+24>>2]=d;n=k;m=j;continue}break}d=-1}Y=c+48|0;return d|0}function vc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0;f=Y-32|0;Y=f;k=ua(a,a+4|0);y[f+28>>2]=k;a:{c=y[k+16>>2];if(!c){k=0;break a}Mb(y[k+12>>2],c,z[a+20|0]);b:{while(1){if(!m&l>>>0>=B[a+36>>2]|m){y[f+28>>2]=0;break a}e=y[b>>2];c=y[b+4>>2];d=0;y[f+24>>2]=0;y[f+16>>2]=0;y[f+20>>2]=0;c:{d:{if((c|0)==(e|0)){j=0;e=c;break d}c=c-e|0;e=c>>2;if(e>>>0>=536870912){break c}j=na(c<<1);y[f+16>>2]=j;d=(e<<3)+j|0;y[f+24>>2]=d;c=j;while(1){if((c|0)!=(d|0)){y[c>>2]=0;y[c+4>>2]=0;c=c+8|0;continue}break}y[f+20>>2]=d;c=y[b>>2];e=y[b+4>>2]}e=e-c|0;if(e>>2>>>0>d-j>>3>>>0){break b}e=c+e|0;d=j;while(1){if((c|0)==(e|0)){e:{c=y[a+44>>2];d=ze(l,m,A[a+48>>1],0);e=c+d|0;c=Z+(c>>31)|0;n=e;r=d>>>0>e>>>0?c+1|0:c;c=y[a+40>>2];d=ze(l,m,A[a+50>>1],0);e=c+d|0;c=Z+(c>>31)|0;s=e;t=d>>>0>e>>>0?c+1|0:c;e=0;c=0;f:while(1){if(!c&B[a+32>>2]<=e>>>0|c){break e}h=y[b>>2];p=y[b+4>>2]-h>>2;d=0;g=0;while(1){i=d&255;if(p>>>0<=i>>>0){d=y[a+12>>2]-1|0;d=y[y[y[a+16>>2]>>2]+((d>>>0>>0?d:g)<<2)>>2];h=ze(e,c,A[a+48>>1],0);i=h+s|0;g=Z+t|0;g=h>>>0>i>>>0?g+1|0:g;h=ze(e,c,A[a+50>>1],0);p=n-h|0;i=(g&255)<<24|i>>>8;q=g>>8;h=r-(Z+(h>>>0>n>>>0)|0)|0;g=h>>8;Ab(d,k,i,q,(h&255)<<24|p>>>8,g,y[a+24>>2]);e=e+1|0;c=e?c:c+1|0;continue f}else{q=g;g=(i<<3)+j|0;g=q|ia(y[y[(i<<2)+h>>2]+20>>2],e,y[g>>2],y[g+4>>2])<>2],l);n=y[f+12>>2];y[d>>2]=y[f+8>>2];y[d+4>>2]=n;d=d+8|0;c=c+4|0;continue}break}d=m;l=l+1|0;m=l?d:d+1|0;va(f+16|0);continue}break}za()}o()}la(f+28|0);Y=f+32|0;return k}function Zb(a,b,c,d,e,f,g,h){var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;j=Y-48|0;Y=j;m=((b&536870911)<<3|a>>>29)&-8;o=d;d=-1;p=1;a:{b:while(1){k=p&1;q=k?326:325;r=k?1392:1056;s=k?325:326;t=k?1056:1392;c:while(1){i=y[c>>2];while(1){if(i>>>0>=m>>>0){break a}d:{i=0;e:{if(Ia(a,b,c)){break e}if(B[c>>2]>=m>>>0){break a}l=Ia(a,b,c);if(B[c>>2]>=m>>>0){break a}n=Ia(a,b,c);i=n?1:-1;if(l){break e}if(n){i=0;while(1){Yb(j+44|0,t,s,a,b,c);if(z[j+46|0]!=1){break a}l=A[j+44>>1];i=l+i|0;if((i|0)>(h|0)){break a}if(l>>>0>=64){continue}break}l=((d>>>31|0)+d|0)+i|0;if(!k){gb(o,e,h,d,l)}i=0;while(1){Yb(j+44|0,r,q,a,b,c);if(z[j+46|0]!=1){break a}d=A[j+44>>1];i=d+i|0;if((i|0)>(h|0)){break a}if(d>>>0>=64){continue}break}d=i+l|0;if(k){gb(o,e,h,l,d)}if((d|0)<(h|0)){continue c}break a}if(B[c>>2]>=m>>>0){break a}if(Ia(a,b,c)){y[j+32>>2]=f;y[j+36>>2]=g;y[j+16>>2]=f;y[j+20>>2]=g;Gc(j+16|0,h,d,k,j+44|0,j+40|0);i=y[j+40>>2];if(!k){gb(o,e,h,d,i)}d=i;if((i|0)<(h|0)){continue c}break a}if(B[c>>2]>=m>>>0){break a}l=Ia(a,b,c);if(B[c>>2]>=m>>>0){break a}n=Ia(a,b,c);i=n?2:-2;if(l){break e}i=y[c>>2];if(!n){break d}if(i>>>0>=m>>>0){break a}i=Ia(a,b,c)?3:-3}y[j+24>>2]=f;y[j+28>>2]=g;y[j+8>>2]=f;y[j+12>>2]=g;Gc(j+8|0,h,d,k,j+44|0,j+40|0);i=i+y[j+44>>2]|0;if(!k){gb(o,e,h,d,i)}if((h|0)<=(i|0)){break a}p=p^1;k=(d|0)<(i|0);d=i;if(k){continue b}break a}if(i>>>0>=m>>>0){break a}l=Ia(a,b,c);i=y[c>>2];if(l){i=i+3|0;y[c>>2]=i;continue}break}break}break}y[c>>2]=i+5}Y=j+48|0}function qe(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,A=0;c=Y-48|0;Y=c;i=y[b+4>>2];q=y[b+12>>2];r=y[b+8>>2];h=y[y[b>>2]>>2];d=y[a+24>>2];ja(c+40|0,h,d-1|0);u=r+810|0;v=q>>>0>405;j=4;a:{while(1){b:{c:{if(B[a+8>>2]>d>>>0){k=y[c+44>>2];l=y[c+40>>2];ja(c+32|0,h,d);e=y[c+36>>2];m=y[c+32>>2];y[c+40>>2]=m;y[c+44>>2]=e;d:{e:{f:{if(!z[a+1|0]){d=y[a+60>>2];break f}if(z[i|0]){break b}if(!v){break e}d=y[a+60>>2]^ka(i,u);y[a+60>>2]=d}if(d){y[c+20>>2]=k;y[c+16>>2]=l;y[c+24>>2]=m;y[c+28>>2]=e;y[c+8>>2]=m;y[c+12>>2]=e;e=y[c+20>>2];y[c>>2]=y[c+16>>2];y[c+4>>2]=e;Ca(c+8|0,c);break d}d=y[a+24>>2];g=0;s=0;t=0;if(z[a+2|0]==1){ja(c+32|0,y[a+12>>2],d);t=y[c+32>>2];s=y[c+36>>2]}ja(c+32|0,h,d+w[a+17|0]|0);x=y[c+36>>2];A=y[c+32>>2];f=y[h+20>>2];g=!k|(f|0)<2?g:z[l|0]>>>6&1;g=!k|(f|0)<=0?g:z[l|0]>>>6&2|g;p=0;d=0;while(1){if(B[a+4>>2]<=d>>>0){break d}g:{h:{if(z[a+2|0]==1){if(ia(y[y[a+12>>2]+20>>2],d,t,s)){break h}}f=ia(f,w[a+16|0]+d|0,A,x);if(z[i|0]){break b}f=g<<5|f<<4|p;if(f>>>0>=q>>>0){break e}n=ka(i,(f<<1)+r|0);f=y[h+20>>2];if(!n){break h}Ea(f,d,m,e,1);f=y[h+20>>2];n=1;break g}n=0}g=ia(f,d+2|0,l,k)|g<<1&30;d=d+1|0;p=p<<1&14|n;continue}}o()}e=y[b+16>>2];if(!e){d=y[a+24>>2];break c}e=_[y[y[e>>2]+8>>2]](e)|0;d=y[a+24>>2];if(!e){break c}y[a+24>>2]=d+1;j=3}y[a+52>>2]=j;break a}d=d+1|0;y[a+24>>2]=d;continue}break}j=-1}Y=c+48|0;return j|0}function Od(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;c=y[b+60>>2];d=y[b+64>>2];f=b+52|0;Jc(c,d,f);j=((d&536870911)<<3|c>>>29)&-8;if(j>>>0<=B[b+52>>2]){y[a>>2]=0;y[a+4>>2]=0;return}Kc(y[b+68>>2],y[b+72>>2]);h=b+68|0;c=y[b+48>>2];a:{if((c|0)<0){e=y[b+68>>2];c=y[b+72>>2]-e|0;d=0;i=c;g=y[b+80>>2];c=y[b+84>>2]-g|0;Zb(y[b+60>>2],y[b+64>>2],f,e|d,i,d|g,c,y[b+4>>2]);Ic(b+80|0,h);break a}if(!c){d=y[b+68>>2];c=y[b+72>>2]-d|0;Hc(y[b+60>>2],y[b+64>>2],f,d,c,y[b+4>>2]);break a}e=Ia(y[b+60>>2],y[b+64>>2],f);g=y[b+68>>2];c=y[b+72>>2]-g|0;d=y[b+60>>2];k=y[b+64>>2];b:{if(e){Hc(d,k,f,g,c,y[b+4>>2]);break b}i=d;d=0;l=c;e=y[b+80>>2];c=y[b+84>>2]-e|0;Zb(i,k,f,d|g,l,d|e,c,y[b+4>>2])}Ic(b+80|0,h)}if(z[b+57|0]==1){Jc(y[b+60>>2],y[b+64>>2],f)}c:{d:{e:{if(z[b+56|0]!=1){break e}d=y[f>>2];if(j>>>0<=d>>>0){break e}e=d+7&-8;while(1){h=d>>>3|0;g=128>>>(d&7)|0;c=1;f:{while(1){if(!c|d>>>0>=e>>>0){break f}if(h>>>0>=B[b+64>>2]){break d}if(g&z[h+y[b+60>>2]|0]){c=0;w[b+56|0]=0;continue}break}d=d+1|0;continue}break}if(!c){break e}y[f>>2]=e}c=y[b+68>>2];if(!z[b+58|0]){d=y[b+72>>2]-c|0;break c}if(c&3){break d}d=y[b+72>>2]-c|0;e=c+(d&-4)|0;b=c;while(1){if((b|0)==(e|0)){break c}y[b>>2]=y[b>>2]^-1;b=b+4|0;continue}}o()}y[a+4>>2]=d;y[a>>2]=c}function ab(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;i=Y-32|0;Y=i;a:{b:{if(!y[a+16>>2]|y[a+24>>2]>=(b|0)){break b}e=y[a+28>>2];if((268435452/(e|0)|0)<(b|0)){break b}if((b|0)<0){break a}e=ze(e,e>>31,b,0);g=Z;if((g|0)==1|g>>>0>1){break a}k=y[a+12>>2];g=0;j=y[a+16>>2];d=y[a>>2];h=y[a+4>>2];c:{if((d|0)!=(h|0)){y[a+12>>2]=0;y[a+16>>2]=0;f=h-d|0;d:{if(f>>>0>>0){g=y[a+8>>2];if(e>>>0<=g-d>>>0){kd(a,e-f|0);break d}h=Fc(d,g,e);if(h){l=Ad(h)}k=e+l|0;g=f+l|0;d=g;while(1){if((d|0)!=(k|0)){w[d|0]=0;d=d+1|0;continue}break}d=y[a>>2];e=y[a+4>>2];g=g+(d-e|0)|0;f=g;while(1){if((d|0)!=(e|0)){w[f|0]=z[d|0];f=f+1|0;d=d+1|0;continue}break}y[a+4>>2]=k;y[a+8>>2]=h+l;e=y[a>>2];y[a>>2]=g;ma(e);break d}if(e>>>0>=f>>>0){break d}y[a+4>>2]=d+e}e=y[a>>2];y[a+12>>2]=e;d=y[a+4>>2]-e|0;y[a+16>>2]=d;break c}f=Gb(i,e);h=y[f>>2];y[i+12>>2]=h;e=y[f+4>>2];y[i+16>>2]=e;y[i+20>>2]=y[f+8>>2];y[f+8>>2]=0;y[f>>2]=0;y[f+4>>2]=0;y[i+28>>2]=e-h;y[i+24>>2]=h;e=i+12|0;ec(a,e);va(e);va(f);d=y[a+16>>2];if(j>>>0>d>>>0){break a}if(!(g|j)){break c}if(j){p(y[a+12>>2],k,j)}d=y[a+16>>2]}if(d>>>0>>0){break a}c=0-c|0;d=d-j|0;f=y[a+12>>2]+j|0;while(1){if((d|0)>0){w[f|0]=c;d=d-1|0;f=f+1|0;continue}break}y[a+24>>2]=b}Y=i+32|0;return}o()}function nd(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;d=Y-32|0;Y=d;h=y[a+24>>2];y[d+16>>2]=0;a:{b:{switch(z[a+3|0]){case 0:c=Bd(a)?3:4;break a;case 1:c=yd(a)?5:6;break a;case 2:c=Hb(a)?7:8;break a;default:break b}}c=Hb(a)?9:10}e=Y-48|0;Y=e;y[e+24>>2]=0;c:{if(c){y[e+16>>2]=0;y[e+12>>2]=c;y[e+8>>2]=2244;g=e+8|0;y[e+24>>2]=g;if(y[d+16>>2]==(d|0)){f=e+32|0;_[y[y[e+8>>2]+12>>2]](g,f);c=y[e+24>>2];_[y[y[c>>2]+16>>2]](c);y[e+24>>2]=0;c=y[d+16>>2];_[y[y[c>>2]+12>>2]](c,g);c=y[d+16>>2];_[y[y[c>>2]+16>>2]](c);y[d+16>>2]=0;y[e+24>>2]=g;_[y[y[e+32>>2]+12>>2]](f,d);_[y[y[e+32>>2]+16>>2]](f);y[d+16>>2]=d;break c}_[y[y[e+8>>2]+12>>2]](e+8|0,d);c=y[e+24>>2];_[y[y[c>>2]+16>>2]](c);y[e+24>>2]=y[d+16>>2];y[d+16>>2]=d;break c}c=y[d+16>>2];if((c|0)==(d|0)){f=e+8|0;_[y[y[c>>2]+12>>2]](c,f);c=y[d+16>>2];_[y[y[c>>2]+16>>2]](c);y[d+16>>2]=y[e+24>>2];y[e+24>>2]=f;break c}y[e+24>>2]=c;y[d+16>>2]=0}md(e+8|0);Y=e+48|0;c=y[y[b>>2]>>2];f=y[d+16>>2];y[d+28>>2]=b;if(f){f=_[y[y[f>>2]+24>>2]](f,a,d+28|0)|0;y[a+64>>2]=0;y[a+52>>2]=f;b=y[c+20>>2];y[a+68>>2]=h;y[a+72>>2]=b;y[a+76>>2]=y[a+24>>2];if((f|0)==4){y[a+24>>2]=0}md(d);Y=d+32|0;return f}a=vb(4);y[a>>2]=4876;P(a|0,4888,11);o()}function ie(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,l=0;k=Y-16|0;Y=k;l=i?i:c;a:{if((l|0)<=0){break a}j=j?j:d;if((j|0)<=0|(j|l)>>>0>65535){break a}i=na(92);y[i+44>>2]=0;y[i+36>>2]=-1;y[i+40>>2]=0;w[i+32|0]=0;y[i+20>>2]=1;y[i+24>>2]=1;y[i+16>>2]=j;y[i+12>>2]=l;y[i+8>>2]=j;y[i+4>>2]=l;y[i+60>>2]=a;y[i+64>>2]=b;w[i+58|0]=(h|0)!=0;w[i+57|0]=(f|0)!=0;w[i+56|0]=(g|0)!=0;y[i+52>>2]=0;y[i+48>>2]=e;y[i>>2]=1728;a=(l>>>3|0)+3|0;a=((l<<29)-536870912>>>0<3758096384?a+1|0:a)&16380;y[i+28>>2]=a;Gb(i+68|0,a);Gb(i+80|0,y[i+28>>2]);e=c+7>>>3|0;W(E(e,d)|0);c=0;while(1){b:{if((c|0)==(d|0)){break b}c:{j=y[i+36>>2];a=c+1|0;if((j|0)==(a|0)){b=y[i+44>>2];j=y[i+40>>2];break c}d:{if(!((j|0)>=0&(c|0)>=(j|0))){j=0;if(!(_[y[y[i>>2]+12>>2]](i)|0)){break b}b=0;break d}b=1}while(1){if(!b){y[i+36>>2]=j;b=1;continue}e:{if((c|0)>(j|0)){_[y[y[i>>2]+16>>2]](k+8|0,i);j=y[i+36>>2]+1|0;break e}_[y[y[i>>2]+16>>2]](k+8|0,i);b=y[k+12>>2];j=y[k+8>>2];y[i+40>>2]=j;y[i+44>>2]=b;y[i+36>>2]=y[i+36>>2]+1;break c}b=0;continue}}if(!b){break b}V(j|0,e|0,E(c,e)|0);c=a;continue}break}_[y[y[i>>2]+4>>2]](i)}Y=k+16|0}function db(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,q=0,r=0,s=0,t=0,u=0;d=Y-32|0;Y=d;h=ua(a+4|0,a+8|0);y[d+8>>2]=h;i=y[h+12>>2];f=y[h+16>>2];g=f;a:{if(!f){oa(b,0);y[a+52>>2]=-1;break a}b:{f=y[h+28>>2];if((f|0)<0|!f){break b}j=y[c+12>>2]+(y[c+8>>2]<<3)|0;l=g;k=y[a+8>>2];q=y[a+4>>2];r=y[c>>2];s=y[c+4>>2];y[d+20>>2]=0;y[d+12>>2]=0;y[d+16>>2]=0;g=d+12|0;y[d+24>>2]=g;Eb(g,f);e=y[d+16>>2];g=f+e|0;while(1){if((e|0)!=(g|0)){w[e|0]=255;e=e+1|0;continue}break}w[d+28|0]=1;y[d+16>>2]=g;gc(d+24|0);m=y[d+12>>2];g=y[d+16>>2];y[d+24>>2]=j;t=(k|0)>0?k:0;e=0;g=g-m|0;k=e|m;while(1){if((n|0)!=(t|0)){j=i;e=f;if(l>>>0>>0){break b}while(1){if((e|0)>0){w[j|0]=255;e=e-1|0;j=j+1|0;continue}break}Zb(r,s,d+24|0,i|u,f,k,g,q);if(f>>>0>g>>>0){break b}if(f){p(m,i,f)}n=n+1|0;l=l-f|0;i=f+i|0;continue}break}i=y[d+24>>2];va(d+12|0);y[c+12>>2]=i&7;y[c+8>>2]=i>>>3;e=y[h+12>>2];c=e+y[h+16>>2]|0;while(1)if((c|0)==(e|0)){y[a+64>>2]=0;y[a+52>>2]=4;c=y[h+20>>2];y[a+68>>2]=0;y[a+72>>2]=c;y[a+76>>2]=y[h+24>>2];y[d+8>>2]=0;oa(b,h);break a}else{w[e|0]=z[e|0]^-1;e=e+1|0;continue}}o()}la(d+8|0);Y=d+32|0}function Ld(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;f=Y-16|0;Y=f;y[a+44>>2]=0;e=y[a+12>>2];b=y[a+8>>2];while(1){if((b|0)==(e|0)){a:{y[f+4>>2]=0;d=c+1|0;fc(a+60|0,d,f+4|0);e=y[a+12>>2];b=y[a+8>>2];while(1)if((b|0)==(e|0)){y[y[a+60>>2]>>2]=0;y[f+4>>2]=0;b=f+4|0;fc(a+48|0,d,b);y[f+4>>2]=0;fc(a+72|0,d,b);c=0;e=0;b=1;while(1){j=B[a+44>>2]>>0;if(!j){g=b<<2;h=g+y[a+60>>2]|0;i=y[h-4>>2];c=i+c|0;if((c|0)<0|c>>>0>>0){break a}c=c<<1;y[g+y[a+48>>2]>>2]=c;y[g+y[a+72>>2]>>2]=e;b=b+1|0;e=y[h>>2]+e|0;continue}break}Rb(a+84|0,e);b=0;y[f+12>>2]=0;y[f+4>>2]=0;y[f+8>>2]=0;e=0;if(d){e=f+4|0;ed(e,d);qd(e,d);e=y[f+4>>2]}g=y[a+8>>2];h=y[a+12>>2]-g>>3;while(1){if((b|0)==(h|0)){va(f+4|0);break a}c=g+(b<<3)|0;d=y[c>>2];if(d){i=c;d=d<<2;c=d+e|0;y[i+4>>2]=y[c>>2]+y[d+y[a+48>>2]>>2];y[(y[a+84>>2]+(y[d+y[a+72>>2]>>2]<<2)|0)+(y[c>>2]<<2)>>2]=b;y[c>>2]=y[c>>2]+1}b=b+1|0;continue}}else{c=y[a+60>>2]+(y[b>>2]<<2)|0;y[c>>2]=y[c>>2]+1;b=b+8|0;continue}}}else{d=y[b>>2];c=c>>>0>>0?d:c;y[a+44>>2]=c;b=b+8|0;continue}break}Y=f+16|0;return j}function Md(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0;b=y[1420];c=a+7&-8;a=c+7|0;d=a>>>0<7?1:d;e=a&-8;a=e+b|0;a:{b:{if(!(a>>>0>>0?d+1|0:d)){if(a>>>0<=$()<<16>>>0){break b}if(R(a|0)|0){break b}}y[1428]=48;b=-1;break a}y[1420]=a}d=b;if((d|0)!=-1){a=d+c|0;y[a-4>>2]=16;f=a-16|0;y[f>>2]=16;b=y[1688];if(b){e=y[b+8>>2]}else{e=0}c:{d:{if((e|0)==(d|0)){e=y[d-4>>2]&-2;g=d-e|0;h=y[g-4>>2];y[b+8>>2]=a;b=h&-2;a=g-b|0;if(y[(a+y[a>>2]|0)-4>>2]&1){f=y[a+4>>2];g=y[a+8>>2];y[f+8>>2]=g;y[g+4>>2]=f;b=(b+(c+e|0)|0)-16|0;y[a>>2]=b;break c}a=d-16|0;break d}y[d>>2]=16;y[d+8>>2]=a;y[d+4>>2]=b;y[d+12>>2]=16;y[1688]=d;a=d+16|0}b=f-a|0;y[a>>2]=b}y[((b&-4)+a|0)-4>>2]=b|1;c=y[a>>2]-8|0;e:{if(c>>>0<=127){b=(c>>>3|0)-1|0;break e}e=H(c);b=((c>>>29-e^4)-(e<<2)|0)+110|0;if(c>>>0<=4095){break e}b=((c>>>30-e^2)-(e<<1)|0)+71|0;b=b>>>0>=63?63:b}c=b<<4;y[a+4>>2]=c+5728;c=c+5736|0;y[a+8>>2]=y[c>>2];y[c>>2]=a;y[y[a+8>>2]+4>>2]=a;c=y[1691];a=b&31;if((b&63)>>>0>=32){b=1<>>32-a}y[1690]=e|y[1690];y[1691]=b|c}return(d|0)!=-1}function tb(a,b){var c=0,d=0,e=0;c=Y+-64|0;Y=c;d=y[a>>2];e=y[d-8>>2];d=y[d-4>>2];a:{if(y[d+4>>2]==y[b+4>>2]){a=e?0:a;break a}e=a+e|0;if((e|0)<=(a|0)){y[c+16>>2]=0;y[c+20>>2]=0;y[c+12>>2]=b;y[c+8>>2]=a;y[c+4>>2]=d;y[c+24>>2]=0;y[c+28>>2]=0;y[c+32>>2]=0;y[c+36>>2]=0;y[c+40>>2]=0;y[c+44>>2]=0;y[c+48>>2]=0;y[c+60>>2]=0;y[c+52>>2]=1;y[c+56>>2]=16777216;_[y[y[d>>2]+20>>2]](d,c+4|0,e,e,1,0);if(y[c+28>>2]){break a}}y[c+16>>2]=0;y[c+20>>2]=0;y[c+12>>2]=4984;y[c+8>>2]=a;y[c+4>>2]=b;y[c+24>>2]=0;y[c+28>>2]=0;y[c+32>>2]=0;y[c+36>>2]=0;y[c+40>>2]=0;y[c+44>>2]=0;y[c+48>>2]=0;y[c+52>>2]=0;a=0;w[c+55|0]=0;w[c+56|0]=0;w[c+57|0]=0;w[c+58|0]=0;y[c+60>>2]=0;w[c+59|0]=1;_[y[y[d>>2]+24>>2]](d,c+4|0,e,1,0);b:{switch(y[c+40>>2]){case 0:a=y[c+44>>2]==1?y[c+32>>2]==1?y[c+36>>2]==1?y[c+24>>2]:0:0:0;break a;case 1:break b;default:break a}}if(y[c+28>>2]!=1){if(y[c+44>>2]|y[c+32>>2]!=1|y[c+36>>2]!=1){break a}}a=y[c+20>>2]}Y=c- -64|0;return a}function _b(a,b){var c=0,d=0,e=0,f=0,g=0;e=a+4|0;d=e+7&-8;c=y[a>>2];if(d+b>>>0<=(c+a|0)-4>>>0){f=y[a+4>>2];g=y[a+8>>2];y[f+8>>2]=g;y[g+4>>2]=f;if((d|0)!=(e|0)){d=d-e|0;f=a-(y[a-4>>2]&-2)|0;e=d+y[f>>2]|0;y[f>>2]=e;y[(f+(e&-4)|0)-4>>2]=e;a=a+d|0;c=c-d|0;y[a>>2]=c}a:{if(b+24>>>0<=c>>>0){e=a+b|0;c=(c-b|0)-8|0;y[e+8>>2]=c;g=e+8|0;y[(g+(c&-4)|0)-4>>2]=c|1;d=y[e+8>>2]-8|0;b:{if(d>>>0<=127){c=(d>>>3|0)-1|0;break b}f=H(d);c=((d>>>29-f^4)-(f<<2)|0)+110|0;if(d>>>0<=4095){break b}c=((d>>>30-f^2)-(f<<1)|0)+71|0;c=c>>>0>=63?63:c}d=c<<4;y[e+12>>2]=d+5728;d=d+5736|0;y[e+16>>2]=y[d>>2];y[d>>2]=g;y[y[e+16>>2]+4>>2]=g;d=y[1690];f=y[1691];e=c&31;if((c&63)>>>0>=32){c=1<>>32-e}y[1690]=g|d;y[1691]=c|f;c=b+8|0;y[a>>2]=c;b=(c&-4)+a|0;break a}b=a+c|0}y[b-4>>2]=c;a=a+4|0}else{a=0}return a}function ya(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;g=Y-16|0;Y=g;k=y[b+44>>2];f=1;while(1){a:{b:{if(f>>>0>k>>>0){e=-1;break b}e=-1;h=y[a>>2];j=y[h+8>>2];d=y[h>>2];if(B[h+4>>2]<=j>>>0){break b}d=z[d+j|0]>>>7-y[h+12>>2]&1;y[g+12>>2]=d;Tb(h);if((i|0)<0){break b}i=d|i<<1;if(B[b+44>>2]>>0){break a}d=f<<2;e=y[d+y[b+48>>2]>>2];if(e>>>0>i>>>0){break a}e=i-e|0;if(e>>>0>=B[d+y[b+60>>2]>>2]){break a}d=y[(y[b+84>>2]+(y[d+y[b+72>>2]>>2]<<2)|0)+(e<<2)>>2];e=1;if(z[b+1|0]==1&(d|0)==(y[b+4>>2]-1|0)){break b}e=-1;f=y[a>>2];a=d<<2;if((Fa(f,y[a+y[b+20>>2]>>2],g+12|0)|0)==-1){break b}e=0;f=y[a+y[b+32>>2]>>2];a=y[g+12>>2];y[c>>2]=f+((d|0)==(y[b+4>>2]+(z[b+1|0]?-3:-2)|0)?0-a|0:a)}Y=g+16|0;return e}f=f+1|0;continue}}function ma(a){a=a|0;var b=0,c=0,d=0,e=0,f=0;if(a){b=a-4|0;f=y[b>>2];c=f;d=b;e=y[a-8>>2];a=e&-2;if((a|0)!=(e|0)){d=b-a|0;c=y[d+4>>2];e=y[d+8>>2];y[c+8>>2]=e;y[e+4>>2]=c;c=a+f|0}a=b+f|0;b=y[a>>2];if((b|0)!=y[(a+b|0)-4>>2]){f=y[a+4>>2];a=y[a+8>>2];y[f+8>>2]=a;y[a+4>>2]=f;c=b+c|0}y[d>>2]=c;y[((c&-4)+d|0)-4>>2]=c|1;b=y[d>>2]-8|0;a:{if(b>>>0<=127){a=(b>>>3|0)-1|0;break a}c=H(b);a=((b>>>29-c^4)-(c<<2)|0)+110|0;if(b>>>0<=4095){break a}a=((b>>>30-c^2)-(c<<1)|0)+71|0;a=a>>>0>=63?63:a}b=a<<4;y[d+4>>2]=b+5728;b=b+5736|0;y[d+8>>2]=y[b>>2];y[b>>2]=d;y[y[d+8>>2]+4>>2]=d;b=y[1690];c=y[1691];d=a&31;if((a&63)>>>0>=32){a=1<>>32-d}y[1690]=e|b;y[1691]=a|c}}function fd(a,b){var c=0,d=0,e=0,f=0,g=0;a:{b:{c=y[a+4>>2];d=y[a>>2];e=c-d|0;f=e>>3;c:{if(f>>>0>>0){d=y[a+8>>2]-d|0;if(d>>3>>>0>=b>>>0){b=(b-f<<3)+c|0;while(1){if((b|0)!=(c|0)){y[c>>2]=0;y[c+4>>2]=0;c=c+8|0;continue}break}y[a+4>>2]=b;return}if(b>>>0>=536870912){break b}c=d>>2;d=d>>>0>=2147483640?536870911:b>>>0>>0?c:b;if(d>>>0>=536870912){break a}c=b-f<<3;g=na(d<<3);b=g+e|0;f=c+b|0;c=b;while(1){if((c|0)!=(f|0)){y[c>>2]=0;y[c+4>>2]=0;c=c+8|0;continue}break}e=b;b=y[a>>2];c=y[a+4>>2]-b|0;e=e-c|0;if(c){p(e,b,c)}y[a+4>>2]=f;y[a>>2]=e;y[a+8>>2]=g+(d<<3);if(!b){break c}ma(b);return}if(b>>>0>=f>>>0){break c}y[a+4>>2]=d+(b<<3)}return}za();o()}Wa();o()}function Wb(a,b,c,d,e){var f=0,g=0,h=0;a:{b:{c:{if((d|0)<0){break c}if((c|0)<=(d|0)){break a}g=0-(e^1)|0;e=d&7;if(e){f=d>>>3|0;if(f>>>0>=b>>>0){break c}e=(z[a+f|0]^g)&255>>>e;if(e){break b}d=d+7|0}e=d>>>3|0;h=c+7>>>3|0;while(1){d=e;e=d+4|0;if(h>>>0>>0){e=g&255;while(1){if(d>>>0>=h>>>0){break a}if(b>>>0<=d>>>0){break c}f=z[a+d|0];if((f|0)!=(e|0)){a=H((f^g)<<24)|d<<3;return(a|0)>(c|0)?c:a}else{d=d+1|0;continue}}}if(b>>>0>>0|b-d>>>0<=3){break c}f=a+d|0;f=z[f|0]|z[f+1|0]<<8|(z[f+2|0]<<16|z[f+3|0]<<24);f=((Ae(f,16)^f)&-16711936)>>>8^Ae(f,8);if((f|0)==(g|0)){continue}break}a=H(f^g)+(d<<3)|0;return(a|0)>(c|0)?c:a}o()}c=H(e<<24)|d&2147483640}return c}function gb(a,b,c,d,e){var f=0,g=0,h=0;a:{d=(d|0)>0?d:0;f=(e|0)>=0?(c|0)<(e|0)?c:e:0;if((d|0)>=(f|0)){break a}b:{h=d>>>3|0;if(h>>>0>=b>>>0){break b}e=d&7;c=a+h|0;g=f-1|0;f=g>>>3|0;if((f|0)==(h|0)){a=g&7;while(1){if(a>>>0>>0){break a}w[c|0]=z[c|0]+(-128>>e);e=e+1|0;continue}}d=z[c|0];while(1)if((e|0)==8){w[c|0]=d;if(b>>>0<=f>>>0){break b}d=(g&7)+1|0;g=a+f|0;c=z[g|0];e=0;while(1)if((d|0)==(e|0)){w[g|0]=c;c=h+1|0;if(c>>>0>=f>>>0){break a}e=f+(h^-1)|0;if(e>>>0>b-c>>>0){break b}c=a+c|0;while(1){if((e|0)<=0){break a}w[c|0]=0;e=e-1|0;c=c+1|0;continue}}else{c=(-128>>e)+c|0;e=e+1|0;continue}}else{d=(-128>>e)+d|0;e=e+1|0;continue}}o()}}function zb(a,b){var c=0,d=0,e=0,f=0,g=0;a:{b:{c=y[a+4>>2];d=y[a>>2];e=c-d|0;f=e>>2;c:{if(f>>>0>>0){d=y[a+8>>2]-d|0;if(d>>2>>>0>=b>>>0){b=(b-f<<2)+c|0;while(1){if((b|0)!=(c|0)){y[c>>2]=0;c=c+4|0;continue}break}y[a+4>>2]=b;return}if(b>>>0>=1073741824){break b}c=d>>1;d=d>>>0>=2147483644?1073741823:b>>>0>>0?c:b;if(d>>>0>=1073741824){break a}c=b-f<<2;g=na(d<<2);b=g+e|0;f=c+b|0;c=b;while(1){if((c|0)!=(f|0)){y[c>>2]=0;c=c+4|0;continue}break}e=b;b=y[a>>2];c=y[a+4>>2]-b|0;e=e-c|0;if(c){p(e,b,c)}y[a+4>>2]=f;y[a>>2]=e;y[a+8>>2]=g+(d<<2);if(!b){break c}ma(b);return}if(b>>>0>=f>>>0){break c}y[a+4>>2]=d+(b<<2)}return}za();o()}Wa();o()}function ka(a,b){var c=0,d=0,e=0,f=0;c=z[b+1|0];if(c>>>0<47){c=E(c,6);e=A[c+1808>>1];d=y[a+8>>2]-e|0;y[a+8>>2]=d;c=c+1808|0;f=y[a+4>>2];a:{if(d>>>0>f>>>16>>>0){if(d&32768){return z[b|0]}if(d>>>0>>0){d=z[b|0]^1;e=z[c+3|0];if(z[c+4|0]==1){w[b|0]=d&1}w[b+1|0]=e;b=d&1;break a}w[b+1|0]=z[c+2|0];b=z[b|0];break a}y[a+4>>2]=f-(d<<16);b:{if(d>>>0>>0){w[b+1|0]=z[c+2|0];b=z[b|0];break b}d=z[b|0]^1;f=z[c+3|0];if(z[c+4|0]==1){w[b|0]=d&1}w[b+1|0]=f;b=d&1}y[a+8>>2]=e}c=y[a+12>>2];while(1){if(!c){Ec(a);c=y[a+12>>2]}c=c-1|0;y[a+12>>2]=c;d=y[a+8>>2];y[a+8>>2]=d<<1;y[a+4>>2]=y[a+4>>2]<<1;if(!(d&16384)){continue}break}return b}o()}function tc(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;e=Y-32|0;Y=e;x[a>>1]=0;t(a+4|0,0,92);y[e+28>>2]=0;y[e+20>>2]=0;y[e+24>>2]=0;a:{b:{d=c+2|0;if(d){if(d>>>0>=536870912){break b}d=d<<3;f=na(d);y[e+20>>2]=f;g=d+f|0;y[e+28>>2]=g;d=f;while(1){if((d|0)!=(g|0)){y[d>>2]=0;y[d+4>>2]=0;d=d+8|0;continue}break}y[e+24>>2]=g}i=b+c|0;d=0;while(1){if((b|0)==(i|0)){break a}j=z[b|0];h=(d<<3)+f|0;y[h+4>>2]=d;w[h+1|0]=0;w[h|0]=j;b=b+1|0;d=d+1|0;continue}}za();o()}b=(c<<3)+f|0;y[b+4>>2]=0;x[b>>1]=0;y[b+12>>2]=0;x[b+8>>1]=0;y[e+16>>2]=g-f>>3;y[e+12>>2]=f;w[e+8|0]=0;k=a,l=gd(a,e+8|0),w[k|0]=l;va(e+20|0);Y=e+32|0;return a}function _d(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;a:{if(Pa(a,y[b+8>>2],e)){if(y[b+28>>2]==1|y[b+4>>2]!=(c|0)){break a}y[b+28>>2]=d;return}if(Pa(a,y[b>>2],e)){if(!(y[b+16>>2]!=(c|0)&y[b+20>>2]!=(c|0))){if((d|0)!=1){break a}y[b+32>>2]=1;return}y[b+32>>2]=d;b:{if(y[b+44>>2]==4){break b}x[b+52>>1]=0;a=y[a+8>>2];_[y[y[a>>2]+20>>2]](a,b,c,c,1,e);if(z[b+53|0]==1){y[b+44>>2]=3;if(!z[b+52|0]){break b}break a}y[b+44>>2]=4}y[b+20>>2]=c;y[b+40>>2]=y[b+40>>2]+1;if(y[b+36>>2]!=1|y[b+24>>2]!=2){break a}w[b+54|0]=1;return}a=y[a+8>>2];_[y[y[a>>2]+24>>2]](a,b,c,d,e)}}function Yb(a,b,c,d,e,f){var g=0,h=0,i=0,j=0,k=0,l=0;l=((e&536870911)<<3|d>>>29)&-8;a:{b:{c:while(1){d:{if(c>>>0<=g>>>0){break d}j=z[b+g|0];if((j|0)==255){break b}h=y[f>>2];if(h>>>0>=l>>>0){break b}i=h>>>3|0;if(i>>>0>=e>>>0){break d}i=z[d+i|0];y[f>>2]=h+1;k=k<<1|(i<<(h&7)&128)>>>7;g=g+1|0;h=g+E(j,3)|0;while(1){if((g|0)>=(h|0)){continue c}if(c>>>0<=g>>>0){break d}if(z[b+g|0]==(k|0)){d=g+1|0;if(d>>>0>=c>>>0){break d}e=c;c=g+2|0;if(e>>>0<=c>>>0){break d}x[a>>1]=z[b+d|0]|z[b+c|0]<<8;b=1;break a}else{g=g+3|0;continue}}}break}o()}w[a|0]=0;b=0}w[a+2|0]=b}function Wc(a,b,c,d,e,f,g){y[a+8>>2]=0;a:{b:{if(!(b&255)){c:{switch(c|0){case 1:y[a+4>>2]=e;y[a>>2]=d;y[a+8>>2]=f-1;return;case 3:y[a+4>>2]=e;break a;case 0:y[a>>2]=d;y[a+8>>2]=f-1;y[a+4>>2]=(e-g|0)+1;return;case 2:break c;default:break b}}y[a+4>>2]=(e-g|0)+1;break a}d:{switch(c|0){case 1:y[a+4>>2]=d;y[a>>2]=e;y[a+8>>2]=g-1;return;case 3:y[a+4>>2]=d;y[a+8>>2]=g-1;y[a>>2]=(e-f|0)+1;return;case 0:y[a>>2]=e;y[a+4>>2]=(d-g|0)+1;return;case 2:break d;default:break b}}y[a+4>>2]=(d-g|0)+1;y[a>>2]=(e-f|0)+1}return}y[a>>2]=(d-f|0)+1}function fb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;a:{c=y[a+4>>2];d=y[a>>2];e=c-d|0;f=e>>1;if(f>>>0>>0){g=y[a+8>>2];if(g-d>>1>>>0>=b>>>0){b=(b-f<<1)+c|0;while(1){if((b|0)!=(c|0)){w[c|0]=0;w[c+1|0]=0;c=c+2|0;continue}break}y[a+4>>2]=b;return}d=Cc(d,g,b);if(d){h=Bc(d)}c=b-f<<1;b=e+h|0;f=c+b|0;c=b;while(1){if((c|0)!=(f|0)){w[c|0]=0;w[c+1|0]=0;c=c+2|0;continue}break}e=b;b=y[a>>2];c=y[a+4>>2]-b|0;e=e-c|0;if(c){p(e,b,c)}y[a+4>>2]=f;y[a>>2]=e;y[a+8>>2]=(d<<1)+h;if(!b){break a}ma(b);return}if(b>>>0>=f>>>0){break a}y[a+4>>2]=d+(b<<1)}}function sd(a,b,c){var d=0,e=0;d=Y-32|0;Y=d;y[a+24>>2]=0;y[a+28>>2]=0;y[a+16>>2]=0;y[a+20>>2]=0;y[a+8>>2]=0;y[a+12>>2]=0;y[a>>2]=0;y[a+4>>2]=0;a:{b:{if(b-2147483617>>>0<2147483680|(c|0)<=0){break b}e=b+31&2147483616;if(2147483616/(e>>>0)>>>0>>0){break b}y[a+24>>2]=c;y[a+20>>2]=b;b=e>>>3|0;y[a+28>>2]=b;b=ze(c,0,b,0);if(Z){break a}b=Gb(d,b);c=y[b>>2];y[d+12>>2]=c;e=y[b+4>>2];y[d+16>>2]=e;y[d+20>>2]=y[b+8>>2];y[b+8>>2]=0;y[b>>2]=0;y[b+4>>2]=0;y[d+28>>2]=e-c;y[d+24>>2]=c;c=d+12|0;ec(a,c);va(c);va(b)}Y=d+32|0;return a}o()}function Fa(a,b,c){var d=0,e=0,f=0,g=0;e=-1;g=y[a>>2];a:{f=y[a+8>>2];d=y[a+4>>2];if(f>>>0>=d>>>0){break a}b:{if((d|0)==536870912|d>>>0>536870912){break b}f=y[a+12>>2]+(f<<3)|0;if(f>>>0>(((d&536870911)<<3|g>>>29)&-8)>>>0){break a}y[c>>2]=0;g=y[a>>2];d=y[a+4>>2];if((d|0)==536870912|d>>>0>536870912){break b}d=((d&536870911)<<3|g>>>29)&-8;e=d>>>0>>0?d-f|0:b;while(1){if(!e){e=0;break a}b=y[a+8>>2];if(b>>>0>=B[a+4>>2]){break b}y[c>>2]=z[b+y[a>>2]|0]>>>7-y[a+12>>2]&1|y[c>>2]<<1;Tb(a);e=e-1|0;continue}}o()}return e}function Aa(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;f=Y-16|0;Y=f;i=ka(b,y[a>>2]+2|0);d=i|2;while(1){a:{if((e|0)==5){e=5;break a}d=d<<1;g=ka(b,d+y[a>>2]|0);d=d|g;if(!g){break a}e=e+1|0;continue}break}g=0;e=e<<3;h=y[e+2092>>2];h=(h|0)>0?h:0;k=e+2092|0;e=0;while(1){if((e|0)!=(h|0)){d=d<<1;j=ka(b,d+y[a>>2]|0);d=j|d;d=(d|0)>255?d&255|256:d;g=g<<1|j;e=e+1|0;continue}break}w[f+8|0]=1;y[f+12>>2]=y[k+4>>2];e=0;d=0;if(z[La(f+8|0,g)|0]){a=y[f+12>>2];b=a>>31;e=i?b-(a^b)|0:a;d=!i|(e|0)!=0}y[c>>2]=e;Y=f+16|0;return d}function zc(a,b,c,d,e){var f=0,g=0;y[a>>2]=0;f=na(24);y[f+8>>2]=0;y[f+12>>2]=0;g=b;b=(c|0)==268435456|c>>>0<268435456;y[f>>2]=b?g:0;y[f+4>>2]=b?c:0;y[f+16>>2]=0;y[f+20>>2]=0;y[a+8>>2]=0;y[a+12>>2]=0;y[a+4>>2]=f;y[a+16>>2]=0;y[a+20>>2]=0;y[a+24>>2]=0;y[a+28>>2]=0;y[a+32>>2]=0;c=na(64);y[a+36>>2]=c;b=c- -64|0;y[a+44>>2]=b;f=0;while(1){if((f|0)!=64){y[c+f>>2]=0;f=f+4|0;continue}break}y[a+52>>2]=10;w[a+49|0]=0;w[a+50|0]=0;w[a+48|0]=e;y[a+40>>2]=b;t(a+56|0,0,49);w[a+112|0]=0;y[a+108>>2]=d;return a}function Ob(a,b){var c=0,d=0,e=0,f=0;e=Y-16|0;Y=e;c=4;a:{b:{if(y[a+4>>2]-1>>>0>65534|y[a+8>>2]-1>>>0>=65535){break b}y[a+52>>2]=2;f=y[b>>2];d=y[f>>2];if(!d){c=ua(a+4|0,a+8|0);y[e+12>>2]=0;oa(f,c);la(e+12|0);d=y[f>>2]}c=y[d+16>>2];if(!c){oa(f,0);c=-1;break b}d=y[d+12>>2];while(1){if((c|0)>0){w[d|0]=0;c=c-1|0;d=d+1|0;continue}break}y[a+60>>2]=0;x[a+56>>1]=1;y[a+24>>2]=0;y[a+28>>2]=0;y[a+32>>2]=0;y[a+36>>2]=0;y[a+40>>2]=0;y[a+44>>2]=0;y[a+48>>2]=0;c=nd(a,b);break a}y[a+52>>2]=c}Y=e+16|0;return c}function _c(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;a:{c=y[a+4>>2];d=y[a+8>>2];b:{if(c>>>0>>0){e=y[b>>2];y[b>>2]=0;y[c>>2]=e;b=c+4|0;break b}f=y[a>>2];e=c-f|0;h=e>>2;c=h+1|0;if(c>>>0>=1073741824){break a}d=d-f|0;g=d>>1;g=d>>>0>=2147483644?1073741823:c>>>0>>0?g:c;c:{if(!g){c=e;d=0;break c}d=Fb(g);f=y[a>>2];c=y[a+4>>2]-f|0;h=c>>2}i=y[b>>2];y[b>>2]=0;b=d+e|0;y[b>>2]=i;e=b-(h<<2)|0;if(c){p(e,f,c)}y[a+8>>2]=(g<<2)+d;b=b+4|0;y[a+4>>2]=b;y[a>>2]=e;if(!f){break b}ma(f)}y[a+4>>2]=b;return}za();o()}function rb(a,b){var c=0;c=y[a>>2];y[a>>2]=b;if(c){Vb(c+80|0);ta(c+76|0);ta(c+72|0);Ha(c+60|0);b=y[c+36>>2];if(b){a=y[c+40>>2];while(1){if((a|0)!=(b|0)){a=pa(a-4|0);continue}break}y[c+40>>2]=b;ma(y[c+36>>2])}la(c+32|0);b=y[c+20>>2];if(b){a=y[c+24>>2];while(1){if((a|0)!=(b|0)){a=Ub(a-4|0);continue}break}y[c+24>>2]=b;ma(y[c+20>>2])}b=y[c+8>>2];if(b){a=y[c+12>>2];while(1){if((a|0)!=(b|0)){a=Vb(a-4|0);continue}break}y[c+12>>2]=b;ma(y[c+8>>2])}a=y[c+4>>2];y[c+4>>2]=0;if(a){ma(a)}ma(sb(c))}}function xd(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;d=Y-16|0;Y=d;a:{e=y[a+4>>2];b:{if(e>>>0>b>>>0){break b}c=e;if(y[a+8>>2]<<5>>>0>>0){if((b|0)<0){break a}f=(b-1>>>5|0)+1|0;g=na(f<<2);h=y[a>>2];c=y[a+4>>2];i=c?(c-1>>>3&536870908)+4|0:0;if(i){p(g,h,i)}y[a>>2]=g;y[d+4>>2]=h;y[a+4>>2]=c;y[d+8>>2]=c;c=y[a+8>>2];y[a+8>>2]=f;y[d+12>>2]=c;lc(d+4|0);c=y[a+4>>2]}if((b|0)==(e|0)){break b}$c(y[a>>2]+(c>>>3&536870908)|0,c&31,b-e|0)}y[a+4>>2]=b;Y=d+16|0;return}za();o()}function Hc(a,b,c,d,e,f){var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;h=Y-16|0;Y=h;l=((b&536870911)<<3|a>>>29)&-8;j=1;while(1){a:{if(B[c>>2]>=l>>>0){break a}k=j&1;n=k?325:326;o=k?1056:1392;i=0;while(1){Yb(h+12|0,o,n,a,b,c);if(!z[h+14|0]){while(1){if(B[c>>2]>=l>>>0){break a}if(!Ia(a,b,c)){continue}break}break a}g=A[h+12>>1];i=g+i|0;if((i|0)>(f|0)){break a}if(g>>>0>=64){continue}break}g=i+m|0;if(!k){gb(d,e,f,m,g)}j=j^1;m=g;if((f|0)>(g|0)){continue}}break}Y=h+16|0}function te(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0;e=y[y[b>>2]>>2];if(!y[a+48>>2]){c=y[e+16>>2];y[a+44>>2]=y[e+12>>2];y[a+48>>2]=c}c=y[a+4>>2];if(c){c=c-1|0;f=c>>>3|0;g=(c&7)+1|0;c=y[a+24>>2];while(1){a:{if(B[a+8>>2]<=c>>>0){b=4}else{if(!jc(a,b,2204,f,g)){return-1}Db(a,e);d=y[b+16>>2];c=y[a+24>>2];if(!d|(c>>>0)%50){break a}d=_[y[y[d>>2]+8>>2]](d)|0;c=y[a+24>>2];if(!d){break a}y[a+24>>2]=c+1;b=3}y[a+52>>2]=b;return b|0}c=c+1|0;y[a+24>>2]=c;continue}}o()}function xe(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0;d=y[y[b>>2]>>2];if(!y[a+48>>2]){c=y[d+16>>2];y[a+44>>2]=y[d+12>>2];y[a+48>>2]=c}c=y[a+4>>2];if(c){e=y[a+8>>2]&2147483647;c=c-1|0;f=c>>>3|0;g=(c&7)+1|0;c=y[a+24>>2];while(1){a:{if(c>>>0>=e>>>0){b=4}else{if(!jc(a,b,2140,f,g)){return-1}Db(a,d);c=y[b+16>>2];if(!c){break a}if(!(_[y[y[c>>2]+8>>2]](c)|0)){break a}y[a+24>>2]=y[a+24>>2]+1;b=3}y[a+52>>2]=b;return b|0}c=y[a+24>>2]+1|0;y[a+24>>2]=c;continue}}o()}function Xd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;if(y[b+4>>2]==5252){b=y[a+12>>2];a:{if(b){a=5240;if(tb(b,5128)){break a}}a=5248}y[c>>2]=a;return 1}e=y[a+8>>2];b:{c:{if(!(e&24)){d=tb(b,5080);if(!d){break c}c=1;if(!Pa(a,b,(y[d+8>>2]&24)!=0)){break c}break b}c=1;if(Pa(a,b,1)){break b}}c=0;b=tb(b,5180);if(!b){break b}d=y[b+8>>2];if(d&(e^-1)&7|(d^-1)&e&96|y[y[a+12>>2]+4>>2]!=y[y[b+12>>2]+4>>2]){break b}c=y[y[a+16>>2]+4>>2]==y[y[b+16>>2]+4>>2]}return c|0}function za(){var a=0,b=0,c=0,d=0;c=vb(8);y[c>>2]=5476;a=4523;b=0;a:{if(!z[4523]){break a}b:{c:{while(1){a=a+1|0;if(!(a&3)){break c}if(z[a|0]){continue}break}break b}while(1){b=a;a=a+4|0;d=y[b>>2];if(((16843008-d|d)&-2139062144)==-2139062144){continue}break}while(1){a=b;b=a+1|0;if(z[a|0]){continue}break}}b=a-4523|0}a=na(b+13|0);y[a+8>>2]=0;y[a+4>>2]=b;y[a>>2]=b;a=a+12|0;b=b+1|0;if(b){p(a,4523,b)}y[c>>2]=5524;y[c+4>>2]=a;P(c|0,5536,1);o()}function ve(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;d=y[y[b>>2]>>2];if(!y[a+48>>2]){c=y[d+16>>2];y[a+44>>2]=y[d+12>>2];y[a+48>>2]=c}c=y[a+4>>2];if(c){c=c-1|0;e=c>>>3|0;f=(c&7)+1|0;c=y[a+24>>2];while(1){a:{if(B[a+8>>2]<=c>>>0){b=4}else{if(!jc(a,b,2172,e,f)){return-1}Db(a,d);c=y[b+16>>2];if(!c){break a}if(!(_[y[y[c>>2]+8>>2]](c)|0)){break a}y[a+24>>2]=y[a+24>>2]+1;b=3}y[a+52>>2]=b;return b|0}c=y[a+24>>2]+1|0;y[a+24>>2]=c;continue}}o()}function Ec(a){var b=0,c=0,d=0,e=0,f=0;e=255;b=y[a+16>>2];a:{if(z[a+1|0]==255){f=8;d=y[b+8>>2];c=d+1|0;if(c>>>0>=B[b+4>>2]){break a}c=z[c+y[b>>2]|0];if(c>>>0>143){break a}Dc(b);w[a+1|0]=c;y[a+4>>2]=(y[a+4>>2]-(c<<9)|0)+65024;b=y[a+16>>2];d=y[b+8>>2];f=7;break a}Dc(b);f=8;b=y[a+16>>2];d=y[b+8>>2];c=y[b>>2];e=B[b+4>>2]>d>>>0?z[c+d|0]:e;w[a+1|0]=e;y[a+4>>2]=(y[a+4>>2]-(e<<8)|0)+65280}y[a+12>>2]=f;if(B[b+4>>2]<=d>>>0){w[a|0]=1}}function Jb(a,b){var c=0,d=0,e=0,f=0;a:{b:{if((a|0)!=(b|0)){f=y[b+4>>2];d=y[b>>2];b=f-d|0;c=y[a>>2];if(b>>>0<=y[a+8>>2]-c>>>0){e=y[a+4>>2]-c|0;if(e>>>0>>0){if(e){p(c,d,e)}b=y[a+4>>2];d=d+e|0;c=f-d|0;if(c){p(b,d,c)}break a}if(b){p(c,d,b)}break a}kc(a);e=Cc(y[a>>2],y[a+8>>2],b>>1);if((e|0)<0){break b}c=Bc(e);y[a+4>>2]=c;y[a>>2]=c;y[a+8>>2]=c+(e<<1);if(b){p(c,d,b)}y[a+4>>2]=b+c}return a}za();o()}y[a+4>>2]=b+c;return a}function Bb(a,b,c,d){var e=0,f=0,g=0,h=0,i=0;f=b-1|0;g=y[d>>2];e=y[d+4>>2];a:{if((ia(a,f,g,e)|0)!=(c|0)){break a}if((ia(a,b,g,e)|0)!=(c|0)){break a}h=b+1|0;if((ia(a,h,g,e)|0)!=(c|0)){break a}g=y[d+8>>2];e=y[d+12>>2];if((ia(a,f,g,e)|0)!=(c|0)){break a}if((ia(a,h,g,e)|0)!=(c|0)){break a}e=f;f=y[d+16>>2];d=y[d+20>>2];if((ia(a,e,f,d)|0)!=(c|0)){break a}if((ia(a,b,f,d)|0)!=(c|0)){break a}i=(ia(a,h,f,d)|0)==(c|0)}return i}function Rb(a,b){var c=0,d=0,e=0,f=0,g=0;a:{c=y[a>>2];d=y[a+4>>2]-c|0;e=d>>2;if(e>>>0>>0){f=y[a+8>>2];if(f-c>>2>>>0>=b>>>0){qd(a,b-e|0);return}f=pd(c,f,b);g=Fb(f);c=d+g|0;e=c+(b-e<<2)|0;b=c;while(1){if((b|0)!=(e|0)){y[b>>2]=0;b=b+4|0;continue}break}d=c;b=y[a>>2];c=y[a+4>>2]-b|0;d=d-c|0;if(c){p(d,b,c)}y[a+4>>2]=e;y[a>>2]=d;y[a+8>>2]=(f<<2)+g;if(!b){break a}ma(b);return}if(b>>>0>=e>>>0){break a}y[a+4>>2]=c+(b<<2)}}function hd(a,b,c,d,e,f,g,h,i,j){var k=0,l=0;Ea(y[b+20>>2],d,i,j,e);i=y[a+12>>2];j=y[c>>2];b=ia(y[b+20>>2],d+2|0,g,h);y[c+4>>2]=e;y[c>>2]=b|j<<1&2;e=y[c+8>>2];a=y[a+20>>2];b=(d-i|0)+2|0;k=c,l=ia(y[a+20>>2],b,y[f>>2],y[f+4>>2])|e<<1&2,y[k+8>>2]=l;d=y[c+12>>2];k=c,l=ia(y[a+20>>2],b,y[f+8>>2],y[f+12>>2])|d<<1&6,y[k+12>>2]=l;d=y[c+16>>2];k=c,l=ia(y[a+20>>2],b,y[f+16>>2],y[f+20>>2])|d<<1&6,y[k+16>>2]=l}function mc(a){var b=0,c=0,d=0,e=0;e=Y-16|0;Y=e;b=na(32);y[b+8>>2]=0;y[b>>2]=0;y[b+4>>2]=0;c=y[a+4>>2];d=y[a>>2];y[e+8>>2]=b;if((c|0)!=(d|0)){Eb(b,c-d|0);Xb(b,d,c)}w[e+12|0]=1;gc(e+8|0);c=y[b>>2];d=y[b+4>>2];a:{if((c|0)!=(d|0)){y[b+12>>2]=c;y[b+16>>2]=d-c;break a}c=y[a+16>>2];y[b+12>>2]=y[a+12>>2];y[b+16>>2]=c}y[b+20>>2]=y[a+20>>2];y[b+24>>2]=y[a+24>>2];y[b+28>>2]=y[a+28>>2];Y=e+16|0;return b}function Gc(a,b,c,d,e,f){var g=0,h=0,i=0,j=0,k=0;i=y[a+4>>2];a:{b:{c:{if((c|0)<0){h=y[a>>2];a=1;break c}g=c>>>3|0;if(g>>>0>=i>>>0){break b}h=y[a>>2];a=(z[g+h|0]<<(c&7)&128)>>>7|0}g=a^1;c=Wb(h,i,b,c+1|0,g);y[e>>2]=c;if((b|0)<=(c|0)){break a}d:{if((a|0)==(d|0)){g=a;break d}c=Wb(h,i,b,c+1|0,a);y[e>>2]=c}if((b|0)<=(c|0)){break a}j=f,k=Wb(h,i,b,c+1|0,g),y[j>>2]=k;return}o()}y[f>>2]=b;y[e>>2]=b}function Id(a,b){var c=0;c=y[b+4>>2];y[a>>2]=y[b>>2];y[a+4>>2]=c;c=y[a+8>>2];if(c){y[a+12>>2]=c;ma(c);y[a+16>>2]=0;y[a+8>>2]=0;y[a+12>>2]=0}y[a+8>>2]=y[b+8>>2];y[a+12>>2]=y[b+12>>2];y[a+16>>2]=y[b+16>>2];y[b+16>>2]=0;y[b+8>>2]=0;y[b+12>>2]=0;$a(a+20|0,b+20|0);$a(a+32|0,b+32|0);y[a+44>>2]=y[b+44>>2];_a(a+48|0,b+48|0);_a(a+60|0,b+60|0);_a(a+72|0,b+72|0);_a(a+84|0,b+84|0)}function Wd(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;a:{if(Pa(a,y[b+8>>2],e)){if(y[b+28>>2]==1|y[b+4>>2]!=(c|0)){break a}y[b+28>>2]=d;return}if(!Pa(a,y[b>>2],e)){break a}if(!(y[b+16>>2]!=(c|0)&y[b+20>>2]!=(c|0))){if((d|0)!=1){break a}y[b+32>>2]=1;return}y[b+20>>2]=c;y[b+32>>2]=d;y[b+40>>2]=y[b+40>>2]+1;if(!(y[b+36>>2]!=1|y[b+24>>2]!=2)){w[b+54|0]=1}y[b+44>>2]=4}}function ae(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=Y+-64|0;Y=d;a:{e=1;b:{if(y[a+4>>2]==y[b+4>>2]){break b}b=tb(b,5032);e=0;if(!b){break b}e=y[c>>2];if(!e){break a}t(d+8|0,0,56);w[d+59|0]=1;y[d+16>>2]=-1;y[d+12>>2]=a;y[d+4>>2]=b;y[d+52>>2]=1;_[y[y[b>>2]+28>>2]](b,d+4|0,e,1);a=y[d+28>>2];if((a|0)==1){y[c>>2]=y[d+20>>2]}e=(a|0)==1}Y=d- -64|0;return e|0}Sc();o()}function wd(a,b,c,d,e){var f=0,g=0,h=0,i=0;a:{if(!d){break a}g=c;h=b;if(e&1){if(f|g){f=32-g|0;e=d>>>0>>0?d:f;y[h>>2]=y[h>>2]|-1<>>f-e;h=h+4|0;e=d-e|0}else{e=d}f=e;i=f>>>5|0;e=i;g=h;while(1){if(e){y[g>>2]=-1;e=e-1|0;g=g+4|0;continue}break}f=f&31;if(!f){break a}e=(i<<2)+h|0;y[e>>2]=y[e>>2]|-1>>>32-f;break a}$c(h,g,d)}y[a>>2]=b;y[a+4>>2]=c;oc(a,d)}function ad(a,b,c,d){var e=0,f=0;e=Y-16|0;Y=e;dc(e+8|0,b,c);a:{b:{if(!z[e+12|0]){y[a>>2]=0;y[a+4>>2]=0;break b}if(!((d|0)>0&(y[b+24>>2]-c|0)>=(d|0))){y[a>>2]=0;y[a+4>>2]=0;break b}f=y[b+16>>2];c=y[e+8>>2];if(f>>>0>>0){break a}d=E(y[b+28>>2],d);if(d>>>0>f-c>>>0){break a}b=c+y[b+12>>2]|0;if(b&3){break a}y[a>>2]=b;y[a+4>>2]=d>>>2}Y=e+16|0;return}o()}function Rc(a,b,c,d){w[a+53|0]=1;a:{if(y[a+4>>2]!=(c|0)){break a}w[a+52|0]=1;c=y[a+16>>2];b:{if(!c){y[a+36>>2]=1;y[a+24>>2]=d;y[a+16>>2]=b;if((d|0)!=1){break a}if(y[a+48>>2]==1){break b}break a}if((b|0)==(c|0)){c=y[a+24>>2];if((c|0)==2){y[a+24>>2]=d;c=d}if(y[a+48>>2]!=1){break a}if((c|0)==1){break b}break a}y[a+36>>2]=y[a+36>>2]+1}w[a+54|0]=1}}function Fd(a,b){var c=0,d=0,e=0;d=a,e=Da(),y[d>>2]=e;d=a,e=Da(),y[d+4>>2]=e;d=a,e=Da(),y[d+8>>2]=e;d=a,e=Da(),y[d+12>>2]=e;d=a,e=Da(),y[d+16>>2]=e;d=a,e=Da(),y[d+20>>2]=e;d=a,e=Da(),y[d+24>>2]=e;d=a,e=Da(),y[d+28>>2]=e;d=a,e=Da(),y[d+32>>2]=e;c=na(16);w[c+12|0]=b;y[c+8>>2]=0;y[c>>2]=0;y[c+4>>2]=0;fb(c,1<>2]=c;return a}function ld(a,b){var c=0,d=0,e=0;c=Y-32|0;Y=c;a:{d=y[a+40>>2];if(d){e=y[a+48>>2];y[c+24>>2]=y[a+44>>2];y[c+28>>2]=e;b=y[b+28>>2];if(b>>>0>d>>>0){break a}a=y[a+36>>2];y[c+20>>2]=b;y[c+16>>2]=a;a=y[c+28>>2];y[c+8>>2]=y[c+24>>2];y[c+12>>2]=a;a=y[c+20>>2];y[c>>2]=y[c+16>>2];y[c+4>>2]=a;Ca(c+8|0,c)}Y=c+32|0;return}o()}function gd(a,b){var c=0,d=0,e=0;w[a+1|0]=z[b|0];c=y[b+8>>2];y[a+4>>2]=c;b=y[b+4>>2];fd(a+8|0,c);zb(a+20|0,c);zb(a+32|0,c);e=(c<<3)+b|0;c=0;while(1){if((b|0)==(e|0)){a=Ld(a)}else{y[y[a+8>>2]+(c<<3)>>2]=z[b|0];d=c<<2;y[d+y[a+20>>2]>>2]=z[b+1|0];y[y[a+32>>2]+d>>2]=y[b+4>>2];b=b+8|0;c=c+1|0;continue}break}return a}function qa(a,b){var c=0,d=0,e=0,f=0;a:{c=y[a+4>>2];d=y[a+8>>2];if(c>>>0>d+3>>>0){if(d>>>0>=c>>>0|d+1>>>0>=c>>>0|d+2>>>0>=c>>>0){break a}c=b;b=y[a>>2]+d|0;b=z[b|0]|z[b+1|0]<<8|(z[b+2|0]<<16|z[b+3|0]<<24);e=c,f=((Ae(b,16)^b)&-16711936)>>>8^Ae(b,8),y[e>>2]=f;y[a+8>>2]=y[a+8>>2]+4;a=0}else{a=-1}return a}o()}function ec(a,b){var c=0,d=0;if((a|0)!=(b|0)){kc(a);y[a>>2]=y[b>>2];y[a+4>>2]=y[b+4>>2];y[a+8>>2]=y[b+8>>2];y[b+8>>2]=0;y[b>>2]=0;y[b+4>>2]=0;c=y[a>>2];d=y[a+4>>2];a:{if((c|0)!=(d|0)){y[a+12>>2]=c;y[a+16>>2]=d-c;break a}c=y[b+16>>2];y[a+12>>2]=y[b+12>>2];y[a+16>>2]=c}y[b+12>>2]=0;y[b+16>>2]=0}}function fc(a,b,c){var d=0,e=0,f=0,g=0;d=y[a>>2];if(y[a+8>>2]-d>>2>>>0>=b>>>0){e=y[a+4>>2]-d>>2;f=b>>>0>e>>>0?e:b;g=d;while(1){if(f){y[g>>2]=y[c>>2];f=f-1|0;g=g+4|0;continue}break}if(b>>>0>e>>>0){dd(a,b-e|0,c);return}y[a+4>>2]=(b<<2)+d;return}kc(a);ed(a,pd(y[a>>2],y[a+8>>2],b));dd(a,b,c)}function Pa(a,b,c){var d=0;if(!c){return y[a+4>>2]==y[b+4>>2]}if((a|0)==(b|0)){return 1}c=y[a+4>>2];a=z[c|0];b=y[b+4>>2];d=z[b|0];a:{if(!a|(d|0)!=(a|0)){break a}while(1){d=z[b+1|0];a=z[c+1|0];if(!a){break a}b=b+1|0;c=c+1|0;if((a|0)==(d|0)){continue}break}}return(a|0)==(d|0)}function Ic(a,b){var c=0,d=0,e=0,f=0;if((a|0)!=(b|0)){f=y[b+4>>2];c=y[b>>2];b=f-c|0;d=y[a>>2];if(b>>>0<=y[a+8>>2]-d>>>0){e=y[a+4>>2]-d|0;if(b>>>0>e>>>0){if(e){p(d,c,e)}Xb(a,c+e|0,f);return}if(b){p(d,c,b)}y[a+4>>2]=b+d;return}kc(a);Eb(a,Fc(y[a>>2],y[a+8>>2],b));Xb(a,c,f)}}function Ca(a,b){var c=0,d=0,e=0;a:{c=y[a+4>>2];b:{if(!c){break b}if(!y[b+4>>2]){a=y[a>>2];while(1){if((c|0)<=0){break b}w[a|0]=0;c=c-1|0;a=a+1|0;continue}}e=y[b>>2];d=y[b+4>>2];c=y[a>>2];b=0;if(1&B[a+4>>2]>>0){break a}if(!(b|d)|!d){break b}p(c,e,d)}return}o()}function Dd(a){var b=0,c=0,d=0,e=0,f=0,g=0;d=Y-16|0;Y=d;e=nc();f=e+24|0;g=y[a+28>>2];c=y[a+24>>2];while(1){if((c|0)!=(g|0)){b=y[c>>2];if(b){b=mc(b)}else{b=0}y[d+12>>2]=b;b=d+12|0;_c(f,b);c=c+4|0;la(b);continue}break}c=Jb(e,a);Jb(c+12|0,a+12|0);Y=d+16|0;return c}function ja(a,b,c){var d=0,e=0,f=0;d=Y-16|0;Y=d;dc(d+8|0,b,c);a:{b:{if(!z[d+12|0]){y[a>>2]=0;y[a+4>>2]=0;break b}e=y[b+16>>2];c=y[d+8>>2];if(e>>>0>>0){break a}f=y[b+28>>2];if(f>>>0>e-c>>>0){break a}b=y[b+12>>2];y[a+4>>2]=f;y[a>>2]=b+c}Y=d+16|0;return}o()}function Qc(a,b,c){var d=0;d=y[a+36>>2];if(!d){y[a+24>>2]=c;y[a+16>>2]=b;y[a+36>>2]=1;y[a+20>>2]=y[a+56>>2];return}a:{if(!(y[a+20>>2]!=y[a+56>>2]|y[a+16>>2]!=(b|0))){if(y[a+24>>2]!=2){break a}y[a+24>>2]=c;return}w[a+54|0]=1;y[a+24>>2]=2;y[a+36>>2]=d+1}}function Na(a){var b=0,c=0,d=0,e=0;b=na(20);y[b+16>>2]=a;w[b|0]=0;c=255;d=y[a>>2];e=y[a+4>>2];a=y[a+8>>2];if(e>>>0>a>>>0){c=z[a+d|0]}w[b+1|0]=c;y[b+4>>2]=((c^-1)&255)<<16;Ec(b);y[b+8>>2]=32768;y[b+4>>2]=y[b+4>>2]<<7;y[b+12>>2]=y[b+12>>2]-7;return b}function $c(a,b,c){var d=0,e=0;if(b){d=32-b|0;e=c>>>0>>0?c:d;y[a>>2]=y[a>>2]&(-1<>>d-e^-1);c=c-e|0;a=a+4|0}e=c>>>5|0;b=e;d=a;while(1){if(b){y[d>>2]=0;b=b-1|0;d=d+4|0;continue}break}b=c&31;if(b){a=(e<<2)+a|0;y[a>>2]=y[a>>2]&(-1>>>32-b^-1)}}function ob(a,b){var c=0;c=1;a:{if(qa(y[a+4>>2],b)){break a}if(qa(y[a+4>>2],b+4|0)){break a}if(qa(y[a+4>>2],b+8|0)){break a}if(qa(y[a+4>>2],b+12|0)){break a}if(wa(y[a+4>>2],b+16|0)|(y[b>>2]>4096|y[b+4>>2]>4096)&z[a+112|0]==1){break a}c=0}return c}function jd(a,b,c,d){var e=0;e=Y-32|0;Y=e;ja(e+24|0,c,(b^-1)+d|0);y[a>>2]=y[e+24>>2];y[a+4>>2]=y[e+28>>2];b=d-b|0;ja(e+16|0,c,b);y[a+8>>2]=y[e+16>>2];y[a+12>>2]=y[e+20>>2];ja(e+8|0,c,b+1|0);y[a+16>>2]=y[e+8>>2];y[a+20>>2]=y[e+12>>2];Y=e+32|0}function Cd(a,b,c){var d=0,e=0;d=na(32);e=y[b+12>>2];y[d+16>>2]=y[b+8>>2];y[d+20>>2]=e;e=y[b+4>>2];y[d+8>>2]=y[b>>2];y[d+12>>2]=e;b=y[c>>2];y[c>>2]=0;y[d>>2]=a;y[d+24>>2]=b;b=y[a+4>>2];y[d+4>>2]=b;y[b>>2]=d;y[a+4>>2]=d;y[a+8>>2]=y[a+8>>2]+1}function Ga(a,b,c){var d=0,e=0,f=0,g=0;d=y[b+8>>2];g=(d|0)>0?d:0;d=0;while(1){a:{if((d|0)==(g|0)){e=0;break a}e=Ka(a,y[y[b+12>>2]+(d<<2)>>2]);if(!(!e|(z[e+4|0]&63)!=53)){if((c|0)==(f|0)){break a}f=f+1|0}d=d+1|0;continue}break}return e}function Kb(a,b){var c=0;y[a+8>>2]=0;y[a>>2]=0;y[a+4>>2]=0;a:{if(b){if(b>>>0>=1073741824){break a}c=b<<2;b=na(c);y[a>>2]=b;c=b+c|0;y[a+8>>2]=c;while(1){if((b|0)!=(c|0)){y[b>>2]=0;b=b+4|0;continue}break}y[a+4>>2]=c}return a}za();o()}function cb(a,b){var c=0;y[a+8>>2]=0;y[a>>2]=0;y[a+4>>2]=0;a:{if(b){if(b>>>0>=1073741824){break a}c=Fb(b);y[a>>2]=c;b=(b<<2)+c|0;y[a+8>>2]=b;while(1){if((b|0)!=(c|0)){y[c>>2]=0;c=c+4|0;continue}break}y[a+4>>2]=b}return a}za();o()}function Cb(a,b,c){var d=0;d=Y-32|0;Y=d;ja(d+24|0,b,c-1|0);y[a>>2]=y[d+24>>2];y[a+4>>2]=y[d+28>>2];ja(d+16|0,b,c);y[a+8>>2]=y[d+16>>2];y[a+12>>2]=y[d+20>>2];ja(d+8|0,b,c+1|0);y[a+16>>2]=y[d+8>>2];y[a+20>>2]=y[d+12>>2];Y=d+32|0}function Mc(a,b){var c=0,d=0,e=0;c=Y-16|0;Y=c;d=z[a+4|0];if((d|0)==255){a=vb(4);y[a>>2]=4936;P(a|0,4948,2);o()}y[c+4>>2]=c+3;e=y[b+4>>2];y[c+8>>2]=y[b>>2];y[c+12>>2]=e;a=_[y[(c+8|0)+(d<<2)>>2]](c+4|0,a)|0;Y=c+16|0;return a}function lb(){var a=0;a=na(80);x[a+56>>1]=0;y[a+12>>2]=0;y[a+24>>2]=0;y[a+28>>2]=0;y[a+32>>2]=0;y[a+36>>2]=0;y[a+40>>2]=0;y[a+44>>2]=0;y[a+48>>2]=0;y[a+60>>2]=0;y[a+64>>2]=0;y[a+68>>2]=0;y[a+72>>2]=0;y[a+76>>2]=0;return a}function ze(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0;e=c>>>16|0;f=a>>>16|0;j=E(e,f);g=c&65535;h=a&65535;i=E(g,h);f=(i>>>16|0)+E(f,g)|0;e=(f&65535)+E(e,h)|0;Z=(E(b,c)+j|0)+E(a,d)+(f>>>16)+(e>>>16)|0;return i&65535|e<<16}function Ea(a,b,c,d,e){var f=0;a:{if(!(!d|(b|0)<0|(a|0)<=(b|0))){f=b&7;a=b>>>3|0;if(e){if(a>>>0>=d>>>0){break a}a=a+c|0;w[a|0]=z[a|0]|128>>>f;return}if(a>>>0>=d>>>0){break a}a=a+c|0;w[a|0]=z[a|0]&-129>>f}return}o()}function od(a){var b=0,c=0,d=0;y[a+56>>2]=2;c=1;b=4;d=y[a+52>>2];a:{b:{if((d|0)==5){break b}if((d|0)>=3){y[a+52>>2]=5;break b}b=yc(a);c=!b;if(y[a+56>>2]==3){break a}y[a+52>>2]=5;b=b?-1:4}y[a+56>>2]=b}return c}function Ka(a,b){var c=0,d=0;c=y[a>>2];a:{if(c){c=Ka(c,b);if(c){break a}}d=y[a+12>>2];a=y[a+8>>2];while(1){if((a|0)==(d|0)){return 0}c=y[a>>2];a=a+4|0;if(y[c>>2]!=(b|0)){continue}break}}return c}function Bd(a){var b=0;a:{if(z[a+16|0]!=3|z[a+17|0]!=255|(z[a+18|0]!=253|z[a+19|0]!=255)){break a}if(z[a+20|0]!=2|z[a+21|0]!=254|(z[a+22|0]!=254|z[a+23|0]!=254)){break a}b=z[a+2|0]^1}return b&1}function Sa(a,b){var c=0,d=0,e=0;a:{c=y[a+8>>2];e=c+1|0;d=y[a+4>>2];if(e>>>0>>0){if(c>>>0>=d>>>0){break a}d=b;b=y[a>>2];x[d>>1]=z[b+c|0]<<8|z[b+e|0];y[a+8>>2]=c+2;a=0}else{a=-1}return a}o()}function id(a,b,c,d,e,f,g,h){return y[c+16>>2]|y[c+12>>2]<<3|y[c+8>>2]<<6|ia(y[y[a+20>>2]+20>>2],w[a+26|0]+(d-y[a+12>>2]|0)|0,e,f)<<8|y[c+4>>2]<<9|y[c>>2]<<10|ia(b,w[a+24|0]+d|0,g,h)<<12} +function Db(a,b){var c=0;c=y[a+40>>2];y[a+28>>2]=y[a+36>>2];y[a+32>>2]=c;c=y[a+48>>2];b=y[b+28>>2];if(c>>>0>>0){o()}y[a+40>>2]=c;y[a+48>>2]=c-b;c=y[a+44>>2];y[a+36>>2]=c;y[a+44>>2]=b+c}function ra(a,b){var c=0,d=0,e=0;d=Y-16|0;Y=d;e=b<<2;c=y[e+y[a+36>>2]>>2];if(!c){b=rd(na(96),b);c=y[a+36>>2];y[d+12>>2]=0;pb(c+e|0,b);pa(d+12|0);c=y[y[a+36>>2]+e>>2]}Y=d+16|0;return c}function $a(a,b){var c=0;c=y[a>>2];if(c){y[a+4>>2]=c;ma(c);y[a+8>>2]=0;y[a>>2]=0;y[a+4>>2]=0}y[a>>2]=y[b>>2];y[a+4>>2]=y[b+4>>2];y[a+8>>2]=y[b+8>>2];y[b+8>>2]=0;y[b>>2]=0;y[b+4>>2]=0}function Qb(){var a=0;a=na(180);y[a+144>>2]=0;y[a+148>>2]=0;x[a+28>>1]=0;y[a+152>>2]=0;y[a+156>>2]=0;y[a+160>>2]=0;y[a+164>>2]=0;y[a+168>>2]=0;y[a+172>>2]=0;t(a+32|0,0,104);return a}function Jc(a,b,c){var d=0,e=0;e=((b&536870911)<<3|a>>>29)&-8;d=y[c>>2];a:{while(1){if(B[c>>2]>=e>>>0){break a}if(!Ia(a,b,c)){continue}break}if(y[c>>2]-d>>>0>11){break a}y[c>>2]=d}}function xb(a,b){var c=0,d=0;if(z[a|0]==1){c=y[a+4>>2];b=ze(c,c>>31,b,0);c=Z;d=!(b- -2147483648>>>0<2147483648?c+1|0:c);c=0|d;b=d?b:0}else{b=0}y[a>>2]=c;y[a+4>>2]=b;return a}function oc(a,b){var c=0;c=y[a+4>>2];a:{if((b|0)>=0){b=b+c|0;c=y[a>>2]+(b>>>3&536870908)|0;break a}b=b+c|0;c=y[a>>2]+((b-31|0)/32<<2)|0}y[a>>2]=c;y[a+4>>2]=b&31;return a}function Lc(a,b){var c=0,d=0,e=0;c=Y-16|0;Y=c;d=z[a+4|0];if((d|0)!=255){e=y[b+4>>2];y[c+8>>2]=y[b>>2];y[c+12>>2]=e;_[y[(c+8|0)+(d<<2)>>2]](c+7|0,a)}w[a+4|0]=255;Y=c+16|0}function Ab(a,b,c,d,e,f,g){var h=0,i=0;h=Y-16|0;Y=h;if(y[a+16>>2]){i=y[a+24>>2];y[h+8>>2]=y[a+20>>2];y[h+12>>2]=i;y[h>>2]=0;y[h+4>>2]=0;cd(a,b,c,d,e,f,g,h)}Y=h+16|0}function Xc(a,b){var c=0;c=Y-16|0;Y=c;y[c+8>>2]=0;a:{if(z[a+4|0]==1){oa(a,b);break a}Xa(a);w[a+4|0]=1;y[a>>2]=b}y[c+12>>2]=0;la(c+12|0);la(c+8|0);Y=c+16|0;return a}function Ac(a,b,c){var d=0,e=0,f=0;d=1;while(1){e=z[a+12|0];if(e>>>0<=(f&255)>>>0){y[c>>2]=(-1<>2]|0)|d;f=f+1|0;continue}break}}function wb(a,b,c,d){var e=0;e=Y-16|0;Y=e;y[e+12>>2]=d;d=1;w[e+8|0]=1;a:{if(!z[La(e+8|0,b>>c)|0]){d=0;w[a|0]=0;break a}y[a>>2]=y[e+12>>2]}w[a+4|0]=d;Y=e+16|0}function rc(a){var b=0;b=y[a+36>>2];y[a+36>>2]=0;if(b){ma(Ha(b))}Ba(a+32|0);Ba(a+28|0);Ba(a+24|0);Ba(a+20|0);Ba(a+16|0);Ba(a+12|0);Ba(a+8|0);Ba(a+4|0);Ba(a)}function Lb(a,b){var c=0;c=y[a+4>>2];if(b){c=c+1|0;y[a+4>>2]=c}b=y[a+12>>2]-y[a+8>>2]>>3;if(b>>>0<=c>>>0){b=b+16|0;fd(a+8|0,b);zb(a+20|0,b);zb(a+32|0,b)}}function yb(a,b,c){a:{switch(a|0){case 1:return b&c;case 2:return b^c;case 3:return b^c^-1;default:o();case 0:b=b|c;break;case 4:break a}}return b}function $d(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;if(Pa(a,y[b+8>>2],f)){Rc(b,c,d,e);return}a=y[a+8>>2];_[y[y[a>>2]+20>>2]](a,b,c,d,e,f)}function Gb(a,b){var c=0;c=Y-16|0;Y=c;y[a+8>>2]=0;y[a>>2]=0;y[a+4>>2]=0;y[c+8>>2]=a;if(b){Eb(a,b);kd(a,b)}w[c+12|0]=1;gc(c+8|0);Y=c+16|0;return a}function xc(a){var b=0,c=0,d=0;c=E(z[a+1|0],y[a+4>>2]+1|0);if(c>>>0<=65535){d=z[a+2|0];b=lb();a=z[a|0];y[b+8>>2]=d;y[b+4>>2]=c;w[b|0]=a}return b}function Zc(a,b,c){var d=0;if(!(b&1)|z[a|0]!=1){b=0;c=0}else{b=y[a+4>>2];d=b;b=b+c|0;c=((d^b)&(b^c))>=0;b=c?b:0}y[a>>2]=c;y[a+4>>2]=b;return a}function me(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=y[a+4>>2];a=y[a+8>>2];b=(a>>1)+b|0;c=y[c>>2];if(a&1){d=y[d+y[b>>2]>>2]}return _[d|0](b,c)|0}function Zd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if(y[a+4>>2]==y[y[b+8>>2]+4>>2]){Qc(b,c,d);return}a=y[a+8>>2];_[y[y[a>>2]+28>>2]](a,b,c,d)}function zd(a,b,c,d){if(b>>>0<=d>>>0){b=(b<<2)+a|0;while(1){if((a|0)!=(b|0)){y[c>>2]=y[a>>2];c=c+4|0;a=a+4|0;continue}break}return}o()}function ia(a,b,c,d){a:{if(!d|(b|0)<0|(a|0)<=(b|0)){a=0}else{a=b>>>3|0;if(a>>>0>=d>>>0){break a}a=z[a+c|0]>>>((b^-1)&7)&1}return a}o()}function dd(a,b,c){var d=0;d=y[a+4>>2];b=d+(b<<2)|0;while(1){if((b|0)==(d|0)){y[a+4>>2]=b}else{y[d>>2]=y[c>>2];d=d+4|0;continue}break}}function Oa(a){var b=0;va(a+84|0);va(a+72|0);va(a+60|0);va(a+48|0);Ha(a+32|0);Ha(a+20|0);b=y[a+8>>2];if(b){y[a+12>>2]=b;ma(b)}return a}function bd(a,b){var c=0,d=0;if(z[a|0]==1){c=y[a+4>>2];d=c-b|0;c=((c^d)&(b^c))>=0;b=c?d:0}else{b=0;c=0}y[a>>2]=c;y[a+4>>2]=b;return a}function La(a,b){var c=0,d=0;if(z[a|0]==1){c=y[a+4>>2];d=c+b|0;c=((d^c)&(b^d))>=0;b=c?d:0}else{b=0;c=0}y[a>>2]=c;y[a+4>>2]=b;return a}function dc(a,b,c){var d=0;a:{if(!(!(!y[b+16>>2]|(c|0)<0)&y[b+24>>2]>(c|0))){w[a|0]=0;break a}y[a>>2]=E(y[b+28>>2],c);d=1}w[a+4|0]=d}function Za(a){var b=0,c=0;b=y[a>>2];if(b){c=y[a+4>>2];while(1){if((c|0)!=(b|0)){c=la(c-4|0);continue}break}y[a+4>>2]=b;ma(y[a>>2])}}function wa(a,b){var c=0,d=0;d=y[a>>2];c=y[a+8>>2];if(c>>>0>2]){w[b|0]=z[d+c|0];y[a+8>>2]=y[a+8>>2]+1;a=0}else{a=-1}return a}function ye(){var a=0,b=0,c=0;while(1){b=a<<4;c=b+5728|0;y[b+5732>>2]=c;y[b+5736>>2]=c;a=a+1|0;if((a|0)!=64){continue}break}Md(48)}function Tc(a){a=a|0;var b=0,c=0,d=0;y[a>>2]=5476;b=y[a+4>>2];c=b-4|0;d=y[c>>2]-1|0;y[c>>2]=d;if((d|0)<0){ma(b-12|0)}return a|0}function qd(a,b){var c=0;c=y[a+4>>2];b=c+(b<<2)|0;while(1){if((b|0)==(c|0)){y[a+4>>2]=b}else{y[c>>2]=0;c=c+4|0;continue}break}}function kd(a,b){var c=0;c=b;b=y[a+4>>2];c=c+b|0;while(1){if((b|0)==(c|0)){y[a+4>>2]=c}else{w[b|0]=0;b=b+1|0;continue}break}}function Xb(a,b,c){var d=0;d=y[a+4>>2];while(1){if((b|0)!=(c|0)){w[d|0]=z[b|0];d=d+1|0;b=b+1|0;continue}break}y[a+4>>2]=d}function Ia(a,b,c){var d=0;d=c;c=y[c>>2];y[d>>2]=c+1;d=b;b=c>>>3|0;if(d>>>0<=b>>>0){o()}return(z[a+b|0]<<(c&7)&128)>>>7|0}function vd(a,b){var c=0;c=ze(b,0,a,0);if(Z|c>>>0>2147479550){a=0}else{b=E(a,b);a=hb(b);if(b?a:0){t(a,0,b)}}return a}function pd(a,b,c){if(c>>>0>=1073741824){za();o()}a=b-a|0;b=a>>1;return a>>>0>=2147483644?1073741823:b>>>0>c>>>0?b:c}function sa(a){var b=0,c=0;if(y[a+12>>2]){b=y[a+8>>2]+1|0;if(b){c=y[a+4>>2];y[a+8>>2]=b>>>0>>0?b:c}y[a+12>>2]=0}}function eb(a,b){var c=0;c=y[a>>2];y[a>>2]=b;if(c){pa(c+68|0);la(c- -64|0);Sb(c+60|0);Va(c+56|0);va(c+12|0);ma(c)}}function md(a){var b=0;a:{b=a;a=y[a+16>>2];if((b|0)==(a|0)){b=16}else{if(!a){break a}b=20}_[y[b+y[a>>2]>>2]](a)}}function _a(a,b){kc(a);y[a>>2]=y[b>>2];y[a+4>>2]=y[b+4>>2];y[a+8>>2]=y[b+8>>2];y[b+8>>2]=0;y[b>>2]=0;y[b+4>>2]=0}function Nb(a,b){var c=0;c=y[a+52>>2];if((c|0)==3){if(A[a+56>>1]!=1){y[a+52>>2]=-1;return-1}c=nd(a,b)}return c}function pe(a){a=a|0;var b=0,c=0;b=na(12);y[b>>2]=2244;c=y[a+8>>2];y[b+4>>2]=y[a+4>>2];y[b+8>>2]=c;return b|0}function cc(a,b,c,d){var e=0;e=Y-16|0;Y=e;ad(e+8|0,b,c,d);b=y[e+12>>2];y[a>>2]=y[e+8>>2];y[a+4>>2]=b;Y=e+16|0}function Tb(a){var b=0;b=y[a+12>>2];a:{if((b|0)==7){y[a+8>>2]=y[a+8>>2]+1;b=0;break a}b=b+1|0}y[a+12>>2]=b}function Fc(a,b,c){if((c|0)<0){za();o()}a=b-a|0;b=a<<1;return a>>>0>=1073741823?2147483647:b>>>0>c>>>0?b:c}function ed(a,b){var c=0;if(b>>>0>=1073741824){za();o()}c=Fb(b);y[a+4>>2]=c;y[a>>2]=c;y[a+8>>2]=(b<<2)+c}function Ya(a){var b=0,c=0;b=y[a+4>>2];if(!b){o()}c=y[a>>2];y[a>>2]=c+4;y[a+4>>2]=b-1;return y[c>>2]}function Yc(a,b){a:{b:{if(!z[a+4|0]){if(y[a>>2]!=(b|0)){break b}break a}Xa(a);w[a+4|0]=0}y[a>>2]=b}}function Cc(a,b,c){if((c|0)<0){za();o()}a=b-a|0;return a>>>0>=2147483646?2147483647:a>>>0>c>>>0?a:c}function rd(a,b){var c=0,d=0;x[a>>1]=0;t(a+4|0,0,92);c=a,d=gd(a,E(b,12)+2708|0),w[c|0]=d;return a}function Vd(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;if(Pa(a,y[b+8>>2],f)){Rc(b,c,d,e)}}function ib(a){var b=0,c=0;while(1){b=c;c=b+1|0;if(1<>>0>>0){continue}break}return b&255}function bc(a){var b=0,c=0;b=y[a+4>>2];if(!b){o()}c=y[a>>2];y[a>>2]=c+4;y[a+4>>2]=b-1;return c}function oe(a,b){a=a|0;b=b|0;var c=0;y[b>>2]=2244;c=y[a+8>>2];y[b+4>>2]=y[a+4>>2];y[b+8>>2]=c}function ud(a,b){var c=0;c=Y-16|0;Y=c;y[c+12>>2]=b;b=a+24|0;a=c+12|0;_c(b,a);la(a);Y=c+16|0}function kc(a){var b=0;b=y[a>>2];if(b){y[a+4>>2]=b;ma(b);y[a+8>>2]=0;y[a>>2]=0;y[a+4>>2]=0}}function Dc(a){var b=0,c=0;b=y[a+8>>2]+1|0;if(b){c=a;a=y[a+4>>2];y[c+8>>2]=a>>>0>b>>>0?b:a}}function Kd(a,b){var c=0;if((b|0)<0){za();o()}c=na(b);y[a+4>>2]=c;y[a>>2]=c;y[a+8>>2]=b+c}function Eb(a,b){var c=0;if((b|0)<0){za();o()}c=Ad(b);y[a+4>>2]=c;y[a>>2]=c;y[a+8>>2]=b+c}function Ae(a,b){var c=0,d=0;c=b&31;d=(-1<>>c|0;c=a;a=0-b&31;return d|(c&-1>>>a)<>2]==y[y[b+8>>2]+4>>2]){Qc(b,c,d)}}function Qd(a){a=a|0;var b=0;b=y[a+64>>2];a=y[a+52>>2]+7>>>3|0;return(a>>>0>b>>>0?b:a)|0}function Mb(a,b,c){c=0-c|0;while(1){if((b|0)>0){w[a|0]=c;b=b-1|0;a=a+1|0;continue}break}}function Kc(a,b){b=b-a|0;while(1){if((b|0)>0){w[a|0]=255;b=b-1|0;a=a+1|0;continue}break}}function Ib(a,b){var c=0;c=y[a>>2];y[a>>2]=b;if(c){Za(c+24|0);Ha(c+12|0);ma(Ha(c))}}function Da(){var a=0;a=na(12);y[a+8>>2]=0;y[a>>2]=0;y[a+4>>2]=0;fb(a,512);return a}function uc(a,b,c,d,e,f,g,h){if(!(!y[a+16>>2]|!y[f+16>>2])){cd(f,a,b,c,d,e,h,g)}}function Ad(a){a:{if(a>>>0<=2147479550){a=hb(a);if(a){break a}}Jd();o()}return a}function Oc(a,b){var c=0;return(z[a+16|0]!=(b|0)|z[a+17|0]!=255?c:z[a+2|0]^1)&1}function Nc(a){a=a|0;y[a+40>>2]=0;y[a+44>>2]=0;va(a+80|0);va(a+68|0);return a|0}function qc(a){var b=0;b=y[a>>2];y[a>>2]=0;if(b){va(b+124|0);Oa(b+28|0);ma(b)}}function mb(a,b){var c=0;c=vd(b,2);if(!c){Jd();o()}y[a+4>>2]=b;y[a>>2]=c}function Pd(a){a=a|0;Kc(y[a+80>>2],y[a+84>>2]);y[a+52>>2]=0;return 1}function Pb(a,b){var c=0;c=y[a>>2];y[a>>2]=b;if(c){Za(c+4|0);ma(c)}}function Ha(a){var b=0;b=y[a>>2];if(b){y[a+4>>2]=b;ma(b)}return a}function oa(a,b){var c=0;c=y[a>>2];y[a>>2]=b;if(c){va(c);ma(c)}}function Ub(a){var b=0;b=y[a>>2];y[a>>2]=0;if(b){ma(b)}return a}function wc(a){var b=0;b=na(16);y[b>>2]=a;cb(b+4|0,a);return b}function le(a,b){a=a|0;b=b|0;return(y[b+4>>2]==2532?a+4|0:0)|0}function pb(a,b){var c=0;c=y[a>>2];y[a>>2]=b;if(c){ma(Oa(c))}}function Fb(a){if(a>>>0>=1073741824){Wa();o()}return na(a<<2)}function bb(a,b,c,d,e,f,g){if(y[a+16>>2]){Ab(f,a,b,c,d,e,g)}}function Wa(){var a=0;a=vb(4);y[a>>2]=5372;P(a|0,5428,2);o()}function Ba(a){var b=0;b=y[a>>2];y[a>>2]=0;if(b){ma(Ha(b))}}function na(a){a=hb(a>>>0<=1?1:a);if(!a){Sc();o()}return a}function va(a){var b=0;b=y[a>>2];if(b){y[a+4>>2]=b;ma(b)}}function Ra(a,b){var c=0;c=y[a>>2];y[a>>2]=b;if(c){ma(c)}}function Ua(a){var b=0;b=y[a>>2];y[a>>2]=0;if(b){ma(b)}}function kb(){var a=0;a=na(28);y[a+20>>2]=0;return a}function Be(a){if(a){return 31-H(a-1^a)|0}return 32} +function Bc(a){if((a|0)<0){Wa();o()}return na(a<<1)}function ua(a,b){return sd(na(32),y[a>>2],y[b>>2])}function Hd(a,b){var c=0;c=y[a>>2];y[a>>2]=b;ma(c)}function td(a){var b=0;b=na(4);y[b>>2]=a;return b}function nc(){var a=0;a=na(36);t(a,0,36);return a}function be(a,b,c){a=a|0;b=b|0;c=c|0;return 0}function Jd(){y[(Y-16|0)+12>>2]=5684;sc();o()}function Ma(a,b,c,d){return(yb(a,b,c)^c)&d^c}function ub(a,b){a=a|0;b=b|0;return y[b>>2]}function ne(a){a=a|0;_[y[y[a>>2]+4>>2]](a)}function gc(a){if(!z[a+4|0]){va(y[a>>2])}}function ee(a){a=a|0;T();S(a+128|0);o()}function hc(a,b){return sd(na(32),a,b)}function lc(a){a=y[a>>2];if(a){ma(a)}}function Td(a){a=a|0;return y[a+4>>2]}function vb(a){return hb(a|80)+80|0}function Nd(a){a=a|0;return hb(a)|0}function xa(a){return rd(na(96),a)}function je(a,b){a=a|0;b=b|0;la(b)}function ge(a,b){a=a|0;b=b|0;Ja(b)}function ac(a){return(Ta(a)|0)!=0}function ke(a){a=a|0;return 2512}function de(a){a=a|0;return 4530}function ce(a){a=a|0;return 4504}function Ud(a){a=a|0;return 4553}function Ta(a){return Mc(a,4584)}function $b(a){return Mc(a,4600)}function sb(a){rb(a,0);return a}function qb(a){a=a|0;return a|0}function pc(a){Va(a+24|0);ma(a)}function pa(a){pb(a,0);return a}function la(a){oa(a,0);return a}function Vb(a){eb(a,0);return a}function Rd(a){a=a|0;ma(Nc(a))}function Pc(a){a=a|0;ma(Tc(a))}function yd(a){return Oc(a,3)}function fe(a){a=a|0;sc();o()}function Hb(a){return Oc(a,2)}function Vc(a,b){a=a|0;b=b|0}function Qa(a){a=a|0;ma(a)}function Xa(a){Lc(a,4576)}function Uc(a){Lc(a,4592)}function ta(a){Ra(a,0)}function Va(a){Ib(a,0)}function Sc(){sc();o()}function Sb(a){Pb(a,0)}function Ja(a){Hd(a,0)}function sc(){U();o()}function ic(a){a=a|0} +// EMSCRIPTEN_END_FUNCS +a=z;m(n);var _=[null,Tc,qb,xe,we,ve,ue,te,se,re,qe,qb,Nc,Rd,Qd,Pd,Od,qb,Qa,pe,oe,ic,ne,me,le,ke,Vc,je,ub,ub,Vc,ge,ub,ub,ee,fe,Qa,de,Qa,ce,qb,Qa,ic,ic,be,Qa,Xd,Qa,Ud,Pc,Td,Pc,Qa,ae,Vd,Wd,Yd,Qa,$d,_d,Zd];function $(){return v.byteLength>>16}function ea(fa){fa=fa|0;var aa=$()|0;var ba=aa+fa|0;if(aa{instantiateWasm(info,inst=>resolve(receiveInstance(inst)))})}wasmBinaryFile??=findWasmBinary();var result=instantiateSync(wasmBinaryFile,info);return receiveInstance(result[0])}class ExitStatus{name="ExitStatus";constructor(status){this.message=`Program terminated with exit(${status})`;this.status=status}}var HEAP8;var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var onPostRuns=[];var onPreRuns=[];var noExitRuntime=true;var HEAPU32;class ExceptionInfo{constructor(excPtr){this.excPtr=excPtr;this.ptr=excPtr-24}set_type(type){HEAPU32[this.ptr+4>>2]=type}get_type(){return HEAPU32[this.ptr+4>>2]}set_destructor(destructor){HEAPU32[this.ptr+8>>2]=destructor}get_destructor(){return HEAPU32[this.ptr+8>>2]}set_caught(caught){caught=caught?1:0;HEAP8[this.ptr+12]=caught}get_caught(){return HEAP8[this.ptr+12]!=0}set_rethrown(rethrown){rethrown=rethrown?1:0;HEAP8[this.ptr+13]=rethrown}get_rethrown(){return HEAP8[this.ptr+13]!=0}init(type,destructor){this.set_adjusted_ptr(0);this.set_type(type);this.set_destructor(destructor)}set_adjusted_ptr(adjustedPtr){HEAPU32[this.ptr+16>>2]=adjustedPtr}get_adjusted_ptr(){return HEAPU32[this.ptr+16>>2]}}var uncaughtExceptionCount=0;var __Unwind_RaiseException=ex=>{abort()};var ___cxa_throw=(ptr,type,destructor)=>{var info=new ExceptionInfo(ptr);info.init(type,destructor);uncaughtExceptionCount++;__Unwind_RaiseException(ptr)};var __abort_js=()=>abort("");var runtimeKeepaliveCounter=0;var __emscripten_runtime_keepalive_clear=()=>{noExitRuntime=false;runtimeKeepaliveCounter=0};var timers={};var handleException=e=>{if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)};var keepRuntimeAlive=()=>noExitRuntime||runtimeKeepaliveCounter>0;var _proc_exit=code=>{EXITSTATUS=code;if(!keepRuntimeAlive()){Module["onExit"]?.(code);ABORT=true}quit_(code,new ExitStatus(code))};var exitJS=(status,implicit)=>{EXITSTATUS=status;_proc_exit(status)};var _exit=exitJS;var maybeExit=()=>{if(!keepRuntimeAlive()){try{_exit(EXITSTATUS)}catch(e){handleException(e)}}};var callUserCallback=func=>{if(ABORT){return}try{return func()}catch(e){handleException(e)}finally{maybeExit()}};var _emscripten_get_now=()=>performance.now();var __setitimer_js=(which,timeout_ms)=>{if(timers[which]){clearTimeout(timers[which].id);delete timers[which]}if(!timeout_ms)return 0;var id=setTimeout(()=>{delete timers[which];callUserCallback(()=>__emscripten_timeout(which,_emscripten_get_now()))},timeout_ms);timers[which]={id,timeout_ms};return 0};function _createImageData(size){Module.imageData=new Uint8Array(size)}var getHeapMax=()=>2147483648;var alignMemory=(size,alignment)=>Math.ceil(size/alignment)*alignment;var growMemory=size=>{var oldHeapSize=wasmMemory.buffer.byteLength;var pages=(size-oldHeapSize+65535)/65536|0;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var HEAPU8;var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignMemory(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};function _setImageData(array_ptr,pitch8,pitch32,height){if(pitch32===pitch8){Module.imageData=new Uint8ClampedArray(HEAPU8.subarray(array_ptr,array_ptr+pitch32*height));return}const destSize=pitch8*height;const imageData=Module.imageData=new Uint8ClampedArray(destSize);for(let srcStart=array_ptr,destStart=0;destStart{HEAP8.set(array,buffer)};{if(Module["noExitRuntime"])noExitRuntime=Module["noExitRuntime"];if(Module["print"])out=Module["print"];if(Module["printErr"])err=Module["printErr"];if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];if(Module["arguments"])programArgs=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];var preInit=Module["preInit"];if(preInit){if(typeof preInit=="function")Module["preInit"]=preInit=[preInit];while(preInit.length>0){preInit.shift()()}}}Module["writeArrayToMemory"]=writeArrayToMemory;var _malloc,_free,_jbig2_decode,_ccitt_decode,__emscripten_timeout,memory,__indirect_function_table,wasmMemory;function assignWasmExports(wasmExports){_malloc=Module["_malloc"]=wasmExports["l"];_free=Module["_free"]=wasmExports["m"];_jbig2_decode=Module["_jbig2_decode"]=wasmExports["n"];_ccitt_decode=Module["_ccitt_decode"]=wasmExports["o"];__emscripten_timeout=wasmExports["p"];memory=wasmMemory=wasmExports["j"];__indirect_function_table=wasmExports["__indirect_function_table"]}var wasmImports={a:___cxa_throw,f:__abort_js,e:__emscripten_runtime_keepalive_clear,b:__setitimer_js,h:_createImageData,c:_emscripten_resize_heap,d:_proc_exit,i:_setImageData,g:_setLineData};async function run(){preRun();var setStatus=Module["setStatus"];if(setStatus){setStatus("Running...");await new Promise(resolve=>setTimeout(resolve,1));setTimeout(setStatus,1,"")}if(ABORT)return;initRuntime();Module["onRuntimeInitialized"]?.();postRun()}var wasmExports;wasmExports=createWasm();await run(); +;return Module}export default JBig2; diff --git a/public/assets/vendor/pdfjs-6.4.299/web/wasm/openjpeg.wasm b/public/assets/vendor/pdfjs-6.4.299/web/wasm/openjpeg.wasm new file mode 100644 index 0000000000000000000000000000000000000000..6c6790138a24f6d37b4f8d22d9a4723df6bd0fbf GIT binary patch literal 251131 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 h@+jSPt{cd~MsfXR}9adFE*~as1 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 literal 0 HcmV?d00001 diff --git a/public/assets/vendor/pdfjs-6.4.299/web/wasm/openjpeg_nowasm_fallback.js b/public/assets/vendor/pdfjs-6.4.299/web/wasm/openjpeg_nowasm_fallback.js new file mode 100644 index 000000000..3bc22534f --- /dev/null +++ b/public/assets/vendor/pdfjs-6.4.299/web/wasm/openjpeg_nowasm_fallback.js @@ -0,0 +1,17 @@ +/* THIS FILE IS GENERATED - DO NOT EDIT */ +async function OpenJPEG(moduleArg={}){var Module=moduleArg;var ENVIRONMENT_IS_WEB=true;var ENVIRONMENT_IS_WORKER=false;var programArgs=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var _scriptName=import.meta.url;var scriptDirectory="";var readAsync;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){try{scriptDirectory=new URL(".",_scriptName).href}catch{}{readAsync=async url=>{var response=await fetch(url,{credentials:"same-origin"});if(response.ok){return response.arrayBuffer()}throw new Error(response.status+" : "+response.url)}}}else{}var out=console.log.bind(console);var err=console.error.bind(console);var wasmBinary;var WebAssembly={Memory:function(opts){this.buffer=new ArrayBuffer(opts["initial"]*65536)},Module:function(binary){},Instance:function(module,info){this.exports=( +// EMSCRIPTEN_START_ASM +function instantiate(Aa){var a;var b=new Uint8Array(123);for(var c=25;c>=0;--c){b[48+c]=52+c;b[65+c]=c;b[97+c]=26+c}b[43]=62;b[47]=63;function i(j,k,l){var d,e,c=0,f=k,g=l.length,h=k+(g*3>>2)-(l[g-2]=="=")-(l[g-1]=="=");for(;c>4;if(f>2;if(f>>0;A=A>>>0;if(z+A>a.length)throw"trap: invalid memory.fill";a.fill(v,z,z+A)}function B(z,C,A){a.copyWithin(z,C,C+A)}function D(){throw new Error("abort")}function za(n){var E=new ArrayBuffer(16777216);var F=new Int8Array(E);var G=new Int16Array(E);var H=new Int32Array(E);var I=new Uint8Array(E);var J=new Uint16Array(E);var K=new Uint32Array(E);var L=new Float32Array(E);var M=new Float64Array(E);var N=Math.imul;var O=Math.fround;var P=Math.abs;var Q=Math.clz32;var R=Math.min;var S=Math.max;var T=Math.floor;var U=Math.ceil;var V=Math.trunc;var W=Math.sqrt;var X=n.a;var Y=X.a;var Z=X.b;var _=X.c;var $=X.d;var aa=X.e;var ba=X.f;var ca=X.g;var da=X.h;var ea=X.i;var fa=X.j;var ga=X.k;var ha=X.l;var ia=X.m;var ja=X.n;var ka=X.o;var la=X.p;var ma=X.q;var na=94272;var oa=0;var pa=0;var qa=0; +// EMSCRIPTEN_START_FUNCS +function Sc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,C=0,D=0,E=0,M=0,P=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=O(0),ja=0,ka=0,la=0,ma=0,oa=0,pa=0,qa=0,sa=0,ta=0,ua=0,va=0,wa=0;aa=na-96|0;na=aa;D=H[a+8>>2];a:{b:{c:{if(!H[a>>2]){g=N(H[D+16>>2]-H[D+8>>2]|0,H[D+20>>2]-H[D+12>>2]|0)<<2;c=Ia(g);H[D+60>>2]=c;if(!c){Ba(H[a+32>>2],1,8023,0);d=a+28|0;break b}if(!g){break c}y(c,0,g);break c}c=H[D+60>>2];if(!c){break c}Ca(c);H[D+60>>2]=0}if(!H[H[a+28>>2]>>2]){break a}ma=H[a+16>>2];c=H[ma+28>>2]+N(H[ma+24>>2],152)|0;va=H[c-152>>2];wa=H[c-144>>2];oa=H[a+20>>2];pa=H[a+12>>2];ua=H[a+4>>2];d=a+28|0;d:{p=H[b+4>>2];e=0;e:{if((p|0)<=0){break e}l=H[b>>2];c=0;f:{while(1){g=l+N(c,12)|0;if(!H[g>>2]){break f}c=c+1|0;if((p|0)!=(c|0)){continue}break}e=0;break e}e=H[g+4>>2]}if(e){break d}e=Ea(1,156);if(!e){Ba(H[a+32>>2],1,6313,0);break b}H[e+140>>2]=0;c=0;l=H[b+4>>2];g:{if((l|0)==2147483647){break g}g=H[b>>2];if((l|0)>0){while(1){p=g+N(c,12)|0;if(!H[p>>2]){l=H[p+8>>2];if(l){ra[l|0](H[p+4>>2]);g=H[b>>2]}b=g+N(c,12)|0;H[b+8>>2]=15;H[b+4>>2]=e;c=1;break g}c=c+1|0;if((l|0)!=(c|0)){continue}break}}g=Ga(g,N(l,12)+12|0);c=0;if(!g){break g}H[b>>2]=g;c=H[b+4>>2];g=g+N(c,12)|0;H[g+8>>2]=15;H[g+4>>2]=e;H[g>>2]=0;H[b+4>>2]=c+1;c=1}if(c){break d}Ba(H[a+32>>2],1,8338,0);b=H[e+116>>2];if(b){Ca(b);H[e+116>>2]=0}b=H[e+120>>2];if(b){Ca(b);H[e+120>>2]=0}Ca(H[e+148>>2]);Ca(e);break b}H[e+144>>2]=H[a+24>>2];$=H[a+40>>2];ca=H[a+36>>2];W=H[a+32>>2];t=H[oa+808>>2];b=H[pa+16>>2];h:{ba=H[oa+16>>2];i:{if(ba&64){l=na-304|0;na=l;j:{if(t){if(ca){Ba(W,1,3219,0);break j}Ba(W,1,3219,0);break j}i=H[e+116>>2];c=H[D+20>>2]-H[D+12>>2]|0;b=H[D+16>>2]-H[D+8>>2]|0;g=N(c,b);k:{l:{if(g>>>0>K[e+132>>2]){Ca(i);f=g<<2;i=Ia(f);H[e+116>>2]=i;if(!i){i=0;break j}H[e+132>>2]=g;break l}if(!i){break k}f=g<<2}if(!f){break k}y(i,0,f)}i=H[e+120>>2];m:{if(K[e+136>>2]>2639){break m}Ca(i);i=Ia(10560);H[e+120>>2]=i;if(i){break m}i=0;break j}H[e+136>>2]=2640;y(i,0,10560);H[e+128>>2]=c;H[e+124>>2]=b;m=H[D+24>>2];if(!m){i=1;break j}p=H[D+28>>2];i=1;n:{o:{p:{q:{f=H[D+52>>2];r:{if(f){g=f&3;c=H[D+4>>2];i=0;s:{if(f>>>0>=4){b=f&-4;while(1){k=c+(i<<3)|0;j=H[k+28>>2]+(H[k+20>>2]+(H[k+12>>2]+(H[k+4>>2]+j|0)|0)|0)|0;i=i+4|0;r=r+4|0;if((b|0)!=(r|0)){continue}break}if(!g){break s}}while(1){j=H[(c+(i<<3)|0)+4>>2]+j|0;i=i+1|0;o=o+1|0;if((g|0)!=(o|0)){continue}break}}if(!H[e+144>>2]&(f|0)==1){break o}if(K[e+152>>2]>=j>>>0){break r}r=Ga(H[e+148>>2],j);if(r){break q}i=0;break j}if(!H[e+144>>2]){break j}}r=H[e+148>>2];if(r){break p}i=0;break j}H[e+152>>2]=j;H[e+148>>2]=r}if(!H[D+52>>2]){j=0;break n}f=H[D+4>>2];j=0;i=0;while(1){g=i<<3;c=g+f|0;b=H[c+4>>2];if(b){B(j+r|0,H[c>>2],b)}f=H[D+4>>2];j=H[(g+f|0)+4>>2]+j|0;i=i+1|0;if(i>>>0>2]){continue}break}break n}r=H[H[D+4>>2]>>2]}i=0;f=0;c=H[D+40>>2];g=0;t:{if(!c){break t}b=H[D>>2];f=H[b+8>>2];g=0;if((c|0)==1){break t}g=H[b+32>>2]}c=m-p|0;f=f+g|0;u:{if(!f){o=0;break u}i=1;b=H[D>>2];q=H[b>>2];o=0;if((f|0)==1){i=0;break u}o=H[b+24>>2]}Z=c+1|0;ja=H[e+116>>2];$=H[e+120>>2];S=H[D+12>>2];z=H[D+20>>2];ea=H[D+8>>2];A=H[D+16>>2];v:{w:{x:{y:{z:{A:{B:{C:{if(!(!i|o)){if(!ca){break C}Ba(W,2,10806,0);f=1;break B}if(f>>>0<4){break B}if(ca){H[l+112>>2]=f;Ba(W,1,9590,l+112|0);break v}H[l+96>>2]=f;Ba(W,1,9590,l+96|0);i=0;break j}Ba(W,2,10806,0);i=H[D+24>>2];if(i>>>0>30){break A}n=1;if(i>>>0>=Z>>>0){break y}break w}i=H[D+24>>2];if(i>>>0<=30){break z}if(!ca){break A}H[l+32>>2]=H[D+24>>2];Ba(W,1,12302,l+32|0);break v}H[l>>2]=i;Ba(W,1,12302,l);i=0;break j}if(i>>>0>>0){break x}if(f>>>0<2){n=f;break y}if((i|0)!=(Z|0)){n=f;break y}n=1;if(I[26416]){break y}if(!ca){F[26416]=1;H[l+64>>2]=f;Ba(W,2,10299,l- -64|0);break y}if(!I[26416]){F[26416]=1;H[l+80>>2]=f;Ba(W,2,10299,l+80|0)}}if(!(!(q>>>0<2|j>>>0>>0)&o+q>>>0<=j>>>0)){if(ca){i=0;Ba(W,1,9532,0);break j}i=0;Ba(W,1,9532,0);break j}V=q+r|0;b=I[V-1|0];k=b<<4|I[V-2|0]&15;if(!(!(k>>>0<2|(b|0)==255)&(k|0)<=(q|0))){if(ca){i=0;Ba(W,1,15305,0);break j}i=0;Ba(W,1,15305,0);break j}qa=H[D+28>>2];H[l+272>>2]=0;H[l+280>>2]=0;H[l+264>>2]=0;H[l+268>>2]=0;H[l+296>>2]=0;H[l+300>>2]=0;H[l+284>>2]=0;H[l+288>>2]=0;b=k-1|0;H[l+276>>2]=b;p=(q+r|0)-k|0;H[l+256>>2]=p;i=I[p|0];c=8;H[l+272>>2]=8;t=p+1|0;H[l+256>>2]=t;g=k-2|0;H[l+276>>2]=g;f=(b|0)==1?i|15:i;H[l+264>>2]=f;b=0;H[l+268>>2]=b;H[l+280>>2]=(f|0)==255;T=p&3;D:{E:{if((T|0)==3){break E}p=0;if(!((f|0)!=255|I[t|0]<=143)){break D}m=255;m=k>>>0>=3?I[t|0]:m;u=k-3|0;H[l+276>>2]=u;p=(f|0)==255;c=p?15:16;H[l+272>>2]=c;v=t+(k>>>0>2)|0;H[l+256>>2]=v;g=(g|0)==1?m|15:m;H[l+280>>2]=(g|0)==255;i=g;m=f;g=p?7:8;p=g&31;if((g&63)>>>0>=32){t=f<>>32-p|b<>2]=f;b=t|x;H[l+268>>2]=b;if((T|0)==2){break E}m=255;p=0;if(!((i|0)!=255|I[v|0]<=143)){break D}m=k>>>0>=4?I[v|0]:m;j=k-4|0;H[l+276>>2]=j;v=v+(k>>>0>3)|0;H[l+256>>2]=v;g=(u|0)==1?m|15:m;p=0;u=p;H[l+280>>2]=(g|0)==255;p=(i|0)==255;c=(p?7:8)+c|0;H[l+272>>2]=c;i=g;m=f;g=p?7:8;p=g&31;if((g&63)>>>0>=32){t=f<>>32-p|b<>2]=f;b=t|u;H[l+268>>2]=b;if((T|0)==1){break E}p=0;if(!((i|0)!=255|I[v|0]<=143)){break D}m=255;m=k>>>0>=5?I[v|0]:m;H[l+276>>2]=k-5;H[l+256>>2]=v+(k>>>0>4);p=0;g=(j|0)==1?m|15:m;H[l+280>>2]=(g|0)==255;i=(i|0)==255;c=(i?7:8)+c|0;H[l+272>>2]=c;m=f;i=i?7:8;t=i&31;if((i&63)>>>0>=32){T=f<>>32-t|b<>2]=f;b=p|T;H[l+268>>2]=b}g=64-c|0;c=f;i=g&31;if((g&63)>>>0>=32){x=c<>>32-i|b<>2]=b;H[l+268>>2]=x;p=1}if(!p){if(ca){i=0;Ba(W,1,11470,0);break j}i=0;Ba(W,1,11470,0);break j}C=A-ea|0;R=k-2|0;H[l+244>>2]=R;x=q+r|0;b=x-3|0;H[l+224>>2]=b;c=I[x-2|0];f=c>>>0>143;H[l+248>>2]=f;p=0;m=c>>>4|0;H[l+232>>2]=m;H[l+236>>2]=0;v=(m&7)==7?3:4;H[l+240>>2]=v;c=(b&3)+1|0;E=c>>>0>>0?c:R;F:{G:{if(!R){H[l+244>>2]=R-E;break G}c=x-4|0;H[l+224>>2]=c;g=I[b|0];i=g>>>0>143;H[l+248>>2]=i;p=v&31;if((v&63)>>>0>=32){t=g<>>32-p;p=g<>2]=m;p=t;H[l+236>>2]=p;v=(f?(g&127)==127?7:8:8)+v|0;H[l+240>>2]=v;H:{if((E|0)==1){f=i;break H}i=x-5|0;H[l+224>>2]=i;b=I[c|0];f=b>>>0>143;H[l+248>>2]=f;j=v&31;if((v&63)>>>0>=32){t=b<>>32-j;M=b<>2]=m;p=p|t;H[l+236>>2]=p;v=(g>>>0<=143?8:(b&127)==127?7:8)+v|0;H[l+240>>2]=v;if((E|0)==2){b=c;c=i;break H}g=x-6|0;H[l+224>>2]=g;j=I[i|0];f=j>>>0>143;H[l+248>>2]=f;c=j;u=c&255;T=v&31;if((v&63)>>>0>=32){t=u<>>32-T;M=u<>2]=m;p=p|t;H[l+236>>2]=p;v=(b>>>0<=143?8:(c&127)==127?7:8)+v|0;H[l+240>>2]=v;if((E|0)==3){b=i;c=g;break H}c=x-7|0;H[l+224>>2]=c;b=I[g|0];f=b>>>0>143;H[l+248>>2]=f;i=v&31;if((v&63)>>>0>=32){T=b<>>32-i;i=b<>2]=m;H[l+236>>2]=i;v=(j>>>0<=143?8:(b&127)==127?7:8)+v|0;H[l+240>>2]=v;b=g}g=R-E|0;H[l+244>>2]=g;if(v>>>0>32){break F}if(g>>>0>=4){h=H[b-4>>2];H[l+224>>2]=b-5;H[l+244>>2]=g-4;break G}if(!g){break G}I:{if((E|0)==(k-3|0)){t=24;break I}T=g&1;u=g&2;t=24;b=0;while(1){i=c-1|0;H[l+224>>2]=i;j=I[c|0];c=c-2|0;H[l+224>>2]=c;H[l+244>>2]=g-1;i=I[i|0];g=g-2|0;H[l+244>>2]=g;h=j<>2]=c-1;b=I[c|0];H[l+244>>2]=g-1;h=b<>2]=j>>>0>143;g=f?(h&2130706432)==2130706432?7:8:8;c=g+(h>>>0<=2415919103?8:(h&8323072)==8323072?7:8)|0;i=h>>>16&255;b=c+(i>>>0<=143?8:(h&32512)==32512?7:8)|0;t=h>>>8&255;H[l+240>>2]=b+((t>>>0<=143?8:(h&127)==127?7:8)+v|0);b=i<>>24|t<>>0>=32){t=b<>>32-c;b=b<>2]=b|m;H[l+236>>2]=p|t}Wb(l+192|0,r,q-k|0,255);u=0;J:{if(n>>>0<2){break J}Wb(l+160|0,V,o,0);u=0;if((n|0)==2){break J}m=0;p=0;f=0;u=0;H[l+152>>2]=1;H[l+144>>2]=0;H[l+136>>2]=0;H[l+140>>2]=0;i=o;c=i-1|0;H[l+148>>2]=c;b=(q+r|0)+i|0;g=b-1|0;H[l+128>>2]=g;q=g&3;K:{if((i|0)<=0){b=g;break K}b=b-2|0;H[l+128>>2]=b;m=I[g|0]}H[l+136>>2]=m;H[l+140>>2]=0;o=m>>>0>143;H[l+152>>2]=o;j=(m&127)==127?7:8;H[l+144>>2]=j;L:{if(!q){break L}h=i-2|0;H[l+148>>2]=h;M:{if((i|0)<2){k=b;break M}k=b-1|0;H[l+128>>2]=k;f=I[b|0]}o=f>>>0>143;H[l+152>>2]=o;b=j&31;if((j&63)>>>0>=32){t=f<>>32-b;b=f<>2]=p;b=t;H[l+140>>2]=b;j=(m>>>0<=143?8:(f&127)==127?7:8)+j|0;H[l+144>>2]=j;if((q|0)==1){b=k;m=p;p=t;i=c;c=h;break L}t=i-3|0;H[l+148>>2]=t;N:{if((i|0)<3){g=k;break N}g=k-1|0;H[l+128>>2]=g;u=I[k|0]}o=u>>>0>143;H[l+152>>2]=o;c=j&31;if((j&63)>>>0>=32){T=u<>>32-c;c=u<>2]=m;H[l+140>>2]=b;j=(f>>>0<=143?8:(u&127)==127?7:8)+j|0;H[l+144>>2]=j;if((q|0)==2){b=g;i=h;c=t;break L}c=i-4|0;H[l+148>>2]=c;f=0;O:{if((i|0)<4){b=g;break O}b=g-1|0;H[l+128>>2]=b;f=I[g|0]}o=f>>>0>143;H[l+152>>2]=o;g=j&31;if((j&63)>>>0>=32){x=f<>>32-g;g=f<>2]=m;H[l+140>>2]=g;j=(u>>>0<=143?8:(f&127)==127?7:8)+j|0;H[l+144>>2]=j;i=t}if(j>>>0<=32){P:{if((i|0)>=5){k=H[b-3>>2];H[l+148>>2]=i-5;H[l+128>>2]=b-4;break P}k=0;if((i|0)<2){break P}i=24;while(1){f=b-1|0;H[l+128>>2]=f;b=I[b|0];g=c-1|0;H[l+148>>2]=g;k=b<>>0>1;b=f;i=i-8|0;c=g;if(t){continue}break}}t=k&255;H[l+152>>2]=t>>>0>143;g=o?(k&2130706432)==2130706432?7:8:8;c=g+(k>>>0<=2415919103?8:(k&8323072)==8323072?7:8)|0;i=k>>>16&255;b=c+(i>>>0<=143?8:(k&32512)==32512?7:8)|0;f=k>>>8&255;H[l+144>>2]=b+((f>>>0<=143?8:(k&127)==127?7:8)+j|0);b=i<>>24|f<>>0>=32){t=b<>>32-c;b=b<>2]=b|m;H[l+140>>2]=p|t}u=1}da=z-S|0;U=Z+1|0;F[$+2112|0]=0;h=$+2112|0;g=Xa(l+256|0);if((C|0)>0){E=qa-1|0;o=$;f=h;b=0;c=ja;r=0;while(1){T=r;j=J[(b<<8|(kb(l+224|0)&127)<<1)+16656>>1];Q:{if(b){break Q}b=g-2|0;j=(b|0)==-1?j:0;if((g|0)>1){g=b;break Q}g=Xa(l+256|0)}m=H[l+232>>2];p=H[l+236>>2];i=H[l+240>>2];v=j>>>4|0;q=H[o>>2]|(v&3|j>>>2&48)<>2]=q;S=j&16;b=j>>>5&7|S>>>4;k=i;i=j&7;r=k-i|0;m=((1<>>i;p=p>>>i|0;k=m;i=0;if((C|0)>(T|2)){i=J[(b<<8|(k&127)<<1)+16656>>1];R:{if(b){break R}b=g-2|0;i=(b|0)==-1?i:0;if((g|0)>1){g=b;break R}g=Xa(l+256|0)}b=i&7;r=r-b|0;m=((1<>>b;p=p>>>b|0;k=m;b=i>>>4&1|i>>>5&7}H[o>>2]=q|(i<<2&768|i&48)<>>2&2|j>>>3&1;S:{if((q|0)!=3){break S}t=g-2|0;q=(t|0)==-1?4:3;if((g|0)>1){g=t;break S}g=Xa(l+256|0)}T:{if(!q){H[l+120>>2]=1;H[l+124>>2]=1;k=0;break T}if(q>>>0<=2){t=I[(k&7)+20804|0];x=t>>>2&7;z=t&3;t=(((-1<>>z)+(t>>>5|0)|0)+1|0;k=(q|0)==1;H[l+124>>2]=k?1:t;H[l+120>>2]=k?t:1;k=x+z|0;break T}x=k;k=I[(k&7)+20804|0];R=k&3;t=x>>>R|0;if((q|0)==3){V=(k>>>5|0)+1|0;if((R|0)==3){H[l+124>>2]=t&1|2;k=k>>>2&7;H[l+120>>2]=V+((-1<>>1);k=k+4|0;break T}z=I[(t&7)+20804|0];q=z&3;t=t>>>q|0;x=k>>>2&7;H[l+120>>2]=V+(t&(-1<>>2&7;H[l+124>>2]=(((-1<>>x)+(z>>>5|0)|0)+1;k=k+(q+(x+R|0)|0)|0;break T}z=I[(t&7)+20804|0];q=z&3;t=t>>>q|0;x=k>>>2&7;H[l+120>>2]=((t&(-1<>>5|0)|0)+3;k=z>>>2&7;H[l+124>>2]=(((-1<>>x)+(z>>>5|0)|0)+3;k=k+(x+(q+R|0)|0)|0}U:{V=H[l+120>>2];if(V>>>0<=U>>>0){x=H[l+124>>2];if(x>>>0<=U>>>0){break U}}if(ca){i=0;Ba(W,1,15756,0);break j}i=0;Ba(W,1,15756,0);break j}H[l+240>>2]=r-k;q=k&31;if((k&63)>>>0>=32){t=0;p=p>>>q|0}else{t=p>>>q|0;p=((1<>>q}H[l+232>>2]=p;H[l+236>>2]=t;r=T+4|0;p=(r|0)<=(C|0)?255:255>>>(r-C<<1)|0;R=(da|0)>1?p:p&85;if((i&240|v&15)&(R^-1)){if(ca){i=0;Ba(W,1,12194,0);break j}i=0;Ba(W,1,12194,0);break j}V:{W:{if(S){m=Ma(l+192|0);q=V-(j>>>12&1)|0;H[l+208>>2]=H[l+208>>2]-q;k=H[l+204>>2];p=H[l+200>>2];z=q&31;if((q&63)>>>0>=32){t=0;p=k>>>z|0}else{t=k>>>z|0;p=((1<>>z}H[l+200>>2]=p;H[l+204>>2]=t;v=(m&(-1<>>8&1)<>2]=v}X:{if(j&32){m=Ma(l+192|0);q=V-(j>>>13&1)|0;H[l+208>>2]=H[l+208>>2]-q;k=H[l+204>>2];p=H[l+200>>2];z=q&31;if((q&63)>>>0>=32){t=0;p=k>>>z|0}else{t=k>>>z|0;p=((1<>>z}H[l+200>>2]=p;H[l+204>>2]=t;p=m&(-1<>>9&1)<>2]=p+2<>>0>p>>>0?m:p)|128;break X}if(!(R&2)){break X}H[(C<<2)+c>>2]=0}q=c+4|0;Y:{Z:{if(j&64){m=Ma(l+192|0);z=V-(j>>>14&1)|0;H[l+208>>2]=H[l+208>>2]-z;k=H[l+204>>2];p=H[l+200>>2];S=z&31;if((z&63)>>>0>=32){t=0;p=k>>>S|0}else{t=k>>>S|0;p=((1<>>S}H[l+200>>2]=p;H[l+204>>2]=t;v=(m&(-1<>>10&1)<>2]=v}F[f+1|0]=0;_:{if(j&128){m=Ma(l+192|0);z=V-(j>>>15|0)|0;H[l+208>>2]=H[l+208>>2]-z;k=H[l+204>>2];p=H[l+200>>2];S=z&31;if((z&63)>>>0>=32){t=0;p=k>>>S|0}else{t=k>>>S|0;p=((1<>>S}H[l+200>>2]=p;H[l+204>>2]=t;p=m&(-1<>>11&1)<>2]=p+2<>2]=0}j=c+8|0;$:{aa:{if(i&16){m=Ma(l+192|0);q=x-(i>>>12&1)|0;H[l+208>>2]=H[l+208>>2]-q;k=H[l+204>>2];p=H[l+200>>2];z=q&31;if((q&63)>>>0>=32){t=0;p=k>>>z|0}else{t=k>>>z|0;p=((1<>>z}H[l+200>>2]=p;H[l+204>>2]=t;q=(m&(-1<>>8&1)<>2]=q}ba:{if(i&32){m=Ma(l+192|0);q=x-(i>>>13&1)|0;H[l+208>>2]=H[l+208>>2]-q;k=H[l+204>>2];p=H[l+200>>2];z=q&31;if((q&63)>>>0>=32){t=0;p=k>>>z|0}else{t=k>>>z|0;p=((1<>>z}H[l+200>>2]=p;H[l+204>>2]=t;p=m&(-1<>>9&1)<>2]=p+2<>>0>p>>>0?m:p)|128;break ba}if(!(R&32)){break ba}H[j+(C<<2)>>2]=0}j=c+12|0;ca:{da:{if(i&64){m=Ma(l+192|0);q=x-(i>>>14&1)|0;H[l+208>>2]=H[l+208>>2]-q;k=H[l+204>>2];p=H[l+200>>2];z=q&31;if((q&63)>>>0>=32){t=0;p=k>>>z|0}else{t=k>>>z|0;p=((1<>>z}H[l+200>>2]=p;H[l+204>>2]=t;q=(m&(-1<>>10&1)<>2]=q}f=f+2|0;F[f|0]=0;ea:{if(i&128){m=Ma(l+192|0);q=x-(i>>>15|0)|0;H[l+208>>2]=H[l+208>>2]-q;k=H[l+204>>2];p=H[l+200>>2];z=q&31;if((q&63)>>>0>=32){t=0;p=k>>>z|0}else{t=k>>>z|0;p=((1<>>z}H[l+200>>2]=p;H[l+204>>2]=t;i=m&(-1<>>11&1)<>2]=i+2<>>0<128){break ea}H[j+(C<<2)>>2]=0}s=s^16;o=(T&4)+o|0;c=c+16|0;if((r|0)<(C|0)){continue}break}}ka=ba&8;sa=$+1584|0;ta=$+1056|0;ga=$+528|0;if((da|0)>=3){M=N(C,12);la=C<<3;fa=qa-1|0;b=qa-2|0;Y=3<>>1&2147483644)+4|0;T=2;while(1){z=T;v=I[h|0];F[h|0]=0;s=s&-17^2;fa:{if((C|0)<=0){T=z+2|0;break fa}b=z&4?ga:$;T=z+2|0;f=ja+(N(z,C)<<2)|0;q=0;c=h;S=0;while(1){ba=q;v=v&255;i=I[c+1|0]>>>5&4|(v>>>7|S);j=J[(i<<8|(kb(l+224|0)&127)<<1)+18704>>1];ga:{if(i){break ga}i=g-2|0;j=(i|0)==-1?j:0;if((g|0)>1){g=i;break ga}g=Xa(l+256|0)}m=H[l+232>>2];p=H[l+236>>2];i=H[l+240>>2];o=H[b>>2]|(j>>>4&3|j>>>2&48)<>2]=o;R=j&64;V=j&128;S=R>>>5|V>>>6;k=i;i=j&7;X=k-i|0;m=((1<>>i;p=p>>>i|0;q=m;i=0;if((C|0)>(ba|2)){k=I[c+2|0]>>>5&4|I[c+1|0]>>>7|S;i=J[(k<<8|(m&127)<<1)+18704>>1];ha:{if(k){break ha}k=g-2|0;i=(k|0)==-1?i:0;if((g|0)>1){g=k;break ha}g=Xa(l+256|0)}k=i&7;X=X-k|0;S=(i>>>5|i>>>6)&2;m=((1<>>k;q=m;p=p>>>k|0}H[b>>2]=o|(i<<2&768|i&48)<>>2&2|j>>>3&1;switch(r|0){case 0:break ia;case 3:break ja;default:break ka}}k=I[(q&7)+20804|0];x=k>>>2&7;o=q;q=k&3;o=(((-1<>>q)+(k>>>5|0)|0)+1|0;t=(r|0)==1;k=t?1:o;o=t?o:1;r=q+x|0;break ia}E=I[(q&7)+20804|0];t=E&3;k=q>>>t|0;x=I[(k&7)+20804|0];o=x&3;q=E>>>2&7;r=q+(o+t|0)|0;t=x>>>2&7;r=r+t|0;k=k>>>o|0;o=((k&(-1<>>5|0)|0)+1|0;k=(((-1<>>q)+(x>>>5|0)|0)+1|0}H[l+240>>2]=X-r;t=r&31;if((r&63)>>>0>=32){x=0;p=p>>>t|0}else{x=p>>>t|0;p=((1<>>t}H[l+232>>2]=p;H[l+236>>2]=x;q=j&240;if(q-1&q){m=v&127;p=I[c+1|0]&127;m=m>>>0>p>>>0?m:p;p=m-2|0;o=(m>>>0>=p>>>0?p:0)+o|0}t=i&240;if(t-1&t){m=I[c+1|0]&127;p=I[c+2|0]&127;p=m>>>0>p>>>0?m:p;k=(p>>>0>2?p-2|0:0)+k|0}if(!(o>>>0<=U>>>0&k>>>0<=U>>>0)){if(ca){i=0;Ba(W,1,15856,0);break j}i=0;Ba(W,1,15856,0);break j}v=I[c+2|0];F[c+1|0]=0;F[c+2|0]=0;m=t|q>>>4;q=ba+4|0;p=(q|0)<=(C|0)?255:255>>>(q-C<<1)|0;P=(T|0)>(da|0)?p&85:p;if(m&(P^-1)){if(ca){i=0;Ba(W,1,12194,0);break j}i=0;Ba(W,1,12194,0);break j}la:{ma:{if(j&16){m=Ma(l+192|0);r=o-(j>>>12&1)|0;H[l+208>>2]=H[l+208>>2]-r;t=H[l+204>>2];p=H[l+200>>2];E=r&31;if((r&63)>>>0>=32){x=0;p=t>>>E|0}else{x=t>>>E|0;p=((1<>>E}H[l+200>>2]=p;H[l+204>>2]=x;X=(m&(-1<>>8&1)<>2]=X}na:{if(j&32){m=Ma(l+192|0);r=o-(j>>>13&1)|0;H[l+208>>2]=H[l+208>>2]-r;t=H[l+204>>2];p=H[l+200>>2];E=r&31;if((r&63)>>>0>=32){x=0;p=t>>>E|0}else{x=t>>>E|0;p=((1<>>E}H[l+200>>2]=p;H[l+204>>2]=x;p=m&(-1<>>9&1)<>2]=p+2<>>0>p>>>0?m:p)|128;break na}if(!(P&2)){break na}H[(C<<2)+f>>2]=0}r=f+4|0;oa:{pa:{if(R){m=Ma(l+192|0);R=o-(j>>>14&1)|0;H[l+208>>2]=H[l+208>>2]-R;t=H[l+204>>2];p=H[l+200>>2];E=R&31;if((R&63)>>>0>=32){x=0;p=t>>>E|0}else{x=t>>>E|0;p=((1<>>E}H[l+200>>2]=p;H[l+204>>2]=x;X=(m&(-1<>>10&1)<>2]=X}qa:{if(V){m=Ma(l+192|0);o=o-(j>>>15|0)|0;H[l+208>>2]=H[l+208>>2]-o;t=H[l+204>>2];p=H[l+200>>2];V=o&31;if((o&63)>>>0>=32){x=0;p=t>>>V|0}else{x=t>>>V|0;p=((1<>>V}H[l+200>>2]=p;H[l+204>>2]=x;p=m&(-1<>>11&1)<>2]=p+2<>2]=0}j=f+8|0;ra:{sa:{if(i&16){m=Ma(l+192|0);o=k-(i>>>12&1)|0;H[l+208>>2]=H[l+208>>2]-o;t=H[l+204>>2];p=H[l+200>>2];r=o&31;if((o&63)>>>0>=32){x=0;p=t>>>r|0}else{x=t>>>r|0;p=((1<>>r}H[l+200>>2]=p;H[l+204>>2]=x;o=(m&(-1<>>8&1)<>2]=o}ta:{if(i&32){m=Ma(l+192|0);o=k-(i>>>13&1)|0;H[l+208>>2]=H[l+208>>2]-o;t=H[l+204>>2];p=H[l+200>>2];r=o&31;if((o&63)>>>0>=32){x=0;p=t>>>r|0}else{x=t>>>r|0;p=((1<>>r}H[l+200>>2]=p;H[l+204>>2]=x;p=m&(-1<>>9&1)<>2]=p+2<>>0>p>>>0?m:p)|128;break ta}if(!(P&32)){break ta}H[j+(C<<2)>>2]=0}j=f+12|0;ua:{va:{if(i&64){m=Ma(l+192|0);o=k-(i>>>14&1)|0;H[l+208>>2]=H[l+208>>2]-o;t=H[l+204>>2];p=H[l+200>>2];r=o&31;if((o&63)>>>0>=32){x=0;p=t>>>r|0}else{x=t>>>r|0;p=((1<>>r}H[l+200>>2]=p;H[l+204>>2]=x;o=(m&(-1<>>10&1)<>2]=o}c=c+2|0;wa:{if(i&128){m=Ma(l+192|0);t=k-(i>>>15|0)|0;H[l+208>>2]=H[l+208>>2]-t;k=H[l+204>>2];p=H[l+200>>2];o=t&31;if((t&63)>>>0>=32){x=0;p=k>>>o|0}else{x=k>>>o|0;p=((1<>>o}H[l+200>>2]=p;H[l+204>>2]=x;i=m&(-1<>>11&1)<>2]=i+2<>>0<128){break wa}H[j+(C<<2)>>2]=0}s=s^16;b=(ba&4)+b|0;f=f+16|0;if((q|0)<(C|0)){continue}break}}xa:{if(!(z&2)|n>>>0<2){break xa}q=T&4;ya:{za:{Aa:{if(u){t=q?$:ga;r=0;if((C|0)<=0){break Aa}p=ja+(N(C,z-2|0)<<2)|0;while(1){i=kb(l+128|0);j=0;f=H[t>>2];if(f){j=p+(r<<2)|0;c=15;k=0;while(1){Ba:{if(!(c&f)){break Ba}m=c&286331153;if(m&f){H[j>>2]=w|H[j>>2]^((i^-1)&1)<>>1|0}if(f&m<<1){b=(C<<2)+j|0;H[b>>2]=w|H[b>>2]^((i^-1)&1)<>>1|0}if(f&m<<2){b=j+la|0;H[b>>2]=w|H[b>>2]^((i^-1)&1)<>>1|0}if(!(f&m<<3)){break Ba}b=j+M|0;H[b>>2]=w|H[b>>2]^((i^-1)&1)<>>1|0}j=j+4|0;c=c<<4;k=k+1|0;if((k|0)!=8){continue}break}j=he(f)}t=t+4|0;H[l+144>>2]=H[l+144>>2]-j;c=H[l+140>>2];b=H[l+136>>2];i=j&31;if((j&63)>>>0>=32){x=0;b=c>>>i|0}else{x=c>>>i|0;b=((1<>>i}H[l+136>>2]=b;H[l+140>>2]=x;r=r+8|0;if((C|0)>(r|0)){continue}break}}o=0;i=0;ha=q?ta:sa;j=ha;t=q?$:ga;c=t;if((C|0)>0){break za}}if(z>>>0<=5){break xa}v=q?ga:$;break ya}while(1){b=i>>>28|0;i=H[c>>2];b=i|(b|i<<4|i>>>4);H[j>>2]=b;b=b|H[c+4>>2]<<28;H[j>>2]=(b>>>1&2004318071|b<<1&-286331154|b)&(i^-1);j=j+4|0;c=c+4|0;o=o+8|0;if((C|0)>(o|0)){continue}break}if(z>>>0<6){break xa}b=0;k=0;j=t;X=q?sa:ta;i=X;v=q?ga:$;c=v;while(1){m=j+4|0;p=H[i>>2];f=H[j>>2];if(!ka){p=p|(f|(f<<4|b>>>28|f>>>4|H[m>>2]<<28))<<3&-2004318072}H[i>>2]=p&(H[c>>2]^-1);c=c+4|0;i=i+4|0;b=f;j=m;k=k+8|0;if((C|0)>(k|0)){continue}break}V=ja+(N(C,z-6|0)<<2)|0;_=0;b=v;while(1){f=0;c=H[X>>2];if(c){z=C-_|0;ba=(_<<2)+V|0;i=0;S=0;while(1){p=i;i=Ma(l+160|0);m=S+4|0;R=(C|0)>(m+_|0)?m:z;Ca:{if((R|0)<=(S|0)){j=0;break Ca}P=H[b>>2]^-1;x=S<<2;r=x+ba|0;j=0;k=S;q=15<>>1|0}m=E<<1;if(m&c){if(i&1){f=f|m;c=P&116<<(k<<2)|c}j=j+1|0;i=i>>>1|0}m=E<<2;if(m&c){if(i&1){f=f|m;c=P&232<<(k<<2)|c}j=j+1|0;i=i>>>1|0}m=E<<3;if(!(m&c)){break Da}if(i&1){f=f|m;c=P&192<<(k<<2)|c}j=j+1|0;i=i>>>1|0}o=o<<4;k=k+1|0;if((R|0)>(k|0)){continue}break}if(!(f>>>x&65535)){break Ca}while(1){Ea:{if(!(f&q)){break Ea}k=q&286331153;if(k&f){H[r>>2]=Y|(H[r>>2]|i<<31);j=j+1|0;i=i>>>1|0}if(k<<1&f){m=(C<<2)+r|0;H[m>>2]=Y|(H[m>>2]|i<<31);j=j+1|0;i=i>>>1|0}if(k<<2&f){m=r+la|0;H[m>>2]=Y|(H[m>>2]|i<<31);j=j+1|0;i=i>>>1|0}if(!(k<<3&f)){break Ea}m=r+M|0;H[m>>2]=Y|(H[m>>2]|i<<31);j=j+1|0;i=i>>>1|0}q=q<<4;r=r+4|0;S=S+1|0;if((R|0)>(S|0)){continue}break}}H[l+176>>2]=H[l+176>>2]-j;m=H[l+172>>2];i=H[l+168>>2];k=j&31;if((j&63)>>>0>=32){x=0;i=m>>>k|0}else{x=m>>>k|0;i=((1<>>k}H[l+168>>2]=i;H[l+172>>2]=x;i=1;S=4;if(!(p&1)){continue}break}H[X+4>>2]=H[X+4>>2]|(f>>>27&14|f>>>29|f>>>28)&(H[b+4>>2]^-1)}p=H[b>>2]|f;m=p>>>3&286331153;i=m>>>4|m<<4|m;if(_){c=ha-4|0;H[c>>2]=H[c>>2]|(H[t-4>>2]^-1)&m<<28}H[ha>>2]=H[ha>>2]|i&(H[t>>2]^-1);H[ha+4>>2]=H[ha+4>>2]|(H[t+4>>2]^-1)&p>>>31;X=X+4|0;b=b+4|0;ha=ha+4|0;t=t+4|0;_=_+8|0;if((C|0)>(_|0)){continue}break}}if(!Z){break xa}y(v,0,Z)}if((T|0)<(da|0)){continue}break}}Fa:{if(n>>>0<2){break Fa}f=(da&3)-1|0;Ga:{if(u&f>>>0<2){if((C|0)<=0){break Ga}h=1<>2];if(q){j=m+(S<<2)|0;c=15;k=0;while(1){Ha:{if(!(c&q)){break Ha}t=c&286331153;if(t&q){H[j>>2]=h|H[j>>2]^((i^-1)&1)<>>1|0}if(q&t<<1){b=(C<<2)+j|0;H[b>>2]=h|H[b>>2]^((i^-1)&1)<>>1|0}if(q&t<<2){b=g+j|0;H[b>>2]=h|H[b>>2]^((i^-1)&1)<>>1|0}if(!(q&t<<3)){break Ha}b=j+p|0;H[b>>2]=h|H[b>>2]^((i^-1)&1)<>>1|0}j=j+4|0;c=c<<4;k=k+1|0;if((k|0)!=8){continue}break}j=he(q)}n=n+4|0;H[l+144>>2]=H[l+144>>2]-j;c=H[l+140>>2];b=H[l+136>>2];i=j&31;if((j&63)>>>0>=32){x=0;b=c>>>i|0}else{x=c>>>i|0;b=((1<>>i}H[l+136>>2]=b;H[l+140>>2]=x;S=S+8|0;if((C|0)>(S|0)){continue}break}}if((C|0)<=0|f>>>0>1){break Ga}b=da&4;j=b?ga:$;c=b?sa:ta;o=0;i=0;while(1){b=i>>>28|0;i=H[j>>2];b=i|(b|i<<4|i>>>4);H[c>>2]=b;b=b|H[j+4>>2]<<28;H[c>>2]=(b>>>1&2004318071|b<<1&-286331154|b)&(i^-1);c=c+4|0;j=j+4|0;o=o+8|0;if((C|0)>(o|0)){continue}break}}b=(da|0)>6?(da-(da+1&3)|0)-3|0:0;if((da|0)<=(b|0)){break Fa}T=N(C,12);ba=C<<3;E=3<>>0>=3){s=-1;if((g|0)<5){break Ka}if(v){break Ia}g=b&4;j=g?ga:$;i=g?sa:ta;c=0;if(!ka){c=g?$:ga;o=0;f=0;while(1){g=f>>>28|0;s=-1;f=H[c>>2];H[i>>2]=(H[i>>2]|(f|(g|f<<4|f>>>4|H[c+4>>2]<<28))<<3&-2004318072)&(H[j>>2]^-1);j=j+4|0;i=i+4|0;c=c+4|0;o=o+8|0;if((C|0)>(o|0)){continue}break}break Ja}while(1){s=-1;H[i>>2]=H[i>>2]&(H[j>>2]^-1);j=j+4|0;i=i+4|0;c=c+8|0;if((C|0)>(c|0)){continue}break}break Ja}s=H[(c<<2)+20812>>2]}if(v){break Ia}}c=b&4;Z=c?ga:$;g=c?sa:ta;X=c?$:ga;_=c?ta:sa;u=ja+(N(b,C)<<2)|0;q=0;while(1){f=0;c=H[g>>2]&s;if(c){h=C-q|0;t=u+(q<<2)|0;i=0;n=0;while(1){p=i;i=Ma(l+160|0);m=n+4|0;S=(C|0)>(m+q|0)?m:h;La:{if((S|0)<=(n|0)){j=0;break La}z=n<<2;r=z+t|0;R=(H[Z>>2]^-1)&s;j=0;k=n;V=15<>>1|0}m=x<<1;if(m&c){if(i&1){f=f|m;c=R&116<<(k<<2)|c}j=j+1|0;i=i>>>1|0}m=x<<2;if(m&c){if(i&1){f=f|m;c=R&232<<(k<<2)|c}j=j+1|0;i=i>>>1|0}m=x<<3;if(!(m&c)){break Ma}if(i&1){f=f|m;c=R&192<<(k<<2)|c}j=j+1|0;i=i>>>1|0}o=o<<4;k=k+1|0;if((S|0)>(k|0)){continue}break}if(!(f>>>z&65535)){break La}while(1){Na:{if(!(f&V)){break Na}k=V&286331153;if(k&f){H[r>>2]=E|(H[r>>2]|i<<31);j=j+1|0;i=i>>>1|0}if(k<<1&f){m=(C<<2)+r|0;H[m>>2]=E|(H[m>>2]|i<<31);j=j+1|0;i=i>>>1|0}if(k<<2&f){m=r+ba|0;H[m>>2]=E|(H[m>>2]|i<<31);j=j+1|0;i=i>>>1|0}if(!(k<<3&f)){break Na}m=r+T|0;H[m>>2]=E|(H[m>>2]|i<<31);j=j+1|0;i=i>>>1|0}V=V<<4;r=r+4|0;n=n+1|0;if((S|0)>(n|0)){continue}break}}H[l+176>>2]=H[l+176>>2]-j;m=H[l+172>>2];i=H[l+168>>2];k=j&31;if((j&63)>>>0>=32){x=0;i=m>>>k|0}else{x=m>>>k|0;i=((1<>>k}H[l+168>>2]=i;H[l+172>>2]=x;i=1;n=4;if(!(p&1)){continue}break}H[g+4>>2]=H[g+4>>2]|(f>>>27&14|f>>>29|f>>>28)&(H[Z+4>>2]^-1)}p=H[Z>>2]|f;m=p>>>3&286331153;i=m>>>4|m<<4|m;if(q){c=_-4|0;H[c>>2]=H[c>>2]|(H[X-4>>2]^-1)&m<<28}H[_>>2]=H[_>>2]|i&(H[X>>2]^-1);H[_+4>>2]=H[_+4>>2]|(H[X+4>>2]^-1)&p>>>31;g=g+4|0;Z=Z+4|0;_=_+4|0;X=X+4|0;q=q+8|0;if((C|0)>(q|0)){continue}break}}b=b+4|0;if((da|0)>(b|0)){continue}break}}i=1;if((da|0)<=0|(C|0)<=0){break j}m=C&2147483644;k=C&3;p=ea-A>>>0>4294967292;b=0;while(1){i=ja+(N(b,C)<<2)|0;j=0;Oa:{if(!p){while(1){g=H[i>>2];c=g&2147483647;H[i>>2]=(g|0)<0?0-c|0:c;g=H[i+4>>2];c=g&2147483647;H[i+4>>2]=(g|0)<0?0-c|0:c;g=H[i+8>>2];c=g&2147483647;H[i+8>>2]=(g|0)<0?0-c|0:c;g=H[i+12>>2];c=g&2147483647;H[i+12>>2]=(g|0)<0?0-c|0:c;i=i+16|0;j=j+4|0;if((m|0)!=(j|0)){continue}break}if(!k){break Oa}}j=0;while(1){g=H[i>>2];c=g&2147483647;H[i>>2]=(g|0)<0?0-c|0:c;i=i+4|0;j=j+1|0;if((k|0)!=(j|0)){continue}break}}i=1;b=b+1|0;if((da|0)!=(b|0)){continue}break}break j}if(!ca){break w}H[l+52>>2]=H[D+24>>2];H[l+48>>2]=Z;Ba(W,1,9686,l+48|0);break v}H[l+20>>2]=i;H[l+16>>2]=Z;Ba(W,1,9686,l+16|0);i=0;break j}i=0}na=l+304|0;if(i){break i}break b}H[e+108>>2]=(b<<9)+22336;c=0;b=H[e+116>>2];Pa:{Qa:{j=H[D+16>>2]-H[D+8>>2]|0;o=H[D+20>>2]-H[D+12>>2]|0;g=N(j,o);Ra:{Sa:{Ta:{if(g>>>0>K[e+132>>2]){Ca(b);b=Ia(g<<2);H[e+116>>2]=b;if(!b){break Ra}H[e+132>>2]=g;break Ta}if(!b){break Sa}}g=g<<2;if(!g){break Sa}y(b,0,g)}b=H[e+120>>2];h=j+2|0;k=o+3>>>2|0;g=N(h,k+2|0);if(g>>>0<=K[e+136>>2]){U=g<<2;break Qa}Ca(b);U=g<<2;b=Ia(U);H[e+120>>2]=b;if(b){break Qa}}b=0;break Pa}H[e+136>>2]=g;if(U){y(b,0,U)}Ua:{if(!h){break Ua}l=h&7;m=H[e+120>>2];b=m;p=j+1|0;Va:{if(p>>>0>=7){g=h&-8;while(1){H[b+24>>2]=1226833920;H[b+28>>2]=1226833920;H[b+16>>2]=1226833920;H[b+20>>2]=1226833920;H[b+8>>2]=1226833920;H[b+12>>2]=1226833920;H[b>>2]=1226833920;H[b+4>>2]=1226833920;b=b+32|0;c=c+8|0;if((g|0)!=(c|0)){continue}break}if(!l){break Va}}c=0;while(1){H[b>>2]=1226833920;b=b+4|0;c=c+1|0;if((l|0)!=(c|0)){continue}break}}l=h&7;b=m+(N(h,k+1|0)<<2)|0;Wa:{if(p>>>0>=7){g=h&-8;c=0;while(1){H[b+24>>2]=1226833920;H[b+28>>2]=1226833920;H[b+16>>2]=1226833920;H[b+20>>2]=1226833920;H[b+8>>2]=1226833920;H[b+12>>2]=1226833920;H[b>>2]=1226833920;H[b+4>>2]=1226833920;b=b+32|0;c=c+8|0;if((g|0)!=(c|0)){continue}break}if(!l){break Wa}}c=0;while(1){H[b>>2]=1226833920;b=b+4|0;c=c+1|0;if((l|0)!=(c|0)){continue}break}}b=o&3;if(!b){break Ua}l=(b|0)==1?1224736768:(b|0)==2?1207959552:1073741824;g=h&7;b=m+(N(h,k)<<2)|0;if(p>>>0>=7){c=h&-8;U=0;while(1){H[b+28>>2]=l;H[b+24>>2]=l;H[b+20>>2]=l;H[b+16>>2]=l;H[b+12>>2]=l;H[b+8>>2]=l;H[b+4>>2]=l;H[b>>2]=l;b=b+32|0;U=U+8|0;if((c|0)!=(U|0)){continue}break}if(!g){break Ua}}U=0;while(1){H[b>>2]=l;b=b+4|0;U=U+1|0;if((g|0)!=(U|0)){continue}break}}H[e+128>>2]=o;H[e+124>>2]=j;b=1}if(!b){break b}U=t+H[D+28>>2]|0;if((U|0)>=31){if(!ca){break h}H[aa+16>>2]=U;Ba(W,2,8716,aa+16|0);break b}Vb(e);Wa(e,18,46);Wa(e,17,3);Wa(e,0,4);if(H[D+64>>2]){break i}c=H[D+52>>2];Xa:{if(!(c>>>0<=1&(!H[e+144>>2]|(c|0)!=1))){l=c&3;b=H[D+4>>2];g=0;Ya:{if(c-1>>>0>=3){c=c&-4;while(1){p=(r<<3)+b|0;g=H[p+28>>2]+(H[p+20>>2]+(H[p+12>>2]+(H[p+4>>2]+g|0)|0)|0)|0;r=r+4|0;f=f+4|0;if((c|0)!=(f|0)){continue}break}if(!l){break Ya}}while(1){g=H[((r<<3)+b|0)+4>>2]+g|0;r=r+1|0;i=i+1|0;if((l|0)!=(i|0)){continue}break}}ka=H[e+148>>2];c=g+2|0;if(c>>>0>K[e+152>>2]){b=Ga(ka,c);if(!b){break b}H[e+148>>2]=b;b=b+g|0;F[b|0]=0;F[b+1|0]=0;H[e+152>>2]=c;ka=H[e+148>>2];if(!H[D+52>>2]){break Xa}b=H[D+4>>2]}g=0;r=0;while(1){l=r<<3;c=l+b|0;b=H[c+4>>2];if(b){B(g+ka|0,H[c>>2],b)}b=H[D+4>>2];g=H[(l+b|0)+4>>2]+g|0;r=r+1|0;if(r>>>0>2]){continue}break}break Xa}if((c|0)!=1){break i}ka=H[H[D+4>>2]>>2]}b=H[D+60>>2];if(b){S=H[e+116>>2];H[e+116>>2]=b}if(H[D+44>>2]){E=ba&8;ea=e+28|0;z=!(ba&2);_=2;while(1){l=ha+ka|0;la=H[D>>2]+N(R,24)|0;c=H[la>>2];Z=ba&(_>>>0<2&(H[D+28>>2]-4|0)>=(U|0));Za:{if(Z){H[e+20>>2]=l;b=c+l|0;H[e+24>>2]=b;G[e+112>>1]=I[b|0]|I[b+1|0]<<8;F[b|0]=255;F[H[e+24>>2]+1|0]=255;H[e+8>>2]=0;H[e>>2]=0;H[e+16>>2]=l;break Za}H[e+20>>2]=l;b=c+l|0;H[e+24>>2]=b;G[e+112>>1]=I[b|0]|I[b+1|0]<<8;F[b|0]=255;F[H[e+24>>2]+1|0]=255;H[e+104>>2]=e+28;H[e+16>>2]=l;H[e+12>>2]=0;b=c?I[l|0]<<16:16711680;H[e>>2]=b;i=1;c=l+1|0;g=I[l+1|0];_a:{if(I[l|0]==255){if(g>>>0>=144){H[e+12>>2]=1;b=b|65280;break _a}H[e+16>>2]=c;i=0;b=b+(g<<9)|0;break _a}H[e+16>>2]=c;b=b|g<<8}H[e+8>>2]=i;H[e+4>>2]=32768;H[e>>2]=b<<7}ja=H[la>>2];$a:{if(!H[la+8>>2]|(U|0)<=0){break $a}T=z|Z;V=0;while(1){ab:{bb:{cb:{db:{switch(_-1|0){default:if(!Z){break cb}b=1<>>1|b;o=H[e+124>>2];k=o<<2;b=(k+H[e+120>>2]|0)+12|0;g=H[e+116>>2];j=0;c=H[e+128>>2];if(c>>>0>=4){if(!o){break ab}d=N(o,12);m=o<<3;f=0-h|0;while(1){c=0;while(1){l=b;b=H[b>>2];eb:{if(!b){break eb}if(!(!(b&495)|b&2097168)){b=H[e>>2];i=H[e+8>>2];fb:{if(i){break fb}i=(b|0)!=255;p=H[e+16>>2];b=I[p|0];gb:{if(i){i=8}else{if(b>>>0>143){break gb}i=7}H[e>>2]=b;H[e+16>>2]=p+1;break fb}i=8;b=255}i=i-1|0;H[e+8>>2]=i;hb:{if(!(b>>>i&1)){break hb}ib:{if(i){break ib}i=(b|0)!=255;p=H[e+16>>2];b=I[p|0];jb:{if(i){i=8}else{if(b>>>0>143){break jb}i=7}H[e>>2]=b;H[e+16>>2]=p+1;break ib}i=8;b=255}i=i-1|0;H[e+8>>2]=i;p=b>>>i&1;H[g>>2]=p?f:h;i=H[e+124>>2];b=l-4|0;H[b>>2]=H[b>>2]|32;H[l+4>>2]=H[l+4>>2]|8;H[l>>2]=H[l>>2]|p<<19|16;if(E){break hb}b=l+(-2-i<<2)|0;H[b+4>>2]=H[b+4>>2]|32768;H[b>>2]=H[b>>2]|p<<31|65536;b=b-4|0;H[b>>2]=H[b>>2]|131072}b=H[l>>2]|2097152;H[l>>2]=b}if(!(!(b&3960)|b&16777344)){b=H[e>>2];i=H[e+8>>2];kb:{if(i){break kb}i=(b|0)!=255;p=H[e+16>>2];b=I[p|0];lb:{if(i){i=8}else{if(b>>>0>143){break lb}i=7}H[e>>2]=b;H[e+16>>2]=p+1;break kb}i=8;b=255}i=i-1|0;H[e+8>>2]=i;if(b>>>i&1){mb:{if(i){break mb}i=(b|0)!=255;p=H[e+16>>2];b=I[p|0];nb:{if(i){i=8}else{if(b>>>0>143){break nb}i=7}H[e>>2]=b;H[e+16>>2]=p+1;break mb}i=8;b=255}i=i-1|0;H[e+8>>2]=i;i=b>>>i&1;H[g+k>>2]=i?f:h;b=l-4|0;H[b>>2]=H[b>>2]|256;H[l+4>>2]=H[l+4>>2]|64;b=H[l>>2]|i<<22|128}else{b=H[l>>2]}b=b|16777216;H[l>>2]=b}if(!(!(b&31680)|b&134218752)){b=H[e>>2];i=H[e+8>>2];ob:{if(i){break ob}i=(b|0)!=255;p=H[e+16>>2];b=I[p|0];pb:{if(i){i=8}else{if(b>>>0>143){break pb}i=7}H[e>>2]=b;H[e+16>>2]=p+1;break ob}i=8;b=255}i=i-1|0;H[e+8>>2]=i;if(b>>>i&1){qb:{if(i){break qb}i=(b|0)!=255;p=H[e+16>>2];b=I[p|0];rb:{if(i){i=8}else{if(b>>>0>143){break rb}i=7}H[e>>2]=b;H[e+16>>2]=p+1;break qb}i=8;b=255}i=i-1|0;H[e+8>>2]=i;i=b>>>i&1;H[g+m>>2]=i?f:h;b=l-4|0;H[b>>2]=H[b>>2]|2048;H[l+4>>2]=H[l+4>>2]|512;b=H[l>>2]|i<<25|1024}else{b=H[l>>2]}b=b|134217728;H[l>>2]=b}if(!(b&253440)|b&1073750016){break eb}b=H[e>>2];i=H[e+8>>2];sb:{if(i){break sb}i=(b|0)!=255;p=H[e+16>>2];b=I[p|0];tb:{if(i){i=8}else{if(b>>>0>143){break tb}i=7}H[e>>2]=b;H[e+16>>2]=p+1;break sb}i=8;b=255}i=i-1|0;H[e+8>>2]=i;if(b>>>i&1){ub:{if(i){break ub}i=(b|0)!=255;p=H[e+16>>2];b=I[p|0];vb:{if(i){i=8}else{if(b>>>0>143){break vb}i=7}H[e>>2]=b;H[e+16>>2]=p+1;break ub}i=8;b=255}i=i-1|0;H[e+8>>2]=i;p=b>>>i&1;H[d+g>>2]=p?f:h;i=H[e+124>>2];b=l-4|0;H[b>>2]=H[b>>2]|16384;H[l+4>>2]=H[l+4>>2]|4096;H[l>>2]=H[l>>2]|p<<28|8192;b=l+(i<<2)|0;H[b+4>>2]=H[b+4>>2]|4;H[b+12>>2]=H[b+12>>2]|1;H[b+8>>2]=H[b+8>>2]|p<<18|2}H[l>>2]=H[l>>2]|1073741824}g=g+4|0;b=l+4|0;c=c+1|0;if((o|0)!=(c|0)){continue}break}g=d+g|0;b=l+12|0;j=j+4|0;c=H[e+128>>2];if(j>>>0<(c&-4)>>>0){continue}break}}if(!o|c>>>0<=j>>>0){break bb}q=0;m=0-h|0;i=c;while(1){wb:{if((i|0)==(j|0)){i=j;break wb}d=b-4|0;k=H[b>>2];r=0;while(1){t=N(r,3);l=k>>>t|0;if(!(l&2097168|!(l&495))){c=H[e>>2];f=H[e+8>>2];xb:{if(f){break xb}i=(c|0)!=255;l=H[e+16>>2];c=I[l|0];yb:{if(i){f=8}else{if(c>>>0>143){break yb}f=7}H[e>>2]=c;H[e+16>>2]=l+1;break xb}f=8;c=255}f=f-1|0;H[e+8>>2]=f;zb:{if(!(c>>>f&1)){break zb}p=(N(o,r)<<2)+g|0;Ab:{if(f){break Ab}i=(c|0)!=255;l=H[e+16>>2];c=I[l|0];Bb:{if(i){f=8}else{if(c>>>0>143){break Bb}f=7}H[e>>2]=c;H[e+16>>2]=l+1;break Ab}f=8;c=255}l=f-1|0;H[e+8>>2]=l;i=c>>>l&1;H[p>>2]=i?m:h;l=H[e+124>>2];H[d>>2]=H[d>>2]|32<>2]=H[b>>2]|(i<<19|16)<>2]=H[b+4>>2]|8<>2]=H[c+4>>2]|32768;H[c>>2]=H[c>>2]|i<<31|65536;c=c-4|0;H[c>>2]=H[c>>2]|131072}if((r|0)!=3){break zb}c=(l<<2)+b|0;H[c+4>>2]=H[c+4>>2]|4;H[c+12>>2]=H[c+12>>2]|1;H[c+8>>2]=H[c+8>>2]|i<<18|2}k=H[b>>2]|2097152<>2]=k;c=H[e+128>>2]}i=c;r=r+1|0;if(r>>>0>>0){continue}break}}g=g+4|0;b=b+4|0;q=q+1|0;if((o|0)!=(q|0)){continue}break};break bb;case 1:v=0;t=0;Cb:{Db:{Eb:{Y=H[e+124>>2];if(!((Y|0)!=64|H[e+128>>2]!=64)){b=1<>>1|b;x=0-M|0;p=e+100|0;l=e+96|0;A=e+28|0;g=H[e+120>>2]+268|0;h=H[e+8>>2];b=H[e+4>>2];d=H[e>>2];i=H[e+104>>2];c=H[e+116>>2];if(ba&8){break Eb}while(1){s=0;while(1){k=c;f=g;g=H[g>>2];Fb:{Gb:{Hb:{if(!g){i=H[l>>2];g=H[i>>2];b=b-g|0;Ib:{if(d>>>16>>>0>>0){m=H[i+4>>2];c=b>>>0>>0;H[l>>2]=H[i+(c?8:12)>>2];while(1){Jb:{if(h){break Jb}i=H[e+16>>2];b=i+1|0;o=I[i+1|0];if(I[i|0]==255){if(o>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Jb}H[e+16>>2]=b;d=(o<<9)+d|0;h=7;break Jb}H[e+16>>2]=b;h=8;d=(o<<8)+d|0}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;c=c?m:!m;break Ib}d=d-(g<<16)|0;if(!(b&32768)){m=H[i+4>>2];c=b>>>0>>0;H[l>>2]=H[i+(c?12:8)>>2];while(1){Kb:{if(h){break Kb}i=H[e+16>>2];g=i+1|0;o=I[i+1|0];if(I[i|0]==255){if(o>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Kb}H[e+16>>2]=g;d=(o<<9)+d|0;h=7;break Kb}H[e+16>>2]=g;h=8;d=(o<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!m:m;break Ib}c=H[i+4>>2]}if(!c){i=l;break Fb}c=H[p>>2];g=H[c>>2];b=b-g|0;Lb:{if(d>>>16>>>0>>0){o=H[c+4>>2];i=b>>>0>>0;c=H[(i?8:12)+c>>2];H[p>>2]=c;while(1){Mb:{if(h){break Mb}m=H[e+16>>2];b=m+1|0;j=I[m+1|0];if(I[m|0]==255){if(j>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Mb}H[e+16>>2]=b;d=(j<<9)+d|0;h=7;break Mb}H[e+16>>2]=b;h=8;d=(j<<8)+d|0}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;m=i?o:!o;break Lb}d=d-(g<<16)|0;if(!(b&32768)){o=H[c+4>>2];g=b>>>0>>0;c=H[(g?12:8)+c>>2];H[p>>2]=c;while(1){Nb:{if(h){break Nb}m=H[e+16>>2];i=m+1|0;j=I[m+1|0];if(I[m|0]==255){if(j>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Nb}H[e+16>>2]=i;d=(j<<9)+d|0;h=7;break Nb}H[e+16>>2]=i;h=8;d=(j<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}m=g?!o:o;break Lb}m=H[c+4>>2]}g=H[c>>2];b=b-g|0;Ob:{if(d>>>16>>>0>>0){o=H[c+4>>2];i=c;c=b>>>0>>0;H[p>>2]=H[i+(c?8:12)>>2];while(1){Pb:{if(h){break Pb}i=H[e+16>>2];b=i+1|0;j=I[i+1|0];if(I[i|0]==255){if(j>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Pb}H[e+16>>2]=b;d=(j<<9)+d|0;h=7;break Pb}H[e+16>>2]=b;h=8;d=(j<<8)+d|0}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;c=c?o:!o;break Ob}d=d-(g<<16)|0;if(!(b&32768)){o=H[c+4>>2];i=c;c=b>>>0>>0;H[p>>2]=H[i+(c?12:8)>>2];while(1){Qb:{if(h){break Qb}i=H[e+16>>2];g=i+1|0;j=I[i+1|0];if(I[i|0]==255){if(j>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Qb}H[e+16>>2]=g;d=(j<<9)+d|0;h=7;break Qb}H[e+16>>2]=g;h=8;d=(j<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!o:o;break Ob}c=H[c+4>>2]}g=0;i=p;Rb:{Sb:{Tb:{Ub:{Vb:{switch(c|m<<1){case 0:j=f-4|0;i=H[f+4>>2]>>>17&4|H[j>>2]>>>19&1;c=A+(I[i+24384|0]<<2)|0;m=H[c>>2];g=H[m>>2];b=b-g|0;Wb:{if(d>>>16>>>0>>0){o=H[m+4>>2];w=c;c=b>>>0>>0;H[w>>2]=H[m+(c?8:12)>>2];while(1){Xb:{if(h){break Xb}m=H[e+16>>2];b=m+1|0;n=I[m+1|0];if(I[m|0]==255){if(n>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Xb}H[e+16>>2]=b;d=(n<<9)+d|0;h=7;break Xb}H[e+16>>2]=b;h=8;d=(n<<8)+d|0}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;m=c?o:!o;break Wb}d=d-(g<<16)|0;if(!(b&32768)){o=H[m+4>>2];w=c;c=b>>>0>>0;H[w>>2]=H[m+(c?12:8)>>2];while(1){Yb:{if(h){break Yb}m=H[e+16>>2];g=m+1|0;n=I[m+1|0];if(I[m|0]==255){if(n>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Yb}H[e+16>>2]=g;d=(n<<9)+d|0;h=7;break Yb}H[e+16>>2]=g;h=8;d=(n<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}m=c?!o:o;break Wb}m=H[m+4>>2]}g=I[i+24640|0];H[k>>2]=(m|0)==(g|0)?M:x;H[j>>2]=H[j>>2]|32;H[f+4>>2]=H[f+4>>2]|8;c=f-268|0;H[c>>2]=H[c>>2]|131072;c=f-260|0;H[c>>2]=H[c>>2]|32768;c=f-264|0;i=c;o=H[c>>2];c=g^m;H[i>>2]=o|c<<31|65536;i=c<<19;r=H[e+108>>2];c=A+(I[r+2|0]<<2)|0;m=H[c>>2];g=H[m>>2];b=b-g|0;Zb:{if(d>>>16>>>0>>0){o=H[m+4>>2];w=c;c=b>>>0>>0;H[w>>2]=H[m+(c?8:12)>>2];while(1){_b:{if(h){break _b}m=H[e+16>>2];b=m+1|0;j=I[m+1|0];if(I[m|0]==255){if(j>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break _b}H[e+16>>2]=b;d=(j<<9)+d|0;h=7;break _b}H[e+16>>2]=b;h=8;d=(j<<8)+d|0}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;c=c?o:!o;break Zb}d=d-(g<<16)|0;if(!(b&32768)){o=H[m+4>>2];w=c;c=b>>>0>>0;H[w>>2]=H[m+(c?12:8)>>2];while(1){$b:{if(h){break $b}m=H[e+16>>2];g=m+1|0;j=I[m+1|0];if(I[m|0]==255){if(j>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break $b}H[e+16>>2]=g;d=(j<<9)+d|0;h=7;break $b}H[e+16>>2]=g;h=8;d=(j<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!o:o;break Zb}c=H[m+4>>2]}g=i|16;if(!c){break Ub}break;case 1:break Vb;case 2:break Tb;case 3:break Rb;default:break Gb}}n=f-4|0;m=H[f+4>>2]>>>20&4|(H[n>>2]>>>22&1|(g>>>15&16|(g>>>19&64|g>>>3&170)));i=A+(I[m+24384|0]<<2)|0;o=H[i>>2];c=H[o>>2];b=b-c|0;ac:{if(d>>>16>>>0>>0){j=H[o+4>>2];w=i;i=b>>>0>>0;H[w>>2]=H[o+(i?8:12)>>2];while(1){bc:{if(h){break bc}o=H[e+16>>2];b=o+1|0;q=I[o+1|0];if(I[o|0]==255){if(q>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break bc}H[e+16>>2]=b;d=(q<<9)+d|0;h=7;break bc}H[e+16>>2]=b;h=8;d=(q<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;i=i?j:!j;break ac}d=d-(c<<16)|0;if(!(b&32768)){j=H[o+4>>2];c=b>>>0>>0;H[i>>2]=H[o+(c?12:8)>>2];while(1){cc:{if(h){break cc}o=H[e+16>>2];i=o+1|0;q=I[o+1|0];if(I[o|0]==255){if(q>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break cc}H[e+16>>2]=i;d=(q<<9)+d|0;h=7;break cc}H[e+16>>2]=i;h=8;d=(q<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}i=c?!j:j;break ac}i=H[o+4>>2]}c=I[m+24640|0];H[k+256>>2]=(i|0)==(c|0)?M:x;H[n>>2]=H[n>>2]|256;H[f+4>>2]=H[f+4>>2]|64;r=H[e+108>>2];g=(c^i)<<22|g|128}i=A+(I[(g>>>6&495)+r|0]<<2)|0;m=H[i>>2];c=H[m>>2];b=b-c|0;dc:{if(d>>>16>>>0>>0){o=H[m+4>>2];w=i;i=b>>>0>>0;H[w>>2]=H[m+(i?8:12)>>2];while(1){ec:{if(h){break ec}m=H[e+16>>2];b=m+1|0;j=I[m+1|0];if(I[m|0]==255){if(j>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break ec}H[e+16>>2]=b;d=(j<<9)+d|0;h=7;break ec}H[e+16>>2]=b;h=8;d=(j<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=i?o:!o;break dc}d=d-(c<<16)|0;if(!(b&32768)){o=H[m+4>>2];c=b>>>0>>0;H[i>>2]=H[m+(c?12:8)>>2];while(1){fc:{if(h){break fc}m=H[e+16>>2];i=m+1|0;j=I[m+1|0];if(I[m|0]==255){if(j>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break fc}H[e+16>>2]=i;d=(j<<9)+d|0;h=7;break fc}H[e+16>>2]=i;h=8;d=(j<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!o:o;break dc}c=H[m+4>>2]}if(!c){break Sb}}n=f-4|0;m=H[f+4>>2]>>>23&4|(H[n>>2]>>>25&1|(g>>>18&16|(g>>>22&64|g>>>6&170)));i=A+(I[m+24384|0]<<2)|0;o=H[i>>2];c=H[o>>2];b=b-c|0;gc:{if(d>>>16>>>0>>0){j=H[o+4>>2];w=i;i=b>>>0>>0;H[w>>2]=H[o+(i?8:12)>>2];while(1){hc:{if(h){break hc}o=H[e+16>>2];b=o+1|0;q=I[o+1|0];if(I[o|0]==255){if(q>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break hc}H[e+16>>2]=b;d=(q<<9)+d|0;h=7;break hc}H[e+16>>2]=b;h=8;d=(q<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;i=i?j:!j;break gc}d=d-(c<<16)|0;if(!(b&32768)){j=H[o+4>>2];c=b>>>0>>0;H[i>>2]=H[o+(c?12:8)>>2];while(1){ic:{if(h){break ic}o=H[e+16>>2];i=o+1|0;q=I[o+1|0];if(I[o|0]==255){if(q>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break ic}H[e+16>>2]=i;d=(q<<9)+d|0;h=7;break ic}H[e+16>>2]=i;h=8;d=(q<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}i=c?!j:j;break gc}i=H[o+4>>2]}c=I[m+24640|0];H[k+512>>2]=(i|0)==(c|0)?M:x;H[n>>2]=H[n>>2]|2048;H[f+4>>2]=H[f+4>>2]|512;g=(c^i)<<25|g|1024;r=H[e+108>>2]}i=A+(I[(g>>>9&495)+r|0]<<2)|0;o=H[i>>2];c=H[o>>2];b=b-c|0;jc:{if(d>>>16>>>0>>0){j=H[o+4>>2];m=b>>>0>>0;H[i>>2]=H[o+(m?8:12)>>2];while(1){kc:{if(h){break kc}o=H[e+16>>2];b=o+1|0;n=I[o+1|0];if(I[o|0]==255){if(n>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break kc}H[e+16>>2]=b;d=(n<<9)+d|0;h=7;break kc}H[e+16>>2]=b;h=8;d=(n<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=m?j:!j;break jc}d=d-(c<<16)|0;if(!(b&32768)){j=H[o+4>>2];c=b>>>0>>0;H[i>>2]=H[o+(c?12:8)>>2];while(1){lc:{if(h){break lc}o=H[e+16>>2];m=o+1|0;n=I[o+1|0];if(I[o|0]==255){if(n>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break lc}H[e+16>>2]=m;d=(n<<9)+d|0;h=7;break lc}H[e+16>>2]=m;h=8;d=(n<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!j:j;break jc}c=H[o+4>>2]}if(!c){break Gb}}v=f-4|0;q=H[f+4>>2]>>>26&4|(H[v>>2]>>>28&1|(g>>>21&16|(g>>>25&64|g>>>9&170)));i=A+(I[q+24384|0]<<2)|0;r=H[i>>2];c=H[r>>2];b=b-c|0;break Hb}mc:{if(g&2097168){break mc}i=A+(I[H[e+108>>2]+(g&495)|0]<<2)|0;o=H[i>>2];c=H[o>>2];b=b-c|0;nc:{if(d>>>16>>>0>>0){j=H[o+4>>2];m=b>>>0>>0;H[i>>2]=H[o+(m?8:12)>>2];while(1){oc:{if(h){break oc}o=H[e+16>>2];b=o+1|0;n=I[o+1|0];if(I[o|0]==255){if(n>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break oc}H[e+16>>2]=b;d=(n<<9)+d|0;h=7;break oc}H[e+16>>2]=b;h=8;d=(n<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=m?j:!j;break nc}d=d-(c<<16)|0;if(!(b&32768)){j=H[o+4>>2];c=b>>>0>>0;H[i>>2]=H[o+(c?12:8)>>2];while(1){pc:{if(h){break pc}o=H[e+16>>2];m=o+1|0;n=I[o+1|0];if(I[o|0]==255){if(n>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break pc}H[e+16>>2]=m;d=(n<<9)+d|0;h=7;break pc}H[e+16>>2]=m;h=8;d=(n<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!j:j;break nc}c=H[o+4>>2]}if(!c){break mc}q=f-4|0;o=H[f+4>>2]>>>17&4|(H[q>>2]>>>19&1|(g>>>14&16|(g>>>16&64|g&170)));i=A+(I[o+24384|0]<<2)|0;j=H[i>>2];c=H[j>>2];b=b-c|0;qc:{if(d>>>16>>>0>>0){n=H[j+4>>2];m=b>>>0>>0;H[i>>2]=H[j+(m?8:12)>>2];while(1){rc:{if(h){break rc}j=H[e+16>>2];b=j+1|0;u=I[j+1|0];if(I[j|0]==255){if(u>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break rc}H[e+16>>2]=b;d=(u<<9)+d|0;h=7;break rc}H[e+16>>2]=b;h=8;d=(u<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;j=m?n:!n;break qc}d=d-(c<<16)|0;if(!(b&32768)){n=H[j+4>>2];c=b>>>0>>0;H[i>>2]=H[j+(c?12:8)>>2];while(1){sc:{if(h){break sc}j=H[e+16>>2];m=j+1|0;u=I[j+1|0];if(I[j|0]==255){if(u>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break sc}H[e+16>>2]=m;d=(u<<9)+d|0;h=7;break sc}H[e+16>>2]=m;h=8;d=(u<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}j=c?!n:n;break qc}j=H[j+4>>2]}m=I[o+24640|0];H[k>>2]=(j|0)==(m|0)?M:x;H[q>>2]=H[q>>2]|32;H[f+4>>2]=H[f+4>>2]|8;c=f-268|0;H[c>>2]=H[c>>2]|131072;c=f-260|0;H[c>>2]=H[c>>2]|32768;c=f-264|0;o=c;w=H[c>>2];c=j^m;H[o>>2]=w|c<<31|65536;g=c<<19|g|16}tc:{if(g&16777344){break tc}o=g>>>3|0;i=A+(I[H[e+108>>2]+(o&495)|0]<<2)|0;j=H[i>>2];c=H[j>>2];b=b-c|0;uc:{if(d>>>16>>>0>>0){n=H[j+4>>2];m=b>>>0>>0;H[i>>2]=H[j+(m?8:12)>>2];while(1){vc:{if(h){break vc}j=H[e+16>>2];b=j+1|0;q=I[j+1|0];if(I[j|0]==255){if(q>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break vc}H[e+16>>2]=b;d=(q<<9)+d|0;h=7;break vc}H[e+16>>2]=b;h=8;d=(q<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=m?n:!n;break uc}d=d-(c<<16)|0;if(!(b&32768)){n=H[j+4>>2];c=b>>>0>>0;H[i>>2]=H[j+(c?12:8)>>2];while(1){wc:{if(h){break wc}j=H[e+16>>2];m=j+1|0;q=I[j+1|0];if(I[j|0]==255){if(q>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break wc}H[e+16>>2]=m;d=(q<<9)+d|0;h=7;break wc}H[e+16>>2]=m;h=8;d=(q<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!n:n;break uc}c=H[j+4>>2]}if(!c){break tc}q=f-4|0;o=H[f+4>>2]>>>20&4|(H[q>>2]>>>22&1|(g>>>15&16|(g>>>19&64|o&170)));i=A+(I[o+24384|0]<<2)|0;j=H[i>>2];c=H[j>>2];b=b-c|0;xc:{if(d>>>16>>>0>>0){n=H[j+4>>2];m=b>>>0>>0;H[i>>2]=H[j+(m?8:12)>>2];while(1){yc:{if(h){break yc}j=H[e+16>>2];b=j+1|0;u=I[j+1|0];if(I[j|0]==255){if(u>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break yc}H[e+16>>2]=b;d=(u<<9)+d|0;h=7;break yc}H[e+16>>2]=b;h=8;d=(u<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;m=m?n:!n;break xc}d=d-(c<<16)|0;if(!(b&32768)){n=H[j+4>>2];c=b>>>0>>0;H[i>>2]=H[j+(c?12:8)>>2];while(1){zc:{if(h){break zc}j=H[e+16>>2];m=j+1|0;u=I[j+1|0];if(I[j|0]==255){if(u>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break zc}H[e+16>>2]=m;d=(u<<9)+d|0;h=7;break zc}H[e+16>>2]=m;h=8;d=(u<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}m=c?!n:n;break xc}m=H[j+4>>2]}c=I[o+24640|0];H[k+256>>2]=(m|0)==(c|0)?M:x;H[q>>2]=H[q>>2]|256;H[f+4>>2]=H[f+4>>2]|64;g=(c^m)<<22|g|128}Ac:{if(g&134218752){break Ac}o=g>>>6|0;i=A+(I[H[e+108>>2]+(o&495)|0]<<2)|0;j=H[i>>2];c=H[j>>2];b=b-c|0;Bc:{if(d>>>16>>>0>>0){n=H[j+4>>2];m=b>>>0>>0;H[i>>2]=H[j+(m?8:12)>>2];while(1){Cc:{if(h){break Cc}j=H[e+16>>2];b=j+1|0;q=I[j+1|0];if(I[j|0]==255){if(q>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Cc}H[e+16>>2]=b;d=(q<<9)+d|0;h=7;break Cc}H[e+16>>2]=b;h=8;d=(q<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=m?n:!n;break Bc}d=d-(c<<16)|0;if(!(b&32768)){n=H[j+4>>2];c=b>>>0>>0;H[i>>2]=H[j+(c?12:8)>>2];while(1){Dc:{if(h){break Dc}j=H[e+16>>2];m=j+1|0;q=I[j+1|0];if(I[j|0]==255){if(q>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Dc}H[e+16>>2]=m;d=(q<<9)+d|0;h=7;break Dc}H[e+16>>2]=m;h=8;d=(q<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!n:n;break Bc}c=H[j+4>>2]}if(!c){break Ac}q=f-4|0;o=H[f+4>>2]>>>23&4|(H[q>>2]>>>25&1|(g>>>18&16|(g>>>22&64|o&170)));i=A+(I[o+24384|0]<<2)|0;j=H[i>>2];c=H[j>>2];b=b-c|0;Ec:{if(d>>>16>>>0>>0){n=H[j+4>>2];m=b>>>0>>0;H[i>>2]=H[j+(m?8:12)>>2];while(1){Fc:{if(h){break Fc}j=H[e+16>>2];b=j+1|0;u=I[j+1|0];if(I[j|0]==255){if(u>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Fc}H[e+16>>2]=b;d=(u<<9)+d|0;h=7;break Fc}H[e+16>>2]=b;h=8;d=(u<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;m=m?n:!n;break Ec}d=d-(c<<16)|0;if(!(b&32768)){n=H[j+4>>2];c=b>>>0>>0;H[i>>2]=H[j+(c?12:8)>>2];while(1){Gc:{if(h){break Gc}j=H[e+16>>2];m=j+1|0;u=I[j+1|0];if(I[j|0]==255){if(u>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Gc}H[e+16>>2]=m;d=(u<<9)+d|0;h=7;break Gc}H[e+16>>2]=m;h=8;d=(u<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}m=c?!n:n;break Ec}m=H[j+4>>2]}c=I[o+24640|0];H[k+512>>2]=(m|0)==(c|0)?M:x;H[q>>2]=H[q>>2]|2048;H[f+4>>2]=H[f+4>>2]|512;g=(c^m)<<25|g|1024}if(g&1073750016){break Gb}o=g>>>9|0;i=A+(I[H[e+108>>2]+(o&495)|0]<<2)|0;j=H[i>>2];c=H[j>>2];b=b-c|0;Hc:{if(d>>>16>>>0>>0){n=H[j+4>>2];m=b>>>0>>0;H[i>>2]=H[j+(m?8:12)>>2];while(1){Ic:{if(h){break Ic}j=H[e+16>>2];b=j+1|0;q=I[j+1|0];if(I[j|0]==255){if(q>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Ic}H[e+16>>2]=b;d=(q<<9)+d|0;h=7;break Ic}H[e+16>>2]=b;h=8;d=(q<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=m?n:!n;break Hc}d=d-(c<<16)|0;if(!(b&32768)){n=H[j+4>>2];c=b>>>0>>0;H[i>>2]=H[j+(c?12:8)>>2];while(1){Jc:{if(h){break Jc}j=H[e+16>>2];m=j+1|0;q=I[j+1|0];if(I[j|0]==255){if(q>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Jc}H[e+16>>2]=m;d=(q<<9)+d|0;h=7;break Jc}H[e+16>>2]=m;h=8;d=(q<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!n:n;break Hc}c=H[j+4>>2]}if(!c){break Gb}v=f-4|0;q=H[f+4>>2]>>>26&4|(H[v>>2]>>>28&1|(g>>>21&16|(g>>>25&64|o&170)));i=A+(I[q+24384|0]<<2)|0;r=H[i>>2];c=H[r>>2];b=b-c|0}Kc:{if(d>>>16>>>0>>0){j=H[r+4>>2];m=b>>>0>>0;H[i>>2]=H[(m?8:12)+r>>2];while(1){Lc:{if(h){break Lc}o=H[e+16>>2];b=o+1|0;n=I[o+1|0];if(I[o|0]==255){if(n>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Lc}H[e+16>>2]=b;d=(n<<9)+d|0;h=7;break Lc}H[e+16>>2]=b;h=8;d=(n<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;m=m?j:!j;break Kc}d=d-(c<<16)|0;if(!(b&32768)){j=H[r+4>>2];c=b>>>0>>0;H[i>>2]=H[(c?12:8)+r>>2];while(1){Mc:{if(h){break Mc}o=H[e+16>>2];m=o+1|0;n=I[o+1|0];if(I[o|0]==255){if(n>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Mc}H[e+16>>2]=m;d=(n<<9)+d|0;h=7;break Mc}H[e+16>>2]=m;h=8;d=(n<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}m=c?!j:j;break Kc}m=H[r+4>>2]}c=I[q+24640|0];H[k+768>>2]=(m|0)==(c|0)?M:x;H[v>>2]=H[v>>2]|16384;H[f+4>>2]=H[f+4>>2]|4096;H[f+260>>2]=H[f+260>>2]|4;H[f+268>>2]=H[f+268>>2]|1;c=c^m;H[f+264>>2]=H[f+264>>2]|c<<18|2;g=c<<28|g|8192}H[f>>2]=g&-1226833921}g=f+4|0;c=k+4|0;s=s+1|0;if((s|0)!=64){continue}break}g=f+12|0;c=k+772|0;m=t>>>0<60;t=t+4|0;if(m){continue}break}break Db}b=1<>>1|b;l=H[e+120>>2];c=(l+(Y<<2)|0)+12|0;g=H[e+128>>2];h=H[e+8>>2];b=H[e+4>>2];d=H[e>>2];i=H[e+104>>2];o=H[e+116>>2];if(ba&8){Nc:{if(g>>>0<4){break Nc}if(Y){m=e+100|0;p=e+96|0;x=N(Y,12);u=Y<<3;A=0-w|0;P=e+28|0;while(1){M=0;while(1){k=c;c=H[c>>2];Oc:{Pc:{Qc:{if(c){Rc:{if(c&2097168){break Rc}i=P+(I[H[e+108>>2]+(c&495)|0]<<2)|0;f=H[i>>2];g=H[f>>2];b=b-g|0;Sc:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;l=H[f+4>>2];if(b&32768){break Sc}j=H[f+4>>2];g=b>>>0>>0;H[i>>2]=H[f+(g?12:8)>>2];while(1){Tc:{if(h){break Tc}f=H[e+16>>2];l=f+1|0;n=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=l;h=8;d=(n<<8)+d|0;break Tc}if(n>>>0<=143){H[e+16>>2]=l;d=(n<<9)+d|0;h=7;break Tc}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=g?!j:j;break Sc}j=H[f+4>>2];l=b>>>0>>0;H[i>>2]=H[f+(l?8:12)>>2];while(1){Uc:{if(h){break Uc}f=H[e+16>>2];b=f+1|0;n=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=b;h=8;d=(n<<8)+d|0;break Uc}if(n>>>0<=143){H[e+16>>2]=b;d=(n<<9)+d|0;h=7;break Uc}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;l=l?j:!j}if(!l){break Rc}q=k-4|0;f=H[k+4>>2]>>>17&4|(H[q>>2]>>>19&1|(c>>>14&16|(c>>>16&64|c&170)));i=P+(I[f+24384|0]<<2)|0;j=H[i>>2];g=H[j>>2];b=b-g|0;Vc:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;l=H[j+4>>2];if(b&32768){break Vc}n=H[j+4>>2];g=b>>>0>>0;H[i>>2]=H[j+(g?12:8)>>2];while(1){Wc:{if(h){break Wc}j=H[e+16>>2];l=j+1|0;s=I[j+1|0];if(I[j|0]!=255){H[e+16>>2]=l;h=8;d=(s<<8)+d|0;break Wc}if(s>>>0<=143){H[e+16>>2]=l;d=(s<<9)+d|0;h=7;break Wc}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=g?!n:n;break Vc}n=H[j+4>>2];l=b>>>0>>0;H[i>>2]=H[j+(l?8:12)>>2];while(1){Xc:{if(h){break Xc}j=H[e+16>>2];b=j+1|0;s=I[j+1|0];if(I[j|0]!=255){H[e+16>>2]=b;h=8;d=(s<<8)+d|0;break Xc}if(s>>>0<=143){H[e+16>>2]=b;d=(s<<9)+d|0;h=7;break Xc}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;l=l?n:!n}g=I[f+24640|0];H[o>>2]=(l|0)==(g|0)?w:A;H[q>>2]=H[q>>2]|32;H[k+4>>2]=H[k+4>>2]|8;c=(g^l)<<19|c|16}Yc:{if(c&16777344){break Yc}f=c>>>3|0;i=P+(I[H[e+108>>2]+(f&495)|0]<<2)|0;j=H[i>>2];g=H[j>>2];b=b-g|0;Zc:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;l=H[j+4>>2];if(b&32768){break Zc}n=H[j+4>>2];g=b>>>0>>0;H[i>>2]=H[j+(g?12:8)>>2];while(1){_c:{if(h){break _c}j=H[e+16>>2];l=j+1|0;q=I[j+1|0];if(I[j|0]!=255){H[e+16>>2]=l;h=8;d=(q<<8)+d|0;break _c}if(q>>>0<=143){H[e+16>>2]=l;d=(q<<9)+d|0;h=7;break _c}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=g?!n:n;break Zc}n=H[j+4>>2];l=b>>>0>>0;H[i>>2]=H[j+(l?8:12)>>2];while(1){$c:{if(h){break $c}j=H[e+16>>2];b=j+1|0;q=I[j+1|0];if(I[j|0]!=255){H[e+16>>2]=b;h=8;d=(q<<8)+d|0;break $c}if(q>>>0<=143){H[e+16>>2]=b;d=(q<<9)+d|0;h=7;break $c}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;l=l?n:!n}if(!l){break Yc}q=k-4|0;f=H[k+4>>2]>>>20&4|(H[q>>2]>>>22&1|(c>>>15&16|(c>>>19&64|f&170)));i=P+(I[f+24384|0]<<2)|0;j=H[i>>2];g=H[j>>2];b=b-g|0;r=(Y<<2)+o|0;ad:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;l=H[j+4>>2];if(b&32768){break ad}n=H[j+4>>2];g=b>>>0>>0;H[i>>2]=H[j+(g?12:8)>>2];while(1){bd:{if(h){break bd}j=H[e+16>>2];l=j+1|0;s=I[j+1|0];if(I[j|0]!=255){H[e+16>>2]=l;h=8;d=(s<<8)+d|0;break bd}if(s>>>0<=143){H[e+16>>2]=l;d=(s<<9)+d|0;h=7;break bd}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=g?!n:n;break ad}n=H[j+4>>2];l=b>>>0>>0;H[i>>2]=H[j+(l?8:12)>>2];while(1){cd:{if(h){break cd}j=H[e+16>>2];b=j+1|0;s=I[j+1|0];if(I[j|0]!=255){H[e+16>>2]=b;h=8;d=(s<<8)+d|0;break cd}if(s>>>0<=143){H[e+16>>2]=b;d=(s<<9)+d|0;h=7;break cd}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;l=l?n:!n}g=I[f+24640|0];H[r>>2]=(l|0)==(g|0)?w:A;H[q>>2]=H[q>>2]|256;H[k+4>>2]=H[k+4>>2]|64;c=(g^l)<<22|c|128}dd:{if(c&134218752){break dd}f=c>>>6|0;i=P+(I[H[e+108>>2]+(f&495)|0]<<2)|0;j=H[i>>2];g=H[j>>2];b=b-g|0;ed:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;l=H[j+4>>2];if(b&32768){break ed}n=H[j+4>>2];g=b>>>0>>0;H[i>>2]=H[j+(g?12:8)>>2];while(1){fd:{if(h){break fd}j=H[e+16>>2];l=j+1|0;q=I[j+1|0];if(I[j|0]!=255){H[e+16>>2]=l;h=8;d=(q<<8)+d|0;break fd}if(q>>>0<=143){H[e+16>>2]=l;d=(q<<9)+d|0;h=7;break fd}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=g?!n:n;break ed}n=H[j+4>>2];l=b>>>0>>0;H[i>>2]=H[j+(l?8:12)>>2];while(1){gd:{if(h){break gd}j=H[e+16>>2];b=j+1|0;q=I[j+1|0];if(I[j|0]!=255){H[e+16>>2]=b;h=8;d=(q<<8)+d|0;break gd}if(q>>>0<=143){H[e+16>>2]=b;d=(q<<9)+d|0;h=7;break gd}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;l=l?n:!n}if(!l){break dd}q=k-4|0;f=H[k+4>>2]>>>23&4|(H[q>>2]>>>25&1|(c>>>18&16|(c>>>22&64|f&170)));i=P+(I[f+24384|0]<<2)|0;j=H[i>>2];g=H[j>>2];b=b-g|0;r=o+u|0;hd:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;l=H[j+4>>2];if(b&32768){break hd}n=H[j+4>>2];g=b>>>0>>0;H[i>>2]=H[j+(g?12:8)>>2];while(1){id:{if(h){break id}j=H[e+16>>2];l=j+1|0;s=I[j+1|0];if(I[j|0]!=255){H[e+16>>2]=l;h=8;d=(s<<8)+d|0;break id}if(s>>>0<=143){H[e+16>>2]=l;d=(s<<9)+d|0;h=7;break id}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=g?!n:n;break hd}n=H[j+4>>2];l=b>>>0>>0;H[i>>2]=H[j+(l?8:12)>>2];while(1){jd:{if(h){break jd}j=H[e+16>>2];b=j+1|0;s=I[j+1|0];if(I[j|0]!=255){H[e+16>>2]=b;h=8;d=(s<<8)+d|0;break jd}if(s>>>0<=143){H[e+16>>2]=b;d=(s<<9)+d|0;h=7;break jd}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;l=l?n:!n}g=I[f+24640|0];H[r>>2]=(l|0)==(g|0)?w:A;H[q>>2]=H[q>>2]|2048;H[k+4>>2]=H[k+4>>2]|512;c=(g^l)<<25|c|1024}if(c&1073750016){break Pc}f=c>>>9|0;i=P+(I[H[e+108>>2]+(f&495)|0]<<2)|0;j=H[i>>2];g=H[j>>2];b=b-g|0;kd:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;l=H[j+4>>2];if(b&32768){break kd}n=H[j+4>>2];g=b>>>0>>0;H[i>>2]=H[j+(g?12:8)>>2];while(1){ld:{if(h){break ld}j=H[e+16>>2];l=j+1|0;q=I[j+1|0];if(I[j|0]!=255){H[e+16>>2]=l;h=8;d=(q<<8)+d|0;break ld}if(q>>>0<=143){H[e+16>>2]=l;d=(q<<9)+d|0;h=7;break ld}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=g?!n:n;break kd}n=H[j+4>>2];l=b>>>0>>0;H[i>>2]=H[j+(l?8:12)>>2];while(1){md:{if(h){break md}j=H[e+16>>2];b=j+1|0;q=I[j+1|0];if(I[j|0]!=255){H[e+16>>2]=b;h=8;d=(q<<8)+d|0;break md}if(q>>>0<=143){H[e+16>>2]=b;d=(q<<9)+d|0;h=7;break md}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;l=l?n:!n}if(!l){break Pc}q=k-4|0;s=H[k+4>>2]>>>26&4|(H[q>>2]>>>28&1|(c>>>21&16|(c>>>25&64|f&170)));i=P+(I[s+24384|0]<<2)|0;r=H[i>>2];g=H[r>>2];b=b-g|0;break Qc}l=H[p>>2];c=H[l>>2];b=b-c|0;nd:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;g=H[l+4>>2];if(b&32768){break nd}i=H[l+4>>2];c=b>>>0>>0;H[p>>2]=H[l+(c?12:8)>>2];while(1){od:{if(h){break od}l=H[e+16>>2];g=l+1|0;f=I[l+1|0];if(I[l|0]!=255){H[e+16>>2]=g;h=8;d=(f<<8)+d|0;break od}if(f>>>0<=143){H[e+16>>2]=g;d=(f<<9)+d|0;h=7;break od}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}g=c?!i:i;break nd}i=H[l+4>>2];g=b>>>0>>0;H[p>>2]=H[l+(g?8:12)>>2];while(1){pd:{if(h){break pd}l=H[e+16>>2];b=l+1|0;f=I[l+1|0];if(I[l|0]!=255){H[e+16>>2]=b;h=8;d=(f<<8)+d|0;break pd}if(f>>>0<=143){H[e+16>>2]=b;d=(f<<9)+d|0;h=7;break pd}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;g=g?i:!i}if(!g){i=p;break Oc}g=H[m>>2];c=H[g>>2];b=b-c|0;qd:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;l=H[g+4>>2];if(b&32768){break qd}f=H[g+4>>2];c=b>>>0>>0;g=H[(c?12:8)+g>>2];H[m>>2]=g;while(1){rd:{if(h){break rd}i=H[e+16>>2];l=i+1|0;j=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=l;h=8;d=(j<<8)+d|0;break rd}if(j>>>0<=143){H[e+16>>2]=l;d=(j<<9)+d|0;h=7;break rd}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=c?!f:f;break qd}f=H[g+4>>2];l=b>>>0>>0;g=H[(l?8:12)+g>>2];H[m>>2]=g;while(1){sd:{if(h){break sd}i=H[e+16>>2];b=i+1|0;j=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=b;h=8;d=(j<<8)+d|0;break sd}if(j>>>0<=143){H[e+16>>2]=b;d=(j<<9)+d|0;h=7;break sd}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;l=l?f:!f}c=H[g>>2];b=b-c|0;td:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;i=H[g+4>>2];if(b&32768){break td}f=H[g+4>>2];c=b>>>0>>0;H[m>>2]=H[(c?12:8)+g>>2];while(1){ud:{if(h){break ud}i=H[e+16>>2];g=i+1|0;j=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=g;h=8;d=(j<<8)+d|0;break ud}if(j>>>0<=143){H[e+16>>2]=g;d=(j<<9)+d|0;h=7;break ud}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}i=c?!f:f;break td}f=H[g+4>>2];i=g;g=b>>>0>>0;H[m>>2]=H[i+(g?8:12)>>2];while(1){vd:{if(h){break vd}i=H[e+16>>2];b=i+1|0;j=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=b;h=8;d=(j<<8)+d|0;break vd}if(j>>>0<=143){H[e+16>>2]=b;d=(j<<9)+d|0;h=7;break vd}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;i=g?f:!f}g=i;c=0;i=m;wd:{xd:{yd:{zd:{Ad:{switch(g|l<<1){case 0:j=k-4|0;l=H[k+4>>2]>>>17&4|H[j>>2]>>>19&1;g=P+(I[l+24384|0]<<2)|0;i=H[g>>2];c=H[i>>2];b=b-c|0;Bd:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;f=H[i+4>>2];if(b&32768){break Bd}f=H[i+4>>2];c=b>>>0>>0;H[g>>2]=H[i+(c?12:8)>>2];while(1){Cd:{if(h){break Cd}i=H[e+16>>2];g=i+1|0;n=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=g;h=8;d=(n<<8)+d|0;break Cd}if(n>>>0<=143){H[e+16>>2]=g;d=(n<<9)+d|0;h=7;break Cd}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}f=c?!f:f;break Bd}f=H[i+4>>2];q=g;g=b>>>0>>0;H[q>>2]=H[i+(g?8:12)>>2];while(1){Dd:{if(h){break Dd}i=H[e+16>>2];b=i+1|0;n=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=b;h=8;d=(n<<8)+d|0;break Dd}if(n>>>0<=143){H[e+16>>2]=b;d=(n<<9)+d|0;h=7;break Dd}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;f=g?f:!f}g=f;c=I[l+24640|0];H[o>>2]=(g|0)==(c|0)?w:A;H[j>>2]=H[j>>2]|32;H[k+4>>2]=H[k+4>>2]|8;l=(c^g)<<19;r=H[e+108>>2];g=P+(I[r+2|0]<<2)|0;i=H[g>>2];c=H[i>>2];b=b-c|0;Ed:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;f=H[i+4>>2];if(b&32768){break Ed}f=H[i+4>>2];c=b>>>0>>0;H[g>>2]=H[i+(c?12:8)>>2];while(1){Fd:{if(h){break Fd}i=H[e+16>>2];g=i+1|0;j=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=g;h=8;d=(j<<8)+d|0;break Fd}if(j>>>0<=143){H[e+16>>2]=g;d=(j<<9)+d|0;h=7;break Fd}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}f=c?!f:f;break Ed}f=H[i+4>>2];j=g;g=b>>>0>>0;H[j>>2]=H[i+(g?8:12)>>2];while(1){Gd:{if(h){break Gd}i=H[e+16>>2];b=i+1|0;j=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=b;h=8;d=(j<<8)+d|0;break Gd}if(j>>>0<=143){H[e+16>>2]=b;d=(j<<9)+d|0;h=7;break Gd}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;f=g?f:!f}g=f;c=l|16;if(!g){break zd}break;case 1:break Ad;case 2:break yd;case 3:break wd;default:break Pc}}n=k-4|0;i=H[k+4>>2]>>>20&4|(H[n>>2]>>>22&1|(c>>>15&16|(c>>>19&64|c>>>3&170)));l=P+(I[i+24384|0]<<2)|0;f=H[l>>2];g=H[f>>2];b=b-g|0;r=(Y<<2)+o|0;Hd:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;j=H[f+4>>2];if(b&32768){break Hd}j=H[f+4>>2];g=b>>>0>>0;H[l>>2]=H[f+(g?12:8)>>2];while(1){Id:{if(h){break Id}f=H[e+16>>2];l=f+1|0;q=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=l;h=8;d=(q<<8)+d|0;break Id}if(q>>>0<=143){H[e+16>>2]=l;d=(q<<9)+d|0;h=7;break Id}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}j=g?!j:j;break Hd}j=H[f+4>>2];q=l;l=b>>>0>>0;H[q>>2]=H[f+(l?8:12)>>2];while(1){Jd:{if(h){break Jd}f=H[e+16>>2];b=f+1|0;q=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=b;h=8;d=(q<<8)+d|0;break Jd}if(q>>>0<=143){H[e+16>>2]=b;d=(q<<9)+d|0;h=7;break Jd}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;j=l?j:!j}l=j;g=I[i+24640|0];H[r>>2]=(l|0)==(g|0)?w:A;H[n>>2]=H[n>>2]|256;H[k+4>>2]=H[k+4>>2]|64;r=H[e+108>>2];c=(g^l)<<22|c|128}l=P+(I[(c>>>6&495)+r|0]<<2)|0;i=H[l>>2];g=H[i>>2];b=b-g|0;Kd:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;f=H[i+4>>2];if(b&32768){break Kd}f=H[i+4>>2];g=b>>>0>>0;H[l>>2]=H[i+(g?12:8)>>2];while(1){Ld:{if(h){break Ld}i=H[e+16>>2];l=i+1|0;j=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=l;h=8;d=(j<<8)+d|0;break Ld}if(j>>>0<=143){H[e+16>>2]=l;d=(j<<9)+d|0;h=7;break Ld}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}f=g?!f:f;break Kd}f=H[i+4>>2];j=l;l=b>>>0>>0;H[j>>2]=H[i+(l?8:12)>>2];while(1){Md:{if(h){break Md}i=H[e+16>>2];b=i+1|0;j=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=b;h=8;d=(j<<8)+d|0;break Md}if(j>>>0<=143){H[e+16>>2]=b;d=(j<<9)+d|0;h=7;break Md}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;f=l?f:!f}if(!f){break xd}}n=k-4|0;i=H[k+4>>2]>>>23&4|(H[n>>2]>>>25&1|(c>>>18&16|(c>>>22&64|c>>>6&170)));l=P+(I[i+24384|0]<<2)|0;f=H[l>>2];g=H[f>>2];b=b-g|0;r=o+u|0;Nd:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;j=H[f+4>>2];if(b&32768){break Nd}j=H[f+4>>2];g=b>>>0>>0;H[l>>2]=H[f+(g?12:8)>>2];while(1){Od:{if(h){break Od}f=H[e+16>>2];l=f+1|0;q=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=l;h=8;d=(q<<8)+d|0;break Od}if(q>>>0<=143){H[e+16>>2]=l;d=(q<<9)+d|0;h=7;break Od}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}j=g?!j:j;break Nd}j=H[f+4>>2];q=l;l=b>>>0>>0;H[q>>2]=H[f+(l?8:12)>>2];while(1){Pd:{if(h){break Pd}f=H[e+16>>2];b=f+1|0;q=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=b;h=8;d=(q<<8)+d|0;break Pd}if(q>>>0<=143){H[e+16>>2]=b;d=(q<<9)+d|0;h=7;break Pd}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;j=l?j:!j}l=j;g=I[i+24640|0];H[r>>2]=(l|0)==(g|0)?w:A;H[n>>2]=H[n>>2]|2048;H[k+4>>2]=H[k+4>>2]|512;c=(g^l)<<25|c|1024;r=H[e+108>>2]}i=P+(I[(c>>>9&495)+r|0]<<2)|0;f=H[i>>2];g=H[f>>2];b=b-g|0;Qd:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;l=H[f+4>>2];if(b&32768){break Qd}j=H[f+4>>2];g=b>>>0>>0;H[i>>2]=H[f+(g?12:8)>>2];while(1){Rd:{if(h){break Rd}f=H[e+16>>2];l=f+1|0;n=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=l;h=8;d=(n<<8)+d|0;break Rd}if(n>>>0<=143){H[e+16>>2]=l;d=(n<<9)+d|0;h=7;break Rd}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=g?!j:j;break Qd}j=H[f+4>>2];l=b>>>0>>0;H[i>>2]=H[f+(l?8:12)>>2];while(1){Sd:{if(h){break Sd}f=H[e+16>>2];b=f+1|0;n=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=b;h=8;d=(n<<8)+d|0;break Sd}if(n>>>0<=143){H[e+16>>2]=b;d=(n<<9)+d|0;h=7;break Sd}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;l=l?j:!j}if(!l){break Pc}}q=k-4|0;s=H[k+4>>2]>>>26&4|(H[q>>2]>>>28&1|(c>>>21&16|(c>>>25&64|c>>>9&170)));i=P+(I[s+24384|0]<<2)|0;r=H[i>>2];g=H[r>>2];b=b-g|0}X=o+x|0;Td:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;l=H[r+4>>2];if(b&32768){break Td}j=H[r+4>>2];g=b>>>0>>0;H[i>>2]=H[(g?12:8)+r>>2];while(1){Ud:{if(h){break Ud}f=H[e+16>>2];l=f+1|0;n=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=l;h=8;d=(n<<8)+d|0;break Ud}if(n>>>0<=143){H[e+16>>2]=l;d=(n<<9)+d|0;h=7;break Ud}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=g?!j:j;break Td}j=H[r+4>>2];l=b>>>0>>0;H[i>>2]=H[(l?8:12)+r>>2];while(1){Vd:{if(h){break Vd}f=H[e+16>>2];b=f+1|0;n=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=b;h=8;d=(n<<8)+d|0;break Vd}if(n>>>0<=143){H[e+16>>2]=b;d=(n<<9)+d|0;h=7;break Vd}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;l=l?j:!j}g=I[s+24640|0];H[X>>2]=(l|0)==(g|0)?w:A;H[q>>2]=H[q>>2]|16384;H[k+4>>2]=H[k+4>>2]|4096;f=k+(H[e+124>>2]<<2)|0;H[f+4>>2]=H[f+4>>2]|4;H[f+12>>2]=H[f+12>>2]|1;g=g^l;H[f+8>>2]=H[f+8>>2]|g<<18|2;c=g<<28|c|8192}H[k>>2]=c&-1226833921}c=k+4|0;o=o+4|0;M=M+1|0;if((Y|0)!=(M|0)){continue}break}c=k+12|0;o=o+x|0;t=t+4|0;g=H[e+128>>2];if(t>>>0<(g&-4)>>>0){continue}break}break Nc}c=(g&-4)-1|0;t=(c&-4)+4|0;c=(l+(c<<1&-8)|0)+20|0}H[e+8>>2]=h;H[e+4>>2]=b;H[e>>2]=d;H[e+104>>2]=i;if(!Y|g>>>0<=t>>>0){break Cb}while(1){h=0;if(H[e+128>>2]!=(t|0)){while(1){Tb(e,c,(N(h,Y)<<2)+o|0,w,h,1);h=h+1|0;if(h>>>0>2]-t>>>0){continue}break}}H[c>>2]=H[c>>2]&-1226833921;o=o+4|0;c=c+4|0;v=v+1|0;if((Y|0)!=(v|0)){continue}break}break Cb}Wd:{if(g>>>0<4){break Wd}if(Y){m=e+100|0;p=e+96|0;x=N(Y,12);u=Y<<3;A=0-w|0;P=e+28|0;while(1){M=0;while(1){k=c;c=H[c>>2];Xd:{Yd:{Zd:{if(c){_d:{if(c&2097168){break _d}i=P+(I[H[e+108>>2]+(c&495)|0]<<2)|0;f=H[i>>2];g=H[f>>2];b=b-g|0;$d:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;l=H[f+4>>2];if(b&32768){break $d}j=H[f+4>>2];g=b>>>0>>0;H[i>>2]=H[f+(g?12:8)>>2];while(1){ae:{if(h){break ae}f=H[e+16>>2];l=f+1|0;n=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=l;h=8;d=(n<<8)+d|0;break ae}if(n>>>0<=143){H[e+16>>2]=l;d=(n<<9)+d|0;h=7;break ae}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=g?!j:j;break $d}j=H[f+4>>2];l=b>>>0>>0;H[i>>2]=H[f+(l?8:12)>>2];while(1){be:{if(h){break be}f=H[e+16>>2];b=f+1|0;n=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=b;h=8;d=(n<<8)+d|0;break be}if(n>>>0<=143){H[e+16>>2]=b;d=(n<<9)+d|0;h=7;break be}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;l=l?j:!j}if(!l){break _d}q=k-4|0;f=H[k+4>>2]>>>17&4|(H[q>>2]>>>19&1|(c>>>14&16|(c>>>16&64|c&170)));i=P+(I[f+24384|0]<<2)|0;j=H[i>>2];g=H[j>>2];b=b-g|0;ce:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;l=H[j+4>>2];if(b&32768){break ce}n=H[j+4>>2];g=b>>>0>>0;H[i>>2]=H[j+(g?12:8)>>2];while(1){de:{if(h){break de}j=H[e+16>>2];l=j+1|0;s=I[j+1|0];if(I[j|0]!=255){H[e+16>>2]=l;h=8;d=(s<<8)+d|0;break de}if(s>>>0<=143){H[e+16>>2]=l;d=(s<<9)+d|0;h=7;break de}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=g?!n:n;break ce}n=H[j+4>>2];l=b>>>0>>0;H[i>>2]=H[j+(l?8:12)>>2];while(1){ee:{if(h){break ee}j=H[e+16>>2];b=j+1|0;s=I[j+1|0];if(I[j|0]!=255){H[e+16>>2]=b;h=8;d=(s<<8)+d|0;break ee}if(s>>>0<=143){H[e+16>>2]=b;d=(s<<9)+d|0;h=7;break ee}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;l=l?n:!n}g=I[f+24640|0];H[o>>2]=(l|0)==(g|0)?w:A;H[q>>2]=H[q>>2]|32;H[k+4>>2]=H[k+4>>2]|8;f=k+(-2-H[e+124>>2]<<2)|0;H[f+4>>2]=H[f+4>>2]|32768;l=g^l;H[f>>2]=H[f>>2]|l<<31|65536;g=f-4|0;H[g>>2]=H[g>>2]|131072;c=l<<19|c|16}fe:{if(c&16777344){break fe}f=c>>>3|0;i=P+(I[H[e+108>>2]+(f&495)|0]<<2)|0;j=H[i>>2];g=H[j>>2];b=b-g|0;ge:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;l=H[j+4>>2];if(b&32768){break ge}n=H[j+4>>2];g=b>>>0>>0;H[i>>2]=H[j+(g?12:8)>>2];while(1){he:{if(h){break he}j=H[e+16>>2];l=j+1|0;q=I[j+1|0];if(I[j|0]!=255){H[e+16>>2]=l;h=8;d=(q<<8)+d|0;break he}if(q>>>0<=143){H[e+16>>2]=l;d=(q<<9)+d|0;h=7;break he}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=g?!n:n;break ge}n=H[j+4>>2];l=b>>>0>>0;H[i>>2]=H[j+(l?8:12)>>2];while(1){ie:{if(h){break ie}j=H[e+16>>2];b=j+1|0;q=I[j+1|0];if(I[j|0]!=255){H[e+16>>2]=b;h=8;d=(q<<8)+d|0;break ie}if(q>>>0<=143){H[e+16>>2]=b;d=(q<<9)+d|0;h=7;break ie}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;l=l?n:!n}if(!l){break fe}q=k-4|0;f=H[k+4>>2]>>>20&4|(H[q>>2]>>>22&1|(c>>>15&16|(c>>>19&64|f&170)));i=P+(I[f+24384|0]<<2)|0;j=H[i>>2];g=H[j>>2];b=b-g|0;r=(Y<<2)+o|0;je:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;l=H[j+4>>2];if(b&32768){break je}n=H[j+4>>2];g=b>>>0>>0;H[i>>2]=H[j+(g?12:8)>>2];while(1){ke:{if(h){break ke}j=H[e+16>>2];l=j+1|0;s=I[j+1|0];if(I[j|0]!=255){H[e+16>>2]=l;h=8;d=(s<<8)+d|0;break ke}if(s>>>0<=143){H[e+16>>2]=l;d=(s<<9)+d|0;h=7;break ke}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=g?!n:n;break je}n=H[j+4>>2];l=b>>>0>>0;H[i>>2]=H[j+(l?8:12)>>2];while(1){le:{if(h){break le}j=H[e+16>>2];b=j+1|0;s=I[j+1|0];if(I[j|0]!=255){H[e+16>>2]=b;h=8;d=(s<<8)+d|0;break le}if(s>>>0<=143){H[e+16>>2]=b;d=(s<<9)+d|0;h=7;break le}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;l=l?n:!n}g=I[f+24640|0];H[r>>2]=(l|0)==(g|0)?w:A;H[q>>2]=H[q>>2]|256;H[k+4>>2]=H[k+4>>2]|64;c=(g^l)<<22|c|128}me:{if(c&134218752){break me}f=c>>>6|0;i=P+(I[H[e+108>>2]+(f&495)|0]<<2)|0;j=H[i>>2];g=H[j>>2];b=b-g|0;ne:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;l=H[j+4>>2];if(b&32768){break ne}n=H[j+4>>2];g=b>>>0>>0;H[i>>2]=H[j+(g?12:8)>>2];while(1){oe:{if(h){break oe}j=H[e+16>>2];l=j+1|0;q=I[j+1|0];if(I[j|0]!=255){H[e+16>>2]=l;h=8;d=(q<<8)+d|0;break oe}if(q>>>0<=143){H[e+16>>2]=l;d=(q<<9)+d|0;h=7;break oe}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=g?!n:n;break ne}n=H[j+4>>2];l=b>>>0>>0;H[i>>2]=H[j+(l?8:12)>>2];while(1){pe:{if(h){break pe}j=H[e+16>>2];b=j+1|0;q=I[j+1|0];if(I[j|0]!=255){H[e+16>>2]=b;h=8;d=(q<<8)+d|0;break pe}if(q>>>0<=143){H[e+16>>2]=b;d=(q<<9)+d|0;h=7;break pe}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;l=l?n:!n}if(!l){break me}q=k-4|0;f=H[k+4>>2]>>>23&4|(H[q>>2]>>>25&1|(c>>>18&16|(c>>>22&64|f&170)));i=P+(I[f+24384|0]<<2)|0;j=H[i>>2];g=H[j>>2];b=b-g|0;r=o+u|0;qe:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;l=H[j+4>>2];if(b&32768){break qe}n=H[j+4>>2];g=b>>>0>>0;H[i>>2]=H[j+(g?12:8)>>2];while(1){re:{if(h){break re}j=H[e+16>>2];l=j+1|0;s=I[j+1|0];if(I[j|0]!=255){H[e+16>>2]=l;h=8;d=(s<<8)+d|0;break re}if(s>>>0<=143){H[e+16>>2]=l;d=(s<<9)+d|0;h=7;break re}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=g?!n:n;break qe}n=H[j+4>>2];l=b>>>0>>0;H[i>>2]=H[j+(l?8:12)>>2];while(1){se:{if(h){break se}j=H[e+16>>2];b=j+1|0;s=I[j+1|0];if(I[j|0]!=255){H[e+16>>2]=b;h=8;d=(s<<8)+d|0;break se}if(s>>>0<=143){H[e+16>>2]=b;d=(s<<9)+d|0;h=7;break se}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;l=l?n:!n}g=I[f+24640|0];H[r>>2]=(l|0)==(g|0)?w:A;H[q>>2]=H[q>>2]|2048;H[k+4>>2]=H[k+4>>2]|512;c=(g^l)<<25|c|1024}if(c&1073750016){break Yd}f=c>>>9|0;i=P+(I[H[e+108>>2]+(f&495)|0]<<2)|0;j=H[i>>2];g=H[j>>2];b=b-g|0;te:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;l=H[j+4>>2];if(b&32768){break te}n=H[j+4>>2];g=b>>>0>>0;H[i>>2]=H[j+(g?12:8)>>2];while(1){ue:{if(h){break ue}j=H[e+16>>2];l=j+1|0;q=I[j+1|0];if(I[j|0]!=255){H[e+16>>2]=l;h=8;d=(q<<8)+d|0;break ue}if(q>>>0<=143){H[e+16>>2]=l;d=(q<<9)+d|0;h=7;break ue}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=g?!n:n;break te}n=H[j+4>>2];l=b>>>0>>0;H[i>>2]=H[j+(l?8:12)>>2];while(1){ve:{if(h){break ve}j=H[e+16>>2];b=j+1|0;q=I[j+1|0];if(I[j|0]!=255){H[e+16>>2]=b;h=8;d=(q<<8)+d|0;break ve}if(q>>>0<=143){H[e+16>>2]=b;d=(q<<9)+d|0;h=7;break ve}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;l=l?n:!n}if(!l){break Yd}q=k-4|0;s=H[k+4>>2]>>>26&4|(H[q>>2]>>>28&1|(c>>>21&16|(c>>>25&64|f&170)));i=P+(I[s+24384|0]<<2)|0;r=H[i>>2];g=H[r>>2];b=b-g|0;break Zd}l=H[p>>2];c=H[l>>2];b=b-c|0;we:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;g=H[l+4>>2];if(b&32768){break we}i=H[l+4>>2];c=b>>>0>>0;H[p>>2]=H[l+(c?12:8)>>2];while(1){xe:{if(h){break xe}l=H[e+16>>2];g=l+1|0;f=I[l+1|0];if(I[l|0]!=255){H[e+16>>2]=g;h=8;d=(f<<8)+d|0;break xe}if(f>>>0<=143){H[e+16>>2]=g;d=(f<<9)+d|0;h=7;break xe}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}g=c?!i:i;break we}i=H[l+4>>2];g=b>>>0>>0;H[p>>2]=H[l+(g?8:12)>>2];while(1){ye:{if(h){break ye}l=H[e+16>>2];b=l+1|0;f=I[l+1|0];if(I[l|0]!=255){H[e+16>>2]=b;h=8;d=(f<<8)+d|0;break ye}if(f>>>0<=143){H[e+16>>2]=b;d=(f<<9)+d|0;h=7;break ye}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;g=g?i:!i}if(!g){i=p;break Xd}g=H[m>>2];c=H[g>>2];b=b-c|0;ze:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;l=H[g+4>>2];if(b&32768){break ze}f=H[g+4>>2];c=b>>>0>>0;g=H[(c?12:8)+g>>2];H[m>>2]=g;while(1){Ae:{if(h){break Ae}i=H[e+16>>2];l=i+1|0;j=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=l;h=8;d=(j<<8)+d|0;break Ae}if(j>>>0<=143){H[e+16>>2]=l;d=(j<<9)+d|0;h=7;break Ae}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=c?!f:f;break ze}f=H[g+4>>2];l=b>>>0>>0;g=H[(l?8:12)+g>>2];H[m>>2]=g;while(1){Be:{if(h){break Be}i=H[e+16>>2];b=i+1|0;j=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=b;h=8;d=(j<<8)+d|0;break Be}if(j>>>0<=143){H[e+16>>2]=b;d=(j<<9)+d|0;h=7;break Be}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;l=l?f:!f}c=H[g>>2];b=b-c|0;Ce:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;i=H[g+4>>2];if(b&32768){break Ce}f=H[g+4>>2];c=b>>>0>>0;H[m>>2]=H[(c?12:8)+g>>2];while(1){De:{if(h){break De}i=H[e+16>>2];g=i+1|0;j=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=g;h=8;d=(j<<8)+d|0;break De}if(j>>>0<=143){H[e+16>>2]=g;d=(j<<9)+d|0;h=7;break De}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}i=c?!f:f;break Ce}f=H[g+4>>2];i=g;g=b>>>0>>0;H[m>>2]=H[i+(g?8:12)>>2];while(1){Ee:{if(h){break Ee}i=H[e+16>>2];b=i+1|0;j=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=b;h=8;d=(j<<8)+d|0;break Ee}if(j>>>0<=143){H[e+16>>2]=b;d=(j<<9)+d|0;h=7;break Ee}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;i=g?f:!f}g=i;c=0;i=m;Fe:{Ge:{He:{Ie:{Je:{switch(g|l<<1){case 0:j=k-4|0;l=H[k+4>>2]>>>17&4|H[j>>2]>>>19&1;g=P+(I[l+24384|0]<<2)|0;i=H[g>>2];c=H[i>>2];b=b-c|0;Ke:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;f=H[i+4>>2];if(b&32768){break Ke}f=H[i+4>>2];c=b>>>0>>0;H[g>>2]=H[i+(c?12:8)>>2];while(1){Le:{if(h){break Le}i=H[e+16>>2];g=i+1|0;n=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=g;h=8;d=(n<<8)+d|0;break Le}if(n>>>0<=143){H[e+16>>2]=g;d=(n<<9)+d|0;h=7;break Le}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}f=c?!f:f;break Ke}f=H[i+4>>2];q=g;g=b>>>0>>0;H[q>>2]=H[i+(g?8:12)>>2];while(1){Me:{if(h){break Me}i=H[e+16>>2];b=i+1|0;n=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=b;h=8;d=(n<<8)+d|0;break Me}if(n>>>0<=143){H[e+16>>2]=b;d=(n<<9)+d|0;h=7;break Me}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;f=g?f:!f}g=f;c=I[l+24640|0];H[o>>2]=(g|0)==(c|0)?w:A;H[j>>2]=H[j>>2]|32;H[k+4>>2]=H[k+4>>2]|8;l=k+(-2-H[e+124>>2]<<2)|0;H[l+4>>2]=H[l+4>>2]|32768;g=c^g;H[l>>2]=H[l>>2]|g<<31|65536;c=l-4|0;H[c>>2]=H[c>>2]|131072;l=g<<19;r=H[e+108>>2];g=P+(I[r+2|0]<<2)|0;i=H[g>>2];c=H[i>>2];b=b-c|0;Ne:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;f=H[i+4>>2];if(b&32768){break Ne}f=H[i+4>>2];c=b>>>0>>0;H[g>>2]=H[i+(c?12:8)>>2];while(1){Oe:{if(h){break Oe}i=H[e+16>>2];g=i+1|0;j=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=g;h=8;d=(j<<8)+d|0;break Oe}if(j>>>0<=143){H[e+16>>2]=g;d=(j<<9)+d|0;h=7;break Oe}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}f=c?!f:f;break Ne}f=H[i+4>>2];j=g;g=b>>>0>>0;H[j>>2]=H[i+(g?8:12)>>2];while(1){Pe:{if(h){break Pe}i=H[e+16>>2];b=i+1|0;j=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=b;h=8;d=(j<<8)+d|0;break Pe}if(j>>>0<=143){H[e+16>>2]=b;d=(j<<9)+d|0;h=7;break Pe}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;f=g?f:!f}g=f;c=l|16;if(!g){break Ie}break;case 1:break Je;case 2:break He;case 3:break Fe;default:break Yd}}n=k-4|0;i=H[k+4>>2]>>>20&4|(H[n>>2]>>>22&1|(c>>>15&16|(c>>>19&64|c>>>3&170)));l=P+(I[i+24384|0]<<2)|0;f=H[l>>2];g=H[f>>2];b=b-g|0;r=(Y<<2)+o|0;Qe:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;j=H[f+4>>2];if(b&32768){break Qe}j=H[f+4>>2];g=b>>>0>>0;H[l>>2]=H[f+(g?12:8)>>2];while(1){Re:{if(h){break Re}f=H[e+16>>2];l=f+1|0;q=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=l;h=8;d=(q<<8)+d|0;break Re}if(q>>>0<=143){H[e+16>>2]=l;d=(q<<9)+d|0;h=7;break Re}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}j=g?!j:j;break Qe}j=H[f+4>>2];q=l;l=b>>>0>>0;H[q>>2]=H[f+(l?8:12)>>2];while(1){Se:{if(h){break Se}f=H[e+16>>2];b=f+1|0;q=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=b;h=8;d=(q<<8)+d|0;break Se}if(q>>>0<=143){H[e+16>>2]=b;d=(q<<9)+d|0;h=7;break Se}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;j=l?j:!j}l=j;g=I[i+24640|0];H[r>>2]=(l|0)==(g|0)?w:A;H[n>>2]=H[n>>2]|256;H[k+4>>2]=H[k+4>>2]|64;r=H[e+108>>2];c=(g^l)<<22|c|128}l=P+(I[(c>>>6&495)+r|0]<<2)|0;i=H[l>>2];g=H[i>>2];b=b-g|0;Te:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;f=H[i+4>>2];if(b&32768){break Te}f=H[i+4>>2];g=b>>>0>>0;H[l>>2]=H[i+(g?12:8)>>2];while(1){Ue:{if(h){break Ue}i=H[e+16>>2];l=i+1|0;j=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=l;h=8;d=(j<<8)+d|0;break Ue}if(j>>>0<=143){H[e+16>>2]=l;d=(j<<9)+d|0;h=7;break Ue}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}f=g?!f:f;break Te}f=H[i+4>>2];j=l;l=b>>>0>>0;H[j>>2]=H[i+(l?8:12)>>2];while(1){Ve:{if(h){break Ve}i=H[e+16>>2];b=i+1|0;j=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=b;h=8;d=(j<<8)+d|0;break Ve}if(j>>>0<=143){H[e+16>>2]=b;d=(j<<9)+d|0;h=7;break Ve}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;f=l?f:!f}if(!f){break Ge}}n=k-4|0;i=H[k+4>>2]>>>23&4|(H[n>>2]>>>25&1|(c>>>18&16|(c>>>22&64|c>>>6&170)));l=P+(I[i+24384|0]<<2)|0;f=H[l>>2];g=H[f>>2];b=b-g|0;r=o+u|0;We:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;j=H[f+4>>2];if(b&32768){break We}j=H[f+4>>2];g=b>>>0>>0;H[l>>2]=H[f+(g?12:8)>>2];while(1){Xe:{if(h){break Xe}f=H[e+16>>2];l=f+1|0;q=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=l;h=8;d=(q<<8)+d|0;break Xe}if(q>>>0<=143){H[e+16>>2]=l;d=(q<<9)+d|0;h=7;break Xe}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}j=g?!j:j;break We}j=H[f+4>>2];q=l;l=b>>>0>>0;H[q>>2]=H[f+(l?8:12)>>2];while(1){Ye:{if(h){break Ye}f=H[e+16>>2];b=f+1|0;q=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=b;h=8;d=(q<<8)+d|0;break Ye}if(q>>>0<=143){H[e+16>>2]=b;d=(q<<9)+d|0;h=7;break Ye}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;j=l?j:!j}l=j;g=I[i+24640|0];H[r>>2]=(l|0)==(g|0)?w:A;H[n>>2]=H[n>>2]|2048;H[k+4>>2]=H[k+4>>2]|512;c=(g^l)<<25|c|1024;r=H[e+108>>2]}i=P+(I[(c>>>9&495)+r|0]<<2)|0;f=H[i>>2];g=H[f>>2];b=b-g|0;Ze:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;l=H[f+4>>2];if(b&32768){break Ze}j=H[f+4>>2];g=b>>>0>>0;H[i>>2]=H[f+(g?12:8)>>2];while(1){_e:{if(h){break _e}f=H[e+16>>2];l=f+1|0;n=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=l;h=8;d=(n<<8)+d|0;break _e}if(n>>>0<=143){H[e+16>>2]=l;d=(n<<9)+d|0;h=7;break _e}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=g?!j:j;break Ze}j=H[f+4>>2];l=b>>>0>>0;H[i>>2]=H[f+(l?8:12)>>2];while(1){$e:{if(h){break $e}f=H[e+16>>2];b=f+1|0;n=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=b;h=8;d=(n<<8)+d|0;break $e}if(n>>>0<=143){H[e+16>>2]=b;d=(n<<9)+d|0;h=7;break $e}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;l=l?j:!j}if(!l){break Yd}}q=k-4|0;s=H[k+4>>2]>>>26&4|(H[q>>2]>>>28&1|(c>>>21&16|(c>>>25&64|c>>>9&170)));i=P+(I[s+24384|0]<<2)|0;r=H[i>>2];g=H[r>>2];b=b-g|0}X=o+x|0;af:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;l=H[r+4>>2];if(b&32768){break af}j=H[r+4>>2];g=b>>>0>>0;H[i>>2]=H[(g?12:8)+r>>2];while(1){bf:{if(h){break bf}f=H[e+16>>2];l=f+1|0;n=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=l;h=8;d=(n<<8)+d|0;break bf}if(n>>>0<=143){H[e+16>>2]=l;d=(n<<9)+d|0;h=7;break bf}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=g?!j:j;break af}j=H[r+4>>2];l=b>>>0>>0;H[i>>2]=H[(l?8:12)+r>>2];while(1){cf:{if(h){break cf}f=H[e+16>>2];b=f+1|0;n=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=b;h=8;d=(n<<8)+d|0;break cf}if(n>>>0<=143){H[e+16>>2]=b;d=(n<<9)+d|0;h=7;break cf}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;l=l?j:!j}g=I[s+24640|0];H[X>>2]=(l|0)==(g|0)?w:A;H[q>>2]=H[q>>2]|16384;H[k+4>>2]=H[k+4>>2]|4096;f=k+(H[e+124>>2]<<2)|0;H[f+4>>2]=H[f+4>>2]|4;H[f+12>>2]=H[f+12>>2]|1;g=g^l;H[f+8>>2]=H[f+8>>2]|g<<18|2;c=g<<28|c|8192}H[k>>2]=c&-1226833921}c=k+4|0;o=o+4|0;M=M+1|0;if((Y|0)!=(M|0)){continue}break}c=k+12|0;o=o+x|0;t=t+4|0;g=H[e+128>>2];if(t>>>0<(g&-4)>>>0){continue}break}break Wd}c=(g&-4)-1|0;t=(c&-4)+4|0;c=(l+(c<<1&-8)|0)+20|0}H[e+8>>2]=h;H[e+4>>2]=b;H[e>>2]=d;H[e+104>>2]=i;if(!Y|g>>>0<=t>>>0){break Cb}while(1){h=0;if(H[e+128>>2]!=(t|0)){while(1){Tb(e,c,(N(h,Y)<<2)+o|0,w,h,0);h=h+1|0;if(h>>>0>2]-t>>>0){continue}break}}H[c>>2]=H[c>>2]&-1226833921;o=o+4|0;c=c+4|0;v=v+1|0;if((Y|0)!=(v|0)){continue}break}break Cb}while(1){s=0;while(1){k=c;f=g;g=H[g>>2];df:{ef:{ff:{if(!g){i=H[l>>2];g=H[i>>2];b=b-g|0;gf:{if(d>>>16>>>0>>0){m=H[i+4>>2];c=b>>>0>>0;H[l>>2]=H[i+(c?8:12)>>2];while(1){hf:{if(h){break hf}i=H[e+16>>2];b=i+1|0;o=I[i+1|0];if(I[i|0]==255){if(o>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break hf}H[e+16>>2]=b;d=(o<<9)+d|0;h=7;break hf}H[e+16>>2]=b;h=8;d=(o<<8)+d|0}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;c=c?m:!m;break gf}d=d-(g<<16)|0;if(!(b&32768)){m=H[i+4>>2];c=b>>>0>>0;H[l>>2]=H[i+(c?12:8)>>2];while(1){jf:{if(h){break jf}i=H[e+16>>2];g=i+1|0;o=I[i+1|0];if(I[i|0]==255){if(o>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break jf}H[e+16>>2]=g;d=(o<<9)+d|0;h=7;break jf}H[e+16>>2]=g;h=8;d=(o<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!m:m;break gf}c=H[i+4>>2]}if(!c){i=l;break df}c=H[p>>2];g=H[c>>2];b=b-g|0;kf:{if(d>>>16>>>0>>0){o=H[c+4>>2];i=b>>>0>>0;c=H[(i?8:12)+c>>2];H[p>>2]=c;while(1){lf:{if(h){break lf}m=H[e+16>>2];b=m+1|0;j=I[m+1|0];if(I[m|0]==255){if(j>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break lf}H[e+16>>2]=b;d=(j<<9)+d|0;h=7;break lf}H[e+16>>2]=b;h=8;d=(j<<8)+d|0}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;m=i?o:!o;break kf}d=d-(g<<16)|0;if(!(b&32768)){o=H[c+4>>2];g=b>>>0>>0;c=H[(g?12:8)+c>>2];H[p>>2]=c;while(1){mf:{if(h){break mf}m=H[e+16>>2];i=m+1|0;j=I[m+1|0];if(I[m|0]==255){if(j>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break mf}H[e+16>>2]=i;d=(j<<9)+d|0;h=7;break mf}H[e+16>>2]=i;h=8;d=(j<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}m=g?!o:o;break kf}m=H[c+4>>2]}g=H[c>>2];b=b-g|0;nf:{if(d>>>16>>>0>>0){o=H[c+4>>2];i=c;c=b>>>0>>0;H[p>>2]=H[i+(c?8:12)>>2];while(1){of:{if(h){break of}i=H[e+16>>2];b=i+1|0;j=I[i+1|0];if(I[i|0]==255){if(j>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break of}H[e+16>>2]=b;d=(j<<9)+d|0;h=7;break of}H[e+16>>2]=b;h=8;d=(j<<8)+d|0}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;c=c?o:!o;break nf}d=d-(g<<16)|0;if(!(b&32768)){o=H[c+4>>2];i=c;c=b>>>0>>0;H[p>>2]=H[i+(c?12:8)>>2];while(1){pf:{if(h){break pf}i=H[e+16>>2];g=i+1|0;j=I[i+1|0];if(I[i|0]==255){if(j>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break pf}H[e+16>>2]=g;d=(j<<9)+d|0;h=7;break pf}H[e+16>>2]=g;h=8;d=(j<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!o:o;break nf}c=H[c+4>>2]}g=0;i=p;qf:{rf:{sf:{tf:{uf:{switch(c|m<<1){case 0:j=f-4|0;i=H[f+4>>2]>>>17&4|H[j>>2]>>>19&1;c=A+(I[i+24384|0]<<2)|0;m=H[c>>2];g=H[m>>2];b=b-g|0;vf:{if(d>>>16>>>0>>0){o=H[m+4>>2];w=c;c=b>>>0>>0;H[w>>2]=H[m+(c?8:12)>>2];while(1){wf:{if(h){break wf}m=H[e+16>>2];b=m+1|0;n=I[m+1|0];if(I[m|0]==255){if(n>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break wf}H[e+16>>2]=b;d=(n<<9)+d|0;h=7;break wf}H[e+16>>2]=b;h=8;d=(n<<8)+d|0}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;g=c?o:!o;break vf}d=d-(g<<16)|0;if(!(b&32768)){o=H[m+4>>2];w=c;c=b>>>0>>0;H[w>>2]=H[m+(c?12:8)>>2];while(1){xf:{if(h){break xf}m=H[e+16>>2];g=m+1|0;n=I[m+1|0];if(I[m|0]==255){if(n>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break xf}H[e+16>>2]=g;d=(n<<9)+d|0;h=7;break xf}H[e+16>>2]=g;h=8;d=(n<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}g=c?!o:o;break vf}g=H[m+4>>2]}c=I[i+24640|0];H[k>>2]=(g|0)==(c|0)?M:x;H[j>>2]=H[j>>2]|32;H[f+4>>2]=H[f+4>>2]|8;i=(c^g)<<19;r=H[e+108>>2];c=A+(I[r+2|0]<<2)|0;m=H[c>>2];g=H[m>>2];b=b-g|0;yf:{if(d>>>16>>>0>>0){o=H[m+4>>2];w=c;c=b>>>0>>0;H[w>>2]=H[m+(c?8:12)>>2];while(1){zf:{if(h){break zf}m=H[e+16>>2];b=m+1|0;j=I[m+1|0];if(I[m|0]==255){if(j>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break zf}H[e+16>>2]=b;d=(j<<9)+d|0;h=7;break zf}H[e+16>>2]=b;h=8;d=(j<<8)+d|0}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;c=c?o:!o;break yf}d=d-(g<<16)|0;if(!(b&32768)){o=H[m+4>>2];w=c;c=b>>>0>>0;H[w>>2]=H[m+(c?12:8)>>2];while(1){Af:{if(h){break Af}m=H[e+16>>2];g=m+1|0;j=I[m+1|0];if(I[m|0]==255){if(j>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Af}H[e+16>>2]=g;d=(j<<9)+d|0;h=7;break Af}H[e+16>>2]=g;h=8;d=(j<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!o:o;break yf}c=H[m+4>>2]}g=i|16;if(!c){break tf}break;case 1:break uf;case 2:break sf;case 3:break qf;default:break ef}}n=f-4|0;m=H[f+4>>2]>>>20&4|(H[n>>2]>>>22&1|(g>>>15&16|(g>>>19&64|g>>>3&170)));i=A+(I[m+24384|0]<<2)|0;o=H[i>>2];c=H[o>>2];b=b-c|0;Bf:{if(d>>>16>>>0>>0){j=H[o+4>>2];w=i;i=b>>>0>>0;H[w>>2]=H[o+(i?8:12)>>2];while(1){Cf:{if(h){break Cf}o=H[e+16>>2];b=o+1|0;q=I[o+1|0];if(I[o|0]==255){if(q>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Cf}H[e+16>>2]=b;d=(q<<9)+d|0;h=7;break Cf}H[e+16>>2]=b;h=8;d=(q<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;i=i?j:!j;break Bf}d=d-(c<<16)|0;if(!(b&32768)){j=H[o+4>>2];c=b>>>0>>0;H[i>>2]=H[o+(c?12:8)>>2];while(1){Df:{if(h){break Df}o=H[e+16>>2];i=o+1|0;q=I[o+1|0];if(I[o|0]==255){if(q>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Df}H[e+16>>2]=i;d=(q<<9)+d|0;h=7;break Df}H[e+16>>2]=i;h=8;d=(q<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}i=c?!j:j;break Bf}i=H[o+4>>2]}c=I[m+24640|0];H[k+256>>2]=(i|0)==(c|0)?M:x;H[n>>2]=H[n>>2]|256;H[f+4>>2]=H[f+4>>2]|64;r=H[e+108>>2];g=(c^i)<<22|g|128}i=A+(I[(g>>>6&495)+r|0]<<2)|0;m=H[i>>2];c=H[m>>2];b=b-c|0;Ef:{if(d>>>16>>>0>>0){o=H[m+4>>2];w=i;i=b>>>0>>0;H[w>>2]=H[m+(i?8:12)>>2];while(1){Ff:{if(h){break Ff}m=H[e+16>>2];b=m+1|0;j=I[m+1|0];if(I[m|0]==255){if(j>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Ff}H[e+16>>2]=b;d=(j<<9)+d|0;h=7;break Ff}H[e+16>>2]=b;h=8;d=(j<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=i?o:!o;break Ef}d=d-(c<<16)|0;if(!(b&32768)){o=H[m+4>>2];c=b>>>0>>0;H[i>>2]=H[m+(c?12:8)>>2];while(1){Gf:{if(h){break Gf}m=H[e+16>>2];i=m+1|0;j=I[m+1|0];if(I[m|0]==255){if(j>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Gf}H[e+16>>2]=i;d=(j<<9)+d|0;h=7;break Gf}H[e+16>>2]=i;h=8;d=(j<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!o:o;break Ef}c=H[m+4>>2]}if(!c){break rf}}n=f-4|0;m=H[f+4>>2]>>>23&4|(H[n>>2]>>>25&1|(g>>>18&16|(g>>>22&64|g>>>6&170)));i=A+(I[m+24384|0]<<2)|0;o=H[i>>2];c=H[o>>2];b=b-c|0;Hf:{if(d>>>16>>>0>>0){j=H[o+4>>2];w=i;i=b>>>0>>0;H[w>>2]=H[o+(i?8:12)>>2];while(1){If:{if(h){break If}o=H[e+16>>2];b=o+1|0;q=I[o+1|0];if(I[o|0]==255){if(q>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break If}H[e+16>>2]=b;d=(q<<9)+d|0;h=7;break If}H[e+16>>2]=b;h=8;d=(q<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;i=i?j:!j;break Hf}d=d-(c<<16)|0;if(!(b&32768)){j=H[o+4>>2];c=b>>>0>>0;H[i>>2]=H[o+(c?12:8)>>2];while(1){Jf:{if(h){break Jf}o=H[e+16>>2];i=o+1|0;q=I[o+1|0];if(I[o|0]==255){if(q>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Jf}H[e+16>>2]=i;d=(q<<9)+d|0;h=7;break Jf}H[e+16>>2]=i;h=8;d=(q<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}i=c?!j:j;break Hf}i=H[o+4>>2]}c=I[m+24640|0];H[k+512>>2]=(i|0)==(c|0)?M:x;H[n>>2]=H[n>>2]|2048;H[f+4>>2]=H[f+4>>2]|512;g=(c^i)<<25|g|1024;r=H[e+108>>2]}i=A+(I[(g>>>9&495)+r|0]<<2)|0;o=H[i>>2];c=H[o>>2];b=b-c|0;Kf:{if(d>>>16>>>0>>0){j=H[o+4>>2];m=b>>>0>>0;H[i>>2]=H[o+(m?8:12)>>2];while(1){Lf:{if(h){break Lf}o=H[e+16>>2];b=o+1|0;n=I[o+1|0];if(I[o|0]==255){if(n>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Lf}H[e+16>>2]=b;d=(n<<9)+d|0;h=7;break Lf}H[e+16>>2]=b;h=8;d=(n<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=m?j:!j;break Kf}d=d-(c<<16)|0;if(!(b&32768)){j=H[o+4>>2];c=b>>>0>>0;H[i>>2]=H[o+(c?12:8)>>2];while(1){Mf:{if(h){break Mf}o=H[e+16>>2];m=o+1|0;n=I[o+1|0];if(I[o|0]==255){if(n>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Mf}H[e+16>>2]=m;d=(n<<9)+d|0;h=7;break Mf}H[e+16>>2]=m;h=8;d=(n<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!j:j;break Kf}c=H[o+4>>2]}if(!c){break ef}}v=f-4|0;q=H[f+4>>2]>>>26&4|(H[v>>2]>>>28&1|(g>>>21&16|(g>>>25&64|g>>>9&170)));i=A+(I[q+24384|0]<<2)|0;r=H[i>>2];c=H[r>>2];b=b-c|0;break ff}Nf:{if(g&2097168){break Nf}i=A+(I[H[e+108>>2]+(g&495)|0]<<2)|0;o=H[i>>2];c=H[o>>2];b=b-c|0;Of:{if(d>>>16>>>0>>0){j=H[o+4>>2];m=b>>>0>>0;H[i>>2]=H[o+(m?8:12)>>2];while(1){Pf:{if(h){break Pf}o=H[e+16>>2];b=o+1|0;n=I[o+1|0];if(I[o|0]==255){if(n>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Pf}H[e+16>>2]=b;d=(n<<9)+d|0;h=7;break Pf}H[e+16>>2]=b;h=8;d=(n<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=m?j:!j;break Of}d=d-(c<<16)|0;if(!(b&32768)){j=H[o+4>>2];c=b>>>0>>0;H[i>>2]=H[o+(c?12:8)>>2];while(1){Qf:{if(h){break Qf}o=H[e+16>>2];m=o+1|0;n=I[o+1|0];if(I[o|0]==255){if(n>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Qf}H[e+16>>2]=m;d=(n<<9)+d|0;h=7;break Qf}H[e+16>>2]=m;h=8;d=(n<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!j:j;break Of}c=H[o+4>>2]}if(!c){break Nf}q=f-4|0;o=H[f+4>>2]>>>17&4|(H[q>>2]>>>19&1|(g>>>14&16|(g>>>16&64|g&170)));i=A+(I[o+24384|0]<<2)|0;j=H[i>>2];c=H[j>>2];b=b-c|0;Rf:{if(d>>>16>>>0>>0){n=H[j+4>>2];m=b>>>0>>0;H[i>>2]=H[j+(m?8:12)>>2];while(1){Sf:{if(h){break Sf}j=H[e+16>>2];b=j+1|0;u=I[j+1|0];if(I[j|0]==255){if(u>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Sf}H[e+16>>2]=b;d=(u<<9)+d|0;h=7;break Sf}H[e+16>>2]=b;h=8;d=(u<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;m=m?n:!n;break Rf}d=d-(c<<16)|0;if(!(b&32768)){n=H[j+4>>2];c=b>>>0>>0;H[i>>2]=H[j+(c?12:8)>>2];while(1){Tf:{if(h){break Tf}j=H[e+16>>2];m=j+1|0;u=I[j+1|0];if(I[j|0]==255){if(u>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Tf}H[e+16>>2]=m;d=(u<<9)+d|0;h=7;break Tf}H[e+16>>2]=m;h=8;d=(u<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}m=c?!n:n;break Rf}m=H[j+4>>2]}c=I[o+24640|0];H[k>>2]=(m|0)==(c|0)?M:x;H[q>>2]=H[q>>2]|32;H[f+4>>2]=H[f+4>>2]|8;g=(c^m)<<19|g|16}Uf:{if(g&16777344){break Uf}o=g>>>3|0;i=A+(I[H[e+108>>2]+(o&495)|0]<<2)|0;j=H[i>>2];c=H[j>>2];b=b-c|0;Vf:{if(d>>>16>>>0>>0){n=H[j+4>>2];m=b>>>0>>0;H[i>>2]=H[j+(m?8:12)>>2];while(1){Wf:{if(h){break Wf}j=H[e+16>>2];b=j+1|0;q=I[j+1|0];if(I[j|0]==255){if(q>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Wf}H[e+16>>2]=b;d=(q<<9)+d|0;h=7;break Wf}H[e+16>>2]=b;h=8;d=(q<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=m?n:!n;break Vf}d=d-(c<<16)|0;if(!(b&32768)){n=H[j+4>>2];c=b>>>0>>0;H[i>>2]=H[j+(c?12:8)>>2];while(1){Xf:{if(h){break Xf}j=H[e+16>>2];m=j+1|0;q=I[j+1|0];if(I[j|0]==255){if(q>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Xf}H[e+16>>2]=m;d=(q<<9)+d|0;h=7;break Xf}H[e+16>>2]=m;h=8;d=(q<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!n:n;break Vf}c=H[j+4>>2]}if(!c){break Uf}q=f-4|0;o=H[f+4>>2]>>>20&4|(H[q>>2]>>>22&1|(g>>>15&16|(g>>>19&64|o&170)));i=A+(I[o+24384|0]<<2)|0;j=H[i>>2];c=H[j>>2];b=b-c|0;Yf:{if(d>>>16>>>0>>0){n=H[j+4>>2];m=b>>>0>>0;H[i>>2]=H[j+(m?8:12)>>2];while(1){Zf:{if(h){break Zf}j=H[e+16>>2];b=j+1|0;u=I[j+1|0];if(I[j|0]==255){if(u>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Zf}H[e+16>>2]=b;d=(u<<9)+d|0;h=7;break Zf}H[e+16>>2]=b;h=8;d=(u<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;m=m?n:!n;break Yf}d=d-(c<<16)|0;if(!(b&32768)){n=H[j+4>>2];c=b>>>0>>0;H[i>>2]=H[j+(c?12:8)>>2];while(1){_f:{if(h){break _f}j=H[e+16>>2];m=j+1|0;u=I[j+1|0];if(I[j|0]==255){if(u>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break _f}H[e+16>>2]=m;d=(u<<9)+d|0;h=7;break _f}H[e+16>>2]=m;h=8;d=(u<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}m=c?!n:n;break Yf}m=H[j+4>>2]}c=I[o+24640|0];H[k+256>>2]=(m|0)==(c|0)?M:x;H[q>>2]=H[q>>2]|256;H[f+4>>2]=H[f+4>>2]|64;g=(c^m)<<22|g|128}$f:{if(g&134218752){break $f}o=g>>>6|0;i=A+(I[H[e+108>>2]+(o&495)|0]<<2)|0;j=H[i>>2];c=H[j>>2];b=b-c|0;ag:{if(d>>>16>>>0>>0){n=H[j+4>>2];m=b>>>0>>0;H[i>>2]=H[j+(m?8:12)>>2];while(1){bg:{if(h){break bg}j=H[e+16>>2];b=j+1|0;q=I[j+1|0];if(I[j|0]==255){if(q>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break bg}H[e+16>>2]=b;d=(q<<9)+d|0;h=7;break bg}H[e+16>>2]=b;h=8;d=(q<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=m?n:!n;break ag}d=d-(c<<16)|0;if(!(b&32768)){n=H[j+4>>2];c=b>>>0>>0;H[i>>2]=H[j+(c?12:8)>>2];while(1){cg:{if(h){break cg}j=H[e+16>>2];m=j+1|0;q=I[j+1|0];if(I[j|0]==255){if(q>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break cg}H[e+16>>2]=m;d=(q<<9)+d|0;h=7;break cg}H[e+16>>2]=m;h=8;d=(q<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!n:n;break ag}c=H[j+4>>2]}if(!c){break $f}q=f-4|0;o=H[f+4>>2]>>>23&4|(H[q>>2]>>>25&1|(g>>>18&16|(g>>>22&64|o&170)));i=A+(I[o+24384|0]<<2)|0;j=H[i>>2];c=H[j>>2];b=b-c|0;dg:{if(d>>>16>>>0>>0){n=H[j+4>>2];m=b>>>0>>0;H[i>>2]=H[j+(m?8:12)>>2];while(1){eg:{if(h){break eg}j=H[e+16>>2];b=j+1|0;u=I[j+1|0];if(I[j|0]==255){if(u>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break eg}H[e+16>>2]=b;d=(u<<9)+d|0;h=7;break eg}H[e+16>>2]=b;h=8;d=(u<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;m=m?n:!n;break dg}d=d-(c<<16)|0;if(!(b&32768)){n=H[j+4>>2];c=b>>>0>>0;H[i>>2]=H[j+(c?12:8)>>2];while(1){fg:{if(h){break fg}j=H[e+16>>2];m=j+1|0;u=I[j+1|0];if(I[j|0]==255){if(u>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break fg}H[e+16>>2]=m;d=(u<<9)+d|0;h=7;break fg}H[e+16>>2]=m;h=8;d=(u<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}m=c?!n:n;break dg}m=H[j+4>>2]}c=I[o+24640|0];H[k+512>>2]=(m|0)==(c|0)?M:x;H[q>>2]=H[q>>2]|2048;H[f+4>>2]=H[f+4>>2]|512;g=(c^m)<<25|g|1024}if(g&1073750016){break ef}o=g>>>9|0;i=A+(I[H[e+108>>2]+(o&495)|0]<<2)|0;j=H[i>>2];c=H[j>>2];b=b-c|0;gg:{if(d>>>16>>>0>>0){n=H[j+4>>2];m=b>>>0>>0;H[i>>2]=H[j+(m?8:12)>>2];while(1){hg:{if(h){break hg}j=H[e+16>>2];b=j+1|0;q=I[j+1|0];if(I[j|0]==255){if(q>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break hg}H[e+16>>2]=b;d=(q<<9)+d|0;h=7;break hg}H[e+16>>2]=b;h=8;d=(q<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=m?n:!n;break gg}d=d-(c<<16)|0;if(!(b&32768)){n=H[j+4>>2];c=b>>>0>>0;H[i>>2]=H[j+(c?12:8)>>2];while(1){ig:{if(h){break ig}j=H[e+16>>2];m=j+1|0;q=I[j+1|0];if(I[j|0]==255){if(q>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break ig}H[e+16>>2]=m;d=(q<<9)+d|0;h=7;break ig}H[e+16>>2]=m;h=8;d=(q<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!n:n;break gg}c=H[j+4>>2]}if(!c){break ef}v=f-4|0;q=H[f+4>>2]>>>26&4|(H[v>>2]>>>28&1|(g>>>21&16|(g>>>25&64|o&170)));i=A+(I[q+24384|0]<<2)|0;r=H[i>>2];c=H[r>>2];b=b-c|0}jg:{if(d>>>16>>>0>>0){j=H[r+4>>2];m=b>>>0>>0;H[i>>2]=H[(m?8:12)+r>>2];while(1){kg:{if(h){break kg}o=H[e+16>>2];b=o+1|0;n=I[o+1|0];if(I[o|0]==255){if(n>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break kg}H[e+16>>2]=b;d=(n<<9)+d|0;h=7;break kg}H[e+16>>2]=b;h=8;d=(n<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;m=m?j:!j;break jg}d=d-(c<<16)|0;if(!(b&32768)){j=H[r+4>>2];c=b>>>0>>0;H[i>>2]=H[(c?12:8)+r>>2];while(1){lg:{if(h){break lg}o=H[e+16>>2];m=o+1|0;n=I[o+1|0];if(I[o|0]==255){if(n>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break lg}H[e+16>>2]=m;d=(n<<9)+d|0;h=7;break lg}H[e+16>>2]=m;h=8;d=(n<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}m=c?!j:j;break jg}m=H[r+4>>2]}c=I[q+24640|0];H[k+768>>2]=(m|0)==(c|0)?M:x;H[v>>2]=H[v>>2]|16384;H[f+4>>2]=H[f+4>>2]|4096;H[f+260>>2]=H[f+260>>2]|4;H[f+268>>2]=H[f+268>>2]|1;c=c^m;H[f+264>>2]=H[f+264>>2]|c<<18|2;g=c<<28|g|8192}H[f>>2]=g&-1226833921}g=f+4|0;c=k+4|0;s=s+1|0;if((s|0)!=64){continue}break}g=f+12|0;c=k+772|0;m=t>>>0<60;t=t+4|0;if(m){continue}break}}H[e+8>>2]=h;H[e+4>>2]=b;H[e>>2]=d;H[e+104>>2]=i}mg:{if(!(ba&32)){break mg}H[e+104>>2]=e+100;g=H[e+100>>2];b=H[g>>2];d=H[e+4>>2]-b|0;H[e+4>>2]=d;h=H[e>>2];ng:{if(h>>>16>>>0>>0){H[e+4>>2]=b;g=H[(b>>>0>d>>>0?8:12)+g>>2];H[e+100>>2]=g;d=H[e+8>>2];while(1){og:{if(d){break og}l=H[e+16>>2];c=l+1|0;i=I[l+1|0];if(I[l|0]==255){if(i>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;h=h+65280|0;d=8;break og}H[e+16>>2]=c;h=(i<<9)+h|0;d=7;break og}H[e+16>>2]=c;d=8;h=(i<<8)+h|0}d=d-1|0;H[e+8>>2]=d;h=h<<1;H[e>>2]=h;b=b<<1;H[e+4>>2]=b;if(b>>>0<32768){continue}break}d=b;break ng}h=h-(b<<16)|0;H[e>>2]=h;if(d&32768){break ng}g=H[(b>>>0>d>>>0?12:8)+g>>2];H[e+100>>2]=g;b=H[e+8>>2];while(1){pg:{if(b){break pg}c=H[e+16>>2];b=c+1|0;l=I[c+1|0];if(I[c|0]==255){if(l>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;h=h+65280|0;b=8;break pg}H[e+16>>2]=b;h=(l<<9)+h|0;b=7;break pg}H[e+16>>2]=b;b=8;h=(l<<8)+h|0}b=b-1|0;H[e+8>>2]=b;h=h<<1;H[e>>2]=h;d=d<<1;H[e+4>>2]=d;if(d>>>0<32768){continue}break}}b=H[g>>2];d=d-b|0;H[e+4>>2]=d;qg:{if(h>>>16>>>0>>0){H[e+4>>2]=b;g=H[(b>>>0>d>>>0?8:12)+g>>2];H[e+100>>2]=g;d=H[e+8>>2];while(1){rg:{if(d){break rg}l=H[e+16>>2];c=l+1|0;i=I[l+1|0];if(I[l|0]==255){if(i>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;h=h+65280|0;d=8;break rg}H[e+16>>2]=c;h=(i<<9)+h|0;d=7;break rg}H[e+16>>2]=c;d=8;h=(i<<8)+h|0}d=d-1|0;H[e+8>>2]=d;h=h<<1;H[e>>2]=h;b=b<<1;H[e+4>>2]=b;if(b>>>0<32768){continue}break}d=b;break qg}h=h-(b<<16)|0;H[e>>2]=h;if(d&32768){break qg}g=H[(b>>>0>d>>>0?12:8)+g>>2];H[e+100>>2]=g;b=H[e+8>>2];while(1){sg:{if(b){break sg}c=H[e+16>>2];b=c+1|0;l=I[c+1|0];if(I[c|0]==255){if(l>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;h=h+65280|0;b=8;break sg}H[e+16>>2]=b;h=(l<<9)+h|0;b=7;break sg}H[e+16>>2]=b;b=8;h=(l<<8)+h|0}b=b-1|0;H[e+8>>2]=b;h=h<<1;H[e>>2]=h;d=d<<1;H[e+4>>2]=d;if(d>>>0<32768){continue}break}}b=H[g>>2];d=d-b|0;H[e+4>>2]=d;tg:{if(h>>>16>>>0>>0){H[e+4>>2]=b;g=H[(b>>>0>d>>>0?8:12)+g>>2];H[e+100>>2]=g;d=H[e+8>>2];while(1){ug:{if(d){break ug}l=H[e+16>>2];c=l+1|0;i=I[l+1|0];if(I[l|0]==255){if(i>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;h=h+65280|0;d=8;break ug}H[e+16>>2]=c;h=(i<<9)+h|0;d=7;break ug}H[e+16>>2]=c;d=8;h=(i<<8)+h|0}d=d-1|0;H[e+8>>2]=d;h=h<<1;H[e>>2]=h;b=b<<1;H[e+4>>2]=b;if(b>>>0<32768){continue}break}d=b;break tg}h=h-(b<<16)|0;H[e>>2]=h;if(d&32768){break tg}g=H[(b>>>0>d>>>0?12:8)+g>>2];H[e+100>>2]=g;b=H[e+8>>2];while(1){vg:{if(b){break vg}c=H[e+16>>2];b=c+1|0;l=I[c+1|0];if(I[c|0]==255){if(l>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;h=h+65280|0;b=8;break vg}H[e+16>>2]=b;h=(l<<9)+h|0;b=7;break vg}H[e+16>>2]=b;b=8;h=(l<<8)+h|0}b=b-1|0;H[e+8>>2]=b;h=h<<1;H[e>>2]=h;d=d<<1;H[e+4>>2]=d;if(d>>>0<32768){continue}break}}b=H[g>>2];d=d-b|0;H[e+4>>2]=d;if(h>>>16>>>0>>0){H[e+4>>2]=b;H[e+100>>2]=H[(b>>>0>d>>>0?8:12)+g>>2];d=H[e+8>>2];while(1){wg:{if(d){break wg}g=H[e+16>>2];c=g+1|0;l=I[g+1|0];if(I[g|0]==255){if(l>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;h=h+65280|0;d=8;break wg}H[e+16>>2]=c;h=(l<<9)+h|0;d=7;break wg}H[e+16>>2]=c;d=8;h=(l<<8)+h|0}d=d-1|0;H[e+8>>2]=d;h=h<<1;H[e>>2]=h;b=b<<1;H[e+4>>2]=b;if(b>>>0<32768){continue}break}break mg}c=h-(b<<16)|0;H[e>>2]=c;if(d&32768){break mg}H[e+100>>2]=H[(b>>>0>d>>>0?12:8)+g>>2];h=H[e+8>>2];while(1){xg:{if(h){break xg}g=H[e+16>>2];b=g+1|0;l=I[g+1|0];if(I[g|0]==255){if(l>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;c=c+65280|0;h=8;break xg}H[e+16>>2]=b;c=(l<<9)+c|0;h=7;break xg}H[e+16>>2]=b;h=8;c=(l<<8)+c|0}h=h-1|0;H[e+8>>2]=h;c=c<<1;H[e>>2]=c;d=d<<1;H[e+4>>2]=d;if(d>>>0<32768){continue}break}}break bb;case 0:break db}}if(Z){u=1<>>1|0;n=H[e+124>>2];d=n<<2;b=(d+H[e+120>>2]|0)+12|0;g=H[e+116>>2];k=0;c=H[e+128>>2];if(c>>>0>=4){if(!n){break ab}t=N(n,12);m=n<<3;o=0-u|0;while(1){c=0;while(1){l=b;b=H[b>>2];yg:{if(!b){break yg}if((b&2097168)==16){b=H[e>>2];h=H[e+8>>2];zg:{if(h){break zg}p=(b|0)!=255;i=H[e+16>>2];b=I[i|0];Ag:{if(p){h=8}else{if(b>>>0>143){break Ag}h=7}H[e>>2]=b;H[e+16>>2]=i+1;break zg}h=8;b=255}i=h-1|0;H[e+8>>2]=i;i=b>>>i&1;b=H[g>>2];H[g>>2]=((i|0)==(b>>>31|0)?o:u)+b;b=H[l>>2]|1048576;H[l>>2]=b}if((b&16777344)==128){b=H[e>>2];h=H[e+8>>2];Bg:{if(h){break Bg}p=(b|0)!=255;i=H[e+16>>2];b=I[i|0];Cg:{if(p){h=8}else{if(b>>>0>143){break Cg}h=7}H[e>>2]=b;H[e+16>>2]=i+1;break Bg}h=8;b=255}p=h-1|0;H[e+8>>2]=p;i=d+g|0;f=H[i>>2];H[i>>2]=f+((b>>>p&1)==(f>>>31|0)?o:u);b=H[l>>2]|8388608;H[l>>2]=b}if((b&134218752)==1024){b=H[e>>2];h=H[e+8>>2];Dg:{if(h){break Dg}p=(b|0)!=255;i=H[e+16>>2];b=I[i|0];Eg:{if(p){h=8}else{if(b>>>0>143){break Eg}h=7}H[e>>2]=b;H[e+16>>2]=i+1;break Dg}h=8;b=255}p=h-1|0;H[e+8>>2]=p;i=g+m|0;f=H[i>>2];H[i>>2]=f+((b>>>p&1)==(f>>>31|0)?o:u);b=H[l>>2]|67108864;H[l>>2]=b}if((b&1073750016)!=8192){break yg}b=H[e>>2];h=H[e+8>>2];Fg:{if(h){break Fg}p=(b|0)!=255;i=H[e+16>>2];b=I[i|0];Gg:{if(p){h=8}else{if(b>>>0>143){break Gg}h=7}H[e>>2]=b;H[e+16>>2]=i+1;break Fg}h=8;b=255}p=h-1|0;H[e+8>>2]=p;i=g+t|0;f=H[i>>2];H[i>>2]=f+((b>>>p&1)==(f>>>31|0)?o:u);H[l>>2]=H[l>>2]|536870912}g=g+4|0;b=l+4|0;c=c+1|0;if((n|0)!=(c|0)){continue}break}g=g+t|0;b=l+12|0;k=k+4|0;c=H[e+128>>2];if(k>>>0<(c&-4)>>>0){continue}break}}if(!n|c>>>0<=k>>>0){break bb}q=0;p=0-u|0;d=c;while(1){Hg:{if((d|0)==(k|0)){d=k;break Hg}h=H[b>>2];r=0;while(1){d=N(r,3);if((2097168<>2];j=H[e+8>>2];Ig:{if(j){break Ig}i=(c|0)!=255;l=H[e+16>>2];c=I[l|0];Jg:{if(i){j=8}else{if(c>>>0>143){break Jg}j=7}H[e>>2]=c;H[e+16>>2]=l+1;break Ig}j=8;c=255}l=j-1|0;H[e+8>>2]=l;l=c>>>l&1;c=H[m>>2];H[m>>2]=((l|0)==(c>>>31|0)?p:u)+c;h=H[b>>2]|1048576<>2]=h;c=H[e+128>>2]}r=r+1|0;d=c;if(r>>>0>>0){continue}break}}g=g+4|0;b=b+4|0;q=q+1|0;if((n|0)!=(q|0)){continue}break}break bb}i=H[e+120>>2];d=H[e+116>>2];v=H[e+124>>2];c=H[e+128>>2];if(!((v|0)!=64|(c|0)!=64)){c=i+268|0;t=0;q=1<>>1|0;n=0-q|0;r=H[e+8>>2];g=H[e+4>>2];b=H[e>>2];k=H[e+104>>2];while(1){j=0;while(1){p=d;i=c;d=H[c>>2];if(d){l=c;if((d&2097168)==16){k=ea+((d&1048576?16:d&495?15:14)<<2)|0;f=H[k>>2];c=H[f>>2];g=g-c|0;Kg:{if(b>>>16>>>0>>0){o=H[f+4>>2];m=c>>>0>g>>>0;H[k>>2]=H[f+(m?8:12)>>2];while(1){Lg:{if(r){break Lg}f=H[e+16>>2];g=f+1|0;h=I[f+1|0];if(I[f|0]==255){if(h>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;b=b+65280|0;r=8;break Lg}H[e+16>>2]=g;b=(h<<9)+b|0;r=7;break Lg}H[e+16>>2]=g;r=8;b=(h<<8)+b|0}r=r-1|0;b=b<<1;c=c<<1;if(c>>>0<32768){continue}break}g=c;m=m?o:!o;break Kg}b=b-(c<<16)|0;if(!(g&32768)){o=H[f+4>>2];c=c>>>0>g>>>0;H[k>>2]=H[f+(c?12:8)>>2];while(1){Mg:{if(r){break Mg}f=H[e+16>>2];m=f+1|0;h=I[f+1|0];if(I[f|0]==255){if(h>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;b=b+65280|0;r=8;break Mg}H[e+16>>2]=m;b=(h<<9)+b|0;r=7;break Mg}H[e+16>>2]=m;r=8;b=(h<<8)+b|0}r=r-1|0;b=b<<1;g=g<<1;if(g>>>0<32768){continue}break}m=c?!o:o;break Kg}m=H[f+4>>2]}c=H[p>>2];H[p>>2]=((m|0)==(c>>>31|0)?n:q)+c;d=d|1048576}if((d&16777344)==128){k=ea+((d&8388608?16:d&3960?15:14)<<2)|0;f=H[k>>2];c=H[f>>2];g=g-c|0;Ng:{if(b>>>16>>>0>>0){o=H[f+4>>2];m=c>>>0>g>>>0;H[k>>2]=H[f+(m?8:12)>>2];while(1){Og:{if(r){break Og}f=H[e+16>>2];g=f+1|0;h=I[f+1|0];if(I[f|0]==255){if(h>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;b=b+65280|0;r=8;break Og}H[e+16>>2]=g;b=(h<<9)+b|0;r=7;break Og}H[e+16>>2]=g;r=8;b=(h<<8)+b|0}r=r-1|0;b=b<<1;c=c<<1;if(c>>>0<32768){continue}break}g=c;m=m?o:!o;break Ng}b=b-(c<<16)|0;if(!(g&32768)){o=H[f+4>>2];c=c>>>0>g>>>0;H[k>>2]=H[f+(c?12:8)>>2];while(1){Pg:{if(r){break Pg}f=H[e+16>>2];m=f+1|0;h=I[f+1|0];if(I[f|0]==255){if(h>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;b=b+65280|0;r=8;break Pg}H[e+16>>2]=m;b=(h<<9)+b|0;r=7;break Pg}H[e+16>>2]=m;r=8;b=(h<<8)+b|0}r=r-1|0;b=b<<1;g=g<<1;if(g>>>0<32768){continue}break}m=c?!o:o;break Ng}m=H[f+4>>2]}c=H[p+256>>2];H[p+256>>2]=((m|0)==(c>>>31|0)?n:q)+c;d=d|8388608}if((d&134218752)==1024){k=ea+((d&67108864?16:d&31680?15:14)<<2)|0;f=H[k>>2];c=H[f>>2];g=g-c|0;Qg:{if(b>>>16>>>0>>0){o=H[f+4>>2];m=c>>>0>g>>>0;H[k>>2]=H[f+(m?8:12)>>2];while(1){Rg:{if(r){break Rg}f=H[e+16>>2];g=f+1|0;h=I[f+1|0];if(I[f|0]==255){if(h>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;b=b+65280|0;r=8;break Rg}H[e+16>>2]=g;b=(h<<9)+b|0;r=7;break Rg}H[e+16>>2]=g;r=8;b=(h<<8)+b|0}r=r-1|0;b=b<<1;c=c<<1;if(c>>>0<32768){continue}break}g=c;m=m?o:!o;break Qg}b=b-(c<<16)|0;if(!(g&32768)){o=H[f+4>>2];c=c>>>0>g>>>0;H[k>>2]=H[f+(c?12:8)>>2];while(1){Sg:{if(r){break Sg}f=H[e+16>>2];m=f+1|0;h=I[f+1|0];if(I[f|0]==255){if(h>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;b=b+65280|0;r=8;break Sg}H[e+16>>2]=m;b=(h<<9)+b|0;r=7;break Sg}H[e+16>>2]=m;r=8;b=(h<<8)+b|0}r=r-1|0;b=b<<1;g=g<<1;if(g>>>0<32768){continue}break}m=c?!o:o;break Qg}m=H[f+4>>2]}c=H[p+512>>2];H[p+512>>2]=((m|0)==(c>>>31|0)?n:q)+c;d=d|67108864}if((d&1073750016)==8192){k=ea+((d&536870912?16:d&253440?15:14)<<2)|0;f=H[k>>2];c=H[f>>2];g=g-c|0;Tg:{if(b>>>16>>>0>>0){o=H[f+4>>2];m=c>>>0>g>>>0;H[k>>2]=H[f+(m?8:12)>>2];while(1){Ug:{if(r){break Ug}f=H[e+16>>2];g=f+1|0;h=I[f+1|0];if(I[f|0]==255){if(h>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;b=b+65280|0;r=8;break Ug}H[e+16>>2]=g;b=(h<<9)+b|0;r=7;break Ug}H[e+16>>2]=g;r=8;b=(h<<8)+b|0}r=r-1|0;b=b<<1;c=c<<1;if(c>>>0<32768){continue}break}g=c;m=m?o:!o;break Tg}b=b-(c<<16)|0;if(!(g&32768)){o=H[f+4>>2];c=c>>>0>g>>>0;H[k>>2]=H[f+(c?12:8)>>2];while(1){Vg:{if(r){break Vg}f=H[e+16>>2];m=f+1|0;h=I[f+1|0];if(I[f|0]==255){if(h>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;b=b+65280|0;r=8;break Vg}H[e+16>>2]=m;b=(h<<9)+b|0;r=7;break Vg}H[e+16>>2]=m;r=8;b=(h<<8)+b|0}r=r-1|0;b=b<<1;g=g<<1;if(g>>>0<32768){continue}break}m=c?!o:o;break Tg}m=H[f+4>>2]}c=H[p+768>>2];H[p+768>>2]=((m|0)==(c>>>31|0)?n:q)+c;d=d|536870912}H[l>>2]=d}c=i+4|0;d=p+4|0;j=j+1|0;if((j|0)!=64){continue}break}c=i+12|0;d=p+772|0;l=t>>>0<60;t=t+4|0;if(l){continue}break}H[e+8>>2]=r;H[e+4>>2]=g;H[e>>2]=b;H[e+104>>2]=k;break bb}s=1<>>1|0;t=v<<2;f=(t+i|0)+12|0;r=H[e+8>>2];g=H[e+4>>2];b=H[e>>2];k=H[e+104>>2];o=0;Wg:{if(c>>>0<4){break Wg}if(v){n=N(v,12);m=v<<3;u=0-s|0;while(1){j=0;while(1){l=f;i=H[f>>2];if(i){if((i&2097168)==16){k=ea+((i&1048576?16:i&495?15:14)<<2)|0;f=H[k>>2];c=H[f>>2];g=g-c|0;Xg:{if(b>>>16>>>0>=c>>>0){b=b-(c<<16)|0;p=H[f+4>>2];if(g&32768){break Xg}h=H[f+4>>2];c=c>>>0>g>>>0;H[k>>2]=H[f+(c?12:8)>>2];while(1){Yg:{if(r){break Yg}f=H[e+16>>2];p=f+1|0;q=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=p;r=8;b=(q<<8)+b|0;break Yg}if(q>>>0<=143){H[e+16>>2]=p;b=(q<<9)+b|0;r=7;break Yg}H[e+12>>2]=H[e+12>>2]+1;b=b+65280|0;r=8}r=r-1|0;b=b<<1;g=g<<1;if(g>>>0<32768){continue}break}p=c?!h:h;break Xg}h=H[f+4>>2];p=c>>>0>g>>>0;H[k>>2]=H[f+(p?8:12)>>2];while(1){Zg:{if(r){break Zg}f=H[e+16>>2];g=f+1|0;q=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=g;r=8;b=(q<<8)+b|0;break Zg}if(q>>>0<=143){H[e+16>>2]=g;b=(q<<9)+b|0;r=7;break Zg}H[e+12>>2]=H[e+12>>2]+1;b=b+65280|0;r=8}r=r-1|0;b=b<<1;c=c<<1;if(c>>>0<32768){continue}break}g=c;p=p?h:!h}c=H[d>>2];H[d>>2]=((p|0)==(c>>>31|0)?u:s)+c;i=i|1048576}if((i&16777344)==128){k=ea+((i&8388608?16:i&3960?15:14)<<2)|0;f=H[k>>2];c=H[f>>2];g=g-c|0;_g:{if(b>>>16>>>0>=c>>>0){b=b-(c<<16)|0;p=H[f+4>>2];if(g&32768){break _g}h=H[f+4>>2];c=c>>>0>g>>>0;H[k>>2]=H[f+(c?12:8)>>2];while(1){$g:{if(r){break $g}f=H[e+16>>2];p=f+1|0;q=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=p;r=8;b=(q<<8)+b|0;break $g}if(q>>>0<=143){H[e+16>>2]=p;b=(q<<9)+b|0;r=7;break $g}H[e+12>>2]=H[e+12>>2]+1;b=b+65280|0;r=8}r=r-1|0;b=b<<1;g=g<<1;if(g>>>0<32768){continue}break}p=c?!h:h;break _g}h=H[f+4>>2];p=c>>>0>g>>>0;H[k>>2]=H[f+(p?8:12)>>2];while(1){ah:{if(r){break ah}f=H[e+16>>2];g=f+1|0;q=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=g;r=8;b=(q<<8)+b|0;break ah}if(q>>>0<=143){H[e+16>>2]=g;b=(q<<9)+b|0;r=7;break ah}H[e+12>>2]=H[e+12>>2]+1;b=b+65280|0;r=8}r=r-1|0;b=b<<1;c=c<<1;if(c>>>0<32768){continue}break}g=c;p=p?h:!h}f=p;c=d+t|0;p=H[c>>2];H[c>>2]=p+((f|0)==(p>>>31|0)?u:s);i=i|8388608}if((i&134218752)==1024){k=ea+((i&67108864?16:i&31680?15:14)<<2)|0;f=H[k>>2];c=H[f>>2];g=g-c|0;bh:{if(b>>>16>>>0>=c>>>0){b=b-(c<<16)|0;p=H[f+4>>2];if(g&32768){break bh}h=H[f+4>>2];c=c>>>0>g>>>0;H[k>>2]=H[f+(c?12:8)>>2];while(1){ch:{if(r){break ch}f=H[e+16>>2];p=f+1|0;q=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=p;r=8;b=(q<<8)+b|0;break ch}if(q>>>0<=143){H[e+16>>2]=p;b=(q<<9)+b|0;r=7;break ch}H[e+12>>2]=H[e+12>>2]+1;b=b+65280|0;r=8}r=r-1|0;b=b<<1;g=g<<1;if(g>>>0<32768){continue}break}p=c?!h:h;break bh}h=H[f+4>>2];p=c>>>0>g>>>0;H[k>>2]=H[f+(p?8:12)>>2];while(1){dh:{if(r){break dh}f=H[e+16>>2];g=f+1|0;q=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=g;r=8;b=(q<<8)+b|0;break dh}if(q>>>0<=143){H[e+16>>2]=g;b=(q<<9)+b|0;r=7;break dh}H[e+12>>2]=H[e+12>>2]+1;b=b+65280|0;r=8}r=r-1|0;b=b<<1;c=c<<1;if(c>>>0<32768){continue}break}g=c;p=p?h:!h}f=p;c=d+m|0;p=H[c>>2];H[c>>2]=p+((f|0)==(p>>>31|0)?u:s);i=i|67108864}if((i&1073750016)==8192){k=ea+((i&536870912?16:i&253440?15:14)<<2)|0;f=H[k>>2];c=H[f>>2];g=g-c|0;eh:{if(b>>>16>>>0>=c>>>0){b=b-(c<<16)|0;p=H[f+4>>2];if(g&32768){break eh}h=H[f+4>>2];c=c>>>0>g>>>0;H[k>>2]=H[f+(c?12:8)>>2];while(1){fh:{if(r){break fh}f=H[e+16>>2];p=f+1|0;q=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=p;r=8;b=(q<<8)+b|0;break fh}if(q>>>0<=143){H[e+16>>2]=p;b=(q<<9)+b|0;r=7;break fh}H[e+12>>2]=H[e+12>>2]+1;b=b+65280|0;r=8}r=r-1|0;b=b<<1;g=g<<1;if(g>>>0<32768){continue}break}p=c?!h:h;break eh}h=H[f+4>>2];p=c>>>0>g>>>0;H[k>>2]=H[f+(p?8:12)>>2];while(1){gh:{if(r){break gh}f=H[e+16>>2];g=f+1|0;q=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=g;r=8;b=(q<<8)+b|0;break gh}if(q>>>0<=143){H[e+16>>2]=g;b=(q<<9)+b|0;r=7;break gh}H[e+12>>2]=H[e+12>>2]+1;b=b+65280|0;r=8}r=r-1|0;b=b<<1;c=c<<1;if(c>>>0<32768){continue}break}g=c;p=p?h:!h}f=p;c=d+n|0;p=H[c>>2];H[c>>2]=p+((f|0)==(p>>>31|0)?u:s);i=i|536870912}H[l>>2]=i}f=l+4|0;d=d+4|0;j=j+1|0;if((v|0)!=(j|0)){continue}break}f=l+12|0;d=d+n|0;o=o+4|0;c=H[e+128>>2];if(o>>>0<(c&-4)>>>0){continue}break}break Wg}l=(c&-4)-1|0;o=(l&-4)+4|0;f=(i+(l<<1&-8)|0)+20|0}H[e+8>>2]=r;H[e+4>>2]=g;H[e>>2]=b;H[e+104>>2]=k;if(!v|c>>>0<=o>>>0){break bb}t=0;l=0-s|0;b=c;while(1){hh:{if((b|0)==(o|0)){b=o;break hh}r=H[f>>2];h=0;while(1){n=N(h,3);if((2097168<>>n|0;i=ea+((b&1048576?16:b&495?15:14)<<2)|0;H[e+104>>2]=i;p=H[i>>2];b=H[p>>2];c=H[e+4>>2]-b|0;H[e+4>>2]=c;g=H[e>>2];ih:{if(g>>>16>>>0>>0){m=H[p+4>>2];H[e+4>>2]=b;c=b>>>0>c>>>0;H[i>>2]=H[p+(c?8:12)>>2];r=H[e+8>>2];while(1){jh:{if(r){break jh}p=H[e+16>>2];i=p+1|0;j=I[p+1|0];if(I[p|0]==255){if(j>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;g=g+65280|0;r=8;break jh}H[e+16>>2]=i;g=(j<<9)+g|0;r=7;break jh}H[e+16>>2]=i;r=8;g=(j<<8)+g|0}r=r-1|0;H[e+8>>2]=r;g=g<<1;H[e>>2]=g;b=b<<1;H[e+4>>2]=b;if(b>>>0<32768){continue}break}c=c?m:!m;break ih}g=g-(b<<16)|0;H[e>>2]=g;if(!(c&32768)){m=H[p+4>>2];b=b>>>0>c>>>0;H[i>>2]=H[p+(b?12:8)>>2];r=H[e+8>>2];while(1){kh:{if(r){break kh}p=H[e+16>>2];i=p+1|0;j=I[p+1|0];if(I[p|0]==255){if(j>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;g=g+65280|0;r=8;break kh}H[e+16>>2]=i;g=(j<<9)+g|0;r=7;break kh}H[e+16>>2]=i;r=8;g=(j<<8)+g|0}r=r-1|0;H[e+8>>2]=r;g=g<<1;H[e>>2]=g;c=c<<1;H[e+4>>2]=c;if(c>>>0<32768){continue}break}c=b?!m:m;break ih}c=H[p+4>>2]}b=H[k>>2];H[k>>2]=((c|0)==(b>>>31|0)?l:s)+b;r=H[f>>2]|1048576<>2]=r;c=H[e+128>>2]}h=h+1|0;b=c;if(h>>>0>>0){continue}break}}f=f+4|0;d=d+4|0;t=t+1|0;if((v|0)!=(t|0)){continue}break}break bb}i=0;t=0;q=0;lh:{mh:{nh:{A=H[e+124>>2];if(!((A|0)!=64|H[e+128>>2]!=64)){b=1<>>1|b;l=0-i|0;s=e+28|0;g=H[e+120>>2]+268|0;f=H[e+8>>2];c=H[e+4>>2];k=H[e>>2];j=H[e+104>>2];b=H[e+116>>2];if(ba&8){break nh}while(1){q=0;while(1){p=b;m=g;g=H[g>>2];if(g){oh:{if(g&2097168){break oh}b=g&495;if(!b){break oh}j=s+(I[b+H[e+108>>2]|0]<<2)|0;h=H[j>>2];b=H[h>>2];c=c-b|0;ph:{if(k>>>16>>>0>>0){o=H[h+4>>2];d=b>>>0>c>>>0;H[j>>2]=H[h+(d?8:12)>>2];while(1){qh:{if(f){break qh}f=H[e+16>>2];c=f+1|0;h=I[f+1|0];if(I[f|0]==255){if(h>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break qh}H[e+16>>2]=c;k=(h<<9)+k|0;f=7;break qh}H[e+16>>2]=c;f=8;k=(h<<8)+k|0}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?o:!o;break ph}k=k-(b<<16)|0;if(!(c&32768)){o=H[h+4>>2];b=b>>>0>c>>>0;H[j>>2]=H[h+(b?12:8)>>2];while(1){rh:{if(f){break rh}f=H[e+16>>2];d=f+1|0;h=I[f+1|0];if(I[f|0]==255){if(h>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break rh}H[e+16>>2]=d;k=(h<<9)+k|0;f=7;break rh}H[e+16>>2]=d;f=8;k=(h<<8)+k|0}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!o:o;break ph}b=H[h+4>>2]}if(b){n=m-4|0;d=H[m+4>>2]>>>17&4|(H[n>>2]>>>19&1|(g>>>14&16|(g>>>16&64|g&170)));j=s+(I[d+24384|0]<<2)|0;u=H[j>>2];b=H[u>>2];c=c-b|0;o=I[d+24640|0];sh:{if(k>>>16>>>0>>0){h=H[u+4>>2];d=b>>>0>c>>>0;H[j>>2]=H[u+(d?8:12)>>2];while(1){th:{if(f){break th}f=H[e+16>>2];c=f+1|0;u=I[f+1|0];if(I[f|0]==255){if(u>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break th}H[e+16>>2]=c;k=(u<<9)+k|0;f=7;break th}H[e+16>>2]=c;f=8;k=(u<<8)+k|0}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;d=d?h:!h;break sh}k=k-(b<<16)|0;if(!(c&32768)){h=H[u+4>>2];b=b>>>0>c>>>0;H[j>>2]=H[u+(b?12:8)>>2];while(1){uh:{if(f){break uh}f=H[e+16>>2];d=f+1|0;u=I[f+1|0];if(I[f|0]==255){if(u>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break uh}H[e+16>>2]=d;k=(u<<9)+k|0;f=7;break uh}H[e+16>>2]=d;f=8;k=(u<<8)+k|0}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}d=b?!h:h;break sh}d=H[u+4>>2]}H[p>>2]=(o|0)==(d|0)?i:l;H[n>>2]=H[n>>2]|32;H[m+4>>2]=H[m+4>>2]|8;b=m-268|0;H[b>>2]=H[b>>2]|131072;b=m-260|0;H[b>>2]=H[b>>2]|32768;b=m-264|0;h=b;x=H[b>>2];b=d^o;H[h>>2]=x|b<<31|65536;g=b<<19|g|16}g=g|2097152}if(!(!(g&3960)|g&16777344)){o=g>>>3|0;j=s+(I[H[e+108>>2]+(o&495)|0]<<2)|0;n=H[j>>2];b=H[n>>2];c=c-b|0;vh:{if(k>>>16>>>0>>0){h=H[n+4>>2];d=b>>>0>c>>>0;H[j>>2]=H[n+(d?8:12)>>2];while(1){wh:{if(f){break wh}f=H[e+16>>2];c=f+1|0;n=I[f+1|0];if(I[f|0]==255){if(n>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break wh}H[e+16>>2]=c;k=(n<<9)+k|0;f=7;break wh}H[e+16>>2]=c;f=8;k=(n<<8)+k|0}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?h:!h;break vh}k=k-(b<<16)|0;if(!(c&32768)){h=H[n+4>>2];b=b>>>0>c>>>0;H[j>>2]=H[n+(b?12:8)>>2];while(1){xh:{if(f){break xh}f=H[e+16>>2];d=f+1|0;n=I[f+1|0];if(I[f|0]==255){if(n>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break xh}H[e+16>>2]=d;k=(n<<9)+k|0;f=7;break xh}H[e+16>>2]=d;f=8;k=(n<<8)+k|0}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!h:h;break vh}b=H[n+4>>2]}if(b){n=m-4|0;d=H[m+4>>2]>>>20&4|(H[n>>2]>>>22&1|(g>>>15&16|(g>>>19&64|o&170)));j=s+(I[d+24384|0]<<2)|0;u=H[j>>2];b=H[u>>2];c=c-b|0;o=I[d+24640|0];yh:{if(k>>>16>>>0>>0){h=H[u+4>>2];d=b>>>0>c>>>0;H[j>>2]=H[u+(d?8:12)>>2];while(1){zh:{if(f){break zh}f=H[e+16>>2];c=f+1|0;u=I[f+1|0];if(I[f|0]==255){if(u>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break zh}H[e+16>>2]=c;k=(u<<9)+k|0;f=7;break zh}H[e+16>>2]=c;f=8;k=(u<<8)+k|0}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?h:!h;break yh}k=k-(b<<16)|0;if(!(c&32768)){h=H[u+4>>2];b=b>>>0>c>>>0;H[j>>2]=H[u+(b?12:8)>>2];while(1){Ah:{if(f){break Ah}f=H[e+16>>2];d=f+1|0;u=I[f+1|0];if(I[f|0]==255){if(u>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break Ah}H[e+16>>2]=d;k=(u<<9)+k|0;f=7;break Ah}H[e+16>>2]=d;f=8;k=(u<<8)+k|0}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!h:h;break yh}b=H[u+4>>2]}H[p+256>>2]=(o|0)==(b|0)?i:l;H[n>>2]=H[n>>2]|256;H[m+4>>2]=H[m+4>>2]|64;g=(b^o)<<22|g|128}g=g|16777216}if(!(!(g&31680)|g&134218752)){o=g>>>6|0;j=s+(I[H[e+108>>2]+(o&495)|0]<<2)|0;n=H[j>>2];b=H[n>>2];c=c-b|0;Bh:{if(k>>>16>>>0>>0){h=H[n+4>>2];d=b>>>0>c>>>0;H[j>>2]=H[n+(d?8:12)>>2];while(1){Ch:{if(f){break Ch}f=H[e+16>>2];c=f+1|0;n=I[f+1|0];if(I[f|0]==255){if(n>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break Ch}H[e+16>>2]=c;k=(n<<9)+k|0;f=7;break Ch}H[e+16>>2]=c;f=8;k=(n<<8)+k|0}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?h:!h;break Bh}k=k-(b<<16)|0;if(!(c&32768)){h=H[n+4>>2];b=b>>>0>c>>>0;H[j>>2]=H[n+(b?12:8)>>2];while(1){Dh:{if(f){break Dh}f=H[e+16>>2];d=f+1|0;n=I[f+1|0];if(I[f|0]==255){if(n>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break Dh}H[e+16>>2]=d;k=(n<<9)+k|0;f=7;break Dh}H[e+16>>2]=d;f=8;k=(n<<8)+k|0}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!h:h;break Bh}b=H[n+4>>2]}if(b){n=m-4|0;d=H[m+4>>2]>>>23&4|(H[n>>2]>>>25&1|(g>>>18&16|(g>>>22&64|o&170)));j=s+(I[d+24384|0]<<2)|0;u=H[j>>2];b=H[u>>2];c=c-b|0;o=I[d+24640|0];Eh:{if(k>>>16>>>0>>0){h=H[u+4>>2];d=b>>>0>c>>>0;H[j>>2]=H[u+(d?8:12)>>2];while(1){Fh:{if(f){break Fh}f=H[e+16>>2];c=f+1|0;u=I[f+1|0];if(I[f|0]==255){if(u>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break Fh}H[e+16>>2]=c;k=(u<<9)+k|0;f=7;break Fh}H[e+16>>2]=c;f=8;k=(u<<8)+k|0}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?h:!h;break Eh}k=k-(b<<16)|0;if(!(c&32768)){h=H[u+4>>2];b=b>>>0>c>>>0;H[j>>2]=H[u+(b?12:8)>>2];while(1){Gh:{if(f){break Gh}f=H[e+16>>2];d=f+1|0;u=I[f+1|0];if(I[f|0]==255){if(u>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break Gh}H[e+16>>2]=d;k=(u<<9)+k|0;f=7;break Gh}H[e+16>>2]=d;f=8;k=(u<<8)+k|0}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!h:h;break Eh}b=H[u+4>>2]}H[p+512>>2]=(o|0)==(b|0)?i:l;H[n>>2]=H[n>>2]|2048;H[m+4>>2]=H[m+4>>2]|512;g=(b^o)<<25|g|1024}g=g|134217728}if(!(!(g&253440)|g&1073750016)){o=g>>>9|0;j=s+(I[H[e+108>>2]+(o&495)|0]<<2)|0;n=H[j>>2];b=H[n>>2];c=c-b|0;Hh:{if(k>>>16>>>0>>0){h=H[n+4>>2];d=b>>>0>c>>>0;H[j>>2]=H[n+(d?8:12)>>2];while(1){Ih:{if(f){break Ih}f=H[e+16>>2];c=f+1|0;n=I[f+1|0];if(I[f|0]==255){if(n>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break Ih}H[e+16>>2]=c;k=(n<<9)+k|0;f=7;break Ih}H[e+16>>2]=c;f=8;k=(n<<8)+k|0}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?h:!h;break Hh}k=k-(b<<16)|0;if(!(c&32768)){h=H[n+4>>2];b=b>>>0>c>>>0;H[j>>2]=H[n+(b?12:8)>>2];while(1){Jh:{if(f){break Jh}f=H[e+16>>2];d=f+1|0;n=I[f+1|0];if(I[f|0]==255){if(n>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break Jh}H[e+16>>2]=d;k=(n<<9)+k|0;f=7;break Jh}H[e+16>>2]=d;f=8;k=(n<<8)+k|0}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!h:h;break Hh}b=H[n+4>>2]}if(b){n=m-4|0;d=H[m+4>>2]>>>26&4|(H[n>>2]>>>28&1|(g>>>21&16|(g>>>25&64|o&170)));j=s+(I[d+24384|0]<<2)|0;u=H[j>>2];b=H[u>>2];c=c-b|0;o=I[d+24640|0];Kh:{if(k>>>16>>>0>>0){h=H[u+4>>2];d=b>>>0>c>>>0;H[j>>2]=H[u+(d?8:12)>>2];while(1){Lh:{if(f){break Lh}f=H[e+16>>2];c=f+1|0;u=I[f+1|0];if(I[f|0]==255){if(u>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break Lh}H[e+16>>2]=c;k=(u<<9)+k|0;f=7;break Lh}H[e+16>>2]=c;f=8;k=(u<<8)+k|0}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?h:!h;break Kh}k=k-(b<<16)|0;if(!(c&32768)){h=H[u+4>>2];b=b>>>0>c>>>0;H[j>>2]=H[u+(b?12:8)>>2];while(1){Mh:{if(f){break Mh}f=H[e+16>>2];d=f+1|0;u=I[f+1|0];if(I[f|0]==255){if(u>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break Mh}H[e+16>>2]=d;k=(u<<9)+k|0;f=7;break Mh}H[e+16>>2]=d;f=8;k=(u<<8)+k|0}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!h:h;break Kh}b=H[u+4>>2]}H[p+768>>2]=(o|0)==(b|0)?i:l;H[n>>2]=H[n>>2]|16384;H[m+4>>2]=H[m+4>>2]|4096;H[m+260>>2]=H[m+260>>2]|4;H[m+268>>2]=H[m+268>>2]|1;b=b^o;H[m+264>>2]=H[m+264>>2]|b<<18|2;g=b<<28|g|8192}g=g|1073741824}H[m>>2]=g}g=m+4|0;b=p+4|0;q=q+1|0;if((q|0)!=64){continue}break}g=m+12|0;b=p+772|0;p=t>>>0<60;t=t+4|0;if(p){continue}break}break mh}b=1<>>1|b;p=H[e+120>>2];g=(p+(A<<2)|0)+12|0;b=H[e+128>>2];f=H[e+8>>2];c=H[e+4>>2];k=H[e>>2];j=H[e+104>>2];o=H[e+116>>2];Nh:{if(ba&8){Oh:{if(b>>>0<4){break Oh}if(A){x=N(A,12);u=A<<3;p=0-l|0;M=e+28|0;while(1){t=0;while(1){m=g;g=H[g>>2];if(g){Ph:{if(g&2097168){break Ph}b=g&495;if(!b){break Ph}j=M+(I[b+H[e+108>>2]|0]<<2)|0;n=H[j>>2];b=H[n>>2];c=c-b|0;Qh:{if(k>>>16>>>0>=b>>>0){k=k-(b<<16)|0;h=H[n+4>>2];if(c&32768){break Qh}h=H[n+4>>2];b=b>>>0>c>>>0;H[j>>2]=H[n+(b?12:8)>>2];while(1){Rh:{if(f){break Rh}f=H[e+16>>2];d=f+1|0;n=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=d;f=8;k=(n<<8)+k|0;break Rh}if(n>>>0<=143){H[e+16>>2]=d;k=(n<<9)+k|0;f=7;break Rh}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}h=b?!h:h;break Qh}h=H[n+4>>2];d=b>>>0>c>>>0;H[j>>2]=H[n+(d?8:12)>>2];while(1){Sh:{if(f){break Sh}f=H[e+16>>2];c=f+1|0;n=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=c;f=8;k=(n<<8)+k|0;break Sh}if(n>>>0<=143){H[e+16>>2]=c;k=(n<<9)+k|0;f=7;break Sh}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;h=d?h:!h}if(h){s=m-4|0;d=H[m+4>>2]>>>17&4|(H[s>>2]>>>19&1|(g>>>14&16|(g>>>16&64|g&170)));j=M+(I[d+24384|0]<<2)|0;v=H[j>>2];b=H[v>>2];c=c-b|0;h=I[d+24640|0];Th:{if(k>>>16>>>0>=b>>>0){k=k-(b<<16)|0;w=H[v+4>>2];if(c&32768){break Th}n=H[v+4>>2];b=b>>>0>c>>>0;H[j>>2]=H[v+(b?12:8)>>2];while(1){Uh:{if(f){break Uh}f=H[e+16>>2];d=f+1|0;v=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=d;f=8;k=(v<<8)+k|0;break Uh}if(v>>>0<=143){H[e+16>>2]=d;k=(v<<9)+k|0;f=7;break Uh}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}w=b?!n:n;break Th}n=H[v+4>>2];d=b>>>0>c>>>0;H[j>>2]=H[v+(d?8:12)>>2];while(1){Vh:{if(f){break Vh}f=H[e+16>>2];c=f+1|0;v=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=c;f=8;k=(v<<8)+k|0;break Vh}if(v>>>0<=143){H[e+16>>2]=c;k=(v<<9)+k|0;f=7;break Vh}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;w=d?n:!n}b=w;H[o>>2]=(h|0)==(b|0)?l:p;H[s>>2]=H[s>>2]|32;H[m+4>>2]=H[m+4>>2]|8;g=(b^h)<<19|g|16}g=g|2097152}if(!(!(g&3960)|g&16777344)){h=g>>>3|0;j=M+(I[H[e+108>>2]+(h&495)|0]<<2)|0;s=H[j>>2];b=H[s>>2];c=c-b|0;Wh:{if(k>>>16>>>0>=b>>>0){k=k-(b<<16)|0;w=H[s+4>>2];if(c&32768){break Wh}n=H[s+4>>2];b=b>>>0>c>>>0;H[j>>2]=H[s+(b?12:8)>>2];while(1){Xh:{if(f){break Xh}f=H[e+16>>2];d=f+1|0;s=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=d;f=8;k=(s<<8)+k|0;break Xh}if(s>>>0<=143){H[e+16>>2]=d;k=(s<<9)+k|0;f=7;break Xh}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}w=b?!n:n;break Wh}n=H[s+4>>2];d=b>>>0>c>>>0;H[j>>2]=H[s+(d?8:12)>>2];while(1){Yh:{if(f){break Yh}f=H[e+16>>2];c=f+1|0;s=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=c;f=8;k=(s<<8)+k|0;break Yh}if(s>>>0<=143){H[e+16>>2]=c;k=(s<<9)+k|0;f=7;break Yh}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;w=d?n:!n}if(w){v=m-4|0;d=H[m+4>>2]>>>20&4|(H[v>>2]>>>22&1|(g>>>15&16|(g>>>19&64|h&170)));j=M+(I[d+24384|0]<<2)|0;r=H[j>>2];b=H[r>>2];c=c-b|0;n=(A<<2)+o|0;h=I[d+24640|0];Zh:{if(k>>>16>>>0>=b>>>0){k=k-(b<<16)|0;w=H[r+4>>2];if(c&32768){break Zh}s=H[r+4>>2];b=b>>>0>c>>>0;H[j>>2]=H[r+(b?12:8)>>2];while(1){_h:{if(f){break _h}f=H[e+16>>2];d=f+1|0;r=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=d;f=8;k=(r<<8)+k|0;break _h}if(r>>>0<=143){H[e+16>>2]=d;k=(r<<9)+k|0;f=7;break _h}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}w=b?!s:s;break Zh}s=H[r+4>>2];d=b>>>0>c>>>0;H[j>>2]=H[r+(d?8:12)>>2];while(1){$h:{if(f){break $h}f=H[e+16>>2];c=f+1|0;r=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=c;f=8;k=(r<<8)+k|0;break $h}if(r>>>0<=143){H[e+16>>2]=c;k=(r<<9)+k|0;f=7;break $h}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;w=d?s:!s}b=w;H[n>>2]=(h|0)==(b|0)?l:p;H[v>>2]=H[v>>2]|256;H[m+4>>2]=H[m+4>>2]|64;g=(b^h)<<22|g|128}g=g|16777216}if(!(!(g&31680)|g&134218752)){h=g>>>6|0;j=M+(I[H[e+108>>2]+(h&495)|0]<<2)|0;s=H[j>>2];b=H[s>>2];c=c-b|0;ai:{if(k>>>16>>>0>=b>>>0){k=k-(b<<16)|0;w=H[s+4>>2];if(c&32768){break ai}n=H[s+4>>2];b=b>>>0>c>>>0;H[j>>2]=H[s+(b?12:8)>>2];while(1){bi:{if(f){break bi}f=H[e+16>>2];d=f+1|0;s=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=d;f=8;k=(s<<8)+k|0;break bi}if(s>>>0<=143){H[e+16>>2]=d;k=(s<<9)+k|0;f=7;break bi}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}w=b?!n:n;break ai}n=H[s+4>>2];d=b>>>0>c>>>0;H[j>>2]=H[s+(d?8:12)>>2];while(1){ci:{if(f){break ci}f=H[e+16>>2];c=f+1|0;s=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=c;f=8;k=(s<<8)+k|0;break ci}if(s>>>0<=143){H[e+16>>2]=c;k=(s<<9)+k|0;f=7;break ci}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;w=d?n:!n}if(w){v=m-4|0;d=H[m+4>>2]>>>23&4|(H[v>>2]>>>25&1|(g>>>18&16|(g>>>22&64|h&170)));j=M+(I[d+24384|0]<<2)|0;r=H[j>>2];b=H[r>>2];c=c-b|0;n=o+u|0;h=I[d+24640|0];di:{if(k>>>16>>>0>=b>>>0){k=k-(b<<16)|0;w=H[r+4>>2];if(c&32768){break di}s=H[r+4>>2];b=b>>>0>c>>>0;H[j>>2]=H[r+(b?12:8)>>2];while(1){ei:{if(f){break ei}f=H[e+16>>2];d=f+1|0;r=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=d;f=8;k=(r<<8)+k|0;break ei}if(r>>>0<=143){H[e+16>>2]=d;k=(r<<9)+k|0;f=7;break ei}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}w=b?!s:s;break di}s=H[r+4>>2];d=b>>>0>c>>>0;H[j>>2]=H[r+(d?8:12)>>2];while(1){fi:{if(f){break fi}f=H[e+16>>2];c=f+1|0;r=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=c;f=8;k=(r<<8)+k|0;break fi}if(r>>>0<=143){H[e+16>>2]=c;k=(r<<9)+k|0;f=7;break fi}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;w=d?s:!s}b=w;H[n>>2]=(h|0)==(b|0)?l:p;H[v>>2]=H[v>>2]|2048;H[m+4>>2]=H[m+4>>2]|512;g=(b^h)<<25|g|1024}g=g|134217728}if(!(!(g&253440)|g&1073750016)){h=g>>>9|0;j=M+(I[H[e+108>>2]+(h&495)|0]<<2)|0;s=H[j>>2];b=H[s>>2];c=c-b|0;gi:{if(k>>>16>>>0>=b>>>0){k=k-(b<<16)|0;w=H[s+4>>2];if(c&32768){break gi}n=H[s+4>>2];b=b>>>0>c>>>0;H[j>>2]=H[s+(b?12:8)>>2];while(1){hi:{if(f){break hi}f=H[e+16>>2];d=f+1|0;s=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=d;f=8;k=(s<<8)+k|0;break hi}if(s>>>0<=143){H[e+16>>2]=d;k=(s<<9)+k|0;f=7;break hi}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}w=b?!n:n;break gi}n=H[s+4>>2];d=b>>>0>c>>>0;H[j>>2]=H[s+(d?8:12)>>2];while(1){ii:{if(f){break ii}f=H[e+16>>2];c=f+1|0;s=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=c;f=8;k=(s<<8)+k|0;break ii}if(s>>>0<=143){H[e+16>>2]=c;k=(s<<9)+k|0;f=7;break ii}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;w=d?n:!n}if(w){v=m-4|0;d=H[m+4>>2]>>>26&4|(H[v>>2]>>>28&1|(g>>>21&16|(g>>>25&64|h&170)));j=M+(I[d+24384|0]<<2)|0;r=H[j>>2];b=H[r>>2];c=c-b|0;n=o+x|0;h=I[d+24640|0];ji:{if(k>>>16>>>0>=b>>>0){k=k-(b<<16)|0;w=H[r+4>>2];if(c&32768){break ji}s=H[r+4>>2];b=b>>>0>c>>>0;H[j>>2]=H[r+(b?12:8)>>2];while(1){ki:{if(f){break ki}f=H[e+16>>2];d=f+1|0;r=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=d;f=8;k=(r<<8)+k|0;break ki}if(r>>>0<=143){H[e+16>>2]=d;k=(r<<9)+k|0;f=7;break ki}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}w=b?!s:s;break ji}s=H[r+4>>2];d=b>>>0>c>>>0;H[j>>2]=H[r+(d?8:12)>>2];while(1){li:{if(f){break li}f=H[e+16>>2];c=f+1|0;r=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=c;f=8;k=(r<<8)+k|0;break li}if(r>>>0<=143){H[e+16>>2]=c;k=(r<<9)+k|0;f=7;break li}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;w=d?s:!s}b=w;H[n>>2]=(h|0)==(b|0)?l:p;H[v>>2]=H[v>>2]|16384;H[m+4>>2]=H[m+4>>2]|4096;d=m+(H[e+124>>2]<<2)|0;H[d+4>>2]=H[d+4>>2]|4;H[d+12>>2]=H[d+12>>2]|1;b=b^h;H[d+8>>2]=H[d+8>>2]|b<<18|2;g=b<<28|g|8192}g=g|1073741824}H[m>>2]=g}g=m+4|0;o=o+4|0;t=t+1|0;if((A|0)!=(t|0)){continue}break}g=m+12|0;o=o+x|0;i=i+4|0;b=H[e+128>>2];if(i>>>0<(b&-4)>>>0){continue}break}break Oh}g=(b&-4)-1|0;i=(g&-4)+4|0;g=(p+(g<<1&-8)|0)+20|0}H[e+8>>2]=f;H[e+4>>2]=c;H[e>>2]=k;H[e+104>>2]=j;if(!A|b>>>0<=i>>>0){break Nh}while(1){c=(b|0)==(i|0);f=0;b=i;if(!c){while(1){Ub(e,g,(N(f,A)<<2)+o|0,l,f,H[e+124>>2]+2|0,1);f=f+1|0;b=H[e+128>>2];if(f>>>0>>0){continue}break}}g=g+4|0;o=o+4|0;q=q+1|0;if((A|0)!=(q|0)){continue}break}break Nh}mi:{if(b>>>0<4){break mi}if(A){x=N(A,12);u=A<<3;p=0-l|0;M=e+28|0;while(1){t=0;while(1){m=g;g=H[g>>2];if(g){ni:{if(g&2097168){break ni}b=g&495;if(!b){break ni}j=M+(I[b+H[e+108>>2]|0]<<2)|0;n=H[j>>2];b=H[n>>2];c=c-b|0;oi:{if(k>>>16>>>0>=b>>>0){k=k-(b<<16)|0;h=H[n+4>>2];if(c&32768){break oi}h=H[n+4>>2];b=b>>>0>c>>>0;H[j>>2]=H[n+(b?12:8)>>2];while(1){pi:{if(f){break pi}f=H[e+16>>2];d=f+1|0;n=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=d;f=8;k=(n<<8)+k|0;break pi}if(n>>>0<=143){H[e+16>>2]=d;k=(n<<9)+k|0;f=7;break pi}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}h=b?!h:h;break oi}h=H[n+4>>2];d=b>>>0>c>>>0;H[j>>2]=H[n+(d?8:12)>>2];while(1){qi:{if(f){break qi}f=H[e+16>>2];c=f+1|0;n=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=c;f=8;k=(n<<8)+k|0;break qi}if(n>>>0<=143){H[e+16>>2]=c;k=(n<<9)+k|0;f=7;break qi}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;h=d?h:!h}if(h){s=m-4|0;d=H[m+4>>2]>>>17&4|(H[s>>2]>>>19&1|(g>>>14&16|(g>>>16&64|g&170)));j=M+(I[d+24384|0]<<2)|0;v=H[j>>2];b=H[v>>2];c=c-b|0;h=I[d+24640|0];ri:{if(k>>>16>>>0>=b>>>0){k=k-(b<<16)|0;d=H[v+4>>2];if(c&32768){break ri}n=H[v+4>>2];b=b>>>0>c>>>0;H[j>>2]=H[v+(b?12:8)>>2];while(1){si:{if(f){break si}f=H[e+16>>2];d=f+1|0;v=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=d;f=8;k=(v<<8)+k|0;break si}if(v>>>0<=143){H[e+16>>2]=d;k=(v<<9)+k|0;f=7;break si}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}d=b?!n:n;break ri}n=H[v+4>>2];d=b>>>0>c>>>0;H[j>>2]=H[v+(d?8:12)>>2];while(1){ti:{if(f){break ti}f=H[e+16>>2];c=f+1|0;v=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=c;f=8;k=(v<<8)+k|0;break ti}if(v>>>0<=143){H[e+16>>2]=c;k=(v<<9)+k|0;f=7;break ti}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;d=d?n:!n}H[o>>2]=(h|0)==(d|0)?l:p;H[s>>2]=H[s>>2]|32;H[m+4>>2]=H[m+4>>2]|8;b=m+(-2-H[e+124>>2]<<2)|0;H[b+4>>2]=H[b+4>>2]|32768;d=d^h;H[b>>2]=H[b>>2]|d<<31|65536;b=b-4|0;H[b>>2]=H[b>>2]|131072;g=d<<19|g|16}g=g|2097152}if(!(!(g&3960)|g&16777344)){h=g>>>3|0;j=M+(I[H[e+108>>2]+(h&495)|0]<<2)|0;s=H[j>>2];b=H[s>>2];c=c-b|0;ui:{if(k>>>16>>>0>=b>>>0){k=k-(b<<16)|0;w=H[s+4>>2];if(c&32768){break ui}n=H[s+4>>2];b=b>>>0>c>>>0;H[j>>2]=H[s+(b?12:8)>>2];while(1){vi:{if(f){break vi}f=H[e+16>>2];d=f+1|0;s=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=d;f=8;k=(s<<8)+k|0;break vi}if(s>>>0<=143){H[e+16>>2]=d;k=(s<<9)+k|0;f=7;break vi}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}w=b?!n:n;break ui}n=H[s+4>>2];d=b>>>0>c>>>0;H[j>>2]=H[s+(d?8:12)>>2];while(1){wi:{if(f){break wi}f=H[e+16>>2];c=f+1|0;s=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=c;f=8;k=(s<<8)+k|0;break wi}if(s>>>0<=143){H[e+16>>2]=c;k=(s<<9)+k|0;f=7;break wi}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;w=d?n:!n}if(w){v=m-4|0;d=H[m+4>>2]>>>20&4|(H[v>>2]>>>22&1|(g>>>15&16|(g>>>19&64|h&170)));j=M+(I[d+24384|0]<<2)|0;r=H[j>>2];b=H[r>>2];c=c-b|0;n=(A<<2)+o|0;h=I[d+24640|0];xi:{if(k>>>16>>>0>=b>>>0){k=k-(b<<16)|0;w=H[r+4>>2];if(c&32768){break xi}s=H[r+4>>2];b=b>>>0>c>>>0;H[j>>2]=H[r+(b?12:8)>>2];while(1){yi:{if(f){break yi}f=H[e+16>>2];d=f+1|0;r=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=d;f=8;k=(r<<8)+k|0;break yi}if(r>>>0<=143){H[e+16>>2]=d;k=(r<<9)+k|0;f=7;break yi}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}w=b?!s:s;break xi}s=H[r+4>>2];d=b>>>0>c>>>0;H[j>>2]=H[r+(d?8:12)>>2];while(1){zi:{if(f){break zi}f=H[e+16>>2];c=f+1|0;r=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=c;f=8;k=(r<<8)+k|0;break zi}if(r>>>0<=143){H[e+16>>2]=c;k=(r<<9)+k|0;f=7;break zi}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;w=d?s:!s}b=w;H[n>>2]=(h|0)==(b|0)?l:p;H[v>>2]=H[v>>2]|256;H[m+4>>2]=H[m+4>>2]|64;g=(b^h)<<22|g|128}g=g|16777216}if(!(!(g&31680)|g&134218752)){h=g>>>6|0;j=M+(I[H[e+108>>2]+(h&495)|0]<<2)|0;s=H[j>>2];b=H[s>>2];c=c-b|0;Ai:{if(k>>>16>>>0>=b>>>0){k=k-(b<<16)|0;w=H[s+4>>2];if(c&32768){break Ai}n=H[s+4>>2];b=b>>>0>c>>>0;H[j>>2]=H[s+(b?12:8)>>2];while(1){Bi:{if(f){break Bi}f=H[e+16>>2];d=f+1|0;s=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=d;f=8;k=(s<<8)+k|0;break Bi}if(s>>>0<=143){H[e+16>>2]=d;k=(s<<9)+k|0;f=7;break Bi}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}w=b?!n:n;break Ai}n=H[s+4>>2];d=b>>>0>c>>>0;H[j>>2]=H[s+(d?8:12)>>2];while(1){Ci:{if(f){break Ci}f=H[e+16>>2];c=f+1|0;s=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=c;f=8;k=(s<<8)+k|0;break Ci}if(s>>>0<=143){H[e+16>>2]=c;k=(s<<9)+k|0;f=7;break Ci}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;w=d?n:!n}if(w){v=m-4|0;d=H[m+4>>2]>>>23&4|(H[v>>2]>>>25&1|(g>>>18&16|(g>>>22&64|h&170)));j=M+(I[d+24384|0]<<2)|0;r=H[j>>2];b=H[r>>2];c=c-b|0;n=o+u|0;h=I[d+24640|0];Di:{if(k>>>16>>>0>=b>>>0){k=k-(b<<16)|0;w=H[r+4>>2];if(c&32768){break Di}s=H[r+4>>2];b=b>>>0>c>>>0;H[j>>2]=H[r+(b?12:8)>>2];while(1){Ei:{if(f){break Ei}f=H[e+16>>2];d=f+1|0;r=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=d;f=8;k=(r<<8)+k|0;break Ei}if(r>>>0<=143){H[e+16>>2]=d;k=(r<<9)+k|0;f=7;break Ei}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}w=b?!s:s;break Di}s=H[r+4>>2];d=b>>>0>c>>>0;H[j>>2]=H[r+(d?8:12)>>2];while(1){Fi:{if(f){break Fi}f=H[e+16>>2];c=f+1|0;r=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=c;f=8;k=(r<<8)+k|0;break Fi}if(r>>>0<=143){H[e+16>>2]=c;k=(r<<9)+k|0;f=7;break Fi}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;w=d?s:!s}b=w;H[n>>2]=(h|0)==(b|0)?l:p;H[v>>2]=H[v>>2]|2048;H[m+4>>2]=H[m+4>>2]|512;g=(b^h)<<25|g|1024}g=g|134217728}if(!(!(g&253440)|g&1073750016)){h=g>>>9|0;j=M+(I[H[e+108>>2]+(h&495)|0]<<2)|0;s=H[j>>2];b=H[s>>2];c=c-b|0;Gi:{if(k>>>16>>>0>=b>>>0){k=k-(b<<16)|0;w=H[s+4>>2];if(c&32768){break Gi}n=H[s+4>>2];b=b>>>0>c>>>0;H[j>>2]=H[s+(b?12:8)>>2];while(1){Hi:{if(f){break Hi}f=H[e+16>>2];d=f+1|0;s=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=d;f=8;k=(s<<8)+k|0;break Hi}if(s>>>0<=143){H[e+16>>2]=d;k=(s<<9)+k|0;f=7;break Hi}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}w=b?!n:n;break Gi}n=H[s+4>>2];d=b>>>0>c>>>0;H[j>>2]=H[s+(d?8:12)>>2];while(1){Ii:{if(f){break Ii}f=H[e+16>>2];c=f+1|0;s=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=c;f=8;k=(s<<8)+k|0;break Ii}if(s>>>0<=143){H[e+16>>2]=c;k=(s<<9)+k|0;f=7;break Ii}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;w=d?n:!n}if(w){v=m-4|0;d=H[m+4>>2]>>>26&4|(H[v>>2]>>>28&1|(g>>>21&16|(g>>>25&64|h&170)));j=M+(I[d+24384|0]<<2)|0;r=H[j>>2];b=H[r>>2];c=c-b|0;n=o+x|0;h=I[d+24640|0];Ji:{if(k>>>16>>>0>=b>>>0){k=k-(b<<16)|0;w=H[r+4>>2];if(c&32768){break Ji}s=H[r+4>>2];b=b>>>0>c>>>0;H[j>>2]=H[r+(b?12:8)>>2];while(1){Ki:{if(f){break Ki}f=H[e+16>>2];d=f+1|0;r=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=d;f=8;k=(r<<8)+k|0;break Ki}if(r>>>0<=143){H[e+16>>2]=d;k=(r<<9)+k|0;f=7;break Ki}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}w=b?!s:s;break Ji}s=H[r+4>>2];d=b>>>0>c>>>0;H[j>>2]=H[r+(d?8:12)>>2];while(1){Li:{if(f){break Li}f=H[e+16>>2];c=f+1|0;r=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=c;f=8;k=(r<<8)+k|0;break Li}if(r>>>0<=143){H[e+16>>2]=c;k=(r<<9)+k|0;f=7;break Li}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;w=d?s:!s}b=w;H[n>>2]=(h|0)==(b|0)?l:p;H[v>>2]=H[v>>2]|16384;H[m+4>>2]=H[m+4>>2]|4096;d=m+(H[e+124>>2]<<2)|0;H[d+4>>2]=H[d+4>>2]|4;H[d+12>>2]=H[d+12>>2]|1;b=b^h;H[d+8>>2]=H[d+8>>2]|b<<18|2;g=b<<28|g|8192}g=g|1073741824}H[m>>2]=g}g=m+4|0;o=o+4|0;t=t+1|0;if((A|0)!=(t|0)){continue}break}g=m+12|0;o=o+x|0;i=i+4|0;b=H[e+128>>2];if(i>>>0<(b&-4)>>>0){continue}break}break mi}g=(b&-4)-1|0;i=(g&-4)+4|0;g=(p+(g<<1&-8)|0)+20|0}H[e+8>>2]=f;H[e+4>>2]=c;H[e>>2]=k;H[e+104>>2]=j;if(!A|b>>>0<=i>>>0){break Nh}while(1){c=(b|0)==(i|0);f=0;b=i;if(!c){while(1){Ub(e,g,(N(f,A)<<2)+o|0,l,f,H[e+124>>2]+2|0,0);f=f+1|0;b=H[e+128>>2];if(f>>>0>>0){continue}break}}g=g+4|0;o=o+4|0;q=q+1|0;if((A|0)!=(q|0)){continue}break}}break lh}while(1){q=0;while(1){p=b;m=g;g=H[g>>2];if(g){Mi:{if(g&2097168){break Mi}b=g&495;if(!b){break Mi}j=s+(I[b+H[e+108>>2]|0]<<2)|0;h=H[j>>2];b=H[h>>2];c=c-b|0;Ni:{if(k>>>16>>>0>>0){o=H[h+4>>2];d=b>>>0>c>>>0;H[j>>2]=H[h+(d?8:12)>>2];while(1){Oi:{if(f){break Oi}f=H[e+16>>2];c=f+1|0;h=I[f+1|0];if(I[f|0]==255){if(h>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break Oi}H[e+16>>2]=c;k=(h<<9)+k|0;f=7;break Oi}H[e+16>>2]=c;f=8;k=(h<<8)+k|0}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?o:!o;break Ni}k=k-(b<<16)|0;if(!(c&32768)){o=H[h+4>>2];b=b>>>0>c>>>0;H[j>>2]=H[h+(b?12:8)>>2];while(1){Pi:{if(f){break Pi}f=H[e+16>>2];d=f+1|0;h=I[f+1|0];if(I[f|0]==255){if(h>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break Pi}H[e+16>>2]=d;k=(h<<9)+k|0;f=7;break Pi}H[e+16>>2]=d;f=8;k=(h<<8)+k|0}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!o:o;break Ni}b=H[h+4>>2]}if(b){n=m-4|0;d=H[m+4>>2]>>>17&4|(H[n>>2]>>>19&1|(g>>>14&16|(g>>>16&64|g&170)));j=s+(I[d+24384|0]<<2)|0;u=H[j>>2];b=H[u>>2];c=c-b|0;o=I[d+24640|0];Qi:{if(k>>>16>>>0>>0){h=H[u+4>>2];d=b>>>0>c>>>0;H[j>>2]=H[u+(d?8:12)>>2];while(1){Ri:{if(f){break Ri}f=H[e+16>>2];c=f+1|0;u=I[f+1|0];if(I[f|0]==255){if(u>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break Ri}H[e+16>>2]=c;k=(u<<9)+k|0;f=7;break Ri}H[e+16>>2]=c;f=8;k=(u<<8)+k|0}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?h:!h;break Qi}k=k-(b<<16)|0;if(!(c&32768)){h=H[u+4>>2];b=b>>>0>c>>>0;H[j>>2]=H[u+(b?12:8)>>2];while(1){Si:{if(f){break Si}f=H[e+16>>2];d=f+1|0;u=I[f+1|0];if(I[f|0]==255){if(u>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break Si}H[e+16>>2]=d;k=(u<<9)+k|0;f=7;break Si}H[e+16>>2]=d;f=8;k=(u<<8)+k|0}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!h:h;break Qi}b=H[u+4>>2]}H[p>>2]=(o|0)==(b|0)?i:l;H[n>>2]=H[n>>2]|32;H[m+4>>2]=H[m+4>>2]|8;g=(b^o)<<19|g|16}g=g|2097152}if(!(!(g&3960)|g&16777344)){o=g>>>3|0;j=s+(I[H[e+108>>2]+(o&495)|0]<<2)|0;n=H[j>>2];b=H[n>>2];c=c-b|0;Ti:{if(k>>>16>>>0>>0){h=H[n+4>>2];d=b>>>0>c>>>0;H[j>>2]=H[n+(d?8:12)>>2];while(1){Ui:{if(f){break Ui}f=H[e+16>>2];c=f+1|0;n=I[f+1|0];if(I[f|0]==255){if(n>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break Ui}H[e+16>>2]=c;k=(n<<9)+k|0;f=7;break Ui}H[e+16>>2]=c;f=8;k=(n<<8)+k|0}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?h:!h;break Ti}k=k-(b<<16)|0;if(!(c&32768)){h=H[n+4>>2];b=b>>>0>c>>>0;H[j>>2]=H[n+(b?12:8)>>2];while(1){Vi:{if(f){break Vi}f=H[e+16>>2];d=f+1|0;n=I[f+1|0];if(I[f|0]==255){if(n>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break Vi}H[e+16>>2]=d;k=(n<<9)+k|0;f=7;break Vi}H[e+16>>2]=d;f=8;k=(n<<8)+k|0}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!h:h;break Ti}b=H[n+4>>2]}if(b){n=m-4|0;d=H[m+4>>2]>>>20&4|(H[n>>2]>>>22&1|(g>>>15&16|(g>>>19&64|o&170)));j=s+(I[d+24384|0]<<2)|0;u=H[j>>2];b=H[u>>2];c=c-b|0;o=I[d+24640|0];Wi:{if(k>>>16>>>0>>0){h=H[u+4>>2];d=b>>>0>c>>>0;H[j>>2]=H[u+(d?8:12)>>2];while(1){Xi:{if(f){break Xi}f=H[e+16>>2];c=f+1|0;u=I[f+1|0];if(I[f|0]==255){if(u>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break Xi}H[e+16>>2]=c;k=(u<<9)+k|0;f=7;break Xi}H[e+16>>2]=c;f=8;k=(u<<8)+k|0}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?h:!h;break Wi}k=k-(b<<16)|0;if(!(c&32768)){h=H[u+4>>2];b=b>>>0>c>>>0;H[j>>2]=H[u+(b?12:8)>>2];while(1){Yi:{if(f){break Yi}f=H[e+16>>2];d=f+1|0;u=I[f+1|0];if(I[f|0]==255){if(u>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break Yi}H[e+16>>2]=d;k=(u<<9)+k|0;f=7;break Yi}H[e+16>>2]=d;f=8;k=(u<<8)+k|0}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!h:h;break Wi}b=H[u+4>>2]}H[p+256>>2]=(o|0)==(b|0)?i:l;H[n>>2]=H[n>>2]|256;H[m+4>>2]=H[m+4>>2]|64;g=(b^o)<<22|g|128}g=g|16777216}if(!(!(g&31680)|g&134218752)){o=g>>>6|0;j=s+(I[H[e+108>>2]+(o&495)|0]<<2)|0;n=H[j>>2];b=H[n>>2];c=c-b|0;Zi:{if(k>>>16>>>0>>0){h=H[n+4>>2];d=b>>>0>c>>>0;H[j>>2]=H[n+(d?8:12)>>2];while(1){_i:{if(f){break _i}f=H[e+16>>2];c=f+1|0;n=I[f+1|0];if(I[f|0]==255){if(n>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break _i}H[e+16>>2]=c;k=(n<<9)+k|0;f=7;break _i}H[e+16>>2]=c;f=8;k=(n<<8)+k|0}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?h:!h;break Zi}k=k-(b<<16)|0;if(!(c&32768)){h=H[n+4>>2];b=b>>>0>c>>>0;H[j>>2]=H[n+(b?12:8)>>2];while(1){$i:{if(f){break $i}f=H[e+16>>2];d=f+1|0;n=I[f+1|0];if(I[f|0]==255){if(n>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break $i}H[e+16>>2]=d;k=(n<<9)+k|0;f=7;break $i}H[e+16>>2]=d;f=8;k=(n<<8)+k|0}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!h:h;break Zi}b=H[n+4>>2]}if(b){n=m-4|0;d=H[m+4>>2]>>>23&4|(H[n>>2]>>>25&1|(g>>>18&16|(g>>>22&64|o&170)));j=s+(I[d+24384|0]<<2)|0;u=H[j>>2];b=H[u>>2];c=c-b|0;o=I[d+24640|0];aj:{if(k>>>16>>>0>>0){h=H[u+4>>2];d=b>>>0>c>>>0;H[j>>2]=H[u+(d?8:12)>>2];while(1){bj:{if(f){break bj}f=H[e+16>>2];c=f+1|0;u=I[f+1|0];if(I[f|0]==255){if(u>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break bj}H[e+16>>2]=c;k=(u<<9)+k|0;f=7;break bj}H[e+16>>2]=c;f=8;k=(u<<8)+k|0}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?h:!h;break aj}k=k-(b<<16)|0;if(!(c&32768)){h=H[u+4>>2];b=b>>>0>c>>>0;H[j>>2]=H[u+(b?12:8)>>2];while(1){cj:{if(f){break cj}f=H[e+16>>2];d=f+1|0;u=I[f+1|0];if(I[f|0]==255){if(u>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break cj}H[e+16>>2]=d;k=(u<<9)+k|0;f=7;break cj}H[e+16>>2]=d;f=8;k=(u<<8)+k|0}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!h:h;break aj}b=H[u+4>>2]}H[p+512>>2]=(o|0)==(b|0)?i:l;H[n>>2]=H[n>>2]|2048;H[m+4>>2]=H[m+4>>2]|512;g=(b^o)<<25|g|1024}g=g|134217728}if(!(!(g&253440)|g&1073750016)){o=g>>>9|0;j=s+(I[H[e+108>>2]+(o&495)|0]<<2)|0;n=H[j>>2];b=H[n>>2];c=c-b|0;dj:{if(k>>>16>>>0>>0){h=H[n+4>>2];d=b>>>0>c>>>0;H[j>>2]=H[n+(d?8:12)>>2];while(1){ej:{if(f){break ej}f=H[e+16>>2];c=f+1|0;n=I[f+1|0];if(I[f|0]==255){if(n>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break ej}H[e+16>>2]=c;k=(n<<9)+k|0;f=7;break ej}H[e+16>>2]=c;f=8;k=(n<<8)+k|0}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?h:!h;break dj}k=k-(b<<16)|0;if(!(c&32768)){h=H[n+4>>2];b=b>>>0>c>>>0;H[j>>2]=H[n+(b?12:8)>>2];while(1){fj:{if(f){break fj}f=H[e+16>>2];d=f+1|0;n=I[f+1|0];if(I[f|0]==255){if(n>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break fj}H[e+16>>2]=d;k=(n<<9)+k|0;f=7;break fj}H[e+16>>2]=d;f=8;k=(n<<8)+k|0}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!h:h;break dj}b=H[n+4>>2]}if(b){n=m-4|0;d=H[m+4>>2]>>>26&4|(H[n>>2]>>>28&1|(g>>>21&16|(g>>>25&64|o&170)));j=s+(I[d+24384|0]<<2)|0;u=H[j>>2];b=H[u>>2];c=c-b|0;o=I[d+24640|0];gj:{if(k>>>16>>>0>>0){h=H[u+4>>2];d=b>>>0>c>>>0;H[j>>2]=H[u+(d?8:12)>>2];while(1){hj:{if(f){break hj}f=H[e+16>>2];c=f+1|0;u=I[f+1|0];if(I[f|0]==255){if(u>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break hj}H[e+16>>2]=c;k=(u<<9)+k|0;f=7;break hj}H[e+16>>2]=c;f=8;k=(u<<8)+k|0}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?h:!h;break gj}k=k-(b<<16)|0;if(!(c&32768)){h=H[u+4>>2];b=b>>>0>c>>>0;H[j>>2]=H[u+(b?12:8)>>2];while(1){ij:{if(f){break ij}f=H[e+16>>2];d=f+1|0;u=I[f+1|0];if(I[f|0]==255){if(u>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break ij}H[e+16>>2]=d;k=(u<<9)+k|0;f=7;break ij}H[e+16>>2]=d;f=8;k=(u<<8)+k|0}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!h:h;break gj}b=H[u+4>>2]}H[p+768>>2]=(o|0)==(b|0)?i:l;H[n>>2]=H[n>>2]|16384;H[m+4>>2]=H[m+4>>2]|4096;H[m+260>>2]=H[m+260>>2]|4;H[m+268>>2]=H[m+268>>2]|1;b=b^o;H[m+264>>2]=H[m+264>>2]|b<<18|2;g=b<<28|g|8192}g=g|1073741824}H[m>>2]=g}g=m+4|0;b=p+4|0;q=q+1|0;if((q|0)!=64){continue}break}g=m+12|0;b=p+772|0;p=t>>>0<60;t=t+4|0;if(p){continue}break}}H[e+8>>2]=f;H[e+4>>2]=c;H[e>>2]=k;H[e+104>>2]=j}}if(T){break ab}Vb(e);Wa(e,18,46);Wa(e,17,3);Wa(e,0,4)}b=_+1|0;c=(b|0)==3;_=c?0:b;U=U-c|0;V=V+1|0;if(V>>>0>=K[la+8>>2]){break $a}if((U|0)>0){continue}break}}ha=ha+ja|0;c=H[e+24>>2];b=J[e+112>>1];F[c|0]=b;F[c+1|0]=b>>>8;R=R+1|0;if(R>>>0>2]){continue}break}}jj:{if(!$){break jj}kj:{c=H[e+24>>2];g=H[e+16>>2];if(c>>>0>g+2>>>0){if(!ca){break kj}g=H[e+16>>2];c=H[e+24>>2];b=H[e+20>>2];H[aa+56>>2]=c-b;H[aa+52>>2]=g-b;H[aa+48>>2]=(c-g|0)-2;Ba(W,2,15235,aa+48|0);break jj}b=H[e+12>>2];if(b>>>0<3){break jj}if(ca){H[aa+80>>2]=H[e+12>>2];Ba(W,2,7107,aa+80|0);break jj}H[aa+64>>2]=b;Ba(W,2,7107,aa- -64|0);break jj}b=H[e+20>>2];H[aa+40>>2]=c-b;H[aa+36>>2]=g-b;H[aa+32>>2]=(c-g|0)-2;Ba(W,2,15235,aa+32|0)}if(!H[D+60>>2]){break i}H[e+116>>2]=S}l=H[pa+4>>2];g=H[D+12>>2];j=H[D+8>>2]-H[pa>>2]|0;c=H[pa+16>>2];if(c&1){b=H[ma+28>>2]+N(ua,152)|0;j=(H[b-144>>2]+j|0)-H[b-152>>2]|0}i=g-l|0;if(c&2){b=H[ma+28>>2]+N(ua,152)|0;i=(H[b-140>>2]+i|0)-H[b-148>>2]|0}k=H[D+60>>2];r=k?k:H[e+116>>2];n=H[e+128>>2];q=H[e+124>>2];m=H[oa+808>>2];lj:{if(!m){break lj}h=0;b=(n|0)!=0&(q|0)!=0;if((m|0)<=30){if(!b){break lj}while(1){l=(N(h,q)<<2)+r|0;b=0;while(1){g=l+(b<<2)|0;p=H[g>>2];c=p>>31;c=(c^p)-c|0;if(c>>>m|0){c=c>>>H[oa+808>>2]|0;H[g>>2]=(p|0)<0?0-c|0:c}b=b+1|0;if((q|0)!=(b|0)){continue}break}h=h+1|0;if((n|0)!=(h|0)){continue}break}break lj}if(!b){break lj}b=N(n,q)<<2;if(!b){break lj}y(r,0,b)}if(k){b=N(n,q);if(H[oa+20>>2]==1){if(!b){break a}e=0;if((b|0)!=1){c=b&1;b=b&-2;g=0;while(1){l=(e<<2)+r|0;H[l>>2]=H[l>>2]/2;H[l+4>>2]=H[l+4>>2]/2;e=e+2|0;g=g+2|0;if((b|0)!=(g|0)){continue}break}if(!c){break a}}b=(e<<2)+r|0;H[b>>2]=H[b>>2]/2;break a}if(!b){break a}ia=O(L[pa+32>>2]*O(.5));g=b&3;if(b>>>0>=4){c=b&-4;b=0;while(1){L[r>>2]=ia*O(H[r>>2]);L[r+4>>2]=ia*O(H[r+4>>2]);L[r+8>>2]=ia*O(H[r+8>>2]);L[r+12>>2]=ia*O(H[r+12>>2]);r=r+16|0;b=b+4|0;if((c|0)!=(b|0)){continue}break}if(!g){break a}}b=0;while(1){L[r>>2]=ia*O(H[r>>2]);r=r+4|0;b=b+1|0;if((g|0)!=(b|0)){continue}break}break a}o=wa-va|0;if(H[oa+20>>2]==1){if(!n){break a}f=(H[ma+36>>2]+(N(i,o)<<2)|0)+(j<<2)|0;d=q&-4;i=0;while(1){b=0;if(d){k=f+(N(i,o)<<2)|0;m=(N(i,q)<<2)+r|0;while(1){p=b<<2;t=p+m|0;l=H[t+4>>2];g=H[t+8>>2];c=H[t+12>>2];p=k+p|0;H[p>>2]=H[t>>2]/2;H[p+12>>2]=(c|0)/2;H[p+8>>2]=(g|0)/2;H[p+4>>2]=(l|0)/2;b=b+4|0;if(d>>>0>b>>>0){continue}break}}mj:{if(b>>>0>=q>>>0){break mj}c=b+1|0;l=f+(N(i,o)<<2)|0;g=(N(i,q)<<2)+r|0;if(q-b&1){b=b<<2;H[b+l>>2]=H[b+g>>2]/2;b=c}if((c|0)==(q|0)){break mj}while(1){c=b<<2;H[c+l>>2]=H[c+g>>2]/2;c=c+4|0;H[c+l>>2]=H[c+g>>2]/2;b=b+2|0;if((q|0)!=(b|0)){continue}break}}i=i+1|0;if((n|0)!=(i|0)){continue}break}break a}if(!n|!q){break a}ia=O(L[pa+32>>2]*O(.5));i=(H[ma+36>>2]+(N(i,o)<<2)|0)+(j<<2)|0;g=q&-4;l=q&3;f=0;c=q>>>0<4;while(1){b=i;e=0;nj:{if(!c){while(1){L[b>>2]=ia*O(H[r>>2]);L[b+4>>2]=ia*O(H[r+4>>2]);L[b+8>>2]=ia*O(H[r+8>>2]);L[b+12>>2]=ia*O(H[r+12>>2]);b=b+16|0;r=r+16|0;e=e+4|0;if((g|0)!=(e|0)){continue}break}if(!l){break nj}}e=0;while(1){L[b>>2]=ia*O(H[r>>2]);b=b+4|0;r=r+4|0;e=e+1|0;if((l|0)!=(e|0)){continue}break}}i=(o<<2)+i|0;f=f+1|0;if((n|0)!=(f|0)){continue}break}break a}H[aa>>2]=U;Ba(W,2,8716,aa)}H[H[d>>2]>>2]=0}Ca(a);na=aa+96|0} +function hb(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,C=0,D=0,E=0,J=0,M=0,P=0,Q=0,R=0,S=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=O(0),ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,oa=0,pa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Qa=0,Ta=0,Va=0,Wa=0,Xa=O(0),Za=O(0),_a=0,$a=0,ab=0,bb=0,eb=0,fb=0,gb=0,hb=0,jb=0,kb=0,lb=0,ob=O(0),pb=0,qb=0,rb=0,sb=0,tb=0;za=na-16|0;na=za;a:{if(!(I[a+8|0]&128)|H[a+228>>2]!=(b|0)){break a}ya=H[a+180>>2]+N(b,5644)|0;V=H[ya+5596>>2];if(!V){ib(ya);break a}g=H[a+100>>2];if(!g){g=H[a+96>>2]}m=H[g>>2];o=H[g+4>>2];n=H[g+8>>2];l=H[g+12>>2];g=H[a+60>>2];h=H[a+64>>2];j=H[ya+5600>>2];pa=na-16|0;na=pa;D=H[a+232>>2];H[D+36>>2]=b;i=H[H[D+28>>2]+76>>2];H[D+64>>2]=1;H[D+60>>2]=l;H[D+56>>2]=n;H[D+52>>2]=o;H[D+48>>2]=m;H[D+32>>2]=i+N(b,5644);Ca(H[D+68>>2]);o=0;H[D+68>>2]=0;b:{if(g){o=Ea(4,H[H[D+24>>2]+16>>2]);if(!o){break b}m=g&3;c:{if(g>>>0>=4){n=g&-4;b=0;while(1){g=h+(X<<2)|0;H[(H[g>>2]<<2)+o>>2]=1;H[(H[g+4>>2]<<2)+o>>2]=1;H[(H[g+8>>2]<<2)+o>>2]=1;H[(H[g+12>>2]<<2)+o>>2]=1;X=X+4|0;b=b+4|0;if((n|0)!=(b|0)){continue}break}if(!m){break c}}while(1){H[(H[h+(X<<2)>>2]<<2)+o>>2]=1;X=X+1|0;v=v+1|0;if((m|0)!=(v|0)){continue}break}}H[D+68>>2]=o}d:{E=H[D+24>>2];s=H[E+16>>2];e:{if(!s){break e}X=0;f:{while(1){g:{if(H[(X<<2)+o>>2]?0:o){break g}h=H[E+24>>2]+N(X,52)|0;b=H[h+4>>2];n=b-1|0;m=H[D+60>>2];l=n+m|0;g=0-!b|0;w=fe(l,m>>>0>l>>>0?g+1|0:g,b,0);h=H[h>>2];v=h-1|0;l=H[D+56>>2];i=v+l|0;m=0-!h|0;r=fe(i,i>>>0>>0?m+1|0:m,h,0);l=n;n=H[D+52>>2];l=l+n|0;n=fe(l,l>>>0>>0?g+1|0:g,b,0);b=H[H[H[D+20>>2]>>2]+20>>2]+N(X,76)|0;g=H[b+20>>2]-H[b+24>>2]|0;if(g>>>0>31){break g}l=H[b+12>>2];i=H[b+8>>2];u=H[b+4>>2];Y=v;v=H[D+48>>2];t=Y+v|0;h=fe(t,t>>>0>>0?m+1|0:m,h,0);b=h-H[b>>2]|0;h:{if((b>>>0<=h>>>0?b:0)>>>g|0){break h}b=n-u|0;if((b>>>0<=n>>>0?b:0)>>>g|0){break h}b=i-r|0;if((b>>>0<=i>>>0?b:0)>>>g|0){break h}b=l-w|0;if(!((b>>>0<=l>>>0?b:0)>>>g|0)){break g}}H[D+64>>2]=0;break f}X=X+1|0;if((s|0)!=(X|0)){continue}break}if(!H[D+64>>2]){break f}v=0;while(1){b=H[H[H[D+20>>2]>>2]+20>>2]+N(v,76)|0;g=H[b+28>>2]+N(H[b+24>>2],152)|0;h=H[g-148>>2];m=H[g-140>>2];o=H[g-152>>2];g=H[g-144>>2];n=H[D+68>>2];i:{if(H[n+(v<<2)>>2]?0:n){break i}n=m-h|0;g=g-o|0;be(n,0,g);if(!(!qa|(h|0)==(m|0))){X=0;Ba(f,1,2982,0);break b}g=N(g,n);if(g>>>0>=1073741824){X=0;Ba(f,1,2982,0);break b}g=g<<2;H[b+44>>2]=g;j:{k:{l:{h=H[b+36>>2];if(h){if(g>>>0<=K[b+48>>2]){break i}if(H[b+40>>2]){break l}}g=Ia(g);H[b+36>>2]=g;l=g;g=H[b+44>>2];if(!(g?l:1)){break k}H[b+40>>2]=1;H[b+48>>2]=g;break i}Ca(h);g=Ia(H[b+44>>2]);H[b+36>>2]=g;if(g){break j}H[b+48>>2]=0;H[b+40>>2]=0;H[b+44>>2]=0}X=0;Ba(f,1,2982,0);break b}H[b+40>>2]=1;H[b+48>>2]=H[b+44>>2]}v=v+1|0;E=H[D+24>>2];if(v>>>0>2]){continue}break}break e}P=H[E+24>>2];A=H[H[H[D+20>>2]>>2]+20>>2];b=0;while(1){m:{if(H[(b<<2)+o>>2]?0:o){break m}g=A+N(b,76)|0;m=H[g>>2];n=P+N(b,52)|0;h=H[n>>2];v=h-1|0;l=H[D+48>>2];w=v+l|0;i=0-!h|0;l=fe(w,l>>>0>w>>>0?i+1|0:i,h,0);m=m>>>0>l>>>0?m:l;H[g+56>>2]=m;l=H[g+4>>2];n=H[n+4>>2];r=n-1|0;u=H[D+52>>2];t=r+u|0;w=0-!n|0;u=fe(t,t>>>0>>0?w+1|0:w,n,0);l=l>>>0>u>>>0?l:u;H[g+60>>2]=l;u=H[g+8>>2];Y=v;v=H[D+56>>2];t=Y+v|0;h=fe(t,t>>>0>>0?i+1|0:i,h,0);h=h>>>0>u>>>0?u:h;H[g+64>>2]=h;i=H[g+12>>2];v=H[D+60>>2];r=r+v|0;n=fe(r,r>>>0>>0?w+1|0:w,n,0);n=i>>>0>>0?i:n;H[g+68>>2]=n;if(h>>>0>>0|l>>>0>n>>>0){break d}r=H[g+20>>2];if(!r){break m}u=n-1|0;C=0-!n|0;S=h-1|0;J=0-!h|0;t=l-1|0;M=0-!l|0;Z=m-1|0;Q=0-!m|0;R=H[g+28>>2];n=0;h=0;while(1){l=R+N(n,152)|0;m=r+(n^-1)|0;g=m&31;if((m&63)>>>0>=32){i=1<>>32-g}g=u+w|0;v=i+C|0;W=g>>>0>>0?v+1|0:v;v=m&31;if((m&63)>>>0>=32){g=W>>>v|0}else{g=((1<>>v}H[l+148>>2]=g;g=i+J|0;v=g+1|0;Y=g;g=w+S|0;W=g>>>0>>0?v:Y;v=m&31;if((m&63)>>>0>=32){g=W>>>v|0}else{g=((1<>>v}H[l+144>>2]=g;g=i+M|0;v=g+1|0;Y=g;g=t+w|0;W=g>>>0>>0?v:Y;v=m&31;if((m&63)>>>0>=32){g=W>>>v|0}else{g=((1<>>v}H[l+140>>2]=g;g=i+Q|0;w=w+Z|0;i=w>>>0>>0?g+1|0:g;g=m&31;if((m&63)>>>0>=32){g=i>>>g|0}else{g=((1<>>g}H[l+136>>2]=g;n=n+1|0;h=n?h:h+1|0;if(h|(n|0)!=(r|0)){continue}break}}b=b+1|0;if((s|0)!=(b|0)){continue}break}}X=0;H[pa+8>>2]=0;b=H[D+28>>2];W=Ea(1,8);if(W){H[W+4>>2]=b;H[W>>2]=E}if(!W){break b}S=H[H[D+20>>2]>>2];t=na-144|0;na=t;P=H[D+36>>2];b=N(P,5644);h=H[W+4>>2];J=b+H[h+76>>2]|0;E=H[J+420>>2];n=0;m=0;r=na-32|0;na=r;C=b+H[h+76>>2]|0;Q=H[C+420>>2];Z=H[W>>2];u=H[Z+16>>2];l=Fa(N(u,528));n:{if(!l){break n}b=Fa(u<<2);o:{if(!b){b=l;break o}o=H[h+76>>2]+N(P,5644)|0;w=H[o+420>>2];i=w+1|0;g=Ea(i,240);p:{if(g){q:{if(i){s=H[Z+16>>2];v=g;while(1){H[v+236>>2]=f;i=Ea(s,16);H[v+200>>2]=i;if(!i){break q}A=H[Z+16>>2];H[v+196>>2]=A;s=0;i=0;if(A){while(1){s=H[v+200>>2]+(i<<4)|0;A=H[o+5584>>2]+N(i,1080)|0;M=Ea(H[A+4>>2],16);H[s+12>>2]=M;if(!M){break q}H[s+8>>2]=H[A+4>>2];i=i+1|0;s=H[Z+16>>2];if(i>>>0>>0){continue}break}}v=v+240|0;i=(k|0)==(w|0);k=k+1|0;if(!i){continue}break}}break p}o=H[g+4>>2];if(o){Ca(o);H[g+4>>2]=0}v=g;o=0;while(1){i=H[v+200>>2];if(i){s=0;k=H[v+196>>2];if(k){while(1){A=H[i+12>>2];if(A){Ca(A);H[i+12>>2]=0;k=H[v+196>>2]}i=i+16|0;s=s+1|0;if(s>>>0>>0){continue}break}i=H[v+200>>2]}Ca(i);H[v+200>>2]=0}v=v+240|0;i=(o|0)==(w|0);o=o+1|0;if(!i){continue}break}Ca(g)}g=0}if(g){r:{if(!u){break r}w=u&7;o=l;if(u>>>0>=8){v=u&-8;while(1){i=(q<<2)+b|0;H[i+28>>2]=o+3696;H[i+24>>2]=o+3168;H[i+20>>2]=o+2640;H[i+16>>2]=o+2112;H[i+12>>2]=o+1584;H[i+8>>2]=o+1056;H[i+4>>2]=o+528;H[i>>2]=o;q=q+8|0;o=o+4224|0;n=n+8|0;if((v|0)!=(n|0)){continue}break}if(!w){break r}}while(1){H[(q<<2)+b>>2]=o;q=q+1|0;o=o+528|0;p=p+1|0;if((w|0)!=(p|0)){continue}break}}w=b;s=0;v=H[(H[h+76>>2]+N(P,5644)|0)+5584>>2];o=H[Z+24>>2];b=H[h+24>>2];n=(P>>>0)/(b>>>0)|0;b=H[h+4>>2]+N(H[h+12>>2],P-N(b,n)|0)|0;i=H[Z>>2];H[r+20>>2]=b>>>0>i>>>0?b:i;i=b+H[h+12>>2]|0;b=b>>>0>i>>>0?-1:i;i=H[Z+8>>2];H[r+16>>2]=b>>>0>>0?b:i;b=H[h+8>>2]+N(n,H[h+16>>2])|0;n=H[Z+4>>2];H[r+12>>2]=b>>>0>n>>>0?b:n;h=b+H[h+16>>2]|0;b=b>>>0>h>>>0?-1:h;h=H[Z+12>>2];H[r+8>>2]=b>>>0>>0?b:h;H[r+24>>2]=0;H[r+28>>2]=0;H[r+4>>2]=2147483647;H[r>>2]=2147483647;if(H[Z+16>>2]){while(1){h=w?H[w+(s<<2)>>2]:0;b=H[o+4>>2];P=b-1|0;n=H[r+8>>2];p=P+n|0;i=0-!b|0;p=fe(p,n>>>0>p>>>0?i+1|0:i,b,0);n=H[o>>2];A=n-1|0;k=H[r+16>>2];M=A+k|0;q=0-!n|0;k=fe(M,k>>>0>M>>>0?q+1|0:q,n,0);Y=P;P=H[r+12>>2];M=Y+P|0;i=fe(M,P>>>0>M>>>0?i+1|0:i,b,0);b=H[r+20>>2];P=b+A|0;n=fe(P,b>>>0>P>>>0?q+1|0:q,n,0);b=H[v+4>>2];if(b>>>0>K[r+28>>2]){H[r+28>>2]=b;b=H[v+4>>2]}if(b){$=v+944|0;ba=v+812|0;_=p-1|0;ca=0-!p|0;aa=k-1|0;ia=0-!k|0;ka=i-1|0;fa=0-!i|0;ja=n-1|0;ga=0-!n|0;k=0;while(1){n=k<<2;P=H[n+$>>2];A=H[n+ba>>2];q=0;if(h){H[h+4>>2]=P;H[h>>2]=A;q=h+8|0}b=b-1|0;h=A+b|0;s:{if(h>>>0>31){break s}n=H[o>>2];if(n>>>0>-1>>>h>>>0){break s}i=H[r+4>>2];h=n<>2]=h>>>0>i>>>0?i:h}h=b+P|0;t:{if(h>>>0>31){break t}n=H[o+4>>2];if(n>>>0>-1>>>h>>>0){break t}i=H[r>>2];h=n<>2]=h>>>0>i>>>0?i:h}h=0;n=b&31;if((b&63)>>>0>=32){i=1<>>32-n}R=p;p=_+R|0;n=i;i=ca+i|0;z=p>>>0<_>>>0?i+1|0:i;M=b&31;i=P&31;if((P&63)>>>0>=32){i=1<>>32-i}if((b&63)>>>0>=32){z=z>>>M|0}else{z=((1<>>M}p=Y+z|0;la=p-1|0;p=(p>>>0>>0?i+1|0:i)-!p|0;i=P&31;M=n+fa|0;Y=R+ka|0;M=Y>>>0>>0?M+1|0:M;if((P&63)>>>0>=32){i=p>>>i|0}else{i=((1<>>i}p=i;i=b&31;if((b&63)>>>0>=32){i=M>>>i|0}else{i=((1<>>i}M=(i|0)!=(z|0)?p-(i>>>P|0)&-1>>>P:0;i=n+ia|0;Y=i+1|0;p=i;i=R+aa|0;z=i>>>0>>0?Y:p;p=i;P=b&31;i=A&31;if((A&63)>>>0>=32){i=1<>>32-i}if((b&63)>>>0>=32){z=z>>>P|0}else{z=((1<>>P}p=Y+z|0;la=p-1|0;p=(p>>>0>>0?i+1|0:i)-!p|0;i=A&31;n=n+ga|0;R=R+ja|0;P=R>>>0>>0?n+1|0:n;n=b&31;if((A&63)>>>0>=32){i=p>>>i|0}else{i=((1<>>i}if((b&63)>>>0>=32){n=P>>>n|0}else{n=((1<>>n}n=(n|0)!=(z|0)?i-(n>>>A|0)&-1>>>A:0;if(q){H[q+4>>2]=M;H[q>>2]=n;h=q+8|0}n=N(n,M);if(n>>>0>K[r+24>>2]){H[r+24>>2]=n}k=k+1|0;if(k>>>0>2]){continue}break}}o=o+52|0;v=v+1080|0;s=s+1|0;if(s>>>0>2]){continue}break}}A=Q+1|0;k=H[r+28>>2];s=H[r+24>>2];H[g+4>>2]=0;b=H[C+8>>2]+1|0;M=N(s,u);P=N(M,k);be(b,0,P);u:{if(!qa){b=N(b,P);H[g+8>>2]=b;b=Ea(b,2);H[g+4>>2]=b;if(b){break u}}Ca(l);Ca(w);b=H[g+4>>2];if(b){Ca(b);H[g+4>>2]=0}if(!A){b=g;break o}b=0;n=g;while(1){o=H[n+200>>2];if(o){p=0;q=H[n+196>>2];if(q){while(1){h=H[o+12>>2];if(h){Ca(h);H[o+12>>2]=0;q=H[n+196>>2]}o=o+16|0;p=p+1|0;if(q>>>0>p>>>0){continue}break}o=H[n+200>>2]}Ca(o);H[n+200>>2]=0}n=n+240|0;h=(b|0)==(Q|0);b=b+1|0;if(!h){continue}break}b=g;break o}i=H[Z+24>>2];R=H[r+20>>2];H[g+204>>2]=R;_=H[r+12>>2];H[g+208>>2]=_;aa=H[r+16>>2];H[g+212>>2]=aa;ka=H[r+8>>2];H[g+216>>2]=ka;H[g+12>>2]=P;H[g+16>>2]=M;H[g+20>>2]=s;m=1;H[g+24>>2]=1;if(u){n=H[g+200>>2];v=0;b=i;while(1){o=H[w+(v<<2)>>2];H[n>>2]=H[b>>2];H[n+4>>2]=H[b+4>>2];h=H[n+8>>2];v:{if(!h){break v}p=H[n+12>>2];if((h|0)!=1){ja=h&1;h=h&-2;q=0;while(1){H[p>>2]=H[o>>2];H[p+4>>2]=H[o+4>>2];H[p+8>>2]=H[o+8>>2];H[p+12>>2]=H[o+12>>2];H[p+16>>2]=H[o+16>>2];H[p+20>>2]=H[o+20>>2];H[p+24>>2]=H[o+24>>2];H[p+28>>2]=H[o+28>>2];p=p+32|0;o=o+32|0;q=q+2|0;if((h|0)!=(q|0)){continue}break}if(!ja){break v}}H[p>>2]=H[o>>2];H[p+4>>2]=H[o+4>>2];H[p+8>>2]=H[o+8>>2];H[p+12>>2]=H[o+12>>2]}b=b+52|0;n=n+16|0;v=v+1|0;if((u|0)!=(v|0)){continue}break}}if(A>>>0>1){h=g;while(1){H[h+456>>2]=ka;H[h+452>>2]=aa;H[h+448>>2]=_;H[h+444>>2]=R;H[h+264>>2]=1;H[h+260>>2]=s;H[h+256>>2]=M;H[h+252>>2]=P;if(u){n=H[h+440>>2];v=0;b=i;while(1){o=H[w+(v<<2)>>2];H[n>>2]=H[b>>2];H[n+4>>2]=H[b+4>>2];q=H[n+8>>2];w:{if(!q){break w}p=H[n+12>>2];if((q|0)!=1){A=q&1;ja=q&-2;q=0;while(1){H[p>>2]=H[o>>2];H[p+4>>2]=H[o+4>>2];H[p+8>>2]=H[o+8>>2];H[p+12>>2]=H[o+12>>2];H[p+16>>2]=H[o+16>>2];H[p+20>>2]=H[o+20>>2];H[p+24>>2]=H[o+24>>2];H[p+28>>2]=H[o+28>>2];p=p+32|0;o=o+32|0;q=q+2|0;if((ja|0)!=(q|0)){continue}break}if(!A){break w}}H[p>>2]=H[o>>2];H[p+4>>2]=H[o+4>>2];H[p+8>>2]=H[o+8>>2];H[p+12>>2]=H[o+12>>2]}b=b+52|0;n=n+16|0;v=v+1|0;if((u|0)!=(v|0)){continue}break}}b=H[h+8>>2];H[h+244>>2]=H[h+4>>2];H[h+248>>2]=b;b=(m|0)!=(Q|0);h=h+240|0;m=m+1|0;if(b){continue}break}}Ca(l);Ca(w);b=H[C+420>>2];x:{if(I[C+5640|0]&4){if((b|0)==-1){break x}p=C+424|0;h=H[C+8>>2];q=0;o=g;while(1){m=H[p+36>>2];H[o+44>>2]=1;H[o+84>>2]=m;H[o+48>>2]=H[p>>2];m=H[p+4>>2];H[o+68>>2]=0;H[o+72>>2]=0;H[o+52>>2]=m;H[o+60>>2]=H[p+12>>2];H[o+64>>2]=H[p+16>>2];m=H[p+8>>2];H[o+76>>2]=s;H[o+56>>2]=h>>>0>m>>>0?m:h;p=p+148|0;o=o+240|0;m=(b|0)==(q|0);q=q+1|0;if(!m){continue}break}break x}if((b|0)==-1){break x}h=H[C+8>>2];m=H[C+4>>2];o=g;if(b){n=b+1&-2;p=0;while(1){H[o+68>>2]=0;H[o+72>>2]=0;H[o+52>>2]=0;H[o+44>>2]=1;H[o+48>>2]=0;H[o+84>>2]=m;H[o+60>>2]=k;H[o+324>>2]=m;H[o+76>>2]=s;H[o+56>>2]=h;H[o+308>>2]=0;H[o+312>>2]=0;H[o+292>>2]=0;H[o+284>>2]=1;H[o+288>>2]=0;H[o+300>>2]=k;H[o+296>>2]=h;H[o+316>>2]=s;H[o+64>>2]=H[o+196>>2];H[o+304>>2]=H[o+436>>2];o=o+480|0;p=p+2|0;if((n|0)!=(p|0)){continue}break}if(b&1){break x}}H[o+68>>2]=0;H[o+72>>2]=0;H[o+52>>2]=0;H[o+44>>2]=1;H[o+48>>2]=0;H[o+84>>2]=m;H[o+60>>2]=k;H[o+76>>2]=s;H[o+56>>2]=h;H[o+64>>2]=H[o+196>>2]}m=g;break n}Ca(l)}Ca(b)}na=r+32|0;g=m;y:{z:{if(!g){break z}A=E+1|0;w=g;v=V;A:{B:{while(1){if(H[w+84>>2]==-1){break A}l=Fa(H[Z+16>>2]<<2);if(!l){break A}b=H[Z+16>>2]<<2;if(b){y(l,1,b)}if(Sb(w)){while(1){n=H[S+20>>2];C:{D:{if(K[w+40>>2]>=K[J+12>>2]){break D}b=H[w+32>>2];h=N(H[w+28>>2],76)+n|0;if(b>>>0>=K[h+24>>2]){break D}h=H[h+28>>2]+N(b,152)|0;if(!H[h+24>>2]){break D}m=h+28|0;i=0;E:{while(1){o=m+N(i,36)|0;b=H[o+20>>2]+N(H[w+36>>2],40)|0;if(!wb(D,H[w+28>>2],H[w+32>>2],H[o+16>>2],H[b>>2],H[b+4>>2],H[b+8>>2],H[b+12>>2])){i=i+1|0;if(i>>>0>2]){continue}break E}break}H[l+(H[w+28>>2]<<2)>>2]=0;H[t+136>>2]=0;if(!Rb(H[W+4>>2],H[S+20>>2],J,w,t+140|0,v,t+136|0,j,f)){break B}i=H[w+32>>2];q=H[w+28>>2];u=H[t+136>>2];if(H[t+140>>2]){H[t+136>>2]=0;C=H[(H[S+20>>2]+N(q,76)|0)+28>>2]+N(i,152)|0;n=H[C+24>>2];if(n){P=j-u|0;M=j+v|0;q=C+28|0;k=0;Q=u+v|0;p=Q;r=0;while(1){F:{if(H[q+8>>2]==H[q>>2]|H[q+12>>2]==H[q+4>>2]){break F}b=H[q+20>>2]+N(H[w+36>>2],40)|0;R=N(H[b+20>>2],H[b+16>>2]);if(!R){break F}n=H[b+24>>2];h=0;while(1){o=H[n+36>>2];if(o){G:{if(k|H[n+64>>2]){H[n+52>>2]=0;i=1;b=64;break G}i=H[n>>2];b=H[n+40>>2];H:{if(b){i=N(b,24)+i|0;if(H[i-20>>2]!=H[i-12>>2]){i=i-24|0;break H}b=b+1|0}else{b=1}H[n+40>>2]=b}b=H[i+20>>2];I:{J:{if(b>>>0>(p^-1)>>>0){break J}m=i+20|0;while(1){if(M>>>0>>0){break J}s=H[n+4>>2];k=H[n+52>>2];if((k|0)!=H[n+56>>2]){m=o}else{b=k<<1|1;s=Ga(s,b<<3);if(!s){Ba(f,1,1024,0);break B}H[n+56>>2]=b;H[n+4>>2]=s;k=H[n+52>>2];b=H[m>>2];m=H[n+36>>2]}o=(k<<3)+s|0;H[o+4>>2]=b;H[o>>2]=p;H[n+52>>2]=k+1;H[i>>2]=H[i>>2]+b;s=H[i+16>>2];k=s+H[i+4>>2]|0;H[i+4>>2]=k;o=m-s|0;H[n+36>>2]=o;H[i+8>>2]=k;p=b+p|0;k=0;if((m|0)==(s|0)){break I}H[n+40>>2]=H[n+40>>2]+1;m=i+44|0;b=H[i+44>>2];i=i+24|0;if((p^-1)>>>0>=b>>>0){continue}break}}m=H[w+28>>2];o=H[w+32>>2];i=H[w+36>>2];if(H[H[W+4>>2]+104>>2]){H[t+120>>2]=m;H[t+116>>2]=o;H[t+112>>2]=r;H[t+108>>2]=i;H[t+104>>2]=h;H[t+100>>2]=P;H[t+96>>2]=b;Ba(f,1,14693,t+96|0);break B}H[t+88>>2]=m;H[t+84>>2]=o;H[t+80>>2]=r;H[t+76>>2]=i;H[t+72>>2]=h;H[t+68>>2]=P;H[t+64>>2]=b;Ba(f,2,14693,t- -64|0);H[n+52>>2]=0;H[n+64>>2]=1;k=1}i=H[n+40>>2];b=44}H[b+n>>2]=i}n=n+68|0;h=h+1|0;if((R|0)!=(h|0)){continue}break}n=H[C+24>>2]}q=q+36|0;r=r+1|0;if(r>>>0>>0){continue}break}i=H[w+32>>2];q=H[w+28>>2];b=k?P:p-Q|0}else{b=0}u=b+u|0}h=H[Z+24>>2]+N(q,52)|0;b=H[h+36>>2];H[h+36>>2]=b>>>0>>0?i:b;break C}n=H[S+20>>2]}H[t+136>>2]=0;if(!Rb(H[W+4>>2],n,J,w,t+140|0,v,t+136|0,j,f)){break B}q=H[w+28>>2];u=H[t+136>>2];if(!H[t+140>>2]){break C}M=H[w+32>>2];b=H[(H[S+20>>2]+N(q,76)|0)+28>>2]+N(M,152)|0;Q=H[b+24>>2];if(!Q){break C}P=j-u|0;s=b+28|0;C=H[w+36>>2];i=0;k=0;K:{L:{while(1){M:{if(H[s+8>>2]==H[s>>2]|H[s+12>>2]==H[s+4>>2]){break M}b=H[s+20>>2]+N(C,40)|0;R=N(H[b+20>>2],H[b+16>>2]);if(!R){break M}o=H[b+24>>2];r=0;while(1){b=H[o+36>>2];if(b){n=H[o>>2];h=H[o+40>>2];N:{if(h){n=N(h,24)+n|0;if(H[n-20>>2]!=H[n-12>>2]){n=n-24|0;break N}h=h+1|0}else{h=1}H[o+40>>2]=h}p=H[n+20>>2];i=p+i|0;if(i>>>0

>>0|i>>>0>P>>>0){break K}while(1){O:{p=H[n+16>>2];H[n+4>>2]=p+H[n+4>>2];m=b-p|0;if((b|0)==(p|0)){break O}h=h+1|0;H[o+40>>2]=h;p=H[n+44>>2];i=p+i|0;if(i>>>0

>>0){break L}n=n+24|0;b=m;if(i>>>0<=P>>>0){continue}break L}break}H[o+36>>2]=m}o=o+68|0;r=r+1|0;if((R|0)!=(r|0)){continue}break}}s=s+36|0;k=k+1|0;if((Q|0)!=(k|0)){continue}break}u=i+u|0;break C}H[o+36>>2]=m}if(!H[H[W+4>>2]+104>>2]){H[t+24>>2]=q;H[t+20>>2]=M;H[t+16>>2]=k;H[t+12>>2]=C;H[t+8>>2]=r;H[t+4>>2]=P;H[t>>2]=p;Ba(f,2,14608,t);q=H[w+28>>2];u=u+P|0;break C}H[t+56>>2]=q;H[t+52>>2]=M;H[t+48>>2]=k;H[t+44>>2]=C;H[t+40>>2]=r;H[t+36>>2]=P;H[t+32>>2]=p;Ba(f,1,14608,t+32|0);break B}P:{if(!H[l+(q<<2)>>2]){break P}b=H[Z+24>>2]+N(q,52)|0;if(H[b+36>>2]){break P}H[b+36>>2]=H[(H[S+20>>2]+N(q,76)|0)+24>>2]-1}j=j-u|0;v=u+v|0;if(Sb(w)){continue}break}}Ca(l);w=w+240|0;x=x+1|0;if(x>>>0<=K[J+420>>2]){continue}break}xb(g,A);H[pa+8>>2]=v-V;b=1;break y}xb(g,A);Ca(l);break z}xb(g,A)}b=0}na=t+144|0;cb(W);if(!b){break b}X=H[H[D+32>>2]+5584>>2];p=H[H[D+20>>2]>>2];z=H[p+20>>2];H[pa+12>>2]=1;v=0;b=H[D+32>>2];s=H[X+16>>2]>>>4&1&H[b+12>>2]==H[b+8>>2];E=H[p+16>>2];Q:{if(!E){break Q}while(1){b=H[D+68>>2];if(!(H[b+(v<<2)>>2]?0:b)){r=pa+12|0;E=0;b=H[z+24>>2];R:{if(!b){break R}q=H[D+44>>2];while(1){m=H[z+28>>2]+N(E,152)|0;o=H[m+24>>2];if(o){k=m+28|0;b=H[m+20>>2];w=H[m+16>>2];l=0;while(1){if(N(b,w)){i=k+N(l,36)|0;n=0;while(1){g=H[i+20>>2]+N(n,40)|0;j=wb(D,H[z+16>>2],E,H[i+16>>2],H[g>>2],H[g+4>>2],H[g+8>>2],H[g+12>>2]);h=H[g+16>>2];o=H[g+20>>2];b=N(h,o);S:{if(j){if(!b){break S}h=0;while(1){j=H[g+24>>2]+N(h,68)|0;T:{if(!wb(D,H[z+16>>2],E,H[i+16>>2],H[j+8>>2],H[j+12>>2],H[j+16>>2],H[j+20>>2])){b=H[j+60>>2];if(!b){break T}Ca(b);H[j+60>>2]=0;break T}if(!H[D+64>>2]){if(H[j+60>>2]|H[j+16>>2]==H[j+8>>2]|H[j+20>>2]==H[j+12>>2]){break T}}b=Ea(1,44);if(!b){H[pa+12>>2]=0;break R}o=H[D+64>>2];H[b+36>>2]=0;H[b+28>>2]=r;H[b+20>>2]=X;H[b+16>>2]=z;H[b+12>>2]=i;H[b+8>>2]=j;H[b+4>>2]=E;H[b>>2]=o;H[b+40>>2]=s;H[b+32>>2]=f;H[b+24>>2]=H[q+4>>2]>1;db(q,14,b);if(!H[pa+12>>2]){break R}}h=h+1|0;if(h>>>0>2],H[g+16>>2])>>>0){continue}break}break S}if(!b){break S}w=0;while(1){b=H[g+24>>2]+N(w,68)|0;j=H[b+60>>2];if(j){Ca(j);H[b+60>>2]=0;o=H[g+20>>2];h=H[g+16>>2]}w=w+1|0;if(w>>>0>>0){continue}break}}n=n+1|0;b=H[m+20>>2];w=H[m+16>>2];if(n>>>0>>0){continue}break}o=H[m+24>>2]}l=l+1|0;if(l>>>0>>0){continue}break}b=H[z+24>>2]}E=E+1|0;if(E>>>0>>0){continue}break}}if(!H[pa+12>>2]){break Q}E=H[p+16>>2]}X=X+1080|0;z=z+76|0;v=v+1|0;if(E>>>0>v>>>0){continue}break}}X=0;Ra(H[D+44>>2]);if(!H[pa+12>>2]){break b}U:{if(H[D+64>>2]){break U}v=H[D+24>>2];if(!H[v+16>>2]){break U}z=0;while(1){b=H[H[H[D+20>>2]>>2]+20>>2]+N(z,76)|0;g=H[b+28>>2]+N(H[(H[v+24>>2]+N(z,52)|0)+36>>2],152)|0;j=H[g+136>>2];h=H[g+144>>2];m=H[g+140>>2];g=H[g+148>>2];Ca(H[b+52>>2]);H[b+52>>2]=0;V:{o=H[D+68>>2];if((h|0)==(j|0)|(g|0)==(m|0)|(H[o+(z<<2)>>2]?0:o)){break V}g=g-m|0;j=h-j|0;be(g,0,j);if(qa){Ba(f,1,2982,0);break b}g=N(g,j);if(g>>>0>=1073741824){Ba(f,1,2982,0);break b}j=b;b=Ia(g<<2);H[j+52>>2]=b;if(b){break V}Ba(f,1,2982,0);break b}z=z+1|0;v=H[D+24>>2];if(z>>>0>2]){continue}break}}v=H[D+32>>2];w=H[H[D+20>>2]>>2];if(H[w+16>>2]){z=H[w+20>>2];v=H[v+5584>>2];E=H[H[D+24>>2]+24>>2];o=0;while(1){W:{b=H[D+68>>2];if(H[b+(o<<2)>>2]?0:b){break W}m=H[E+36>>2]+1|0;if(H[v+20>>2]==1){Z=m;b=0;$=na-32|0;na=$;X:{Y:{if(H[D+64>>2]){g=1;if((m|0)==1){break X}n=H[z+28>>2];b=n+N(H[z+24>>2],152)|0;h=H[b-144>>2];q=H[b-152>>2];if((h|0)==(q|0)){break X}s=m-1|0;b=0;l=H[D+44>>2];p=H[l+4>>2];j=n;Z:{if((m|0)!=2){m=s&1;i=s&-2;g=0;while(1){r=H[j+160>>2]-H[j+152>>2]|0;b=b>>>0>r>>>0?b:r;r=H[j+164>>2]-H[j+156>>2]|0;b=b>>>0>r>>>0?b:r;r=H[j+312>>2]-H[j+304>>2]|0;b=b>>>0>r>>>0?b:r;r=H[j+316>>2]-H[j+308>>2]|0;b=b>>>0>r>>>0?b:r;j=j+304|0;g=g+2|0;if((i|0)!=(g|0)){continue}break}if(!m){break Z}}g=H[j+160>>2]-H[j+152>>2]|0;b=b>>>0>g>>>0?b:g;g=H[j+164>>2]-H[j+156>>2]|0;b=b>>>0>g>>>0?b:g}g=0;if(b>>>0>134217727){break X}j=H[n+4>>2];m=H[n+12>>2];r=H[n>>2];u=H[n+8>>2];k=b<<5;i=nb(k);H[$+16>>2]=i;if(!i){break X}q=h-q|0;g=m-j|0;m=u-r|0;H[$>>2]=i;while(1){r=H[z+36>>2];h=g;H[$+8>>2]=g;b=m;H[$+24>>2]=b;g=H[n+156>>2];j=H[n+164>>2];m=H[n+160>>2];u=H[n+152>>2];H[$+28>>2]=(u|0)%2;m=m-u|0;H[$+20>>2]=m-b;t=(p|0)<2;g=j-g|0;_:{if(!(!t&g>>>0>1)){j=0;if(!g){break _}while(1){Yb($+16|0,r+(N(j,q)<<2)|0);j=j+1|0;if((j|0)!=(g|0)){continue}break}break _}u=g>>>0

>>0?g:p;Z=u-1|0;V=(g>>>0)/(u>>>0)|0;b=0;while(1){j=Fa(36);if(!j){break Y}W=H[$+28>>2];H[j+8>>2]=H[$+24>>2];H[j+12>>2]=W;W=H[$+20>>2];H[j>>2]=H[$+16>>2];H[j+4>>2]=W;H[j+24>>2]=r;H[j+20>>2]=q;H[j+16>>2]=m;H[j+28>>2]=N(b,V);W=(b|0)==(Z|0);b=b+1|0;H[j+32>>2]=W?g:N(V,b);W=nb(k);H[j>>2]=W;if(!W){g=0;Ra(l);Ca(j);Ca(i);break X}db(l,10,j);if((b|0)!=(u|0)){continue}break}Ra(l)}H[$+4>>2]=g-h;H[$+12>>2]=H[n+156>>2]%2;$:{if(!(!t&m>>>0>1)){b=8;j=0;if(m>>>0>=8){while(1){mb($,r+(j<<2)|0,q,8);j=b;b=b+8|0;if(m>>>0>=b>>>0){continue}break}}if(j>>>0>=m>>>0){break $}mb($,r+(j<<2)|0,q,m-j|0);break $}h=m>>>0

>>0?m:p;V=h-1|0;u=(m>>>0)/(h>>>0)|0;b=0;while(1){j=Fa(36);if(!j){break Y}t=H[$+12>>2];H[j+8>>2]=H[$+8>>2];H[j+12>>2]=t;t=H[$+4>>2];H[j>>2]=H[$>>2];H[j+4>>2]=t;H[j+24>>2]=r;H[j+20>>2]=q;H[j+16>>2]=g;H[j+28>>2]=N(b,u);t=(b|0)==(V|0);b=b+1|0;H[j+32>>2]=t?m:N(u,b);t=nb(k);H[j>>2]=t;if(!t){g=0;Ra(l);Ca(j);Ca(i);break X}db(l,11,j);if((b|0)!=(h|0)){continue}break}Ra(l)}n=n+152|0;s=s-1|0;if(s){continue}break}g=1;Ca(i);break X}g=1;n=H[z+28>>2];oa=n+N(Z,152)|0;La=oa-152|0;if(H[La>>2]==H[oa-144>>2]){break X}Ma=oa-148|0;if(H[Ma>>2]==H[oa-140>>2]){break X}h=H[n+4>>2];m=H[n+12>>2];l=H[n>>2];i=H[n+8>>2];W=H[z+68>>2];P=H[z+64>>2];A=H[z+60>>2];C=H[z+56>>2];ia=Xb(z,Z);if(!ia){g=0;break X}aa:{ba:{if((Z|0)!=1){j=n;ca:{if((Z|0)!=2){g=Z-1|0;p=g&1;q=g&-2;g=0;while(1){s=H[j+160>>2]-H[j+152>>2]|0;b=b>>>0>s>>>0?b:s;s=H[j+164>>2]-H[j+156>>2]|0;b=b>>>0>s>>>0?b:s;s=H[j+312>>2]-H[j+304>>2]|0;b=b>>>0>s>>>0?b:s;s=H[j+316>>2]-H[j+308>>2]|0;b=b>>>0>s>>>0?b:s;j=j+304|0;g=g+2|0;if((q|0)!=(g|0)){continue}break}if(!p){break ca}}g=H[j+160>>2]-H[j+152>>2]|0;b=b>>>0>g>>>0?b:g;g=H[j+164>>2]-H[j+156>>2]|0;b=b>>>0>g>>>0?b:g}if(b>>>0>=268435456){break aa}k=nb(b<<4);if(!k){break aa}da:{if(!Z){break da}p=m-h|0;u=i-l|0;Na=k+28|0;Q=k+24|0;Ka=k+16|0;Y=k+4|0;ra=1;ea:while(1){b=H[n+156>>2];ha=(b|0)%2|0;g=H[n+152>>2];ma=(g|0)%2|0;S=H[n+164>>2]-b|0;ca=S-p|0;x=H[n+160>>2]-g|0;ba=x-u|0;j=C;g=j;r=A;m=r;b=P;ea=b;h=W;s=h;l=H[z+20>>2];fa:{if((l|0)==(ra|0)){break fa}q=l-ra|0;m=0;g=0;if(j){b=q&31;if((q&63)>>>0>=32){i=-1<>>32-b}b=j+(g^-1)|0;g=i^-1;j=b>>>0>>0?g+1|0:g;g=q&31;if((q&63)>>>0>=32){g=j>>>g|0}else{g=((1<>>g}}if(A){b=q&31;if((q&63)>>>0>=32){i=-1<>>32-b}b=A+(j^-1)|0;j=i^-1;h=b>>>0>>0?j+1|0:j;j=q&31;if((q&63)>>>0>=32){m=h>>>j|0}else{m=((1<>>j}}h=0;b=0;if(P){b=q&31;if((q&63)>>>0>=32){i=-1<>>32-b}b=P+(j^-1)|0;j=i^-1;l=b>>>0

>>0?j+1|0:j;j=q&31;if((q&63)>>>0>=32){b=l>>>j|0}else{b=((1<>>j}}if(W){j=q&31;if((q&63)>>>0>=32){i=-1<>>32-j}j=W+(h^-1)|0;h=i^-1;l=j>>>0>>0?h+1|0:h;h=q&31;if((q&63)>>>0>=32){h=l>>>h|0}else{h=((1<>>h}}ea=0;j=0;V=1<>>0>>0){j=q&31;if((q&63)>>>0>=32){i=-1<>>32-j}l=l^-1;j=l+(C-V|0)|0;i=i^-1;i=j>>>0>>0?i+1|0:i;l=q&31;if((q&63)>>>0>=32){j=i>>>l|0}else{j=((1<>>l}}if(P>>>0>V>>>0){l=q&31;if((q&63)>>>0>=32){i=-1<>>32-l}s=s^-1;l=s+(P-V|0)|0;i=i^-1;s=l>>>0>>0?i+1|0:i;i=q&31;if((q&63)>>>0>=32){ea=s>>>i|0}else{ea=((1<>>i}}s=0;r=0;if(A>>>0>V>>>0){l=q&31;if((q&63)>>>0>=32){i=-1<>>32-l}r=r^-1;l=r+(A-V|0)|0;i=i^-1;r=l>>>0>>0?i+1|0:i;i=q&31;if((q&63)>>>0>=32){r=r>>>i|0}else{r=((1<>>i}}if(W>>>0<=V>>>0){break fa}l=q&31;if((q&63)>>>0>=32){i=-1<>>32-l}s=s^-1;l=s+(W-V|0)|0;i=i^-1;s=l>>>0>>0?i+1|0:i;i=q&31;if((q&63)>>>0>=32){s=s>>>i|0}else{s=((1<>>i}}l=H[n+180>>2];i=ea-l|0;i=i>>>0<=ea>>>0?i:0;q=i+2|0;i=i>>>0>q>>>0?-1:q;fa=i>>>0>>0?i:ba;i=H[n+216>>2];q=b-i|0;b=b>>>0>=q>>>0?q:0;q=b+2|0;b=b>>>0>q>>>0?-1:q;ga=b>>>0>>0?b:u;b=(ma?fa:ga)<<1;q=(ma?ga:fa)<<1|1;ta=b>>>0>q>>>0?b:q;b=ta>>>0>>0;l=j-l|0;j=j>>>0>=l>>>0?l:0;l=j-2|0;q=j>>>0>=l>>>0?l:0;j=g-i|0;g=g>>>0>=j>>>0?j:0;j=g-2|0;j=g>>>0>=j>>>0?j:0;g=(ma?q:j)<<1;l=(ma?j:q)<<1|1;t=g>>>0>>0;V=H[n+184>>2];i=m-V|0;m=i>>>0<=m>>>0?i:0;i=m-2|0;m=i>>>0<=m>>>0?i:0;R=m;J=H[n+220>>2];i=r-J|0;i=i>>>0<=r>>>0?i:0;r=i-2|0;i=i>>>0>=r>>>0?r:0;_=i;r=h-V|0;h=h>>>0>=r>>>0?r:0;r=h+2|0;h=h>>>0>r>>>0?-1:r;V=h>>>0

>>0?h:p;aa=V;h=s-J|0;h=h>>>0<=s>>>0?h:0;s=h+2|0;h=h>>>0>s>>>0?-1:s;la=h>>>0>>0?h:ca;s=la;if(ha){R=i;_=m;aa=s;s=V}Aa=b?ta:x;l=t?g:l;Oa=p+la|0;Qa=i+p|0;if(S){sa=k+(j<<3)|0;b=k+(ba<<3)|0;ua=b-4|0;g=(j|0)<(ba|0);_a=g?sa+4|0:ua;va=u-1|0;$a=(fa|0)<(va|0)?fa:va;t=0;ab=(u|0)>1|(ba|0)>0;h=ma<<2;bb=(Y-h|0)+(q<<3)|0;eb=h+sa|0;M=(ba|0)>(ga|0)?ga:ba;ka=j+1|0;fb=u+fa|0;Ta=q+u|0;gb=k+(l<<2)|0;Va=!u&(ba|0)==1;h=k+(u<<3)|0;ja=h-8|0;wa=h-4|0;xa=b-8|0;Wa=k+(Aa<<2)|0;hb=Wa-4|0;jb=(k+((g?j:ba)<<3)|0)-4|0;while(1){ga:{if(!(t>>>0>>0&m>>>0<=t>>>0|t>>>0>>0&t>>>0>=Qa>>>0)){J=t+1|0;break ga}if(x>>>0>ta>>>0){H[hb>>2]=0;H[Wa>>2]=0}J=t+1|0;Ha(ia,j,t,ga,J,eb,2,0);Ha(ia,Ta,t,fb,J,bb,2,0);ha:{ia:{ja:{if(!ma){if(!ab){break ha}if((j|0)>=(ga|0)){break ia}ka:{la:{if((j|0)>0){b=H[jb>>2];break la}b=H[Y>>2];g=b;if((j|0)<0){break ka}}g=b;b=H[_a>>2]}H[sa>>2]=H[sa>>2]-((b+g|0)+2>>2);b=ka;h=b;g=j;if((b|0)>=(M|0)){break ja}while(1){b=g;g=h;h=k+(g<<3)|0;H[h>>2]=H[h>>2]-((H[(k+(b<<3)|0)+4>>2]+H[h+4>>2]|0)+2>>2);h=g+1|0;if((M|0)!=(h|0)){continue}break}b=M;break ja}ma:{if(!Va){b=j;if((ga|0)<=(b|0)){break ma}while(1){g=k+(b<<3)|0;h=H[g+4>>2];r=xa;na:{oa:{if((b|0)>=0){ea=H[((b|0)<(ba|0)?g:xa)>>2];b=b+1|0;break oa}ea=H[k>>2];if((b|0)!=-1){b=b+1|0;r=k;break na}b=0}if((b|0)>=(ba|0)){break na}r=k+(b<<3)|0}H[g+4>>2]=h-((H[r>>2]+ea|0)+2>>2);if((b|0)<(ga|0)){continue}break}break ma}H[k>>2]=H[k>>2]/2;break ha}b=q;if((fa|0)<=(b|0)){break ha}while(1){g=k+(b<<3)|0;h=H[g>>2];pa:{if((b|0)<0){r=H[Y>>2];ea=Y;break pa}r=H[((b|0)<(u|0)?g+4|0:wa)>>2];ea=Y;if(!b){break pa}ea=(b|0)>(u|0)?wa:g-4|0}H[g>>2]=h+(H[ea>>2]+r>>1);b=b+1|0;if((fa|0)!=(b|0)){continue}break}break ha}if((b|0)>=(ga|0)){break ia}while(1){g=k+(b<<3)|0;r=H[g>>2];qa:{ra:{if((b|0)>0){h=H[(k+(((b|0)<(ba|0)?b:ba)<<3)|0)-4>>2];break ra}h=H[Y>>2];ea=Y;if((b|0)<0){break qa}}ea=ua;if((b|0)>=(ba|0)){break qa}ea=(k+(b<<3)|0)+4|0}H[g>>2]=r-((H[ea>>2]+h|0)+2>>2);b=b+1|0;if((ga|0)!=(b|0)){continue}break}}if((q|0)>=(fa|0)){break ha}b=q;if((va|0)>(b|0)){while(1){g=k+(b<<3)|0;b=b+1|0;H[g+4>>2]=H[g+4>>2]+(H[k+(b<<3)>>2]+H[g>>2]>>1);if((b|0)<($a|0)){continue}break}}if((b|0)>=(fa|0)){break ha}while(1){g=ja;r=b;sa:{ta:{if((b|0)>=0){h=H[((b|0)<(u|0)?k+(b<<3)|0:g)>>2];b=b+1|0;break ta}h=H[k>>2];if((r|0)!=-1){b=r+1|0;g=k;break sa}b=0}if((u|0)<=(b|0)){break sa}g=k+(b<<3)|0}r=k+(r<<3)|0;H[r+4>>2]=H[r+4>>2]+(H[g>>2]+h>>1);if((b|0)<(fa|0)){continue}break}}if(!Ya(ia,l,t,Aa,J,gb,1,0)){break ba}}t=J;if((S|0)!=(t|0)){continue}break}}n=n+152|0;b=aa<<1;g=s<<1|1;b=b>>>0>g>>>0?b:g;_a=b>>>0>>0?b:S;J=k+(m<<5)|0;b=k+(ca<<5)|0;ta=b-4|0;g=(m|0)<(ca|0);$a=g?J+28|0:ta;va=b-8|0;ab=g?J+24|0:va;wa=b-12|0;bb=g?J+20|0:wa;xa=b-16|0;eb=(m|0)<0?Ka:g?J+16|0:xa;ua=p-1|0;fb=(la|0)<(ua|0)?la:ua;j=k+((g?m:ca)<<5)|0;Ta=(m|0)<=0;gb=Ta?Ka:j-16|0;Va=(ca|0)>0;Wa=Va|(p|0)>1;hb=J+(ha<<4)|0;jb=(k+(4-(ha<<2)<<2)|0)+(i<<5)|0;q=(V|0)<(ca|0)?V:ca;u=m+1|0;g=R<<1;h=_<<1|1;lb=g>>>0>>0?g:h;qb=k+(lb<<4)|0;rb=!p&(ca|0)==1;g=k+(p<<5)|0;M=g-20|0;R=g-24|0;_=g-28|0;aa=g-32|0;ka=g-4|0;ja=g-8|0;ba=g-12|0;fa=g-16|0;ga=b-20|0;ea=b-24|0;ma=b-28|0;sa=b-32|0;sb=j-4|0;t=j-8|0;tb=j-12|0;while(1){s=l;ua:{va:{wa:{xa:{if(l>>>0>>0){b=Aa-l|0;l=(b>>>0>=4?4:b)+l|0;Ha(ia,s,m,l,V,hb,1,8);Ha(ia,s,Qa,l,Oa,jb,1,8);if(!ha){if(!Wa){break ua}if((m|0)>=(V|0)){break va}H[J>>2]=H[J>>2]-((H[gb>>2]+H[eb>>2]|0)+2>>2);ya:{if(!Ta){b=H[tb>>2];h=t;g=sb;break ya}b=H[k+20>>2];if((m|0)<0){break xa}h=Q;g=Na}H[J+4>>2]=H[J+4>>2]-((H[bb>>2]+b|0)+2>>2);H[J+8>>2]=H[J+8>>2]-((H[h>>2]+H[ab>>2]|0)+2>>2);b=H[$a>>2];g=H[g>>2];break wa}if(rb){H[k>>2]=H[k>>2]/2;H[k+4>>2]=H[k+4>>2]/2;H[k+8>>2]=H[k+8>>2]/2;H[k+12>>2]=H[k+12>>2]/2;break ua}g=m;if((V|0)>(g|0)){while(1){b=k+(g<<5)|0;za:{if((g|0)<0){h=H[k>>2];j=Va|(g|0)!=-1;H[b+16>>2]=H[b+16>>2]-(((j?h:H[sa>>2])+h|0)+2>>2);h=H[Y>>2];H[b+20>>2]=H[b+20>>2]-(((j?h:H[ma>>2])+h|0)+2>>2);h=H[k+8>>2];H[b+24>>2]=H[b+24>>2]-(((j?h:H[ea>>2])+h|0)+2>>2);h=b;r=H[b+28>>2];b=H[k+12>>2];H[h+28>>2]=r-(((j?b:H[ga>>2])+b|0)+2>>2);g=g+1|0;break za}j=g+1|0;Aa:{if((j|0)<(ca|0)){g=k+(j<<5)|0;H[b+16>>2]=H[b+16>>2]-((H[b>>2]+H[g>>2]|0)+2>>2);H[b+20>>2]=H[b+20>>2]-((H[b+4>>2]+H[g+4>>2]|0)+2>>2);H[b+24>>2]=H[b+24>>2]-((H[b+8>>2]+H[g+8>>2]|0)+2>>2);H[b+28>>2]=H[b+28>>2]-((H[b+12>>2]+H[g+12>>2]|0)+2>>2);break Aa}h=H[b+16>>2];if((g|0)>=(ca|0)){H[b+16>>2]=h-((H[sa>>2]<<1)+2>>2);H[b+20>>2]=H[b+20>>2]-((H[ma>>2]<<1)+2>>2);H[b+24>>2]=H[b+24>>2]-((H[ea>>2]<<1)+2>>2);H[b+28>>2]=H[b+28>>2]-((H[ga>>2]<<1)+2>>2);break Aa}H[b+16>>2]=h-((H[b>>2]+H[sa>>2]|0)+2>>2);H[b+20>>2]=H[b+20>>2]-((H[b+4>>2]+H[ma>>2]|0)+2>>2);H[b+24>>2]=H[b+24>>2]-((H[b+8>>2]+H[ea>>2]|0)+2>>2);H[b+28>>2]=H[b+28>>2]-((H[b+12>>2]+H[ga>>2]|0)+2>>2)}g=j}if((V|0)!=(g|0)){continue}break}}g=i;if((la|0)<=(g|0)){break ua}while(1){b=k+(g<<5)|0;Ba:{if((g|0)<0){H[b>>2]=H[b>>2]+(H[k+16>>2]<<1>>1);H[b+4>>2]=H[b+4>>2]+(H[k+20>>2]<<1>>1);H[b+8>>2]=H[b+8>>2]+(H[k+24>>2]<<1>>1);H[b+12>>2]=H[b+12>>2]+(H[k+28>>2]<<1>>1);break Ba}j=H[b>>2];if(!g){h=(g|0)<(p|0);H[b>>2]=j+(H[k+16>>2]+H[(h?b+16|0:fa)>>2]>>1);H[b+4>>2]=H[b+4>>2]+(H[k+20>>2]+H[(h?b+20|0:ba)>>2]>>1);H[b+8>>2]=H[b+8>>2]+(H[k+24>>2]+H[(h?b+24|0:ja)>>2]>>1);H[b+12>>2]=H[b+12>>2]+(H[k+28>>2]+H[(h?b+28|0:ka)>>2]>>1);break Ba}if((g|0)<=(p|0)){h=(g|0)<(p|0);H[b>>2]=j+(H[b-16>>2]+H[(h?b+16|0:fa)>>2]>>1);H[b+4>>2]=H[b+4>>2]+(H[b-12>>2]+H[(h?b+20|0:ba)>>2]>>1);H[b+8>>2]=H[b+8>>2]+(H[b-8>>2]+H[(h?b+24|0:ja)>>2]>>1);H[b+12>>2]=H[b+12>>2]+(H[b-4>>2]+H[(h?b+28|0:ka)>>2]>>1);break Ba}H[b>>2]=j+(H[fa>>2]<<1>>1);H[b+4>>2]=H[b+4>>2]+(H[ba>>2]<<1>>1);H[b+8>>2]=H[b+8>>2]+(H[ja>>2]<<1>>1);H[b+12>>2]=H[b+12>>2]+(H[ka>>2]<<1>>1)}g=g+1|0;if((la|0)!=(g|0)){continue}break}break ua}p=S;u=x;ra=ra+1|0;if((Z|0)!=(ra|0)){continue ea}break da}H[J+4>>2]=H[J+4>>2]-((b<<1)+2>>2);H[J+8>>2]=H[J+8>>2]-((H[Q>>2]<<1)+2>>2);b=H[Na>>2];g=b}H[J+12>>2]=H[J+12>>2]-((b+g|0)+2>>2);j=m;b=u;g=b;if((b|0)<(q|0)){while(1){g=k+(b<<5)|0;j=k+(j<<5)|0;H[g>>2]=H[g>>2]-((H[j+16>>2]+H[g+16>>2]|0)+2>>2);H[g+4>>2]=H[g+4>>2]-((H[j+20>>2]+H[g+20>>2]|0)+2>>2);H[g+8>>2]=H[g+8>>2]-((H[j+24>>2]+H[g+24>>2]|0)+2>>2);H[g+12>>2]=H[g+12>>2]-((H[j+28>>2]+H[g+28>>2]|0)+2>>2);j=b;b=b+1|0;if((q|0)!=(b|0)){continue}break}g=q}if((g|0)>=(V|0)){break va}while(1){b=k+(g<<5)|0;j=(g|0)<(ca|0);Ca:{if((g|0)<=0){h=H[Ka>>2];if((g|0)>=0){H[b>>2]=H[b>>2]-((h+H[(j?b+16|0:xa)>>2]|0)+2>>2);H[b+4>>2]=H[b+4>>2]-((H[k+20>>2]+H[(j?b+20|0:wa)>>2]|0)+2>>2);H[b+8>>2]=H[b+8>>2]-((H[k+24>>2]+H[(j?b+24|0:va)>>2]|0)+2>>2);H[b+12>>2]=H[b+12>>2]-((H[k+28>>2]+H[(j?b+28|0:ta)>>2]|0)+2>>2);break Ca}H[b>>2]=H[b>>2]-((h<<1)+2>>2);H[b+4>>2]=H[b+4>>2]-((H[k+20>>2]<<1)+2>>2);H[b+8>>2]=H[b+8>>2]-((H[k+24>>2]<<1)+2>>2);H[b+12>>2]=H[b+12>>2]-((H[k+28>>2]<<1)+2>>2);break Ca}h=k+((j?g:ca)<<5)|0;r=H[h-16>>2];if(!j){H[b>>2]=H[b>>2]-((r+H[xa>>2]|0)+2>>2);H[b+4>>2]=H[b+4>>2]-((H[h-12>>2]+H[wa>>2]|0)+2>>2);H[b+8>>2]=H[b+8>>2]-((H[h-8>>2]+H[va>>2]|0)+2>>2);H[b+12>>2]=H[b+12>>2]-((H[h-4>>2]+H[ta>>2]|0)+2>>2);break Ca}H[b>>2]=H[b>>2]-((r+H[b+16>>2]|0)+2>>2);H[b+4>>2]=H[b+4>>2]-((H[h-12>>2]+H[b+20>>2]|0)+2>>2);H[b+8>>2]=H[b+8>>2]-((H[h-8>>2]+H[b+24>>2]|0)+2>>2);H[b+12>>2]=H[b+12>>2]-((H[h-4>>2]+H[b+28>>2]|0)+2>>2)}g=g+1|0;if((V|0)!=(g|0)){continue}break}}if((i|0)>=(la|0)){break ua}g=i;if((ua|0)>(g|0)){while(1){b=k+(g<<5)|0;H[b+16>>2]=H[b+16>>2]+(H[b+32>>2]+H[b>>2]>>1);H[b+20>>2]=H[b+20>>2]+(H[b+36>>2]+H[b+4>>2]>>1);H[b+24>>2]=H[b+24>>2]+(H[b+40>>2]+H[b+8>>2]>>1);H[b+28>>2]=H[b+28>>2]+(H[b+44>>2]+H[b+12>>2]>>1);g=g+1|0;if((fb|0)>(g|0)){continue}break}}if((g|0)>=(la|0)){break ua}while(1){b=k+(g<<5)|0;Da:{Ea:{Fa:{if((g|0)<0){j=H[k>>2];if((g|0)!=-1){break Fa}if((p|0)<=0){H[b+16>>2]=H[b+16>>2]+(j+H[aa>>2]>>1);H[b+20>>2]=H[b+20>>2]+(H[_>>2]+H[k+4>>2]>>1);H[b+24>>2]=H[b+24>>2]+(H[R>>2]+H[k+8>>2]>>1);r=H[k+12>>2];j=H[M>>2];break Ea}break Fa}j=g+1|0;Ga:{if((j|0)<(p|0)){g=k+(j<<5)|0;H[b+16>>2]=H[b+16>>2]+(H[g>>2]+H[b>>2]>>1);H[b+20>>2]=H[b+20>>2]+(H[g+4>>2]+H[b+4>>2]>>1);H[b+24>>2]=H[b+24>>2]+(H[g+8>>2]+H[b+8>>2]>>1);H[b+28>>2]=H[b+28>>2]+(H[g+12>>2]+H[b+12>>2]>>1);break Ga}if((g|0)>=(p|0)){H[b+16>>2]=H[b+16>>2]+H[aa>>2];H[b+20>>2]=H[b+20>>2]+H[_>>2];H[b+24>>2]=H[b+24>>2]+H[R>>2];H[b+28>>2]=H[b+28>>2]+H[M>>2];break Ga}H[b+16>>2]=H[b+16>>2]+(H[aa>>2]+H[b>>2]>>1);H[b+20>>2]=H[b+20>>2]+(H[_>>2]+H[b+4>>2]>>1);H[b+24>>2]=H[b+24>>2]+(H[R>>2]+H[b+8>>2]>>1);H[b+28>>2]=H[b+28>>2]+(H[M>>2]+H[b+12>>2]>>1)}g=j;break Da}H[b+16>>2]=j+H[b+16>>2];H[b+20>>2]=H[b+20>>2]+H[k+4>>2];H[b+24>>2]=H[b+24>>2]+H[k+8>>2];r=H[k+12>>2];j=r}H[b+28>>2]=H[b+28>>2]+(j+r>>1);g=g+1|0}if((la|0)!=(g|0)){continue}break}}if(Ya(ia,s,lb,l,_a,qb,1,4)){continue}break}break}break ba}Ca(k);g=1}b=H[oa-16>>2];j=H[La>>2];h=H[Ma>>2];m=H[oa-8>>2];Ha(ia,b-j|0,H[oa-12>>2]-h|0,m-j|0,H[oa-4>>2]-h|0,H[z+52>>2],1,m-b|0);Ua(ia);break X}Ua(ia);Ca(k);g=0;break X}Ua(ia);g=0;break X}g=0;Ra(l);Ca(i)}na=$+32|0;if(g){break W}break b}h=0;A=na+-64|0;na=A;Ha:{Ia:{if(H[D+64>>2]){n=H[z+28>>2];j=n+N(H[z+24>>2],152)|0;l=H[j-152>>2];k=1;V=H[D+44>>2];P=H[V+4>>2];if((m|0)==1){break Ha}p=m-1|0;b=n;Ja:{if((m|0)!=2){m=p&1;i=p&-2;g=0;while(1){q=H[b+160>>2]-H[b+152>>2]|0;h=h>>>0>q>>>0?h:q;q=H[b+164>>2]-H[b+156>>2]|0;h=h>>>0>q>>>0?h:q;q=H[b+312>>2]-H[b+304>>2]|0;h=h>>>0>q>>>0?h:q;q=H[b+316>>2]-H[b+308>>2]|0;h=h>>>0>q>>>0?h:q;b=b+304|0;g=g+2|0;if((i|0)!=(g|0)){continue}break}if(!m){break Ja}}g=H[b+160>>2]-H[b+152>>2]|0;g=g>>>0>>0?h:g;b=H[b+164>>2]-H[b+156>>2]|0;h=b>>>0>>0?g:b}k=0;if(h>>>0>134217727){break Ha}b=H[j-144>>2];g=H[n+4>>2];j=H[n+12>>2];i=H[n>>2];q=H[n+8>>2];R=h<<5;r=Ia(R);H[A+32>>2]=r;if(!r){break Ha}m=j-g|0;j=q-i|0;g=P>>>1|0;_=g>>>0<=2?2:g;s=b-l|0;ka=s<<5;ja=N(s,28);$=N(s,24);ba=N(s,20);ca=s<<4;C=N(s,12);S=s<<3;H[A>>2]=r;aa=r+32|0;b=H[z+36>>2];while(1){q=m;H[A+8>>2]=m;h=j;H[A+40>>2]=h;Z=H[n+156>>2];W=H[n+164>>2];u=H[n+160>>2];g=H[n+152>>2];H[A+56>>2]=0;H[A+52>>2]=h;H[A+48>>2]=0;J=(g|0)%2|0;H[A+44>>2]=J;j=u-g|0;k=j-h|0;H[A+60>>2]=k;H[A+36>>2]=k;M=(P|0)<2;m=W-Z|0;Ka:{if(!(!M&m>>>0>15)){l=0;i=b;if(m>>>0<8){break Ka}t=j&-2;x=j&1;k=0;J=(u|0)==(g+1|0);while(1){g=A+32|0;yb(g,i,s,8);Sa(g);if(j){h=0;l=0;La:{if(!J){while(1){g=(h<<2)+i|0;u=r+(h<<5)|0;L[g>>2]=L[u>>2];Q=s<<2;L[Q+g>>2]=L[u+4>>2];L[g+S>>2]=L[u+8>>2];L[g+C>>2]=L[u+12>>2];u=h|1;g=(u<<2)+i|0;u=r+(u<<5)|0;L[g>>2]=L[u>>2];L[g+Q>>2]=L[u+4>>2];L[g+S>>2]=L[u+8>>2];L[g+C>>2]=L[u+12>>2];h=h+2|0;l=l+2|0;if((t|0)!=(l|0)){continue}break}if(!x){break La}}g=(h<<2)+i|0;h=r+(h<<5)|0;L[g>>2]=L[h>>2];L[g+(s<<2)>>2]=L[h+4>>2];L[g+S>>2]=L[h+8>>2];L[g+C>>2]=L[h+12>>2]}h=0;while(1){g=(h<<2)+i|0;l=r+(h<<5)|0;L[g+ca>>2]=L[l+16>>2];L[g+ba>>2]=L[l+20>>2];L[g+$>>2]=L[l+24>>2];L[g+ja>>2]=L[l+28>>2];h=h+1|0;if((j|0)!=(h|0)){continue}break}}i=i+ka|0;g=k+15|0;l=k+8|0;k=l;if(g>>>0>>0){continue}break}break Ka}g=m>>>3|0;t=g>>>0

>>0?g:P;x=(m>>>0)/(t>>>0)&-8;l=m&-8;g=0;i=b;while(1){u=Fa(48);if(!u){break Ia}Q=Ia(R);H[u>>2]=Q;if(!Q){k=0;Ra(V);Ca(u);Ca(r);break Ha}H[u+40>>2]=i;H[u+36>>2]=s;H[u+32>>2]=j;H[u+28>>2]=k;H[u+24>>2]=0;H[u+20>>2]=h;H[u+16>>2]=0;H[u+12>>2]=J;H[u+8>>2]=h;H[u+4>>2]=k;Y=l-N(g,x)|0;g=g+1|0;Q=(t|0)==(g|0)?Y:x;H[u+44>>2]=Q;db(V,12,u);i=(N(s,Q)<<2)+i|0;if((g|0)!=(t|0)){continue}break}Ra(V)}Ma:{if(m>>>0<=l>>>0){break Ma}h=A+32|0;g=m-l|0;yb(h,i,s,g);Sa(h);if(!j){break Ma}J=g&-4;x=g&3;k=0;Q=Z+(l-W|0)>>>0>4294967292;while(1){u=(k<<2)+i|0;t=r+(k<<5)|0;h=0;l=0;g=0;Na:{if(!Q){while(1){L[u+(N(h,s)<<2)>>2]=L[t+(h<<2)>>2];g=h|1;L[u+(N(g,s)<<2)>>2]=L[t+(g<<2)>>2];g=h|2;L[u+(N(g,s)<<2)>>2]=L[t+(g<<2)>>2];g=h|3;L[u+(N(g,s)<<2)>>2]=L[t+(g<<2)>>2];h=h+4|0;l=l+4|0;if((J|0)!=(l|0)){continue}break}g=h;if(!x){break Na}}h=0;while(1){L[u+(N(g,s)<<2)>>2]=L[t+(g<<2)>>2];g=g+1|0;h=h+1|0;if((x|0)!=(h|0)){continue}break}}k=k+1|0;if((k|0)!=(j|0)){continue}break}}u=m-q|0;H[A+4>>2]=u;g=H[n+156>>2];H[A+28>>2]=u;H[A+24>>2]=0;H[A+20>>2]=q;H[A+16>>2]=0;J=(g|0)%2|0;H[A+12>>2]=J;Oa:{if(!(!M&j>>>0>15)){g=b;if(j>>>0<8){break Oa}ia=m&-2;fa=m&1;ga=u&-2;Y=u&1;la=q&-2;oa=q&1;h=J<<5;M=aa-h|0;Q=h+r|0;ea=N(q,s)<<2;ma=W-1|0;ra=(ma|0)==(q+Z|0);l=j;while(1){h=0;i=0;Pa:{Qa:{switch(q|0){default:while(1){k=(N(h,s)<<2)+g|0;x=H[k+28>>2];t=Q+(h<<6)|0;H[t+24>>2]=H[k+24>>2];H[t+28>>2]=x;x=H[k+20>>2];H[t+16>>2]=H[k+16>>2];H[t+20>>2]=x;x=H[k+12>>2];H[t+8>>2]=H[k+8>>2];H[t+12>>2]=x;x=H[k+4>>2];H[t>>2]=H[k>>2];H[t+4>>2]=x;t=h|1;k=Q+(t<<6)|0;t=(N(t,s)<<2)+g|0;x=H[t+28>>2];H[k+24>>2]=H[t+24>>2];H[k+28>>2]=x;x=H[t+20>>2];H[k+16>>2]=H[t+16>>2];H[k+20>>2]=x;x=H[t+12>>2];H[k+8>>2]=H[t+8>>2];H[k+12>>2]=x;x=H[t+4>>2];H[k>>2]=H[t>>2];H[k+4>>2]=x;h=h+2|0;i=i+2|0;if((la|0)!=(i|0)){continue}break};if(!oa){break Pa}break;case 0:break Pa;case 1:break Qa}}i=Q+(h<<6)|0;h=(N(h,s)<<2)+g|0;k=H[h+28>>2];H[i+24>>2]=H[h+24>>2];H[i+28>>2]=k;k=H[h+20>>2];H[i+16>>2]=H[h+16>>2];H[i+20>>2]=k;k=H[h+12>>2];H[i+8>>2]=H[h+8>>2];H[i+12>>2]=k;k=H[h+4>>2];H[i>>2]=H[h>>2];H[i+4>>2]=k}Ra:{if((m|0)==(q|0)){break Ra}t=g+ea|0;h=0;x=0;if(!ra){while(1){i=t+(N(h,s)<<2)|0;ha=H[i+28>>2];k=M+(h<<6)|0;H[k+24>>2]=H[i+24>>2];H[k+28>>2]=ha;ha=H[i+20>>2];H[k+16>>2]=H[i+16>>2];H[k+20>>2]=ha;ha=H[i+12>>2];H[k+8>>2]=H[i+8>>2];H[k+12>>2]=ha;ha=H[i+4>>2];H[k>>2]=H[i>>2];H[k+4>>2]=ha;k=h|1;i=M+(k<<6)|0;k=t+(N(k,s)<<2)|0;ha=H[k+28>>2];H[i+24>>2]=H[k+24>>2];H[i+28>>2]=ha;ha=H[k+20>>2];H[i+16>>2]=H[k+16>>2];H[i+20>>2]=ha;ha=H[k+12>>2];H[i+8>>2]=H[k+8>>2];H[i+12>>2]=ha;ha=H[k+4>>2];H[i>>2]=H[k>>2];H[i+4>>2]=ha;h=h+2|0;x=x+2|0;if((ga|0)!=(x|0)){continue}break}if(!Y){break Ra}}i=M+(h<<6)|0;h=t+(N(h,s)<<2)|0;k=H[h+28>>2];H[i+24>>2]=H[h+24>>2];H[i+28>>2]=k;k=H[h+20>>2];H[i+16>>2]=H[h+16>>2];H[i+20>>2]=k;k=H[h+12>>2];H[i+8>>2]=H[h+8>>2];H[i+12>>2]=k;k=H[h+4>>2];H[i>>2]=H[h>>2];H[i+4>>2]=k}Sa(A);Sa:{if(!m){break Sa}h=0;i=0;if((Z|0)!=(ma|0)){while(1){k=r+(h<<5)|0;x=H[k+28>>2];t=(N(h,s)<<2)+g|0;H[t+24>>2]=H[k+24>>2];H[t+28>>2]=x;x=H[k+20>>2];H[t+16>>2]=H[k+16>>2];H[t+20>>2]=x;x=H[k+12>>2];H[t+8>>2]=H[k+8>>2];H[t+12>>2]=x;x=H[k+4>>2];H[t>>2]=H[k>>2];H[t+4>>2]=x;t=h|1;k=(N(t,s)<<2)+g|0;t=r+(t<<5)|0;x=H[t+28>>2];H[k+24>>2]=H[t+24>>2];H[k+28>>2]=x;x=H[t+20>>2];H[k+16>>2]=H[t+16>>2];H[k+20>>2]=x;x=H[t+12>>2];H[k+8>>2]=H[t+8>>2];H[k+12>>2]=x;x=H[t+4>>2];H[k>>2]=H[t>>2];H[k+4>>2]=x;h=h+2|0;i=i+2|0;if((ia|0)!=(i|0)){continue}break}if(!fa){break Sa}}i=(N(h,s)<<2)+g|0;h=r+(h<<5)|0;k=H[h+28>>2];H[i+24>>2]=H[h+24>>2];H[i+28>>2]=k;k=H[h+20>>2];H[i+16>>2]=H[h+16>>2];H[i+20>>2]=k;k=H[h+12>>2];H[i+8>>2]=H[h+8>>2];H[i+12>>2]=k;k=H[h+4>>2];H[i>>2]=H[h>>2];H[i+4>>2]=k}g=g+32|0;l=l-8|0;if(l>>>0>7){continue}break}break Oa}g=j>>>3|0;l=g>>>0<_>>>0?g:_;i=(j>>>0)/(l>>>0)&-8;t=j&-8;k=0;g=b;while(1){h=Fa(48);if(!h){break Ia}x=Ia(R);H[h>>2]=x;if(!x){k=0;Ra(V);Ca(h);Ca(r);break Ha}H[h+40>>2]=g;H[h+36>>2]=s;H[h+32>>2]=m;H[h+28>>2]=u;H[h+24>>2]=0;H[h+20>>2]=q;H[h+16>>2]=0;H[h+12>>2]=J;H[h+8>>2]=q;H[h+4>>2]=u;Y=t-N(i,k)|0;k=k+1|0;x=(l|0)==(k|0)?Y:i;H[h+44>>2]=x;db(V,13,h);g=(x<<2)+g|0;if((k|0)!=(l|0)){continue}break}Ra(V)}k=j&7;Ta:{if(!k){break Ta}x=J<<5;Ua:{if(!q){break Ua}t=r+x|0;i=k<<2;h=0;if((q|0)!=1){J=q&1;M=q&-2;l=0;while(1){Q=!i;if(!Q){B(t+(h<<6)|0,(N(h,s)<<2)+g|0,i)}if(!Q){Q=h|1;B(t+(Q<<6)|0,(N(s,Q)<<2)+g|0,i)}h=h+2|0;l=l+2|0;if((M|0)!=(l|0)){continue}break}if(!J){break Ua}}if(!i){break Ua}B(t+(h<<6)|0,(N(h,s)<<2)+g|0,i)}Va:{if((m|0)==(q|0)){break Va}t=aa-x|0;x=(N(q,s)<<2)+g|0;i=k<<2;h=0;if((Z|0)!=(W+(q^-1)|0)){q=u&1;u=u&-2;l=0;while(1){J=!i;if(!J){B(t+(h<<6)|0,x+(N(h,s)<<2)|0,i)}if(!J){J=h|1;B(t+(J<<6)|0,x+(N(s,J)<<2)|0,i)}h=h+2|0;l=l+2|0;if((u|0)!=(l|0)){continue}break}if(!q){break Va}}if(!i){break Va}B(t+(h<<6)|0,x+(N(h,s)<<2)|0,i)}Sa(A);if(!m){break Ta}i=k<<2;h=0;if((W|0)!=(Z+1|0)){q=m&1;k=m&-2;l=0;while(1){u=!i;if(!u){B((N(h,s)<<2)+g|0,r+(h<<5)|0,i)}if(!u){u=h|1;B((N(u,s)<<2)+g|0,r+(u<<5)|0,i)}h=h+2|0;l=l+2|0;if((k|0)!=(l|0)){continue}break}if(!q){break Ta}}if(!i){break Ta}B((N(h,s)<<2)+g|0,r+(h<<5)|0,i)}n=n+152|0;p=p-1|0;if(p){continue}break}k=1;Ca(r);break Ha}k=1;j=H[z+28>>2];J=j+N(m,152)|0;ga=J-152|0;if(H[ga>>2]==H[J-144>>2]){break Ha}Y=J-148|0;if(H[Y>>2]==H[J-140>>2]){break Ha}g=H[j+4>>2];n=H[j+12>>2];l=H[j>>2];i=H[j+8>>2];u=H[z+68>>2];V=H[z+64>>2];t=H[z+60>>2];Z=H[z+56>>2];S=Xb(z,m);if(!S){k=0;break Ha}if((m|0)==1){b=H[J-16>>2];g=H[ga>>2];j=H[Y>>2];h=H[J-8>>2];Ha(S,b-g|0,H[J-12>>2]-j|0,h-g|0,H[J-4>>2]-j|0,H[z+52>>2],1,h-b|0);Ua(S);break Ha}k=0;b=j;Wa:{if((m|0)!=2){h=m-1|0;p=h&1;q=h&-2;h=0;while(1){s=H[b+160>>2]-H[b+152>>2]|0;s=k>>>0>s>>>0?k:s;r=H[b+164>>2]-H[b+156>>2]|0;s=r>>>0>>0?s:r;r=H[b+312>>2]-H[b+304>>2]|0;s=r>>>0>>0?s:r;r=H[b+316>>2]-H[b+308>>2]|0;k=r>>>0>>0?s:r;b=b+304|0;h=h+2|0;if((q|0)!=(h|0)){continue}break}if(!p){break Wa}}h=H[b+160>>2]-H[b+152>>2]|0;h=h>>>0>>0?k:h;b=H[b+164>>2]-H[b+156>>2]|0;k=b>>>0>>0?h:b}Xa:{if(k>>>0>=134217728){break Xa}M=Ia(k<<5);H[A+32>>2]=M;if(!M){break Xa}H[A>>2]=M;Ya:{if(m){n=n-g|0;b=i-l|0;la=M+32|0;P=m;oa=H[z+20>>2];ka=1;ba=0;while(1){H[A+8>>2]=n;H[A+40>>2]=b;h=H[j+164>>2];m=H[j+160>>2];g=H[j+156>>2];l=H[j+152>>2];R=(l|0)%2|0;H[A+44>>2]=R;ea=(g|0)%2|0;H[A+12>>2]=ea;W=m-l|0;_=W-b|0;H[A+36>>2]=_;s=h-g|0;aa=s-n|0;H[A+4>>2]=aa;l=Z;x=l;r=t;h=r;g=V;k=g;m=u;q=m;Za:{if(!ba&(ka|0)==(oa|0)){break Za}C=oa-ka|0;h=0;x=0;if(l){g=C&31;if((C&63)>>>0>=32){i=-1<>>32-g}g=l+(m^-1)|0;m=i^-1;l=g>>>0>>0?m+1|0:m;m=C&31;if((C&63)>>>0>=32){x=l>>>m|0}else{x=((1<>>m}}if(t){g=C&31;if((C&63)>>>0>=32){i=-1<>>32-g}g=t+(h^-1)|0;h=i^-1;m=g>>>0>>0?h+1|0:h;h=C&31;if((C&63)>>>0>=32){h=m>>>h|0}else{h=((1<>>h}}m=0;g=0;if(V){g=C&31;if((C&63)>>>0>=32){i=-1<>>32-g}g=V+(l^-1)|0;l=i^-1;i=g>>>0>>0?l+1|0:l;l=C&31;if((C&63)>>>0>=32){g=i>>>l|0}else{g=((1<>>l}}if(u){m=C&31;if((C&63)>>>0>=32){i=-1<>>32-m}m=u+(l^-1)|0;l=i^-1;i=m>>>0>>0?l+1|0:l;l=C&31;if((C&63)>>>0>=32){m=i>>>l|0}else{m=((1<>>l}}k=0;l=0;Q=1<>>0>>0){l=C&31;if((C&63)>>>0>=32){i=-1<>>32-l}p=p^-1;l=p+(Z-Q|0)|0;i=i^-1;p=l>>>0

>>0?i+1|0:i;i=C&31;if((C&63)>>>0>=32){l=p>>>i|0}else{l=((1<>>i}}if(Q>>>0>>0){i=C&31;if((C&63)>>>0>=32){i=-1<>>32-i}q=p^-1;p=q+(V-Q|0)|0;i=i^-1;q=q>>>0>p>>>0?i+1|0:i;i=C&31;if((C&63)>>>0>=32){k=q>>>i|0}else{k=((1<>>i}}q=0;r=0;if(t>>>0>Q>>>0){i=C&31;if((C&63)>>>0>=32){i=-1<>>32-i}r=p^-1;p=r+(t-Q|0)|0;i=i^-1;r=p>>>0>>0?i+1|0:i;i=C&31;if((C&63)>>>0>=32){r=r>>>i|0}else{r=((1<>>i}}if(u>>>0<=Q>>>0){break Za}i=C&31;if((C&63)>>>0>=32){i=-1<>>32-i}q=p^-1;p=q+(u-Q|0)|0;i=i^-1;q=q>>>0>p>>>0?i+1|0:i;i=C&31;if((C&63)>>>0>=32){q=q>>>i|0}else{q=((1<>>i}}i=H[j+180>>2];p=k-i|0;p=k>>>0>=p>>>0?p:0;k=p+4|0;p=k>>>0

>>0?-1:k;fa=p>>>0<_>>>0?p:_;p=H[j+216>>2];k=g-p|0;g=g>>>0>=k>>>0?k:0;k=g+4|0;g=g>>>0>k>>>0?-1:k;Q=b>>>0>g>>>0?g:b;g=(R?fa:Q)<<1;k=(R?Q:fa)<<1|1;_=g>>>0>k>>>0?g:k;$=_>>>0>>0;g=l-i|0;g=g>>>0<=l>>>0?g:0;l=g-4|0;ca=g>>>0>=l>>>0?l:0;g=x-p|0;g=g>>>0<=x>>>0?g:0;l=g-4|0;C=g>>>0>=l>>>0?l:0;x=(R?ca:C)<<1;ma=(R?C:ca)<<1|1;ra=x>>>0>>0;i=H[j+184>>2];g=h-i|0;g=g>>>0<=h>>>0?g:0;h=g-4|0;g=g>>>0>=h>>>0?h:0;p=g;h=H[j+220>>2];l=r-h|0;l=l>>>0<=r>>>0?l:0;r=l-4|0;ja=l>>>0>=r>>>0?r:0;l=ja;i=m-i|0;m=i>>>0<=m>>>0?i:0;i=m+4|0;m=i>>>0>>0?-1:i;i=m>>>0>>0?m:n;k=i;h=q-h|0;h=h>>>0<=q>>>0?h:0;m=h+4|0;h=h>>>0>m>>>0?-1:m;ia=h>>>0>>0?h:aa;q=ia;if(ea){k=q;q=i;p=l;l=g}$=$?_:W;x=ra?x:ma;H[A+60>>2]=fa;H[A+56>>2]=ca;H[A+52>>2]=Q;H[A+48>>2]=C;_a:{if(s>>>0<8){m=7;h=0;break _a}h=R<<5;_=(la-h|0)+(ca<<6)|0;ma=_+28|0;aa=(h+M|0)+(C<<6)|0;ra=aa+28|0;ha=_+24|0;Aa=aa+24|0;Ka=_+20|0;sa=aa+20|0;Na=_+16|0;ta=aa+16|0;Oa=_+12|0;Qa=aa+12|0;va=_+8|0;wa=aa+8|0;xa=_+4|0;ua=aa+4|0;r=b+fa|0;R=b+ca|0;fa=n+ia|0;La=n+ja|0;Ma=M+(x<<5)|0;b=0;while(1){h=b|7;$a:{if(!(b>>>0>>0&h>>>0>=g>>>0|b>>>0>>0&h>>>0>=La>>>0)){h=b+8|0;break $a}h=b+1|0;Ha(S,C,b,Q,h,aa,16,0);Ha(S,R,b,r,h,_,16,0);m=b+2|0;Ha(S,C,h,Q,m,ua,16,0);Ha(S,R,h,r,m,xa,16,0);h=b+3|0;Ha(S,C,m,Q,h,wa,16,0);Ha(S,R,m,r,h,va,16,0);m=b+4|0;Ha(S,C,h,Q,m,Qa,16,0);Ha(S,R,h,r,m,Oa,16,0);h=b+5|0;Ha(S,C,m,Q,h,ta,16,0);Ha(S,R,m,r,h,Na,16,0);m=b+6|0;Ha(S,C,h,Q,m,sa,16,0);Ha(S,R,h,r,m,Ka,16,0);ca=b+7|0;Ha(S,C,m,Q,ca,Aa,16,0);Ha(S,R,m,r,ca,ha,16,0);h=b+8|0;Ha(S,C,ca,Q,h,ra,16,0);Ha(S,R,ca,r,h,ma,16,0);Sa(A+32|0);if(!Ya(S,x,b,$,h,Ma,8,1)){break Ya}}b=h;m=b|7;if(s>>>0>m>>>0){continue}break}}if(!(!(h>>>0>>0&g>>>0<=m>>>0)&(n+ia>>>0<=h>>>0|n+ja>>>0>m>>>0)|h>>>0>=s>>>0)){b=A+32|0;m=0;Q=s-h|0;if(Q){while(1){r=h+m|0;C=r+1|0;R=H[b+16>>2];_=m<<2;Ha(S,R,r,H[b+20>>2],C,_+((H[b>>2]+(H[b+12>>2]<<5)|0)+(R<<6)|0)|0,16,0);R=H[b+24>>2];aa=H[b+8>>2];Ha(S,R+aa|0,r,aa+H[b+28>>2]|0,C,(_+((H[b>>2]-(H[b+12>>2]<<5)|0)+(R<<6)|0)|0)+32|0,16,0);m=m+1|0;if((Q|0)!=(m|0)){continue}break}}Sa(b);if(!Ya(S,x,h,$,s,M+(x<<5)|0,8,1)){break Ya}}H[A+28>>2]=ia;H[A+24>>2]=ja;H[A+20>>2]=i;H[A+16>>2]=g;if(x>>>0<$>>>0){b=k<<1;h=q<<1|1;b=b>>>0>h>>>0?b:h;h=b>>>0>>0?b:s;b=ea<<5;m=(la-b|0)+(ja<<6)|0;q=(b+M|0)+(g<<6)|0;r=n+ia|0;n=n+ja|0;b=p<<1;l=l<<1|1;l=b>>>0>>0?b:l;p=M+(l<<5)|0;while(1){b=$-x|0;b=(b>>>0>=8?8:b)+x|0;Ha(S,x,g,b,i,q,1,16);Ha(S,x,n,b,r,m,1,16);Sa(A);if(!Ya(S,x,l,b,h,p,1,8)){break Ya}x=x+8|0;if($>>>0>x>>>0){continue}break}}j=j+152|0;n=s;b=W;ka=ka+1|0;ba=ka?ba:ba+1|0;if(ba|(P|0)!=(ka|0)){continue}break}}k=1;b=H[J-16>>2];g=H[ga>>2];j=H[Y>>2];h=H[J-8>>2];Ha(S,b-g|0,H[J-12>>2]-j|0,h-g|0,H[J-4>>2]-j|0,H[z+52>>2],1,h-b|0);Ua(S);Ca(M);break Ha}Ua(S);Ca(M);k=0;break Ha}Ua(S);k=0;break Ha}k=0;Ra(V);Ca(r)}na=A- -64|0;if(k){break W}break b}v=v+1080|0;E=E+52|0;z=z+76|0;o=o+1|0;if(o>>>0>2]){continue}break}v=H[D+32>>2];w=H[H[D+20>>2]>>2]}n=H[v+16>>2];ab:{if(H[D+68>>2]|!n){break ab}E=H[w+20>>2];g=H[E+28>>2];bb:{cb:{j=H[D+64>>2];if(j){o=H[w+16>>2];if(o>>>0<3){break bb}b=H[E+24>>2];if(!((b|0)==H[E+100>>2]&(b|0)==H[E+176>>2])){Ba(f,1,10089,0);break b}h=H[H[D+24>>2]+24>>2];m=H[h+36>>2];db:{if((m|0)!=H[h+88>>2]|(m|0)!=H[h+140>>2]){break db}h=N(b,152);b=h+g|0;b=N(H[b-140>>2]-H[b-148>>2]|0,H[b-144>>2]-H[b-152>>2]|0);g=h+H[E+104>>2]|0;if((b|0)!=(N(H[g-140>>2]-H[g-148>>2]|0,H[g-144>>2]-H[g-152>>2]|0)|0)){break db}g=h+H[E+180>>2]|0;if((N(H[g-140>>2]-H[g-148>>2]|0,H[g-144>>2]-H[g-152>>2]|0)|0)==(b|0)){break cb}}Ba(f,1,10089,0);break b}o=H[w+16>>2];if(o>>>0<3){break bb}h=H[H[D+24>>2]+24>>2];b=H[h+36>>2];eb:{if((b|0)!=H[h+88>>2]){break eb}h=H[h+140>>2];if((h|0)!=(b|0)){break eb}m=N(b,152);b=g+m|0;b=N(H[b+148>>2]-H[b+140>>2]|0,H[b+144>>2]-H[b+136>>2]|0);g=m+H[E+104>>2]|0;if((b|0)!=(N(H[g+148>>2]-H[g+140>>2]|0,H[g+144>>2]-H[g+136>>2]|0)|0)){break eb}g=H[E+180>>2]+N(h,152)|0;if((N(H[g+148>>2]-H[g+140>>2]|0,H[g+144>>2]-H[g+136>>2]|0)|0)==(b|0)){break cb}}Ba(f,1,10089,0);break b}if((n|0)==2){if(!H[v+5608>>2]){break ab}j=Fa(o<<2);if(!j){break b}l=H[w+16>>2];fb:{if(!l){break fb}gb:{hb:{if(H[D+64>>2]){o=l&3;g=0;if(l>>>0>=4){break hb}z=0;break gb}o=l&3;g=0;ib:{if(l>>>0<4){z=0;break ib}n=l&-4;z=0;h=0;while(1){m=j+(z<<2)|0;H[m>>2]=H[E+52>>2];H[m+4>>2]=H[E+128>>2];H[m+8>>2]=H[E+204>>2];H[m+12>>2]=H[E+280>>2];z=z+4|0;E=E+304|0;h=h+4|0;if((n|0)!=(h|0)){continue}break}if(!o){break fb}}while(1){H[j+(z<<2)>>2]=H[E+52>>2];z=z+1|0;E=E+76|0;g=g+1|0;if((o|0)!=(g|0)){continue}break}break fb}n=l&-4;z=0;h=0;while(1){m=j+(z<<2)|0;H[m>>2]=H[E+36>>2];H[m+4>>2]=H[E+112>>2];H[m+8>>2]=H[E+188>>2];H[m+12>>2]=H[E+264>>2];z=z+4|0;E=E+304|0;h=h+4|0;if((n|0)!=(h|0)){continue}break}if(!o){break fb}}while(1){H[j+(z<<2)>>2]=H[E+36>>2];z=z+1|0;E=E+76|0;g=g+1|0;if((o|0)!=(g|0)){continue}break}}h=H[v+5608>>2];g=j;n=0;i=Fa(l<<3);j=0;jb:{if(!i){break jb}if(!(!b|!l)){j=b;k=i+(l<<2)|0;s=l&-4;p=l&3;r=l>>>0<4;while(1){w=0;o=0;b=0;kb:{if(!r){while(1){b=w<<2;L[b+i>>2]=L[H[b+g>>2]>>2];m=b|4;L[m+i>>2]=L[H[g+m>>2]>>2];m=b|8;L[m+i>>2]=L[H[g+m>>2]>>2];b=b|12;L[b+i>>2]=L[H[b+g>>2]>>2];w=w+4|0;o=o+4|0;if((s|0)!=(o|0)){continue}break}b=w;if(!p){break kb}}w=0;while(1){m=b<<2;L[m+i>>2]=L[H[g+m>>2]>>2];b=b+1|0;w=w+1|0;if((p|0)!=(w|0)){continue}break}}m=0;b=h;while(1){u=m<<2;v=u+k|0;H[v>>2]=0;da=O(0);w=0;o=0;lb:{if(!r){while(1){q=i+(w<<2)|0;da=O(O(L[b>>2]*L[q>>2])+da);L[v>>2]=da;da=O(O(L[b+4>>2]*L[q+4>>2])+da);L[v>>2]=da;da=O(O(L[b+8>>2]*L[q+8>>2])+da);L[v>>2]=da;da=O(O(L[b+12>>2]*L[q+12>>2])+da);L[v>>2]=da;w=w+4|0;b=b+16|0;o=o+4|0;if((s|0)!=(o|0)){continue}break}o=w;if(!p){break lb}}w=0;while(1){da=O(O(L[b>>2]*L[i+(o<<2)>>2])+da);L[v>>2]=da;o=o+1|0;b=b+4|0;w=w+1|0;if((p|0)!=(w|0)){continue}break}}w=g+u|0;o=H[w>>2];H[w>>2]=o+4;L[o>>2]=da;m=m+1|0;if((l|0)!=(m|0)){continue}break}n=n+1|0;if((j|0)!=(n|0)){continue}break}}Ca(i);j=1}b=j;Ca(g);if(b){break ab}break b}if(H[H[v+5584>>2]+20>>2]==1){if(j){$b(H[E+36>>2],H[E+112>>2],H[E+188>>2],b);break ab}$b(H[E+52>>2],H[E+128>>2],H[E+204>>2],b);break ab}if(j){_b(H[E+36>>2],H[E+112>>2],H[E+188>>2],b);break ab}_b(H[E+52>>2],H[E+128>>2],H[E+204>>2],b);break ab}H[pa>>2]=o;Ba(f,1,10150,pa)}q=H[H[D+20>>2]>>2];if(!H[q+16>>2]){X=1;break b}s=H[D+68>>2];n=H[q+20>>2];b=H[H[D+32>>2]+5584>>2];m=H[H[D+24>>2]+24>>2];j=0;while(1){mb:{if(H[s+(j<<2)>>2]?0:s){break mb}h=H[n+28>>2];g=h+N(H[m+36>>2],152)|0;nb:{if(!H[D+64>>2]){h=H[g+148>>2]-H[g+140>>2]|0;w=H[g+144>>2]-H[g+136>>2]|0;l=0;o=52;break nb}h=h+N(H[n+24>>2],152)|0;w=H[g+8>>2]-H[g>>2]|0;l=H[h-144>>2]-(w+H[h-152>>2]|0)|0;h=H[g+12>>2]-H[g+4>>2]|0;o=36}g=H[m+24>>2];ob:{if(H[m+32>>2]){g=1<>2];if(H[b+20>>2]==1){v=w&-2;p=w&1;E=0;l=l<<2;while(1){o=0;pb:{if((w|0)!=1){while(1){g=H[b+1076>>2]+H[X>>2]|0;H[X>>2]=(g|0)<(i|0)?i:(g|0)<(z|0)?g:z;g=H[b+1076>>2]+H[X+4>>2]|0;H[X+4>>2]=(g|0)<(i|0)?i:(g|0)<(z|0)?g:z;X=X+8|0;o=o+2|0;if((v|0)!=(o|0)){continue}break}if(!p){break pb}}g=H[b+1076>>2]+H[X>>2]|0;H[X>>2]=(g|0)<(i|0)?i:(g|0)<(z|0)?g:z;X=X+4|0}X=l+X|0;E=E+1|0;if((E|0)!=(h|0)){continue}break}break mb}r=i>>31;g=0;while(1){o=0;while(1){da=L[X>>2];p=z;qb:{if(da>O(2147483648)){break qb}p=i;if(da>2];Xa=O(T(da));ob=O(da-Xa);if(obO(.5)){break rb}da=O(Xa*O(.5));Za=O(da-O(T(da)))==O(0)?Xa:Za}}p=~~Za;v=k+p|0;k=(k>>31)+(p>>31)|0;p=p>>>0>v>>>0?k+1|0:k;p=(p|0)<=(r|0)&i>>>0>v>>>0|(p|0)<(r|0)?i:v>>>0>>0&(p|0)<=0|(p|0)<0?v:z}H[X>>2]=p;X=X+4|0;o=o+1|0;if((w|0)!=(o|0)){continue}break}X=(l<<2)+X|0;g=g+1|0;if((h|0)!=(g|0)){continue}break}}n=n+76|0;b=b+1080|0;m=m+52|0;X=1;j=j+1|0;if(j>>>0>2]){continue}break}break b}X=0;Ba(f,1,3372,0)}na=pa+16|0;if(!X){ib(ya);H[a+8>>2]=H[a+8>>2]|32768;Ba(f,1,11451,0);break a}sb:{if(!c){break sb}b=0;m=H[a+232>>2];g=Ob(m,1);if(!((g|0)==-1|d>>>0>>0)){tb:{b=1;d=H[m+24>>2];if(!H[d+16>>2]){break tb}h=H[d+24>>2];n=H[H[H[m+20>>2]>>2]+20>>2];while(1){b=H[h+24>>2];j=b&7;l=b>>>3|0;d=H[n+28>>2];b=d+N(H[h+36>>2],152)|0;ub:{if(H[m+64>>2]){g=d+N(H[n+24>>2],152)|0;d=H[b+8>>2]-H[b>>2]|0;o=H[g-144>>2]-(d+H[g-152>>2]|0)|0;g=H[b+12>>2]-H[b+4>>2]|0;b=36;break ub}g=H[b+148>>2]-H[b+140>>2]|0;d=H[b+144>>2]-H[b+136>>2]|0;o=0;b=52}b=H[b+n>>2];vb:{wb:{switch((l+((j|0)!=0)|0)-1|0){case 2:case 3:if(!g){break vb}d=d<<2;if((g|0)!=1){j=g&1;l=g&-2;g=0;while(1){i=!d;if(!i){B(c,b,d)}w=o<<2;b=w+(b+d|0)|0;c=c+d|0;if(!i){B(c,b,d)}c=c+d|0;b=w+(b+d|0)|0;g=g+2|0;if((l|0)!=(g|0)){continue}break}if(!j){break vb}}if(d){B(c,b,d)}c=c+d|0;break vb;case 0:j=!g|!d;if(H[h+32>>2]){if(j){break vb}i=d&-8;l=d&7;j=0;w=d-1>>>0<7;while(1){d=0;xb:{if(!w){while(1){F[c|0]=H[b>>2];F[c+1|0]=H[b+4>>2];F[c+2|0]=H[b+8>>2];F[c+3|0]=H[b+12>>2];F[c+4|0]=H[b+16>>2];F[c+5|0]=H[b+20>>2];F[c+6|0]=H[b+24>>2];F[c+7|0]=H[b+28>>2];c=c+8|0;b=b+32|0;d=d+8|0;if((i|0)!=(d|0)){continue}break}if(!l){break xb}}d=0;while(1){F[c|0]=H[b>>2];c=c+1|0;b=b+4|0;d=d+1|0;if((l|0)!=(d|0)){continue}break}}b=(o<<2)+b|0;j=j+1|0;if((j|0)!=(g|0)){continue}break}break vb}if(j){break vb}i=d&-8;l=d&7;j=0;w=d-1>>>0<7;o=o<<2;while(1){d=0;yb:{if(!w){while(1){F[c|0]=H[b>>2];F[c+1|0]=H[b+4>>2];F[c+2|0]=H[b+8>>2];F[c+3|0]=H[b+12>>2];F[c+4|0]=H[b+16>>2];F[c+5|0]=H[b+20>>2];F[c+6|0]=H[b+24>>2];F[c+7|0]=H[b+28>>2];c=c+8|0;b=b+32|0;d=d+8|0;if((i|0)!=(d|0)){continue}break}if(!l){break yb}}d=0;while(1){F[c|0]=H[b>>2];c=c+1|0;b=b+4|0;d=d+1|0;if((l|0)!=(d|0)){continue}break}}b=b+o|0;j=j+1|0;if((j|0)!=(g|0)){continue}break};break vb;case 1:break wb;default:break vb}}j=!g|!d;if(H[h+32>>2]){if(j){break vb}i=d&-8;l=d&7;j=0;w=d-1>>>0<7;while(1){d=0;zb:{if(!w){while(1){G[c>>1]=H[b>>2];G[c+2>>1]=H[b+4>>2];G[c+4>>1]=H[b+8>>2];G[c+6>>1]=H[b+12>>2];G[c+8>>1]=H[b+16>>2];G[c+10>>1]=H[b+20>>2];G[c+12>>1]=H[b+24>>2];G[c+14>>1]=H[b+28>>2];c=c+16|0;b=b+32|0;d=d+8|0;if((i|0)!=(d|0)){continue}break}if(!l){break zb}}d=0;while(1){G[c>>1]=H[b>>2];c=c+2|0;b=b+4|0;d=d+1|0;if((l|0)!=(d|0)){continue}break}}b=(o<<2)+b|0;j=j+1|0;if((j|0)!=(g|0)){continue}break}break vb}if(j){break vb}i=d&-8;l=d&7;j=0;w=d-1>>>0<7;while(1){d=0;Ab:{if(!w){while(1){G[c>>1]=H[b>>2];G[c+2>>1]=H[b+4>>2];G[c+4>>1]=H[b+8>>2];G[c+6>>1]=H[b+12>>2];G[c+8>>1]=H[b+16>>2];G[c+10>>1]=H[b+20>>2];G[c+12>>1]=H[b+24>>2];G[c+14>>1]=H[b+28>>2];c=c+16|0;b=b+32|0;d=d+8|0;if((i|0)!=(d|0)){continue}break}if(!l){break Ab}}d=0;while(1){G[c>>1]=H[b>>2];c=c+2|0;b=b+4|0;d=d+1|0;if((l|0)!=(d|0)){continue}break}}b=(o<<2)+b|0;j=j+1|0;if((j|0)!=(g|0)){continue}break}}n=n+76|0;h=h+52|0;b=1;pb=pb+1|0;if(pb>>>0>2]+16>>2]){continue}break}}}if(!b){break a}b=H[ya+5596>>2];if(!b){break sb}Ca(b);H[ya+5596>>2]=0;H[ya+5600>>2]=0}F[a+92|0]=I[a+92|0]&254;H[a+8>>2]=H[a+8>>2]&-129;kb=1;c=Pa(e);b=H[a+8>>2];if(!(c|qa)&(b|0)==64|(b|0)==256){break a}if((Ja(e,za+10|0,2,f)|0)!=2){Ba(f,H[a+208>>2]?1:2,2472,0);kb=!H[a+208>>2];break a}Da(za+10|0,za+12|0,2);b=H[za+12>>2];if((b|0)==65424){break a}if((b|0)==65497){H[a+8>>2]=256;H[a+228>>2]=0;break a}if(!(Pa(e)|qa)){H[a+8>>2]=64;Ba(f,2,8419,0);break a}kb=0;Ba(f,1,8306,0)}na=za+16|0;return kb|0}function bb(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,C=0,D=0,E=0,J=0,M=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,oa=0,pa=0,sa=O(0);s=na-80|0;na=s;H[s+40>>2]=65424;u=N(H[a+132>>2],H[a+128>>2]);a:{b:{c:{n=H[a+8>>2];d:{if((n|0)!=8){j=0;if((n|0)!=256){break a}H[s+40>>2]=65497;break d}if(F[a+92|0]&1){break d}T=u&-2;A=u&1;M=s+77|0;S=s+76|0;P=s+72|0;n=65424;e:{f:{while(1){g:{h:{i:{j:{k:{l:{m:{n:{o=H[a+84>>2];if(!o){break n}l=H[a+80>>2];if(o>>>0<=l>>>0){break n}n=H[a+88>>2]+(l<<3)|0;o=H[n>>2];n=H[n+4>>2];H[a+80>>2]=l+1;if(!ab(j,o,n,k)){Ba(k,1,5440,0);j=0;break a}if((Ja(j,H[a+16>>2],2,k)|0)!=2){Ba(k,1,2472,0);j=0;break a}Da(H[a+16>>2],s+40|0,2);if(H[s+40>>2]==65424){break m}Ba(k,1,4073,0);j=0;break a}if((n|0)==65427){break l}}while(1){if(!(Pa(j)|qa)){H[a+8>>2]=64;break l}if((Ja(j,H[a+16>>2],2,k)|0)!=2){Ba(k,1,2472,0);j=0;break a}Da(H[a+16>>2],s+36|0,2);if(K[s+36>>2]<=1){Ba(k,1,6048,0);j=0;break a}o:{if(H[s+40>>2]!=32896){break o}if(Pa(j)|qa){break o}H[a+8>>2]=64;break l}m=H[a+8>>2];p:{if(!(m&16)){n=H[s+36>>2];break p}n=H[s+36>>2];l=H[a+24>>2];if(!l){break p}o=n+2|0;if(o>>>0>l>>>0){Ba(k,1,8370,0);j=0;break a}H[a+24>>2]=l-o}l=n-2|0;H[s+36>>2]=l;n=24912;w=H[s+40>>2];while(1){o=n;p=H[n>>2];if(p){n=n+12|0;if((p|0)!=(w|0)){continue}}break}if(!(m&H[o+4>>2])){Ba(k,1,5397,0);j=0;break a}q:{if(K[a+20>>2]>=l>>>0){n=H[a+16>>2];break q}n=Pa(j);m=qa;if((m|0)<0){l=1}else{l=(m|0)<=0&l>>>0>n>>>0}if(l){Ba(k,1,5797,0);j=0;break a}n=Ga(H[a+16>>2],H[s+36>>2]);if(!n){Ca(H[a+16>>2]);H[a+16>>2]=0;H[a+20>>2]=0;Ba(k,1,4973,0);j=0;break a}H[a+16>>2]=n;l=H[s+36>>2];H[a+20>>2]=l}n=Ja(j,n,l,k);if((n|0)!=H[s+36>>2]){Ba(k,1,2472,0);j=0;break a}l=H[o+8>>2];if(!l){Ba(k,1,11725,0);j=0;break a}if(!(ra[l|0](a,H[a+16>>2],n,k)|0)){H[s+32>>2]=H[s+40>>2];Ba(k,1,13959,s+32|0);j=0;break a}q=H[j+56>>2];m=H[s+36>>2];w=H[a+224>>2];l=H[w+40>>2];v=H[a+228>>2];r=N(v,40);n=l+r|0;x=H[n+20>>2];C=x+1|0;o=H[n+28>>2];r:{if(C>>>0<=o>>>0){n=H[n+24>>2];break r}l=~~O(O(o>>>0)+O(100))>>>0;H[n+28>>2]=l;n=Ga(H[n+24>>2],N(l,24));l=H[w+40>>2];o=r+l|0;if(!n){break k}H[o+24>>2]=n;x=H[o+20>>2];C=x+1|0}n=N(x,24)+n|0;H[n+16>>2]=m+4;o=(q-m|0)-4|0;H[n+8>>2]=o;H[n+12>>2]=o>>31;G[n>>1]=p;n=l+r|0;H[n+20>>2]=C;s:{if((p|0)!=65424){break s}l=H[n+16>>2];t:{if(!l){break t}p=H[n+12>>2];if(p>>>0>=K[n+4>>2]){break t}n=l+N(p,24)|0;H[n>>2]=o;H[n+4>>2]=0}n=(H[j+56>>2]-H[s+36>>2]|0)-4|0;l=H[a+48>>2];o=H[a+52>>2];if((o|0)>0){l=1}else{l=(o|0)>=0&l>>>0>=n>>>0}if(l){break s}H[a+48>>2]=n;H[a+52>>2]=0}if(I[a+92|0]&4){if((qb(j,H[a+24>>2],k)|0)!=H[a+24>>2]|qa){Ba(k,1,2472,0);j=0;break a}H[s+40>>2]=65427;break l}if((Ja(j,H[a+16>>2],2,k)|0)!=2){Ba(k,1,2472,0);j=0;break a}Da(H[a+16>>2],s+40|0,2);if(H[s+40>>2]!=65427){continue}break}}if(!(!(Pa(j)|qa)&H[a+8>>2]==64)){n=I[a+92|0];if(!(n&4)){l=N(H[a+228>>2],5644);o=H[a+180>>2];u:{v:{if(H[a+56>>2]){n=Pa(j);break v}n=H[a+24>>2];if(n>>>0<2){break u}}n=n-2|0;H[a+24>>2]=n}l=l+o|0;if(!n){break j}o=Pa(j);p=qa;if((p|0)<0){m=1}else{m=(p|0)<=0&n>>>0>o>>>0}if(m){if(H[a+208>>2]){Ba(k,1,5842,0);j=0;break a}Ba(k,2,5842,0)}o=H[a+24>>2];if(o>>>0>=4294967294){Ba(k,1,1480,0);j=0;break a}p=H[l+5596>>2];w:{if(p){m=H[l+5600>>2];if(m>>>0>-3-o>>>0){Ba(k,1,1211,0);j=0;break a}o=Ga(p,(m+o|0)+2|0);if(o){H[l+5596>>2]=o;break j}Ca(H[l+5596>>2]);H[l+5596>>2]=0;break w}o=Fa(o+2|0);H[l+5596>>2]=o;if(o){break j}}Ba(k,1,6176,0);j=0;break a}H[a+8>>2]=8;F[a+92|0]=n&250;break i}n=H[s+40>>2];break g}Ca(H[o+24>>2]);a=H[w+40>>2]+N(v,40)|0;H[a+28>>2]=0;H[a+20>>2]=0;H[a+24>>2]=0;Ba(k,1,3863,0);j=0;break a}o=H[j+60>>2];w=o;r=H[j+56>>2];p=r-2|0;q=o-(r>>>0<2)|0;v=H[a+224>>2];E=H[v+40>>2];U=H[a+228>>2];D=N(U,40);o=E+D|0;m=H[o+16>>2];x:{if(!m){break x}x=H[o+12>>2];if(x>>>0>=K[o+4>>2]){break x}m=m+N(x,24)|0;H[m+8>>2]=p;H[m+12>>2]=q;x=r;r=H[a+24>>2];q=x+r|0;H[m+16>>2]=q;H[m+20>>2]=q>>>0>>0?w+1|0:w}m=H[a+24>>2];x=H[o+20>>2];C=x+1|0;w=H[o+28>>2];y:{if(C>>>0<=w>>>0){q=H[o+24>>2];break y}w=~~O(O(w>>>0)+O(100))>>>0;H[o+28>>2]=w;q=Ga(H[o+24>>2],N(w,24));E=H[v+40>>2];o=D+E|0;if(!q){break f}H[o+24>>2]=q;x=H[o+20>>2];C=x+1|0}o=N(x,24)+q|0;H[o+16>>2]=m+2;H[o+8>>2]=p;H[o+12>>2]=p>>31;G[o>>1]=65427;H[(D+E|0)+20>>2]=C;z:{if(n){q=Ja(j,H[l+5596>>2]+H[l+5600>>2]|0,H[a+24>>2],k);m=8;if((q|0)==H[a+24>>2]){break z}m=64;if((q|0)!=-1){break z}Ba(k,1,2472,0);j=0;break a}q=0;m=H[a+24>>2]?64:8}H[a+8>>2]=m;H[l+5600>>2]=H[l+5600>>2]+q;A:{if(F[a+92|0]&1){break A}n=H[a+44>>2];if(H[a+76>>2]|((n|0)<0|(n|0)!=H[a+228>>2])){break A}if(!zb(j)){break A}l=H[a+228>>2];o=H[a+180>>2]+N(l,5644)|0;n=H[o+5592>>2];l=H[H[a+224>>2]+40>>2]+N(l,40)|0;if((n|0)!=H[l+4>>2]){break A}o=H[o+5588>>2]+1|0;if(n>>>0<=o>>>0){break A}B:{n=H[l+16>>2]+N(o,24)|0;l=H[n>>2];n=H[n+4>>2];if((l|0)==H[j+56>>2]&(n|0)==H[j+60>>2]){break B}if(ab(j,l,n,k)){break B}Ba(k,1,5440,0);j=0;break a}if((Ja(j,H[a+16>>2],2,k)|0)!=2){Ba(k,1,2472,0);j=0;break a}Da(H[a+16>>2],s+40|0,2);if(H[s+40>>2]==65424){break h}Ba(k,1,4073,0);j=0;break a}n=I[a+92|0];if((n&9)!=1){break i}F[a+92|0]=n|8;o=H[a+228>>2];if(H[(H[a+180>>2]+N(o,5644)|0)+5592>>2]==1){break i}if(!zb(j)){break i}n=H[j+60>>2];p=n;m=H[j+56>>2];if((n&m)==-1){break i}C:{while(1){n=1;l=s+70|0;if((Ja(j,l,2,k)|0)!=2){break C}Da(l,s- -64|0,2);if(H[s+64>>2]!=65424){break C}q=2472;if((Ja(j,l,2,k)|0)!=2){break c}Da(l,s+60|0,2);if(H[s+60>>2]!=10){q=6048;break c}H[s+60>>2]=8;l=Ja(j,s+70|0,8,k);if((l|0)!=H[s+60>>2]){break c}if((l|0)!=8){q=4047;break c}Da(s+70|0,s+56|0,2);Da(P,s+52|0,4);Da(S,s+48|0,1);Da(M,s+44|0,1);if((o|0)!=H[s+56>>2]){l=H[s+52>>2];if(l>>>0<14){break C}l=l-12|0;H[s+52>>2]=l;l=qb(j,l,k);if(!qa&H[s+52>>2]==(l|0)){continue}break C}break}n=H[s+48>>2]!=H[s+44>>2]}if(!hc(j,m,p,k)){break b}if(n){break i}F[a+92|0]=I[a+92|0]&238|16;D:{if(!u){break D}o=H[a+180>>2];q=0;n=0;if((u|0)!=1){while(1){l=o+N(q,5644)|0;p=H[l+5592>>2];if(p){H[l+5592>>2]=p+1}p=H[l+11236>>2];if(p){H[l+11236>>2]=p+1}q=q+2|0;n=n+2|0;if((T|0)!=(n|0)){continue}break}if(!A){break D}}n=o+N(q,5644)|0;l=H[n+5592>>2];if(!l){break D}H[n+5592>>2]=l+1}Ba(k,2,9035,0)}if(F[a+92|0]&1){break h}if((Ja(j,H[a+16>>2],2,k)|0)!=2){if(!(!u|(u|0)!=(H[a+228>>2]+1|0))){j=H[a+180>>2];n=0;while(1){l=j+N(n,5644)|0;if(!(H[l+5588>>2]|H[l+5592>>2])){break e}n=n+1|0;if((u|0)!=(n|0)){continue}break}}Ba(k,1,2472,0);j=0;break a}Da(H[a+16>>2],s+40|0,2)}n=H[s+40>>2];if(F[a+92|0]&1){break g}if((n|0)!=65497){continue}}break}if(H[a+8>>2]==256|(n|0)!=65497){break d}H[a+8>>2]=256;H[a+228>>2]=0;break d}Ca(H[o+24>>2]);a=H[v+40>>2]+N(U,40)|0;H[a+28>>2]=0;H[a+20>>2]=0;H[a+24>>2]=0;Ba(k,1,3863,0);j=0;break a}H[s+16>>2]=n;Ba(k,4,11004,s+16|0);H[a+228>>2]=n;H[s+40>>2]=65497;H[a+8>>2]=256}n=H[a+228>>2];j=H[a+180>>2];E:{F:{if(F[a+92|0]&1){break F}G:{H:{if(n>>>0>=u>>>0){break H}q=j+N(n,5644)|0;while(1){if(H[q+5596>>2]){break H}n=n+1|0;H[a+228>>2]=n;q=q+5644|0;if((n|0)!=(u|0)){continue}break}break G}if((n|0)!=(u|0)){break F}}H[i>>2]=0;break E}I:{J:{o=j+N(n,5644)|0;if(H[o+5172>>2]){a=6837}else{if(!(I[o+5640|0]&2)){break I}l=H[o+5160>>2];K:{if(!l){q=0;break K}p=l&3;m=H[o+5164>>2];j=0;q=0;n=0;if(l>>>0>=4){w=l&-4;l=0;while(1){u=m+(n<<3)|0;q=H[u+28>>2]+(H[u+20>>2]+(H[u+12>>2]+(H[u+4>>2]+q|0)|0)|0)|0;n=n+4|0;l=l+4|0;if((w|0)!=(l|0)){continue}break}if(!p){break K}}while(1){q=H[(m+(n<<3)|0)+4>>2]+q|0;n=n+1|0;j=j+1|0;if((p|0)!=(j|0)){continue}break}}j=Fa(q);H[o+5172>>2]=j;if(j){break J}a=4009}Ba(k,1,a,0);Ba(k,1,8059,0);j=0;break a}H[o+5180>>2]=q;q=H[o+5164>>2];j=H[o+5160>>2];if(j){l=0;n=0;while(1){u=n<<3;p=u+q|0;m=H[p>>2];if(m){j=H[p+4>>2];if(j){B(H[o+5172>>2]+l|0,m,j)}j=u+H[o+5164>>2]|0;p=H[j+4>>2];Ca(H[j>>2]);q=H[o+5164>>2];j=u+q|0;H[j>>2]=0;H[j+4>>2]=0;l=l+p|0;j=H[o+5160>>2]}n=n+1|0;if(n>>>0>>0){continue}break}}H[o+5160>>2]=0;Ca(q);H[o+5164>>2]=0;H[o+5168>>2]=H[o+5172>>2];H[o+5176>>2]=H[o+5180>>2]}n=H[a+232>>2];U=H[n+28>>2];l=H[a+228>>2];C=H[(H[U+76>>2]+N(l,5644)|0)+5584>>2];j=H[n+24>>2];W=H[j+24>>2];u=H[U+24>>2];o=(l>>>0)/(u>>>0)|0;T=H[H[n+20>>2]>>2];p=H[U+12>>2];n=H[U+4>>2]+N(p,l-N(o,u)|0)|0;l=H[j>>2];l=l>>>0>>0?n:l;H[T>>2]=l;u=n+p|0;n=n>>>0>u>>>0?-1:u;u=H[j+8>>2];n=n>>>0>>0?n:u;H[T+8>>2]=n;L:{M:{if(!((l|0)<(n|0)&(l|0)>=0)){Ba(k,1,6682,0);break M}q=H[T+20>>2];u=H[U+16>>2];n=H[U+8>>2]+N(o,u)|0;l=H[j+4>>2];l=l>>>0>>0?n:l;H[T+4>>2]=l;o=n+u|0;n=n>>>0>o>>>0?-1:o;j=H[j+12>>2];j=j>>>0>n>>>0?n:j;H[T+12>>2]=j;if(!((j|0)>(l|0)&(l|0)>=0)){Ba(k,1,6644,0);break M}N:{if(H[C+4>>2]){if(H[T+16>>2]){break N}j=1;break L}Ba(k,1,5358,0);break M}O:{P:{while(1){H[W+36>>2]=0;j=H[W>>2];l=j>>31;p=j-1|0;n=H[T>>2];o=p+n|0;m=l-!j|0;u=m+(n>>31)|0;oa=q,pa=ee(o,n>>>0>o>>>0?u+1|0:u,j,l),H[oa>>2]=pa;n=H[W+4>>2];o=n>>31;u=n-1|0;w=H[T+4>>2];r=u+w|0;v=o-!n|0;x=v+(w>>31)|0;oa=q,pa=ee(r,r>>>0>>0?x+1|0:x,n,o),H[oa+4>>2]=pa;x=p;p=H[T+8>>2];w=x+p|0;m=(p>>31)+m|0;oa=q,pa=ee(w,p>>>0>w>>>0?m+1|0:m,j,l),H[oa+8>>2]=pa;j=H[T+12>>2];H[q+16>>2]=ba;l=v+(j>>31)|0;j=j+u|0;l=j>>>0>>0?l+1|0:l;oa=q,pa=ee(j,l,n,o),H[oa+12>>2]=pa;j=H[C+4>>2];H[q+20>>2]=j;n=H[U+80>>2];H[q+24>>2]=j>>>0>>0?1:j-n|0;Ca(H[q+52>>2]);H[q+68>>2]=0;H[q+60>>2]=0;H[q+64>>2]=0;H[q+52>>2]=0;H[q+56>>2]=0;j=N(j,152);n=H[q+28>>2];Q:{if(!n){n=Fa(j);H[q+28>>2]=n;if(!n){break M}H[q+32>>2]=j;if(!j){break Q}y(n,0,j);break Q}if(j>>>0<=K[q+32>>2]){break Q}n=Ga(n,j);if(!n){Ba(k,1,3090,0);Ca(H[q+28>>2]);H[q+28>>2]=0;H[q+32>>2]=0;break M}H[q+28>>2]=n;l=H[q+32>>2];o=j-l|0;if(o){y(l+n|0,0,o)}H[q+32>>2]=j}j=H[q+20>>2];if(j){da=C+944|0;ea=C+812|0;$=C+28|0;x=H[q+28>>2];X=0;while(1){n=j-1|0;l=n&31;if((n&63)>>>0>=32){l=-1<>>32-l}o=o^-1;m=H[q>>2];p=o+m|0;u=l^-1;l=u+(m>>31)|0;m=m>>>0>p>>>0?l+1|0:l;l=n&31;if((n&63)>>>0>=32){r=m>>l}else{r=((1<>>l}H[x>>2]=r;p=H[q+4>>2];l=p+o|0;m=(p>>31)+u|0;m=l>>>0

>>0?m+1|0:m;p=n&31;if((n&63)>>>0>=32){v=m>>p}else{v=((1<>>p}H[x+4>>2]=v;p=H[q+8>>2];l=p+o|0;m=(p>>31)+u|0;m=l>>>0

>>0?m+1|0:m;p=n&31;if((n&63)>>>0>=32){m=m>>p}else{m=((1<>>p}H[x+8>>2]=m;p=H[q+12>>2];l=p+o|0;w=(p>>31)+u|0;w=l>>>0

>>0?w+1|0:w;p=n&31;if((n&63)>>>0>=32){w=w>>p}else{w=((1<>>p}H[x+12>>2]=w;D=m>>31;A=X<<2;E=H[A+ea>>2];l=E&31;if((E&63)>>>0>=32){l=1<>>32-l}M=p;p=M+m|0;S=p-1|0;l=l+D|0;p=(p>>>0>>0?l+1|0:l)-!p|0;l=E&31;if((E&63)>>>0>=32){l=p>>l}else{l=((1<>>l}M=l<>31;D=H[A+da>>2];l=D&31;if((D&63)>>>0>=32){l=-1<>>32-l}A=p^-1;p=A+w|0;l=(l^-1)+S|0;A=p>>>0>>0?l+1|0:l;l=D&31;if((D&63)>>>0>=32){l=A>>l}else{l=((1<>>l}l=l<>D:0;H[x+20>>2]=p;Z=r&-1<>E:0;H[x+16>>2]=l;be(l,0,p);if(!(!l|!qa)){break P}_=N(l,p);if(_>>>0>=107374183){break P}A=N(_,40);if(X){D=D-1|0;E=E-1|0;l=Y>>31;m=l;p=l+1|0;l=Y+1|0;Y=((l?m:p)&1)<<31|l>>>1;l=Z>>31;m=l;p=l+1|0;l=Z+1|0;Z=((l?m:p)&1)<<31|l>>>1;l=3}else{l=1}H[x+24>>2]=l;fa=1<>>0>=32){l=1<>>32-l}ca=j;w=l;j=H[C+12>>2];M=j>>>0>>0?j:D;j=M&31;if((M&63)>>>0>=32){l=-1<>>32-j}ha=m^-1;ia=l^-1;j=H[C+8>>2];S=j>>>0>>0?j:E;j=S&31;if((S&63)>>>0>=32){l=-1<>>32-j}ja=m^-1;ka=l^-1;aa=0;while(1){R:{if(!X){l=H[q+4>>2];j=l+o|0;m=(l>>31)+u|0;m=j>>>0>>0?m+1|0:m;l=n&31;if((n&63)>>>0>=32){Q=m>>l}else{Q=((1<>>l}l=H[q>>2];j=l+o|0;m=(l>>31)+u|0;m=j>>>0>>0?m+1|0:m;l=n&31;if((n&63)>>>0>=32){z=m>>l}else{z=((1<>>l}j=0;m=o;P=m;l=u;R=l;r=n;break R}j=aa+1|0;r=j>>>1|0;m=n&31;if((n&63)>>>0>=32){l=r<>>32-m;m=r<>2];m=P+r|0;l=(l^-1)+w|0;R=t>>>0>P>>>0?l+1|0:l;l=R+(r>>31)|0;r=m>>>0>>0?l+1|0:l;l=p&31;if((p&63)>>>0>=32){Q=r>>l}else{Q=((1<>>l}r=j&1;m=n&31;if((n&63)>>>0>=32){l=r<>>32-m;m=r<>2];r=m+t|0;l=(l^-1)+w|0;l=m>>>0>>0?l+1|0:l;z=l+(t>>31)|0;z=r>>>0>>0?z+1|0:z;t=p&31;if((p&63)>>>0>=32){z=z>>t}else{z=((1<>>t}r=p}t=r;J=H[q+8>>2];V=J>>31;r=H[q+12>>2];H[v+4>>2]=Q;H[v>>2]=z;H[v+16>>2]=j;Q=(r>>31)+R|0;z=r;r=r+P|0;Q=z>>>0>r>>>0?Q+1|0:Q;P=t&31;if((t&63)>>>0>=32){r=Q>>P}else{r=((1<>>P}H[v+12>>2]=r;l=l+V|0;z=l+1|0;r=l;l=m+J|0;r=l>>>0>>0?z:r;m=t&31;if((t&63)>>>0>=32){l=r>>m}else{l=((1<>>m}H[v+8>>2]=l;l=H[W+24>>2]+(!H[C+20>>2]|!j?0:(j|0)==3?2:1)|0;j=H[$>>2];oa=v,sa=O((+H[$+4>>2]*.00048828125+1)*tc(l-j|0)),L[oa+32>>2]=sa;H[v+28>>2]=(j+H[C+804>>2]|0)-1;j=H[v+20>>2];S:{T:{if(!(j|!_)){j=Fa(A);H[v+20>>2]=j;if(!j){Ba(k,1,2854,0);break M}if(A){y(j,0,A)}H[v+24>>2]=A;break T}if(A>>>0>K[v+24>>2]){j=Ga(j,A);if(!j){Ba(k,1,2854,0);Ca(H[v+20>>2]);H[v+20>>2]=0;H[v+24>>2]=0;break M}H[v+20>>2]=j;l=H[v+24>>2];m=A-l|0;if(m){y(j+l|0,0,m)}H[v+24>>2]=A}if(!_){break S}}j=H[v+20>>2];P=0;while(1){m=H[x+16>>2];l=(P>>>0)/(m>>>0)|0;m=(P-N(l,m)<>2];Q=(m|0)>(r|0)?m:r;H[j>>2]=Q;l=(l<>2];z=(l|0)>(r|0)?l:r;H[j+4>>2]=z;m=m+ga|0;r=H[v+8>>2];m=(m|0)<(r|0)?m:r;H[j+8>>2]=m;l=l+fa|0;r=H[v+12>>2];r=(l|0)<(r|0)?l:r;H[j+12>>2]=r;l=(m>>31)+ka|0;R=l+1|0;t=l;l=m+ja|0;t=m>>>0>l>>>0?R:t;Q=Q>>S;m=S&31;if((S&63)>>>0>=32){l=t>>m}else{l=((1<>>m}t=l-Q<>S;H[j+16>>2]=t;l=(r>>31)+ia|0;R=l+1|0;m=l;l=r+ha|0;r=l>>>0>>0?R:m;z=z>>M;m=M&31;if((M&63)>>>0>=32){l=r>>m}else{l=((1<>>m}l=l-z<>M;H[j+20>>2]=l;r=N(l,t);be(r,0,68);if(qa){Ba(k,1,2935,0);break M}l=N(r,68);m=H[j+24>>2];U:{V:{if(!(m|!r)){m=Fa(l);H[j+24>>2]=m;if(!m){break M}if(!l){break V}y(m,0,l);break V}if(l>>>0<=K[j+28>>2]){break U}m=Ga(m,l);if(!m){Ca(H[j+24>>2]);H[j+24>>2]=0;H[j+28>>2]=0;Ba(k,1,2549,0);break M}H[j+24>>2]=m;t=H[j+28>>2];R=l-t|0;if(!R){break V}y(m+t|0,0,R)}H[j+28>>2]=l}l=H[j+20>>2];m=H[j+16>>2];t=H[j+32>>2];W:{if(!t){l=dc(m,l,k);break W}l=bc(t,m,l,k)}H[j+32>>2]=l;l=H[j+20>>2];m=H[j+16>>2];t=H[j+36>>2];X:{if(!t){l=dc(m,l,k);break X}l=bc(t,m,l,k)}H[j+36>>2]=l;if(r){l=0;while(1){V=H[j+16>>2];R=(l>>>0)/(V>>>0)|0;m=H[j+24>>2]+N(l,68)|0;J=H[m>>2];Y:{if(J){la=H[m+56>>2];ma=H[m+4>>2];t=H[m+48>>2];Ca(H[m+60>>2]);H[m+48>>2]=0;H[m+52>>2]=0;H[m+64>>2]=0;H[m+56>>2]=0;H[m+60>>2]=0;H[m+40>>2]=0;H[m+44>>2]=0;H[m+32>>2]=0;H[m+36>>2]=0;H[m+24>>2]=0;H[m+28>>2]=0;H[m+16>>2]=0;H[m+20>>2]=0;H[m+8>>2]=0;H[m+12>>2]=0;H[m>>2]=J;H[m+48>>2]=t;Z:{if(!t){break Z}t=N(t,24);if(!t){break Z}y(J,0,t)}H[m+56>>2]=la;H[m+4>>2]=ma;break Y}t=Ea(10,24);H[m>>2]=t;if(!t){break M}H[m+48>>2]=10}t=(l-N(R,V)|0)+Q|0;J=t<>2];H[m+8>>2]=(J|0)>(V|0)?J:V;R=z+R|0;J=R<>2];H[m+12>>2]=(J|0)>(V|0)?J:V;t=t+1<>2];H[m+16>>2]=(t|0)<(J|0)?t:J;J=m;m=R+1<>2];H[J+20>>2]=(m|0)<(t|0)?m:t;l=l+1|0;if((r|0)!=(l|0)){continue}break}}j=j+40|0;P=P+1|0;if((P|0)!=(_|0)){continue}break}}$=$+8|0;v=v+36|0;aa=aa+1|0;if(aa>>>0>2]){continue}break}x=x+152|0;j=n;X=X+1|0;if(X>>>0>2]){continue}break}}W=W+52|0;q=q+76|0;C=C+1080|0;ba=ba+1|0;if(ba>>>0>2]){continue}break}j=1;break L}Ba(k,1,2982,0);break M}Ba(k,1,2373,0)}j=0}if(!j){Ba(k,1,3668,0);j=0;break a}j=H[a+228>>2];H[s+4>>2]=N(H[a+128>>2],H[a+132>>2]);H[s>>2]=j+1;Ba(k,4,11825,s);H[b>>2]=H[a+228>>2];H[i>>2]=1;if(c){b=Ob(H[a+232>>2],0);H[c>>2]=b;j=0;if((b|0)==-1){break a}}b=H[H[H[a+232>>2]+20>>2]>>2];H[d>>2]=H[b>>2];H[e>>2]=H[b+4>>2];H[f>>2]=H[b+8>>2];H[g>>2]=H[b+12>>2];H[h>>2]=H[b+16>>2];H[a+8>>2]=H[a+8>>2]|128}j=1;break a}Ba(k,1,q,0)}Ba(k,1,3702,0);j=0}a=j;na=s+80|0;return a|0}function Sb(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,L=0,M=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0;a:{b:{c:{d:{e:{f:{g:{h:{i:{j:{switch(H[a+84>>2]){case 0:k:{b=H[a+52>>2];c=H[a+196>>2];if(b>>>0>>0){d=H[a+64>>2];if(d>>>0>>0){break k}}Ba(H[a+236>>2],1,8491,0);break b}if(!H[a+44>>2]){p=H[a+36>>2];c=0;break i}H[a+44>>2]=0;q=H[a+68>>2];c=1;break i;case 1:l:{b=H[a+52>>2];c=H[a+196>>2];if(b>>>0>>0){d=H[a+64>>2];if(d>>>0>>0){break l}}Ba(H[a+236>>2],1,8536,0);break b}if(!H[a+44>>2]){n=H[a+36>>2];c=0;break e}H[a+44>>2]=0;w=H[a+48>>2];c=1;break e;case 2:m:{B=H[a+52>>2];z=H[a+196>>2];if(B>>>0>>0){P=H[a+64>>2];if(P>>>0>>0){break m}}Ba(H[a+236>>2],1,8671,0);break b}if(!H[a+44>>2]){p=H[a+40>>2];break f}H[a+228>>2]=0;H[a+232>>2]=0;H[a+44>>2]=0;i=H[a+200>>2];while(1){O=i+(w<<4)|0;j=H[O+8>>2];if(j){v=H[O+12>>2];c=0;while(1){f=j+(c^-1)|0;d=v+(c<<4)|0;s=f+H[d>>2]|0;n:{if(s>>>0>31){break n}b=H[O>>2];if(b>>>0>-1>>>s>>>0){break n}b=b<>>0>n>>>0?n:b:b;H[a+228>>2]=n}f=f+H[d+4>>2]|0;o:{if(f>>>0>31){break o}b=H[O+4>>2];if(b>>>0>-1>>>f>>>0){break o}b=b<>>0>t>>>0?t:b:b;H[a+232>>2]=t}c=c+1|0;if((j|0)!=(c|0)){continue}break}}w=w+1|0;if((z|0)!=(w|0)){continue}break};if(!n|!t){break d}if(!I[a|0]){H[a+108>>2]=H[a+208>>2];H[a+100>>2]=H[a+204>>2];H[a+112>>2]=H[a+216>>2];H[a+104>>2]=H[a+212>>2]}n=H[a+48>>2];c=1;break f;case 3:p:{B=H[a+52>>2];j=H[a+196>>2];if(B>>>0>>0){P=H[a+64>>2];if(P>>>0>>0){break p}}Ba(H[a+236>>2],1,8626,0);break b}if(!H[a+44>>2]){w=H[a+200>>2];e=H[a+28>>2];Q=w+(e<<4)|0;E=H[a+40>>2];break g}H[a+228>>2]=0;H[a+232>>2]=0;H[a+44>>2]=0;w=H[a+200>>2];while(1){z=(q<<4)+w|0;s=H[z+8>>2];if(s){v=H[z+12>>2];c=0;while(1){f=s+(c^-1)|0;d=v+(c<<4)|0;i=f+H[d>>2]|0;q:{if(i>>>0>31){break q}b=H[z>>2];if(b>>>0>-1>>>i>>>0){break q}b=b<>>0>p>>>0?p:b:b;H[a+228>>2]=p}f=f+H[d+4>>2]|0;r:{if(f>>>0>31){break r}b=H[z+4>>2];if(b>>>0>-1>>>f>>>0){break r}b=b<>>0>n>>>0?n:b:b;H[a+232>>2]=n}c=c+1|0;if((s|0)!=(c|0)){continue}break}}q=q+1|0;if((j|0)!=(q|0)){continue}break};if(!p|!n){break d}s:{if(I[a|0]){n=H[a+108>>2];break s}n=H[a+208>>2];H[a+108>>2]=n;H[a+100>>2]=H[a+204>>2];H[a+112>>2]=H[a+216>>2];H[a+104>>2]=H[a+212>>2]}c=1;break g;case 4:break j;default:break d}}t:{q=H[a+52>>2];b=H[a+196>>2];if(q>>>0>>0){k=H[a+64>>2];if(k>>>0>>0){break t}}Ba(H[a+236>>2],1,8581,0);break d}if(!H[a+44>>2]){q=H[a+28>>2];r=H[a+200>>2]+(q<<4)|0;t=H[a+40>>2];break h}H[a+28>>2]=q;H[a+44>>2]=0;e=1;break h}u:while(1){v:{w:{if(!c){p=p+1|0;break w}H[a+40>>2]=q;if(K[a+56>>2]<=q>>>0){break b}n=H[a+48>>2];c=0;break v}c=1}x:while(1){y:{z:{A:{B:{if(!c){H[a+32>>2]=n;if(K[a+60>>2]<=n>>>0){break B}H[a+28>>2]=b;c=b;e=0;break y}H[a+36>>2]=p;if(K[a+76>>2]<=p>>>0){c=H[a+28>>2];e=1;break y}c=((N(H[a+16>>2],H[a+32>>2])+N(H[a+12>>2],H[a+40>>2])|0)+N(H[a+20>>2],H[a+28>>2])|0)+N(H[a+24>>2],p)|0;if(c>>>0>=K[a+8>>2]){break c}c=H[a+4>>2]+(c<<1)|0;if(J[c>>1]){break A}break a}q=H[a+40>>2]+1|0;break z}c=0;continue u}c=1;continue u}while(1){C:{D:{E:{if(!e){if(c>>>0>=d>>>0){break E}e=H[a+32>>2];f=H[a+200>>2]+(c<<4)|0;if(e>>>0>=K[f+8>>2]){break C}if(!I[a|0]){c=H[f+12>>2]+(e<<4)|0;H[a+76>>2]=N(H[c+12>>2],H[c+8>>2])}p=H[a+72>>2];c=1;continue x}c=c+1|0;H[a+28>>2]=c;break D}n=H[a+32>>2]+1|0;c=0;continue x}e=0;continue}e=1;continue}}}}F:while(1){G:{H:{if(!e){t=t+1|0;H[a+40>>2]=t;break H}if(k>>>0<=q>>>0){break b}H[a+228>>2]=0;H[a+232>>2]=0;r=H[a+200>>2]+(q<<4)|0;s=H[r+8>>2];if(!s){break b}v=H[r+12>>2];p=0;n=0;e=0;while(1){f=s+(e^-1)|0;d=v+(e<<4)|0;i=f+H[d>>2]|0;I:{if(i>>>0>31){break I}b=H[r>>2];if(b>>>0>-1>>>i>>>0){break I}b=b<>>0>n>>>0?n:b:b;H[a+228>>2]=n}f=f+H[d+4>>2]|0;J:{if(f>>>0>31){break J}b=H[r+4>>2];if(b>>>0>-1>>>f>>>0){break J}b=b<>>0>p>>>0?p:b:b;H[a+232>>2]=p}e=e+1|0;if((s|0)!=(e|0)){continue}break}if(!n|!p){break d}K:{if(I[a|0]){w=H[a+108>>2];break K}w=H[a+208>>2];H[a+108>>2]=w;H[a+100>>2]=H[a+204>>2];H[a+112>>2]=H[a+216>>2];H[a+104>>2]=H[a+212>>2]}e=0;break G}e=1}L:while(1){M:{N:{O:{P:{if(!e){H[a+224>>2]=w;if(K[a+112>>2]<=w>>>0){break P}Q=H[a+100>>2];e=0;break M}if(K[a+56>>2]<=t>>>0){c=H[a+32>>2];e=1;break M}b=((N(H[a+16>>2],H[a+32>>2])+N(H[a+12>>2],t)|0)+N(H[a+20>>2],q)|0)+N(H[a+24>>2],H[a+36>>2])|0;if(b>>>0>=K[a+8>>2]){break c}b=H[a+4>>2]+(b<<1)|0;if(J[b>>1]){break O}G[b>>1]=1;return 1}q=q+1|0;H[a+28>>2]=q;break N}e=0;continue F}e=1;continue F}while(1){Q:{R:{S:{T:{if(!e){H[a+220>>2]=Q;if(K[a+104>>2]<=Q>>>0){break S}c=H[a+48>>2];break T}c=c+1|0}H[a+32>>2]=c;b=H[a+60>>2];d=H[r+8>>2];if((b>>>0>>0?b:d)>>>0>c>>>0){f=H[r>>2];e=f;o=d+(c^-1)|0;l=o;d=l&31;if((l&63)>>>0>=32){b=f<>>32-d;x=f<>>0>=32){b=b>>>d|0}else{b=((1<>>d}if((v|0)!=(b|0)){break Q}b=l&31;if((l&63)>>>0>=32){b=-1>>>b|0}else{b=(1<>>b}e=H[r+4>>2];if((b&e)!=(e|0)){break Q}d=l&31;if((l&63)>>>0>=32){b=e<>>32-d;y=e<>2];i=F+d|0;O=fe(i,d>>>0>i>>>0?h+1|0:h,y,b);b=h;L=H[a+208>>2];d=F+L|0;b=L>>>0>d>>>0?b+1|0:b;s=fe(d,b,y,C);B=x-1|0;i=H[a+212>>2];j=B+i|0;d=g-!x|0;b=d;z=fe(j,j>>>0>>0?b+1|0:b,x,g);A=H[a+204>>2];i=A+B|0;b=A>>>0>i>>>0?b+1|0:b;i=fe(i,b,x,g);D=H[r+12>>2]+(c<<4)|0;M=H[D>>2];u=M+o|0;b=u&31;if((u&63)>>>0>=32){b=-1>>>b|0}else{b=(1<>>b}if((f|0)!=(b&f)){break Q}h=e;P=H[D+4>>2];o=P+o|0;m=o&31;if((o&63)>>>0>=32){b=e<>>32-m;m=e<>>0>=32){e=b>>>j|0}else{e=((1<>>j}if((h|0)!=(e|0)){break Q}j=H[a+224>>2];m=!!(ge(j,m,b)|qa);b=o&31;if((o&63)>>>0>=32){h=-1<>>32-b;b=-1<>>0>=32){h=o<>>32-m|b<>2];if((u&63)>>>0>=32){b=f<>>32-o;f=f<>>0>=32){h=-1<>>32-b;b=-1<>>0>=32){h=i<>>32-u|b<>2];if(!o|(!H[D+12>>2]|(i|0)==(z|0))){break Q}if((s|0)==(O|0)){break Q}t=H[a+68>>2];H[a+40>>2]=t;b=d;e=e+B|0;b=e>>>0>>0?b+1|0:b;f=(fe(e,b,x,g)>>>M)-(i>>>M)|0;b=v;e=j+F|0;b=e>>>0>>0?b+1|0:b;T=a,U=N(o,(fe(e,b,y,C)>>>P)-(s>>>P)|0)+f|0,H[T+36>>2]=U;e=1;continue L}e=H[a+220>>2];b=H[a+228>>2];Q=e+b-(e>>>0)%(b>>>0)|0;break R}e=H[a+224>>2];b=H[a+232>>2];w=e+b-(e>>>0)%(b>>>0)|0;e=0;continue L}e=0;continue}e=1;continue}}}}U:while(1){V:{W:{if(!c){E=E+1|0;H[a+40>>2]=E;break W}H[a+224>>2]=n;if(K[a+112>>2]<=n>>>0){break b}x=H[a+100>>2];c=0;break V}c=1}X:while(1){Y:{Z:{_:{$:{if(!c){H[a+220>>2]=x;if(K[a+104>>2]<=x>>>0){break $}H[a+28>>2]=B;e=B;c=0;break Y}if(K[a+56>>2]<=E>>>0){t=H[a+32>>2];c=1;break Y}b=((N(H[a+16>>2],H[a+32>>2])+N(H[a+12>>2],E)|0)+N(H[a+20>>2],e)|0)+N(H[a+24>>2],H[a+36>>2])|0;if(b>>>0>=K[a+8>>2]){break c}c=H[a+4>>2]+(b<<1)|0;if(J[c>>1]){break _}break a}c=H[a+224>>2];b=H[a+232>>2];n=c+b-(c>>>0)%(b>>>0)|0;break Z}c=0;continue U}c=1;continue U}while(1){aa:{ba:{ca:{da:{if(!c){if(e>>>0>=P>>>0){break ca}t=H[a+48>>2];H[a+32>>2]=t;Q=(e<<4)+w|0;break da}t=t+1|0;H[a+32>>2]=t}b=H[a+60>>2];d=H[Q+8>>2];if((b>>>0>>0?b:d)>>>0>t>>>0){f=H[Q>>2];c=f;g=d+(t^-1)|0;m=g;d=g&31;if((g&63)>>>0>=32){b=c<>>32-d;q=f<>>0>=32){b=b>>>d|0}else{b=((1<>>d}if((v|0)!=(b|0)){break aa}b=m&31;if((m&63)>>>0>=32){b=-1>>>b|0}else{b=(1<>>b}c=H[Q+4>>2];if((b&c)!=(c|0)){break aa}d=m&31;if((m&63)>>>0>=32){b=c<>>32-d;r=c<>2];i=F+d|0;O=fe(i,d>>>0>i>>>0?h+1|0:h,r,b);b=h;y=H[a+208>>2];d=y+F|0;b=y>>>0>d>>>0?b+1|0:b;s=fe(d,b,r,o);C=q-1|0;i=H[a+212>>2];j=C+i|0;d=u-!q|0;b=d;z=fe(j,j>>>0>>0?b+1|0:b,q,u);L=H[a+204>>2];i=C+L|0;b=L>>>0>i>>>0?b+1|0:b;i=fe(i,b,q,u);A=H[Q+12>>2]+(t<<4)|0;D=H[A>>2];l=D+g|0;b=l&31;if((l&63)>>>0>=32){b=-1>>>b|0}else{b=(1<>>b}if((f|0)!=(b&f)){break aa}h=c;M=H[A+4>>2];g=M+g|0;k=g&31;if((g&63)>>>0>=32){b=c<>>32-k;k=c<>>0>=32){c=b>>>j|0}else{c=((1<>>j}if((h|0)!=(c|0)){break aa}j=H[a+224>>2];k=!!(ge(j,k,b)|qa);b=g&31;if((g&63)>>>0>=32){h=-1<>>32-b;b=-1<>>0>=32){h=g<>>32-k|b<>2];if((l&63)>>>0>=32){b=f<>>32-g;g=f<>>0>=32){h=-1<>>32-b;b=-1<>>0>=32){h=g<>>32-l|b<>2];if(!g|(!H[A+12>>2]|(i|0)==(z|0))){break aa}if((s|0)==(O|0)){break aa}E=H[a+68>>2];H[a+40>>2]=E;b=d;c=c+C|0;b=c>>>0>>0?b+1|0:b;f=(fe(c,b,q,u)>>>D)-(i>>>D)|0;b=v;c=j+F|0;b=c>>>0>>0?b+1|0:b;T=a,U=N(g,(fe(c,b,r,o)>>>M)-(s>>>M)|0)+f|0,H[T+36>>2]=U;c=1;continue X}e=e+1|0;H[a+28>>2]=e;break ba}c=H[a+220>>2];b=H[a+228>>2];x=c+b-(c>>>0)%(b>>>0)|0;c=0;continue X}c=0;continue}c=1;continue}}}}ea:while(1){fa:{ga:{if(!c){p=p+1|0;H[a+40>>2]=p;break ga}H[a+32>>2]=n;if(K[a+60>>2]<=n>>>0){break b}q=H[a+108>>2];c=0;break fa}c=1}ha:while(1){ia:{ja:{ka:{la:{if(!c){H[a+224>>2]=q;if(K[a+112>>2]<=q>>>0){break la}E=H[a+100>>2];c=0;break ia}if(K[a+56>>2]<=p>>>0){e=H[a+28>>2];c=1;break ia}b=((N(H[a+16>>2],H[a+32>>2])+N(H[a+12>>2],p)|0)+N(H[a+20>>2],H[a+28>>2])|0)+N(H[a+24>>2],H[a+36>>2])|0;if(b>>>0>=K[a+8>>2]){break c}c=H[a+4>>2]+(b<<1)|0;if(J[c>>1]){break ka}break a}n=H[a+32>>2]+1|0;break ja}c=0;continue ea}c=1;continue ea}while(1){ma:{na:{oa:{pa:{if(!c){H[a+220>>2]=E;if(K[a+104>>2]<=E>>>0){break oa}H[a+28>>2]=B;e=B;break pa}e=e+1|0;H[a+28>>2]=e}if(e>>>0

>>0){l=H[a+32>>2];k=H[a+200>>2]+(e<<4)|0;b=H[k+8>>2];if(l>>>0>=b>>>0){break ma}f=H[k>>2];c=f;g=b+(l^-1)|0;m=g;d=g&31;if((g&63)>>>0>=32){b=c<>>32-d;r=f<>>0>=32){b=b>>>d|0}else{b=((1<>>d}if((v|0)!=(b|0)){break ma}b=m&31;if((m&63)>>>0>=32){b=-1>>>b|0}else{b=(1<>>b}c=H[k+4>>2];if((b&c)!=(c|0)){break ma}d=m&31;if((m&63)>>>0>=32){b=c<>>32-d;x=c<>2];i=F+d|0;O=fe(i,d>>>0>i>>>0?h+1|0:h,x,b);b=h;y=H[a+208>>2];d=y+F|0;b=y>>>0>d>>>0?b+1|0:b;s=fe(d,b,x,o);C=r-1|0;i=H[a+212>>2];j=C+i|0;d=u-!r|0;b=d;z=fe(j,j>>>0>>0?b+1|0:b,r,u);L=H[a+204>>2];i=C+L|0;b=L>>>0>i>>>0?b+1|0:b;i=fe(i,b,r,u);A=H[k+12>>2]+(l<<4)|0;D=H[A>>2];l=D+g|0;b=l&31;if((l&63)>>>0>=32){b=-1>>>b|0}else{b=(1<>>b}if((f|0)!=(b&f)){break ma}h=c;M=H[A+4>>2];g=M+g|0;k=g&31;if((g&63)>>>0>=32){b=c<>>32-k;k=c<>>0>=32){c=b>>>j|0}else{c=((1<>>j}if((h|0)!=(c|0)){break ma}j=H[a+224>>2];k=!!(ge(j,k,b)|qa);b=g&31;if((g&63)>>>0>=32){h=-1<>>32-b;b=-1<>>0>=32){h=g<>>32-k|b<>2];if((l&63)>>>0>=32){b=f<>>32-g;g=f<>>0>=32){h=-1<>>32-b;b=-1<>>0>=32){h=g<>>32-l|b<>2];if(!g|(!H[A+12>>2]|(i|0)==(z|0))){break ma}if((s|0)==(O|0)){break ma}p=H[a+68>>2];H[a+40>>2]=p;b=d;c=c+C|0;b=c>>>0>>0?b+1|0:b;f=(fe(c,b,r,u)>>>D)-(i>>>D)|0;b=v;c=j+F|0;b=c>>>0>>0?b+1|0:b;T=a,U=N(g,(fe(c,b,x,o)>>>M)-(s>>>M)|0)+f|0,H[T+36>>2]=U;c=1;continue ha}c=H[a+220>>2];b=H[a+228>>2];E=c+b-(c>>>0)%(b>>>0)|0;break na}c=H[a+224>>2];b=H[a+232>>2];q=c+b-(c>>>0)%(b>>>0)|0;c=0;continue ha}c=0;continue}c=1;continue}}}}qa:while(1){ra:{sa:{if(!c){n=n+1|0;break sa}H[a+32>>2]=w;if(K[a+60>>2]<=w>>>0){break b}p=H[a+68>>2];c=0;break ra}c=1}ta:while(1){ua:{va:{wa:{xa:{if(!c){H[a+40>>2]=p;if(K[a+56>>2]<=p>>>0){break xa}H[a+28>>2]=b;c=b;e=0;break ua}H[a+36>>2]=n;if(K[a+76>>2]<=n>>>0){c=H[a+28>>2];e=1;break ua}c=((N(H[a+16>>2],H[a+32>>2])+N(H[a+12>>2],H[a+40>>2])|0)+N(H[a+20>>2],H[a+28>>2])|0)+N(H[a+24>>2],n)|0;if(c>>>0>=K[a+8>>2]){break c}c=H[a+4>>2]+(c<<1)|0;if(J[c>>1]){break wa}break a}w=H[a+32>>2]+1|0;break va}c=0;continue qa}c=1;continue qa}while(1){ya:{za:{Aa:{if(!e){if(c>>>0>=d>>>0){break Aa}e=H[a+32>>2];f=H[a+200>>2]+(c<<4)|0;if(e>>>0>=K[f+8>>2]){break ya}if(!I[a|0]){c=H[f+12>>2]+(e<<4)|0;H[a+76>>2]=N(H[c+12>>2],H[c+8>>2])}n=H[a+72>>2];c=1;continue ta}c=c+1|0;H[a+28>>2]=c;break za}p=H[a+40>>2]+1|0;c=0;continue ta}e=0;continue}e=1;continue}}}}return 0}Ba(H[a+236>>2],1,1343,0)}return 0}G[c>>1]=1;return 1}function gd(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=O(0),w=0,x=0,z=0,A=O(0),C=O(0),D=0,E=0,G=0,J=0,K=0,L=O(0),M=O(0),P=0,Q=0,R=0;n=na-8320|0;na=n;H[n+64>>2]=0;j=2;g=H[a>>2];a:{b:{if((g|0)==176622093){break b}if((g|0)!=1375686655){if(!((g|0)!=201326592|H[a+4>>2]!=538988650)&H[a+8>>2]==176622093){break b}Y(1101);j=1;break a}j=0}g=Ea(1,96);h=0;c:{if(!g){break c}H[g+76>>2]=1;d:{e:{f:{switch(j|0){case 0:H[g+88>>2]=60;H[g+84>>2]=61;H[g+80>>2]=62;H[g+16>>2]=63;H[g+4>>2]=64;H[g+28>>2]=65;H[g+24>>2]=66;H[g+20>>2]=67;H[g>>2]=68;H[g+92>>2]=69;H[g+44>>2]=70;H[g+40>>2]=71;H[g+36>>2]=72;H[g+32>>2]=73;H[g+12>>2]=74;H[g+8>>2]=75;h=Gb();H[g+48>>2]=h;if(h){break e}break d;case 2:break f;default:break d}}H[g+88>>2]=76;H[g+84>>2]=77;H[g+80>>2]=78;H[g+16>>2]=79;H[g+4>>2]=80;H[g+92>>2]=81;H[g+44>>2]=82;H[g+40>>2]=83;H[g+36>>2]=84;H[g+32>>2]=85;H[g+28>>2]=86;H[g+24>>2]=87;H[g+20>>2]=88;H[g+12>>2]=89;H[g+8>>2]=90;H[g>>2]=91;h=Ea(1,136);g:{if(h){k=Gb();H[h>>2]=k;h:{if(!k){break h}F[h+124|0]=0;H[h+116>>2]=0;H[h+120>>2]=0;H[h+108>>2]=0;H[h+112>>2]=0;k=pb();H[h+4>>2]=k;if(!k){break h}k=pb();H[h+8>>2]=k;if(!k){break h}break g}xc(h)}h=0}H[g+48>>2]=h;if(!h){break d}}H[g+72>>2]=1;H[g+64>>2]=1;H[g+60>>2]=0;H[g+52>>2]=0;H[g+56>>2]=0;H[g+68>>2]=1;h=g;break c}Ca(g);h=0}g=h;if(g){H[g+60>>2]=0;H[g+72>>2]=92}if(g){H[g+56>>2]=0;H[g+68>>2]=93}if(g){H[g+52>>2]=0;H[g+64>>2]=94}h=n+68|0;if(h){y(h,0,8248);H[h+8248>>2]=0;H[h+8200>>2]=-1;H[h+8204>>2]=-1}if(d){H[n+8316>>2]=H[n+8316>>2]|1}H[n+60>>2]=b;H[n+56>>2]=a;H[n+52>>2]=a;j=1;b=0;h=n+52|0;i:{if(!h){break i}a=Ea(1,72);if(a){j:{H[a+64>>2]=1048576;k=Fa(1048576);H[a+32>>2]=k;if(!k){Ca(a);a=0;break j}H[a+36>>2]=k;H[a+28>>2]=2;H[a+24>>2]=3;H[a+20>>2]=4;H[a+16>>2]=5;H[a+44>>2]=6;H[a+40>>2]=8;H[a+68>>2]=H[a+68>>2]|2}}else{a=0}if(!a){break i}if(a){H[a+4>>2]=0;H[a>>2]=h}if(a){H[a+8>>2]=H[h+8>>2];H[a+12>>2]=0}if(I[a+68|0]&2){H[a+16>>2]=56}if(a){H[a+24>>2]=58}if(a){H[a+28>>2]=59}b=a}a=n+68|0;if(!g|!a){a=0}else{k:{if(!H[g+76>>2]){Ba(g+52|0,1,9902,0);a=0;break k}ra[H[g+24>>2]](H[g+48>>2],a);a=1}}if(!a){Y(1153);eb(b);gb(g);break a}if(!b|!g){a=0}else{l:{if(!H[g+76>>2]){Ba(g+52|0,1,9983,0);a=0;break l}a=ra[H[g>>2]](b,H[g+48>>2],n- -64|0,g+52|0)|0}}if(!a){Y(1181);eb(b);gb(g);Ta(H[n+64>>2]);break a}m:{if(!f){break m}if(g){a=ra[H[g+40>>2]](H[g+48>>2],f,g+52|0)|0}else{a=0}if(a){break m}Y(1116);eb(b);gb(g);Ta(H[n+64>>2]);break a}a=H[n+64>>2];n:{if(!H[g+76>>2]|(!g|!b)){a=0}else{a=ra[H[g+4>>2]](H[g+48>>2],b,a,g+52|0)|0}if(a){if(!H[g+76>>2]|(!g|!b)){a=0}else{a=ra[H[g+16>>2]](H[g+48>>2],b,g+52|0)|0}if(a){break n}}Y(1316);gb(g);eb(b);Ta(H[n+64>>2]);break a}eb(b);gb(g);l=H[n+64>>2];a=H[l+28>>2];if(a){Ca(a);l=H[n+64>>2];H[l+28>>2]=0;H[l+32>>2]=0}u=H[l+16>>2];o:{p:{if(!c){if(!(!e|(u|0)!=4)){p=1;u=4;break o}q:{b=H[l+20>>2];if(!((b|0)==3|(u|0)!=3)){a=H[l+24>>2];if(H[a>>2]!=H[a+4>>2]|H[a+52>>2]==1){break q}H[l+20>>2]=3;break p}if(u>>>0>2){break q}H[l+20>>2]=2;break o}r:{switch(b-3|0){case 2:s:{t:{if(u>>>0<4){break t}b=H[l+24>>2];a=H[b>>2];if((a|0)!=H[b+52>>2]|(a|0)!=H[b+104>>2]|(a|0)!=H[b+156>>2]){break t}a=H[b+4>>2];if((a|0)!=H[b+56>>2]|(a|0)!=H[b+108>>2]){break t}if((a|0)==H[b+160>>2]){break s}}H[n+20>>2]=1053;H[n+16>>2]=1373;Bb(8179,n+16|0);break o}f=N(H[b+12>>2],H[b+8>>2]);A=O(O(1)/O((-1<>2]^-1)>>>0));C=O(O(1)/O((-1<>2]^-1)>>>0));L=O(O(1)/O((-1<>2]^-1)>>>0));M=O(O(1)/O((-1<>2]^-1)>>>0));a=0;while(1){if((a|0)!=(f|0)){c=a<<2;g=c+H[b+148>>2]|0;h=H[g>>2];k=c+H[b+96>>2]|0;j=H[k>>2];m=c+H[b+44>>2]|0;v=O(O(1)-O(A*O(H[c+H[b+200>>2]>>2])));H[m>>2]=~~O(O(O(O(1)-O(M*O(H[m>>2])))*O(255))*v);H[k>>2]=~~O(O(O(O(1)-O(L*O(j|0)))*O(255))*v);H[g>>2]=~~O(O(O(O(1)-O(C*O(h|0)))*O(255))*v);a=a+1|0;continue}break};Ca(H[b+200>>2]);a=H[l+24>>2];H[a+128>>2]=8;H[a+76>>2]=8;H[a+24>>2]=8;H[a+200>>2]=0;H[l+20>>2]=1;a=H[l+16>>2]-1|0;H[l+16>>2]=a;i=3;while(1){if(a>>>0<=i>>>0){break o}a=H[l+24>>2]+N(i,52)|0;B(a,a+52|0,52);i=i+1|0;a=H[l+16>>2];continue};case 0:break p;case 1:break r;default:break o}}b=H[l+24>>2];a=H[b>>2];u:{v:{if((a|0)!=H[b+52>>2]|(a|0)!=H[b+104>>2]){break v}a=H[b+4>>2];if((a|0)!=H[b+56>>2]){break v}if((a|0)==H[b+108>>2]){break u}}H[n+36>>2]=1115;H[n+32>>2]=1373;Bb(8221,n+32|0);break o}a=H[b+24>>2];c=-1<>2]?0:a;h=H[b+84>>2]?0:a;k=N(H[b+12>>2],H[b+8>>2]);a=0;while(1){if((a|0)!=(k|0)){f=a<<2;j=f+H[b+44>>2]|0;m=f+H[b+148>>2]|0;v=O(H[m>>2]-g|0);i=f+H[b+96>>2]|0;A=O(H[i>>2]-h|0);C=O(H[j>>2]);f=~~O(O(O(v*O(1.4019900560379028))+O(O(A*O(-3680000008898787e-20))+C))+O(.5));H[j>>2]=(c|0)<(f|0)?c:(f|0)>0?f:0;f=~~O(O(O(v*O(-.7141128182411194))+O(O(C*O(1.0003000497817993))+O(A*O(-.34412500262260437))))+O(.5));H[i>>2]=(c|0)<(f|0)?c:(f|0)>0?f:0;f=~~O(O(O(v*O(-7999999979801942e-21))+O(O(C*O(.9998229742050171))+O(A*O(1.7720400094985962))))+O(.5));H[m>>2]=(c|0)<(f|0)?c:(f|0)>0?f:0;a=a+1|0;continue}break}H[l+20>>2]=1;break o}u=c>>>0>u>>>0?u:c;p=1;break o}w:{x:{c=H[l+24>>2];if(H[c>>2]!=1){break x}y:{switch(H[c+52>>2]-1|0){case 1:if(H[c+104>>2]!=2){break x}if(!(H[c+4>>2]!=1|H[c+56>>2]!=2|H[c+108>>2]!=2)){b=H[c+24>>2];i=H[c+148>>2];a=H[c+96>>2];j=H[c+44>>2];D=H[c+60>>2];q=H[c+8>>2];f=H[c+12>>2];c=N(q,f)<<2;g=Ia(c);h=Ia(c);k=Ia(c);if(!(!g|!h|!k)){m=-1<>2]&1;J=f-b|0;G=H[l>>2]&1;w=q-G|0;if(!b){c=g;f=h;b=k;break w}c=g;f=h;b=k;while(1){if((p|0)==(q|0)){break w}Ka(o,m,H[j>>2],0,0,c,f,b);p=p+1|0;b=b+4|0;f=f+4|0;c=c+4|0;j=j+4|0;continue}}Ca(g);Ca(h);Ca(k);break o}if(H[c+4>>2]!=1|H[c+56>>2]!=1|H[c+108>>2]!=1){break x}a=H[c+24>>2];f=H[c+148>>2];b=H[c+96>>2];i=H[c+44>>2];s=H[c+60>>2];g=H[c+8>>2];w=H[c+12>>2];c=N(g,w)<<2;h=Ia(c);k=Ia(c);m=Ia(c);if(!(!h|!k|!m)){o=-1<>2]&1;a=g-x|0;t=a>>>1|0;D=a&1;E=a&-2;a=h;j=k;c=m;while(1){if((q|0)!=(w|0)){if(x){Ka(r,o,H[i>>2],0,0,a,j,c);c=c+4|0;j=j+4|0;i=i+4|0;a=a+4|0}g=0;while(1){if(g>>>0>>0){Ka(r,o,H[i>>2],H[b>>2],H[f>>2],a,j,c);Ka(r,o,H[i+4>>2],H[b>>2],H[f>>2],a+4|0,j+4|0,c+4|0);g=g+2|0;f=f+4|0;b=b+4|0;c=c+8|0;j=j+8|0;a=a+8|0;i=i+8|0;continue}break}z:{if(!D){break z}g=H[i>>2];A:{if((s|0)==(t|0)){Ka(r,o,g,0,0,a,j,c);break A}Ka(r,o,g,H[b>>2],H[f>>2],a,j,c)}c=c+4|0;j=j+4|0;a=a+4|0;i=i+4|0;if(s>>>0<=t>>>0){break z}f=f+4|0;b=b+4|0}q=q+1|0;continue}break}Ca(H[H[l+24>>2]+44>>2]);a=H[l+24>>2];H[a+44>>2]=h;Ca(H[a+96>>2]);a=H[l+24>>2];H[a+96>>2]=k;Ca(H[a+148>>2]);a=H[l+24>>2];H[a+148>>2]=m;b=H[a+8>>2];H[a+112>>2]=b;H[a+60>>2]=b;b=H[a+12>>2];H[a+116>>2]=b;H[a+64>>2]=b;b=H[a>>2];H[a+104>>2]=b;H[a+52>>2]=b;b=H[a+4>>2];H[a+108>>2]=b;H[a+56>>2]=b;H[l+20>>2]=1;break o}Ca(h);Ca(k);Ca(m);break o;case 0:break y;default:break x}}if(H[c+104>>2]!=1|H[c+4>>2]!=1|(H[c+56>>2]!=1|H[c+108>>2]!=1)){break x}b=H[c+24>>2];i=H[c+148>>2];a=H[c+96>>2];j=H[c+44>>2];o=N(H[c+12>>2],H[c+8>>2]);c=o<<2;h=Ia(c);k=Ia(c);m=Ia(c);if(!(!h|!k|!m)){q=-1<>2],H[a>>2],H[i>>2],f,b,g);c=c+1|0;g=g+4|0;b=b+4|0;f=f+4|0;i=i+4|0;a=a+4|0;j=j+4|0;continue}break}Ca(H[H[l+24>>2]+44>>2]);a=H[l+24>>2];H[a+44>>2]=h;Ca(H[a+96>>2]);a=H[l+24>>2];H[a+96>>2]=k;Ca(H[a+148>>2]);H[H[l+24>>2]+148>>2]=m;H[l+20>>2]=1;break o}Ca(h);Ca(k);Ca(m);break o}H[n+4>>2]=463;H[n>>2]=1373;Bb(8264,n);break o}E=w>>>1|0;x=w&-2;P=J&-2;t=q<<2;while(1){if(K>>>0

>>0){p=b+t|0;r=f+t|0;q=c+t|0;s=j+t|0;if(G){Ka(o,m,H[j>>2],0,0,c,f,b);Ka(o,m,H[s>>2],H[a>>2],H[i>>2],q,r,p);p=p+4|0;r=r+4|0;q=q+4|0;s=s+4|0;f=f+4|0;c=c+4|0;j=j+4|0;b=b+4|0}z=0;while(1){if(x>>>0>z>>>0){Ka(o,m,H[j>>2],H[a>>2],H[i>>2],c,f,b);Ka(o,m,H[j+4>>2],H[a>>2],H[i>>2],c+4|0,f+4|0,b+4|0);Ka(o,m,H[s>>2],H[a>>2],H[i>>2],q,r,p);Ka(o,m,H[s+4>>2],H[a>>2],H[i>>2],q+4|0,r+4|0,p+4|0);z=z+2|0;i=i+4|0;a=a+4|0;p=p+8|0;r=r+8|0;q=q+8|0;s=s+8|0;b=b+8|0;f=f+8|0;c=c+8|0;j=j+8|0;continue}break}B:{if((w|0)==(x|0)){break B}z=H[j>>2];C:{if((D|0)==(E|0)){Ka(o,m,z,0,0,c,f,b);Ka(o,m,H[s>>2],0,0,q,r,p);break C}Ka(o,m,z,H[a>>2],H[i>>2],c,f,b);Ka(o,m,H[s>>2],H[a>>2],H[i>>2],q,r,p)}b=b+4|0;f=f+4|0;c=c+4|0;j=j+4|0;if(D>>>0<=E>>>0){break B}i=i+4|0;a=a+4|0}K=K+2|0;b=b+t|0;f=f+t|0;c=c+t|0;j=j+t|0;continue}break}D:{if(!(J&1)){break D}if(G){Ka(o,m,H[j>>2],0,0,c,f,b);f=f+4|0;c=c+4|0;j=j+4|0;b=b+4|0}p=0;while(1){if(p>>>0>>0){Ka(o,m,H[j>>2],H[a>>2],H[i>>2],c,f,b);Ka(o,m,H[j+4>>2],H[a>>2],H[i>>2],c+4|0,f+4|0,b+4|0);p=p+2|0;i=i+4|0;a=a+4|0;b=b+8|0;f=f+8|0;c=c+8|0;j=j+8|0;continue}break}if((w|0)==(x|0)){break D}j=H[j>>2];if((D|0)==(E|0)){Ka(o,m,j,0,0,c,f,b);break D}Ka(o,m,j,H[a>>2],H[i>>2],c,f,b)}Ca(H[H[l+24>>2]+44>>2]);a=H[l+24>>2];H[a+44>>2]=g;Ca(H[a+96>>2]);a=H[l+24>>2];H[a+96>>2]=h;Ca(H[a+148>>2]);a=H[l+24>>2];H[a+148>>2]=k;b=H[a+8>>2];H[a+112>>2]=b;H[a+60>>2]=b;b=H[a+12>>2];H[a+116>>2]=b;H[a+64>>2]=b;b=H[a>>2];H[a+104>>2]=b;H[a+52>>2]=b;b=H[a+4>>2];H[a+108>>2]=b;H[a+56>>2]=b;H[l+20>>2]=1;p=0}c=H[n+64>>2];if(!d){b=0;while(1){if((b|0)!=(u|0)){a=H[c+24>>2]+N(b,52)|0;d=H[a+24>>2];if((d|0)!=8){E:{if(d>>>0<=7){f=N(H[a+12>>2],H[a+8>>2]);g=H[a+44>>2];if(H[a+32>>2]){h=1<>2];k=d>>31<<7|d>>>25;Q=m,R=ee(d<<7,k,h,0),H[Q>>2]=R;i=i+1|0;continue}}d=-1<>2],0,255),qa,d,0);H[h>>2]=k;i=i+1|0;continue}}d=d-8|0;f=N(H[a+12>>2],H[a+8>>2]);g=H[a+44>>2];i=0;if(H[a+32>>2]){while(1){if((f|0)==(i|0)){break E}h=g+(i<<2)|0;H[h>>2]=H[h>>2]>>d;i=i+1|0;continue}}while(1){if((f|0)==(i|0)){break E}h=g+(i<<2)|0;H[h>>2]=H[h>>2]>>>d;i=i+1|0;continue}}H[a+24>>2]=8}b=b+1|0;continue}break}c=H[n+64>>2]}a=H[c+24>>2];b=N(H[a+12>>2],H[a+8>>2]);F:{if(!p){if(H[c+20>>2]==2){if(H[c+16>>2]==1){ma(H[a+44>>2],b|0);break F}if(!e){break F}da(H[a+44>>2],H[a+96>>2],b|0);break F}ca(H[a+44>>2],H[a+96>>2],H[a+148>>2],b|0);break F}G:{switch(u-1|0){case 0:ba(H[a+44>>2],b|0);break F;case 2:aa(H[a+44>>2],H[a+96>>2],H[a+148>>2],b|0);break F;case 3:break G;default:break F}}$(H[a+44>>2],H[a+96>>2],H[a+148>>2],H[a+200>>2],b|0)}Ta(H[n+64>>2]);j=0}na=n+8320|0;return j|0}function Zb(a,b,c,d,e,f,g,h,i){var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,C=0,D=0,E=0,F=0,G=0,I=0,J=0,L=0,M=0,O=0;j=H[a>>2];a:{if(j>>>0>>0|b>>>0>=d>>>0|b>>>0>=j>>>0){break a}j=H[a+4>>2];if(j>>>0>>0|c>>>0>=e>>>0|c>>>0>=j>>>0){break a}C=(c>>>0)/K[a+12>>2]|0;s=H[a+8>>2];E=(b>>>0)/(s>>>0)|0;J=(N(s,E)-b|0)+s|0;F=(g|0)!=8;w=c;while(1){k=H[a+12>>2];j=k;j=(c|0)==(w|0)?j-((c>>>0)%(j>>>0)|0)|0:j;m=e-w|0;r=j>>>0>>0?j:m;x=r&-4;t=r&3;L=r&-8;G=r&7;v=r-1|0;M=(g|0)==2&(r|0)==1;I=N(k-j|0,s);z=(N(w-c|0,h)<<2)+f|0;D=E;u=b;while(1){j=(b|0)==(u|0)?J:s;k=d-u|0;p=j>>>0>>0?j:k;k=s-j|0;m=D<<2;j=H[m+(H[a+24>>2]+(N(H[a+16>>2],C)<<2)|0)>>2];b:{c:{d:{e:{f:{g:{h:{i:{j:{k:{l:{m:{n:{o:{p:{q:{r:{s:{if(i){if(j){l=((I<<2)+j|0)+(k<<2)|0;j=u-b|0;if((g|0)==1){break s}m=(N(g,j)<<2)+z|0;if((p|0)==1){break r}if(M){break q}if(p>>>0<=7|F){break p}if(!r){break b}o=p&-4;k=0;while(1){j=0;while(1){H[(j<<5)+m>>2]=H[(j<<2)+l>>2];n=j|1;H[(n<<5)+m>>2]=H[(n<<2)+l>>2];n=j|2;H[(n<<5)+m>>2]=H[(n<<2)+l>>2];n=j|3;H[(n<<5)+m>>2]=H[(n<<2)+l>>2];j=j+4|0;if(o>>>0>j>>>0){continue}break}if(j>>>0

>>0){while(1){H[(j<<5)+m>>2]=H[(j<<2)+l>>2];j=j+1|0;if((p|0)!=(j|0)){continue}break}}l=(s<<2)+l|0;m=(h<<2)+m|0;k=k+1|0;if((r|0)!=(k|0)){continue}break}break b}if((g|0)==1){break o}if(!r|!p){break b}q=p&-4;n=p&3;l=(N(u-b|0,g)<<2)+z|0;o=0;A=p-1>>>0<3;while(1){j=0;k=0;m=0;t:{if(!A){while(1){H[(N(g,j)<<2)+l>>2]=0;H[(N(j|1,g)<<2)+l>>2]=0;H[(N(j|2,g)<<2)+l>>2]=0;H[(N(j|3,g)<<2)+l>>2]=0;j=j+4|0;k=k+4|0;if((q|0)!=(k|0)){continue}break}m=j;if(!n){break t}}j=0;while(1){H[(N(g,m)<<2)+l>>2]=0;m=m+1|0;j=j+1|0;if((n|0)!=(j|0)){continue}break}}l=(h<<2)+l|0;o=o+1|0;if((r|0)!=(o|0)){continue}break}break b}if(!j){j=Ea(1,N(H[a+8>>2],H[a+12>>2])<<2);if(!j){return 0}H[m+(H[a+24>>2]+(N(H[a+16>>2],C)<<2)|0)>>2]=j}l=((I<<2)+j|0)+(k<<2)|0;j=u-b|0;u:{v:{if((g|0)!=1){m=(N(g,j)<<2)+z|0;if((p|0)==1){break v}if(p>>>0<=7|F){break u}if(!r){break b}o=p&-4;k=0;while(1){j=0;while(1){H[(j<<2)+l>>2]=H[(j<<5)+m>>2];n=j|1;H[(n<<2)+l>>2]=H[(n<<5)+m>>2];n=j|2;H[(n<<2)+l>>2]=H[(n<<5)+m>>2];n=j|3;H[(n<<2)+l>>2]=H[(n<<5)+m>>2];j=j+4|0;if(o>>>0>j>>>0){continue}break}if(j>>>0

>>0){while(1){H[(j<<2)+l>>2]=H[(j<<5)+m>>2];j=j+1|0;if((p|0)!=(j|0)){continue}break}}l=(s<<2)+l|0;m=(h<<2)+m|0;k=k+1|0;if((r|0)!=(k|0)){continue}break}break b}j=(j<<2)+z|0;if((p|0)==4){break m}if(!r){break b}m=p<<2;o=0;if(v>>>0>=3){break h}break g}if(!r){break b}o=0;if(v>>>0>=3){while(1){H[l>>2]=H[m>>2];j=s<<2;l=j+l|0;k=h<<2;m=k+m|0;H[l>>2]=H[m>>2];l=j+l|0;m=k+m|0;H[l>>2]=H[m>>2];l=j+l|0;m=k+m|0;H[l>>2]=H[m>>2];l=j+l|0;m=k+m|0;o=o+4|0;if((x|0)!=(o|0)){continue}break}if(!t){break b}}j=0;while(1){H[l>>2]=H[m>>2];l=(s<<2)+l|0;m=(h<<2)+m|0;j=j+1|0;if((t|0)!=(j|0)){continue}break}break b}if(!r|!p){break b}A=p&-4;q=p&3;n=0;break k}j=(j<<2)+z|0;if((p|0)==4){break n}if(!r){break b}m=p<<2;o=0;if(v>>>0>=3){break d}break c}if(!r){break b}k=0;if(v>>>0>=3){while(1){H[m>>2]=H[l>>2];j=h<<2;o=j+m|0;m=s<<2;l=m+l|0;H[o>>2]=H[l>>2];o=j+o|0;l=l+m|0;H[o>>2]=H[l>>2];o=j+o|0;l=l+m|0;H[o>>2]=H[l>>2];l=l+m|0;m=j+o|0;k=k+4|0;if((x|0)!=(k|0)){continue}break}if(!t){break b}}j=0;while(1){H[m>>2]=H[l>>2];l=(s<<2)+l|0;m=(h<<2)+m|0;j=j+1|0;if((t|0)!=(j|0)){continue}break}break b}j=0;k=p&-4;if(k){while(1){H[(j<<3)+m>>2]=H[(j<<2)+l>>2];o=j|1;H[(o<<3)+m>>2]=H[(o<<2)+l>>2];o=j|2;H[(o<<3)+m>>2]=H[(o<<2)+l>>2];o=j|3;H[(o<<3)+m>>2]=H[(o<<2)+l>>2];j=j+4|0;if(k>>>0>j>>>0){continue}break}}if(j>>>0>=p>>>0){break b}o=0;k=j;n=p-j&3;if(n){while(1){H[(k<<3)+m>>2]=H[(k<<2)+l>>2];k=k+1|0;o=o+1|0;if((n|0)!=(o|0)){continue}break}}if(j-p>>>0>4294967292){break b}while(1){H[(k<<3)+m>>2]=H[(k<<2)+l>>2];j=k+1|0;H[(j<<3)+m>>2]=H[(j<<2)+l>>2];j=k+2|0;H[(j<<3)+m>>2]=H[(j<<2)+l>>2];j=k+3|0;H[(j<<3)+m>>2]=H[(j<<2)+l>>2];k=k+4|0;if((p|0)!=(k|0)){continue}break}break b}if(!r|!p){break b}A=p&-4;q=p&3;n=0;O=p-1>>>0<3;break l}if(!r){break b}m=p<<2;k=(u-b<<2)+z|0;o=0;if(v>>>0>=7){break f}break e}if(!r){break b}o=0;if(v>>>0>=3){while(1){k=H[l+12>>2];H[j+8>>2]=H[l+8>>2];H[j+12>>2]=k;k=H[l+4>>2];H[j>>2]=H[l>>2];H[j+4>>2]=k;k=l;l=s<<2;k=k+l|0;n=H[k+12>>2];m=h<<2;j=m+j|0;H[j+8>>2]=H[k+8>>2];H[j+12>>2]=n;n=H[k+4>>2];H[j>>2]=H[k>>2];H[j+4>>2]=n;k=l+k|0;n=H[k+12>>2];j=j+m|0;H[j+8>>2]=H[k+8>>2];H[j+12>>2]=n;n=H[k+4>>2];H[j>>2]=H[k>>2];H[j+4>>2]=n;k=l+k|0;n=H[k+12>>2];j=j+m|0;H[j+8>>2]=H[k+8>>2];H[j+12>>2]=n;n=H[k+4>>2];H[j>>2]=H[k>>2];H[j+4>>2]=n;l=l+k|0;j=j+m|0;o=o+4|0;if((x|0)!=(o|0)){continue}break}if(!t){break b}}m=0;while(1){k=H[l+12>>2];H[j+8>>2]=H[l+8>>2];H[j+12>>2]=k;k=H[l+4>>2];H[j>>2]=H[l>>2];H[j+4>>2]=k;l=(s<<2)+l|0;j=(h<<2)+j|0;m=m+1|0;if((t|0)!=(m|0)){continue}break}break b}if(!r){break b}o=0;if(v>>>0>=3){break j}break i}while(1){j=0;o=0;k=0;w:{if(!O){while(1){H[(N(g,j)<<2)+m>>2]=H[(j<<2)+l>>2];k=j|1;H[(N(k,g)<<2)+m>>2]=H[(k<<2)+l>>2];k=j|2;H[(N(k,g)<<2)+m>>2]=H[(k<<2)+l>>2];k=j|3;H[(N(k,g)<<2)+m>>2]=H[(k<<2)+l>>2];j=j+4|0;o=o+4|0;if((A|0)!=(o|0)){continue}break}k=j;if(!q){break w}}j=0;while(1){H[(N(g,k)<<2)+m>>2]=H[(k<<2)+l>>2];k=k+1|0;j=j+1|0;if((q|0)!=(j|0)){continue}break}}l=(s<<2)+l|0;m=(h<<2)+m|0;n=n+1|0;if((r|0)!=(n|0)){continue}break}break b}while(1){j=0;o=0;k=0;x:{if(p>>>0>=4){while(1){H[(j<<2)+l>>2]=H[(N(g,j)<<2)+m>>2];k=j|1;H[(k<<2)+l>>2]=H[(N(g,k)<<2)+m>>2];k=j|2;H[(k<<2)+l>>2]=H[(N(g,k)<<2)+m>>2];k=j|3;H[(k<<2)+l>>2]=H[(N(g,k)<<2)+m>>2];j=j+4|0;o=o+4|0;if((A|0)!=(o|0)){continue}break}k=j;if(!q){break x}}j=0;while(1){H[(k<<2)+l>>2]=H[(N(g,k)<<2)+m>>2];k=k+1|0;j=j+1|0;if((q|0)!=(j|0)){continue}break}}l=(s<<2)+l|0;m=(h<<2)+m|0;n=n+1|0;if((r|0)!=(n|0)){continue}break}break b}while(1){k=H[j+12>>2];H[l+8>>2]=H[j+8>>2];H[l+12>>2]=k;k=H[j+4>>2];H[l>>2]=H[j>>2];H[l+4>>2]=k;m=s<<2;k=m+l|0;l=h<<2;j=l+j|0;n=H[j+12>>2];H[k+8>>2]=H[j+8>>2];H[k+12>>2]=n;n=H[j+4>>2];H[k>>2]=H[j>>2];H[k+4>>2]=n;j=j+l|0;n=H[j+12>>2];k=k+m|0;H[k+8>>2]=H[j+8>>2];H[k+12>>2]=n;n=H[j+4>>2];H[k>>2]=H[j>>2];H[k+4>>2]=n;j=j+l|0;n=H[j+12>>2];k=k+m|0;H[k+8>>2]=H[j+8>>2];H[k+12>>2]=n;n=H[j+4>>2];H[k>>2]=H[j>>2];H[k+4>>2]=n;j=j+l|0;l=k+m|0;o=o+4|0;if((x|0)!=(o|0)){continue}break}if(!t){break b}}m=0;while(1){k=H[j+12>>2];H[l+8>>2]=H[j+8>>2];H[l+12>>2]=k;k=H[j+4>>2];H[l>>2]=H[j>>2];H[l+4>>2]=k;j=(h<<2)+j|0;l=(s<<2)+l|0;m=m+1|0;if((t|0)!=(m|0)){continue}break}break b}while(1){k=!m;if(!k){B(l,j,m)}q=j;j=h<<2;n=q+j|0;q=l;l=s<<2;q=q+l|0;if(!k){B(q,n,m)}n=j+n|0;q=l+q|0;if(!k){B(q,n,m)}n=j+n|0;q=l+q|0;if(!k){B(q,n,m)}j=j+n|0;l=l+q|0;o=o+4|0;if((x|0)!=(o|0)){continue}break}if(!t){break b}}k=0;while(1){if(m){B(l,j,m)}j=(h<<2)+j|0;l=(s<<2)+l|0;k=k+1|0;if((t|0)!=(k|0)){continue}break}break b}while(1){j=!m;if(!j){y(k,0,m)}l=k;k=h<<2;l=l+k|0;if(!j){y(l,0,m)}l=l+k|0;if(!j){y(l,0,m)}l=l+k|0;if(!j){y(l,0,m)}l=l+k|0;if(!j){y(l,0,m)}l=l+k|0;if(!j){y(l,0,m)}l=l+k|0;if(!j){y(l,0,m)}l=l+k|0;if(!j){y(l,0,m)}k=l+k|0;o=o+8|0;if((L|0)!=(o|0)){continue}break}if(!G){break b}}j=0;while(1){if(m){y(k,0,m)}k=(h<<2)+k|0;j=j+1|0;if((G|0)!=(j|0)){continue}break}break b}while(1){k=!m;if(!k){B(j,l,m)}q=l;l=s<<2;n=q+l|0;q=j;j=h<<2;q=q+j|0;if(!k){B(q,n,m)}n=l+n|0;q=j+q|0;if(!k){B(q,n,m)}n=l+n|0;q=j+q|0;if(!k){B(q,n,m)}l=l+n|0;j=j+q|0;o=o+4|0;if((x|0)!=(o|0)){continue}break}if(!t){break b}}k=0;while(1){if(m){B(j,l,m)}l=(s<<2)+l|0;j=(h<<2)+j|0;k=k+1|0;if((t|0)!=(k|0)){continue}break}}D=D+1|0;u=p+u|0;if(u>>>0>>0){continue}break}C=C+1|0;w=r+w|0;if(w>>>0>>0){continue}break}}return 1}function Gd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;if(!c){return 0}if(!Fb(H[a>>2],b,c,d)){Ba(d,1,6210,0);return 0}n=c;g=na-240|0;na=g;q=1;o=a;a:{if(H[H[a>>2]+60>>2]|H[a+128>>2]){break a}b:{c=H[a+116>>2];c:{if(!c){a=H[a+120>>2];break c}b=H[n+16>>2];a=H[o+120>>2];if(!(!a|!H[a+12>>2])){b=I[a+18|0]}d:{f=J[c+4>>1];if(f){c=H[c>>2];while(1){h=c+N(e,6)|0;i=J[h>>1];if(i>>>0>=b>>>0){H[g+180>>2]=b;H[g+176>>2]=i;Ba(d,1,13715,g+176|0);q=0;break a}e:{h=J[h+4>>1];if((h+1&65535)>>>0<2){break e}h=h-1|0;if(h>>>0>>0){break e}H[g+164>>2]=b;H[g+160>>2]=h;Ba(d,1,13715,g+160|0);q=0;break a}e=e+1|0;if((f|0)!=(e|0)){continue}break}break d}if(b){break b}break c}while(1){b=b-1|0;e=0;while(1){if(J[c+N(e,6)>>1]!=(b|0)){e=e+1|0;if((f|0)!=(e|0)){continue}break b}break}if(b){continue}break}}f:{if(!a){break f}c=H[a+12>>2];if(!c){break f}g:{b=I[a+18|0];h:{if(b){e=0;i=1;while(1){a=H[n+16>>2];f=J[c+(e<<2)>>1];if(a>>>0<=f>>>0){H[g+148>>2]=a;H[g+144>>2]=f;Ba(d,1,13715,g+144|0);i=0}e=e+1|0;if((b|0)!=(e|0)){continue}break}a=Ea(b,4);if(!a){break h}e=0;while(1){f=c+(e<<2)|0;h=I[f+2|0];i:{if(h>>>0>=2){H[g+68>>2]=h;H[g+64>>2]=e;Ba(d,1,12094,g- -64|0);i=0;break i}f=I[f+3|0];if(f>>>0>=b>>>0){H[g+128>>2]=f;Ba(d,1,12038,g+128|0);i=0;break i}j=(h|0)!=1;m=(f<<2)+a|0;if(!(j|!H[m>>2])){H[g+80>>2]=f;Ba(d,1,11527,g+80|0);i=0;break i}if(!(h|!f)){H[g+100>>2]=f;H[g+96>>2]=e;Ba(d,1,11901,g+96|0);i=0;break i}if(!(j|(e|0)==(f|0))){H[g+120>>2]=f;H[g+116>>2]=e;H[g+112>>2]=e;Ba(d,1,11937,g+112|0);i=0;break i}H[m>>2]=1}e=e+1|0;if((b|0)!=(e|0)){continue}break}i=!i;e=0;while(1){j:{f=e<<2;if(I[(c+f|0)+2|0]?H[f+a>>2]:1){e=e+1|0;if((b|0)!=(e|0)){continue}if(i&1){break j}if(H[n+16>>2]!=1){break g}e=0;while(1){if(H[(e<<2)+a>>2]){e=e+1|0;if((b|0)!=(e|0)){continue}break g}break}h=0;Ba(d,2,9253,0);f=b&3;e=0;if(b>>>0>=4){i=b&252;b=0;while(1){j=c+(e<<2)|0;F[j+3|0]=e;F[j+2|0]=1;j=e|1;m=c+(j<<2)|0;F[m+3|0]=j;F[m+2|0]=1;j=e|2;m=c+(j<<2)|0;F[m+3|0]=j;F[m+2|0]=1;j=e|3;m=c+(j<<2)|0;F[m+3|0]=j;F[m+2|0]=1;e=e+4|0;b=b+4|0;if((i|0)!=(b|0)){continue}break}if(!f){break g}}while(1){b=c+(e<<2)|0;F[b+3|0]=e;F[b+2|0]=1;e=e+1|0;h=h+1|0;if((f|0)!=(h|0)){continue}break}break g}H[g+48>>2]=e;i=1;Ba(d,1,11101,g+48|0);e=e+1|0;if((b|0)!=(e|0)){continue}}break}Ca(a);q=0;break a}a=Ea(b,4);if(a){break g}}q=0;Ba(d,1,12285,0);break a}Ca(a)}a=H[o+120>>2];k:{if(!a){break k}l=H[a+12>>2];if(!l){Ca(H[a+4>>2]);Ca(H[H[o+120>>2]+8>>2]);Ca(H[H[o+120>>2]>>2]);a=H[o+120>>2];b=H[a+12>>2];if(b){Ca(b);a=H[o+120>>2]}Ca(a);H[o+120>>2]=0;break k}m=H[n+24>>2];l:{i=I[a+18|0];m:{if(i){u=H[a>>2];h=H[a+4>>2];j=H[a+8>>2];e=0;n:{while(1){if(H[(m+N(J[l+(e<<2)>>1],52)|0)+44>>2]){e=e+1|0;if((i|0)!=(e|0)){continue}break n}break}H[g+32>>2]=e;Ba(d,1,13877,g+32|0);q=0;break a}f=Fa(N(i,52));if(!f){break m}b=0;while(1){a=l+(b<<2)|0;e=J[a>>1];c=N(I[a+2|0]?I[a+3|0]:b,52)+f|0;a=m+N(e,52)|0;H[c+48>>2]=H[a+48>>2];e=H[a+44>>2];H[c+40>>2]=H[a+40>>2];H[c+44>>2]=e;e=H[a+36>>2];H[c+32>>2]=H[a+32>>2];H[c+36>>2]=e;e=H[a+28>>2];H[c+24>>2]=H[a+24>>2];H[c+28>>2]=e;e=H[a+20>>2];H[c+16>>2]=H[a+16>>2];H[c+20>>2]=e;e=H[a+12>>2];H[c+8>>2]=H[a+8>>2];H[c+12>>2]=e;e=H[a+4>>2];H[c>>2]=H[a>>2];H[c+4>>2]=e;c=N(b,52)+f|0;a=Ia(N(H[a+8>>2],H[a+12>>2])<<2);H[c+44>>2]=a;if(!a){if(b){while(1){Ca(H[(N(b,52)+f|0)-8>>2]);b=b-1|0;if(b){continue}break}}Ca(f);q=0;Ba(d,1,13825,0);break a}H[c+24>>2]=I[b+j|0];H[c+32>>2]=I[b+h|0];b=b+1|0;if((i|0)!=(b|0)){continue}break}j=J[H[o+120>>2]+16>>1]-1|0;while(1){a=N(p,52)+f|0;c=N(H[a+12>>2],H[a+8>>2]);b=l+(p<<2)|0;e=H[(m+N(J[b>>1],52)|0)+44>>2];o:{if(!I[b+2|0]){if(!c){break o}h=H[a+44>>2];r=c&3;a=0;b=0;if(c>>>0>=4){t=c&-4;k=0;while(1){c=b<<2;H[c+h>>2]=H[c+e>>2];s=c|4;H[s+h>>2]=H[e+s>>2];s=c|8;H[s+h>>2]=H[e+s>>2];c=c|12;H[c+h>>2]=H[c+e>>2];b=b+4|0;k=k+4|0;if((t|0)!=(k|0)){continue}break}if(!r){break o}}while(1){c=b<<2;H[c+h>>2]=H[c+e>>2];b=b+1|0;a=a+1|0;if((r|0)!=(a|0)){continue}break}break o}if(!c){break o}b=I[b+3|0];a=(b<<2)+u|0;r=H[(N(b,52)+f|0)+44>>2];b=0;if((c|0)!=1){t=c&1;s=c&-2;h=0;while(1){k=b<<2;c=H[k+e>>2];H[k+r>>2]=H[a+(N(i,(c|0)>=0?(c|0)<(j|0)?c:j:0)<<2)>>2];k=k|4;c=H[k+e>>2];H[k+r>>2]=H[a+(N(i,(c|0)>=0?(c|0)<(j|0)?c:j:0)<<2)>>2];b=b+2|0;h=h+2|0;if((s|0)!=(h|0)){continue}break}if(!t){break o}}c=b<<2;b=H[c+e>>2];H[c+r>>2]=H[a+(N(i,(b|0)>=0?(b|0)<(j|0)?b:j:0)<<2)>>2]}p=p+1|0;if((i|0)!=(p|0)){continue}break}break l}f=Fa(N(i,52));if(f){break l}}q=0;Ba(d,1,13825,0);break a}a=H[n+16>>2];if(a){e=0;while(1){b=H[(m+N(e,52)|0)+44>>2];if(b){Ca(b)}e=e+1|0;if((a|0)!=(e|0)){continue}break}}Ca(m);H[n+16>>2]=i;H[n+24>>2]=f}e=H[o+116>>2];if(!e){break a}i=H[e>>2];m=J[e+4>>1];if(m){e=0;r=m-2&65535;h=1;while(1){a=H[n+16>>2];p=N(e,6)+i|0;b=J[p>>1];p:{if(a>>>0<=b>>>0){H[g+20>>2]=a;H[g+16>>2]=b;Ba(d,2,7334,g+16|0);break p}c=J[p+4>>1];if((c+1&65535)>>>0<=1){G[(H[n+24>>2]+N(b,52)|0)+48>>1]=J[p+2>>1];break p}c=c-1|0;j=c&65535;if(j>>>0>=a>>>0){H[g+4>>2]=a;H[g>>2]=j;Ba(d,2,7293,g);break p}q:{if(J[p+2>>1]|(b|0)==(j|0)){break q}f=H[n+24>>2];a=f+N(b,52)|0;H[g+232>>2]=H[a+48>>2];l=H[a+44>>2];H[g+224>>2]=H[a+40>>2];H[g+228>>2]=l;l=H[a+36>>2];H[g+216>>2]=H[a+32>>2];H[g+220>>2]=l;l=H[a+28>>2];H[g+208>>2]=H[a+24>>2];H[g+212>>2]=l;l=H[a+20>>2];H[g+200>>2]=H[a+16>>2];H[g+204>>2]=l;l=H[a+12>>2];H[g+192>>2]=H[a+8>>2];H[g+196>>2]=l;l=H[a+4>>2];H[g+184>>2]=H[a>>2];H[g+188>>2]=l;l=N(j,52);f=l+f|0;H[a+48>>2]=H[f+48>>2];k=H[f+44>>2];H[a+40>>2]=H[f+40>>2];H[a+44>>2]=k;k=H[f+36>>2];H[a+32>>2]=H[f+32>>2];H[a+36>>2]=k;k=H[f+28>>2];H[a+24>>2]=H[f+24>>2];H[a+28>>2]=k;k=H[f+20>>2];H[a+16>>2]=H[f+16>>2];H[a+20>>2]=k;k=H[f+12>>2];H[a+8>>2]=H[f+8>>2];H[a+12>>2]=k;k=H[f+4>>2];H[a>>2]=H[f>>2];H[a+4>>2]=k;a=l+H[n+24>>2]|0;H[a+48>>2]=H[g+232>>2];f=H[g+228>>2];H[a+40>>2]=H[g+224>>2];H[a+44>>2]=f;f=H[g+220>>2];H[a+32>>2]=H[g+216>>2];H[a+36>>2]=f;f=H[g+212>>2];H[a+24>>2]=H[g+208>>2];H[a+28>>2]=f;f=H[g+204>>2];H[a+16>>2]=H[g+200>>2];H[a+20>>2]=f;f=H[g+196>>2];H[a+8>>2]=H[g+192>>2];H[a+12>>2]=f;f=H[g+188>>2];H[a>>2]=H[g+184>>2];H[a+4>>2]=f;if(m>>>0<=e+1>>>0){break q}f=h;if(!(e-m&1)){a=c;f=N(f,6)+i|0;l=J[f>>1];r:{if((l|0)!=(b|0)){a=b;if((j|0)!=(l|0)){break r}}G[f>>1]=a}f=h+1|0}if((r|0)==(e&65535)){break q}while(1){a=c;l=N(f,6)+i|0;k=J[l>>1];s:{if((k|0)!=(b|0)){a=b;if((j|0)!=(k|0)){break s}}G[l>>1]=a}a=c;k=J[l+6>>1];t:{if((k|0)!=(b|0)){a=b;if((j|0)!=(k|0)){break t}}G[l+6>>1]=a}f=f+2|0;if((m|0)!=(f&65535)){continue}break}}G[(H[n+24>>2]+N(b,52)|0)+48>>1]=J[p+2>>1]}h=h+1|0;e=e+1|0;if((m|0)!=(e|0)){continue}break}e=H[o+116>>2];i=H[e>>2]}if(i){Ca(i);e=H[o+116>>2]}Ca(e);H[o+116>>2]=0;break a}q=0;Ba(d,1,9499,0)}na=g+240|0;return q|0}function Mc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;k=na-48|0;na=k;H[a+8>>2]=1;a:{b:{d=k+40|0;c:{if((Ja(b,d,2,c)|0)!=2){break c}Da(d,k+44|0,2);if(H[k+44>>2]!=65359){break c}H[a+8>>2]=2;d=H[b+56>>2];e=d-2|0;d=H[b+60>>2]-(d>>>0<2)|0;g=H[a+224>>2];H[g>>2]=e;H[g+4>>2]=d;H[k+16>>2]=e;H[k+20>>2]=d;Ba(c,4,12769,k+16|0);i=H[a+224>>2];f=H[i>>2];e=H[i+24>>2];d=e+1|0;g=H[i+32>>2];if(d>>>0<=g>>>0){g=H[i+28>>2];break b}d=~~O(O(g>>>0)+O(100))>>>0;H[i+32>>2]=d;g=Ga(H[i+28>>2],N(d,24));if(g){H[i+28>>2]=g;e=H[i+24>>2];d=e+1|0;break b}Ca(H[i+28>>2]);H[i+32>>2]=0;H[i+24>>2]=0;H[i+28>>2]=0;Ba(c,1,3899,0)}Ba(c,1,15656,0);a=0;break a}e=N(e,24)+g|0;H[e+16>>2]=2;H[e+8>>2]=f;H[e+12>>2]=f>>31;G[e>>1]=65359;H[i+24>>2]=d;if((Ja(b,H[a+16>>2],2,c)|0)!=2){Ba(c,1,2472,0);a=0;break a}Da(H[a+16>>2],k+40|0,2);d:{e:{g=H[k+40>>2];if((g|0)!=65424){while(1){e=24912;if(g>>>0<=65279){H[k>>2]=g;Ba(c,1,2268,k);a=0;break a}while(1){d=e;f=H[d>>2];if(f){e=d+12|0;if((f|0)!=(g|0)){continue}}break}f:{g:{if(f){break g}i=2;Ba(c,2,3847,0);e=2472;h:{i:{if((Ja(b,H[a+16>>2],2,c)|0)!=2){break i}while(1){Da(H[a+16>>2],k+44|0,2);f=24912;g=H[k+44>>2];if(g>>>0>=65280){while(1){d=f;j=H[d>>2];if(j){f=d+12|0;if((g|0)!=(j|0)){continue}}break}if(!(H[d+4>>2]&H[a+8>>2])){e=5397;break i}if(j){if((j|0)==65424){H[k+40>>2]=65424;break f}f=H[b+56>>2];h=H[a+224>>2];g=H[h+24>>2];e=g+1|0;d=H[h+32>>2];if(e>>>0<=d>>>0){d=H[h+28>>2];break h}d=~~O(O(d>>>0)+O(100))>>>0;H[h+32>>2]=d;d=Ga(H[h+28>>2],N(d,24));if(d){H[h+28>>2]=d;g=H[h+24>>2];e=g+1|0;break h}Ca(H[h+28>>2]);H[h+32>>2]=0;H[h+24>>2]=0;H[h+28>>2]=0;e=3899;break i}i=i+2|0}if((Ja(b,H[a+16>>2],2,c)|0)==2){continue}break}}Ba(c,1,e,0);Ba(c,1,9847,0);a=0;break a}d=N(g,24)+d|0;H[d+16>>2]=i;g=f-i|0;H[d+8>>2]=g;H[d+12>>2]=g>>31;G[d>>1]=0;H[h+24>>2]=e;H[k+40>>2]=j;g=24912;while(1){d=g;f=H[d>>2];if(!f){break g}g=d+12|0;if((f|0)!=(j|0)){continue}break}}if(!(H[d+4>>2]&H[a+8>>2])){Ba(c,1,5397,0);a=0;break a}if((Ja(b,H[a+16>>2],2,c)|0)!=2){Ba(c,1,2472,0);a=0;break a}Da(H[a+16>>2],k+36|0,2);e=H[k+36>>2];if(e>>>0<=1){Ba(c,1,6074,0);a=0;break a}e=e-2|0;H[k+36>>2]=e;g=H[a+16>>2];if(K[a+20>>2]>>0){g=Ga(g,e);if(!g){Ca(H[a+16>>2]);H[a+16>>2]=0;H[a+20>>2]=0;Ba(c,1,4973,0);a=0;break a}H[a+16>>2]=g;e=H[k+36>>2];H[a+20>>2]=e}e=Ja(b,g,e,c);if((e|0)!=H[k+36>>2]){Ba(c,1,2472,0);a=0;break a}if(!(ra[H[d+8>>2]](a,H[a+16>>2],e,c)|0)){Ba(c,1,2490,0);a=0;break a}d=H[b+56>>2];j=H[k+36>>2];h=H[a+224>>2];g=H[h+24>>2];i=g+1|0;e=H[h+32>>2];j:{if(i>>>0<=e>>>0){e=H[h+28>>2];break j}e=~~O(O(e>>>0)+O(100))>>>0;H[h+32>>2]=e;e=Ga(H[h+28>>2],N(e,24));if(!e){break d}H[h+28>>2]=e;g=H[h+24>>2];i=g+1|0}e=N(g,24)+e|0;H[e+16>>2]=j+4;d=(d-j|0)-4|0;H[e+8>>2]=d;H[e+12>>2]=d>>31;G[e>>1]=f;H[h+24>>2]=i;if((Ja(b,H[a+16>>2],2,c)|0)!=2){Ba(c,1,2472,0);a=0;break a}n=(f|0)==65372?1:n;l=(f|0)==65362?1:l;m=(f|0)==65361?1:m;Da(H[a+16>>2],k+40|0,2);g=H[k+40>>2];if((g|0)!=65424){continue}}break}if(m){break e}}Ba(c,1,4785,0);a=0;break a}if(!l){Ba(c,1,4831,0);a=0;break a}if(!n){Ba(c,1,4877,0);a=0;break a}d=0;e=0;l=0;i=na-16|0;na=i;n=1;k:{if(!(F[a+212|0]&1)){break k}l:{f=H[a+136>>2];if(!f){break l}m:{while(1){j=H[a+140>>2]+(l<<3)|0;if(H[j>>2]){h=H[j+4>>2];g=d-h|0;g=d>>>0>=g>>>0?g:0;if(d>>>0>>0){h=h-d|0;f=H[j>>2]+d|0;while(1){if(h>>>0<4){d=5671;break m}Da(f,i+12|0,4);d=H[i+12>>2];if((d^-1)>>>0>>0){d=5645;break m}j=h-4|0;m=j>>>0>>0;g=m?d-j|0:g;e=d+e|0;h=j-d|0;f=((m?0:d)+f|0)+4|0;if(d>>>0>>0){continue}break}f=H[a+136>>2]}d=g}l=l+1|0;if(l>>>0>>0){continue}break}if(!d){break l}n=0;Ba(c,1,3067,0);break k}n=0;Ba(c,1,d,0);break k}d=Fa(e);H[a+160>>2]=d;if(!d){n=0;Ba(c,1,4337,0);break k}H[a+148>>2]=e;h=H[a+140>>2];f=H[a+136>>2];if(f){e=0;d=0;g=0;while(1){l=g<<3;j=l+h|0;if(H[j>>2]){m=H[a+160>>2]+d|0;h=H[j>>2];f=H[j+4>>2];n:{if(f>>>0<=e>>>0){if(f){B(m,h,f)}d=d+f|0;e=e-f|0;break n}if(e){B(m,h,e)}d=d+e|0;f=f-e|0;e=e+h|0;while(1){if(f>>>0<=3){n=0;Ba(c,1,5671,0);break k}Da(e,i+8|0,4);e=e+4|0;h=H[a+160>>2]+d|0;f=f-4|0;j=H[i+8>>2];if(f>>>0>>0){if(f){B(h,e,f)}d=d+f|0;e=H[i+8>>2]-f|0;break n}if(j){B(h,e,j)}h=H[i+8>>2];d=h+d|0;e=e+h|0;f=f-h|0;if(f){continue}break}e=0}Ca(H[l+H[a+140>>2]>>2]);h=H[a+140>>2];f=l+h|0;H[f>>2]=0;H[f+4>>2]=0;f=H[a+136>>2]}g=g+1|0;if(g>>>0>>0){continue}break}e=H[a+148>>2];d=H[a+160>>2]}H[a+168>>2]=e;H[a+144>>2]=d;H[a+136>>2]=0;Ca(h);H[a+140>>2]=0}na=i+16|0;if(!n){Ba(c,1,8085,0);a=0;break a}Ba(c,4,11754,0);d=H[a+224>>2];e=H[b+56>>2];e=e-2|0;H[d+8>>2]=e;H[d+12>>2]=0;b=0;i=0;n=na-16|0;na=n;g=H[a+68>>2];o:{if(!g){H[a+76>>2]=1;break o}if(H[a+76>>2]){break o}d=H[a+72>>2];h=H[a+224>>2];e=H[h+40>>2];p:{if((g|0)!=1){l=g&1;j=g&-2;while(1){m=(b<<3)+d|0;o=J[m>>1];f=e+N(o,40)|0;H[f>>2]=o;H[f+8>>2]=H[f+8>>2]+1;m=J[m+8>>1];f=e+N(m,40)|0;H[f>>2]=m;H[f+8>>2]=H[f+8>>2]+1;b=b+2|0;i=i+2|0;if((j|0)!=(i|0)){continue}break}if(!l){break p}}f=J[(b<<3)+d>>1];b=e+N(f,40)|0;H[b>>2]=f;H[b+8>>2]=H[b+8>>2]+1}f=H[h+36>>2];q:{if(f){b=0;while(1){if(!H[(e+N(b,40)|0)+8>>2]){H[n>>2]=b;Ba(c,1,9304,n);break q}b=b+1|0;if((f|0)!=(b|0)){continue}break}}f=H[h+8>>2];b=H[h+12>>2];e=0;while(1){r:{l=e<<3;h=H[H[a+224>>2]+40>>2]+N(J[l+d>>1],40)|0;i=H[h+16>>2];if(!i){i=Ea(H[h+8>>2],24);H[h+16>>2]=i;if(!i){break r}g=H[a+68>>2];d=H[a+72>>2]}j=H[h+4>>2];i=N(j,24)+i|0;H[i>>2]=f;H[i+4>>2]=b;l=H[(d+l|0)+4>>2];f=l+f|0;H[i+16>>2]=f;b=f>>>0>>0?b+1|0:b;H[i+20>>2]=b;H[h+4>>2]=j+1;e=e+1|0;if(g>>>0>e>>>0){continue}break o}break}Ba(c,1,6882,0)}H[a+76>>2]=1;if(!H[a+68>>2]){break o}d=H[H[a+224>>2]+40>>2];b=0;while(1){c=N(J[H[a+72>>2]+(b<<3)>>1],40);d=c+d|0;H[d+8>>2]=0;Ca(H[d+16>>2]);d=H[H[a+224>>2]+40>>2];H[(c+d|0)+16>>2]=0;b=b+1|0;if(b>>>0>2]){continue}break}}na=n+16|0;H[a+8>>2]=8;a=1;break a}Ca(H[h+28>>2]);H[h+32>>2]=0;H[h+24>>2]=0;H[h+28>>2]=0;Ba(c,1,3899,0);a=0}na=k+48|0;return a|0}function Sd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;g=na-160|0;na=g;a:{if(c>>>0<=35){b=0;Ba(d,1,6095,0);break a}h=H[a+96>>2];c=c-36|0;f=(c>>>0)/3|0;if((N(f,3)|0)!=(c|0)){b=0;Ba(d,1,6095,0);break a}c=g+156|0;Da(b,c,2);G[a+104>>1]=H[g+156>>2];Da(b+2|0,h+8|0,4);Da(b+6|0,h+12|0,4);Da(b+10|0,h,4);Da(b+14|0,h+4|0,4);Da(b+18|0,a+116|0,4);Da(b+22|0,a+120|0,4);Da(b+26|0,a+108|0,4);Da(b+30|0,a+112|0,4);Da(b+34|0,c,2);b:{c:{d:{e:{c=H[g+156>>2];if(c>>>0<=16384){H[h+16>>2]=c;if((c|0)!=(f|0)){H[g+132>>2]=f;H[g+128>>2]=c;Ba(d,1,14980,g+128|0);break b}c=H[h+4>>2];j=H[h+12>>2];k=H[h+8>>2];e=H[h>>2];if(!(c>>>0>>0&k>>>0>e>>>0)){H[g+120>>2]=j-c;H[g+124>>2]=0-(c>>>0>j>>>0);H[g+112>>2]=k-e;H[g+116>>2]=0-(e>>>0>k>>>0);Ba(d,1,14542,g+112|0);break b}i=H[a+116>>2];l=H[a+120>>2];if(!(l?i:0)){H[g+4>>2]=l;H[g>>2]=i;Ba(d,1,15094,g);break b}f:{o=H[a+108>>2];g:{if(o>>>0>e>>>0){break g}i=i+o|0;if(e>>>0>=(i>>>0>>0?-1:i)>>>0){break g}i=H[a+112>>2];if(i>>>0>c>>>0){break g}l=i+l|0;if(c>>>0<(i>>>0>l>>>0?-1:l)>>>0){break f}}b=0;Ba(d,1,2792,0);break a}h:{if(H[a+248>>2]){break h}i=H[a+240>>2];if(!i){break h}l=H[a+244>>2];if(!l){break h}e=k-e|0;c=j-c|0;if((e|0)==(i|0)&(c|0)==(l|0)){break h}H[g+108>>2]=c;H[g+104>>2]=e;H[g+100>>2]=l;H[g+96>>2]=i;Ba(d,1,14006,g+96|0);break b}c=Ea(f,52);H[h+24>>2]=c;if(!c){break e}i:{if(!H[h+16>>2]){break i}e=g+152|0;Da(b+36|0,e,1);f=H[g+152>>2];i=f>>>7|0;H[c+32>>2]=i;l=(f&127)+1|0;H[c+24>>2]=l;j=H[a+248>>2];Da(b+37|0,e,1);H[c>>2]=H[g+152>>2];Da(b+38|0,e,1);f=H[g+152>>2];H[c+4>>2]=f;e=0;k=H[c>>2];if(k-256>>>0<4294967041|f-256>>>0<4294967041){break c}f=H[c+24>>2];if(f>>>0>31){break d}H[c+36>>2]=0;H[c+40>>2]=H[a+184>>2];e=1;if(K[h+16>>2]<=1){break i}i=j?0:i;j=j?0:l;b=b+39|0;while(1){Da(b,g+152|0,1);k=H[g+152>>2];f=k>>>7|0;H[c+84>>2]=f;k=(k&127)+1|0;H[c+76>>2]=k;if(!(H[a+248>>2]|(I[a+212|0]&4|(j|0)==(k|0)&(f|0)==(i|0)))){H[g+84>>2]=f;H[g+80>>2]=k;H[g+76>>2]=e;H[g+72>>2]=i;H[g+68>>2]=j;H[g+64>>2]=e;Ba(d,2,14778,g- -64|0)}f=g+152|0;Da(b+1|0,f,1);H[c+52>>2]=H[g+152>>2];Da(b+2|0,f,1);f=H[g+152>>2];H[c+56>>2]=f;k=H[c+52>>2];if(!(f-256>>>0>4294967040&k-256>>>0>=4294967041)){break c}f=H[c+76>>2];if(f>>>0>=32){break d}b=b+3|0;H[c+88>>2]=0;H[c+92>>2]=H[a+184>>2];c=c+52|0;e=e+1|0;if(e>>>0>2]){continue}break}}b=0;f=H[a+116>>2];if(!f){break a}j=H[a+120>>2];if(!j){break a}k=0;c=k;p=H[a+108>>2];l=H[h+8>>2]-p|0;i=f-1|0;e=l+i|0;c=l>>>0>e>>>0?c+1|0:c;e=fe(e,c,f,0);H[a+128>>2]=e;o=0;c=o;q=H[a+112>>2];n=H[h+12>>2]-q|0;m=n;l=j-1|0;n=n+l|0;c=m>>>0>n>>>0?c+1|0:c;c=fe(n,c,j,0);H[a+132>>2]=c;j:{if(!(!e|!c)){if(e>>>0<=65535/(c>>>0)>>>0){break j}}H[g+20>>2]=c;H[g+16>>2]=e;Ba(d,1,14120,g+16|0);break a}n=N(c,e);k:{if(I[a+92|0]&2){H[a+28>>2]=(H[a+28>>2]-p>>>0)/(f>>>0);H[a+32>>2]=(H[a+32>>2]-q>>>0)/(j>>>0);c=k;e=H[a+36>>2]-p|0;m=e;e=e+i|0;c=m>>>0>e>>>0?c+1|0:c;v=a,w=fe(e,c,f,0),H[v+36>>2]=w;c=o;e=H[a+40>>2]-q|0;m=e;e=e+l|0;c=m>>>0>e>>>0?c+1|0:c;v=a,w=fe(e,c,j,0),H[v+40>>2]=w;break k}H[a+40>>2]=c;H[a+36>>2]=e;H[a+28>>2]=0;H[a+32>>2]=0}c=Ea(n,5644);H[a+180>>2]=c;if(!c){Ba(d,1,3935,0);break a}c=Ea(H[h+16>>2],1080);H[H[a+12>>2]+5584>>2]=c;if(!H[H[a+12>>2]+5584>>2]){Ba(d,1,3935,0);break a}c=Ea(10,20);H[H[a+12>>2]+5616>>2]=c;c=H[a+12>>2];if(!H[c+5616>>2]){Ba(d,1,3935,0);break a}H[c+5624>>2]=10;c=Ea(10,20);H[H[a+12>>2]+5628>>2]=c;c=H[a+12>>2];if(!H[c+5628>>2]){Ba(d,1,3935,0);break a}H[c+5636>>2]=10;e=H[h+16>>2];l:{if(!e){break l}f=H[h+24>>2];c=0;if((e|0)!=1){j=e&1;k=e&-2;e=0;while(1){i=f+N(c,52)|0;if(!H[i+32>>2]){H[(H[H[a+12>>2]+5584>>2]+N(c,1080)|0)+1076>>2]=1<>2]-1}i=c|1;l=f+N(i,52)|0;if(!H[l+32>>2]){H[(H[H[a+12>>2]+5584>>2]+N(i,1080)|0)+1076>>2]=1<>2]-1}c=c+2|0;e=e+2|0;if((k|0)!=(e|0)){continue}break}if(!j){break l}}e=f+N(c,52)|0;if(H[e+32>>2]){break l}H[(H[H[a+12>>2]+5584>>2]+N(c,1080)|0)+1076>>2]=1<>2]-1}if(n){c=H[a+180>>2];e=0;while(1){f=Ea(H[h+16>>2],1080);H[c+5584>>2]=f;if(!f){Ba(d,1,3935,0);break a}c=c+5644|0;e=e+1|0;if(n>>>0>e>>>0){continue}break}}c=N(H[a+132>>2],H[a+128>>2]);H[H[a+224>>2]+36>>2]=c;c=Ea(c,40);d=H[a+224>>2];H[d+40>>2]=c;e=0;m:{if(!c){break m}e=1;if(!H[d+36>>2]){break m}d=0;while(1){n:{e=0;j=N(d,40);c=j+c|0;H[c+20>>2]=0;H[c+28>>2]=100;f=Ea(100,24);k=H[a+224>>2];c=H[k+40>>2];H[(j+c|0)+24>>2]=f;if(!f){break n}e=1;d=d+1|0;if(d>>>0>2]){continue}}break}}if(!e){break a}H[a+8>>2]=4;r=H[h+16>>2];if(r){b=H[a+112>>2];d=H[a+120>>2];c=b+N(d,H[a+132>>2]-1|0)|0;d=c+d|0;c=c>>>0>d>>>0?-1:d;d=H[h+12>>2];c=c>>>0>>0?c:d;k=c-1|0;l=0-!c|0;c=H[a+108>>2];d=H[a+116>>2];a=c+N(d,H[a+128>>2]-1|0)|0;d=a+d|0;a=a>>>0>d>>>0?-1:d;d=H[h+8>>2];a=a>>>0>>0?a:d;i=a-1|0;o=0-!a|0;a=H[h+4>>2];b=a>>>0>>0?b:a;n=b-1|0;p=0-!b|0;a=H[h>>2];b=a>>>0>>0?c:a;q=b-1|0;u=0-!b|0;a=H[h+24>>2];b=0;while(1){c=p;e=H[a+4>>2];d=e+n|0;h=fe(d,d>>>0>>0?c+1|0:c,e,0);H[a+20>>2]=h;c=u;f=H[a>>2];d=f+q|0;s=fe(d,d>>>0>>0?c+1|0:c,f,0);H[a+16>>2]=s;d=H[a+40>>2];j=d&31;if((d&63)>>>0>=32){c=-1<>>32-j}j=m^-1;c=c^-1;m=c;c=l;t=e+k|0;c=t>>>0>>0?c+1|0:c;e=fe(t,c,e,0)-h|0;c=m;h=e;e=e+j|0;c=h>>>0>e>>>0?c+1|0:c;h=e;e=d&31;if((d&63)>>>0>=32){c=c>>>e|0}else{c=((1<>>e}H[a+12>>2]=c;c=o;e=f+i|0;c=e>>>0>>0?c+1|0:c;e=fe(e,c,f,0)-s|0;c=m;e=e+j|0;c=e>>>0>>0?c+1|0:c;f=e;e=d&31;if((d&63)>>>0>=32){c=c>>>e|0}else{c=((1<>>e}H[a+8>>2]=c;a=a+52|0;b=b+1|0;if((r|0)!=(b|0)){continue}break}}b=1;break a}H[g+144>>2]=c;Ba(d,1,7932,g+144|0);break b}b=0;H[h+16>>2]=0;Ba(d,1,3935,0);break a}H[g+52>>2]=f;H[g+48>>2]=e;Ba(d,1,15402,g+48|0);break b}H[g+40>>2]=f;H[g+36>>2]=k;H[g+32>>2]=e;Ba(d,1,14340,g+32|0)}b=0}na=g+160|0;return b|0}function nc(a,b,c,d,e,f,g){var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;j=na+-64|0;na=j;H[j+60>>2]=b;y=j+41|0;z=j+39|0;u=j+40|0;a:{b:{c:{d:{e:while(1){b=0;f:while(1){if((o^2147483647)<(b|0)){break d}o=b+o|0;g:{h:{i:{j:{k=H[j+60>>2];b=k;i=I[b|0];if(i){while(1){k:{h=i&255;l:{if(!h){n=b;break l}if((h|0)!=37){break k}i=b;while(1){if(I[i+1|0]!=37){n=i;break l}b=b+1|0;h=I[i+2|0];n=i+2|0;i=n;if((h|0)==37){continue}break}}H[j+60>>2]=n;b=b-k|0;x=o^2147483647;if((b|0)>(x|0)){break d}if(a){La(a,k,b)}if(b){continue f}b=n+1|0;s=-1;h=F[n+1|0]-48|0;if(!(I[n+2|0]!=36|h>>>0>9)){v=1;s=h;b=n+3|0}H[j+60>>2]=b;p=0;i=F[b|0];m=i-32|0;m:{if(m>>>0>31){h=b;break m}h=b;n=1<>2]=h;p=n|p;i=F[b+1|0];m=i-32|0;if(m>>>0>=32){break m}b=h;n=1<>>0>9)){p:{if(!a){H[(b<<2)+e>>2]=10;q=0;break p}q=H[(b<<3)+d>>2]}b=h+3|0;v=1;break o}if(v){break j}b=h+1|0;if(!a){H[j+60>>2]=b;v=0;q=0;break n}h=H[c>>2];H[c>>2]=h+4;q=H[h>>2];v=0}H[j+60>>2]=b;if((q|0)>=0){break n}q=0-q|0;p=p|8192;break n}q=mc(j+60|0);if((q|0)<0){break d}b=H[j+60>>2]}h=0;l=-1;i=0;q:{if(I[b|0]!=46){break q}if(I[b+1|0]==42){i=F[b+2|0]-48|0;r:{if(!(I[b+3|0]!=36|i>>>0>9)){b=b+4|0;s:{if(!a){H[(i<<2)+e>>2]=10;l=0;break s}l=H[(i<<3)+d>>2]}break r}if(v){break j}b=b+2|0;l=0;if(!a){break r}i=H[c>>2];H[c>>2]=i+4;l=H[i>>2]}H[j+60>>2]=b;i=(l|0)>=0;break q}H[j+60>>2]=b+1;l=mc(j+60|0);b=H[j+60>>2];i=1}w=i;while(1){m=h;n=28;r=b;i=F[b|0];if(i-123>>>0<4294967238){break c}b=b+1|0;h=I[(i+N(h,58)|0)+25551|0];if((h-1&255)>>>0<8){continue}break}H[j+60>>2]=b;t:{if((h|0)!=27){if(!h){break c}if((s|0)>=0){if(!a){H[(s<<2)+e>>2]=h;continue e}b=(s<<3)+d|0;h=H[b+4>>2];H[j+48>>2]=H[b>>2];H[j+52>>2]=h;break t}if(!a){break g}lc(j+48|0,h,c,g);break t}if((s|0)>=0){break c}b=0;if(!a){continue f}}if(I[a|0]&32){break b}i=p&-65537;h=p&8192?i:p;p=0;s=1072;n=u;u:{v:{w:{x:{y:{z:{A:{B:{C:{D:{E:{F:{G:{H:{I:{J:{K:{r=I[r|0];b=r<<24>>24;b=m?(r&15)==3?b&-45:b:b;switch(b-88|0){case 0:case 32:break G;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 10:case 16:case 18:case 19:case 20:case 21:case 25:case 26:case 28:case 30:case 31:break h;case 9:case 13:case 14:case 15:break u;case 11:break B;case 12:case 17:break E;case 22:break I;case 23:break F;case 24:break H;case 27:break A;case 29:break J;default:break K}}L:{switch(b-65|0){case 1:case 3:break h;case 0:case 4:case 5:case 6:break u;case 2:break z;default:break L}}if((b|0)==83){break y}break h}m=H[j+48>>2];r=H[j+52>>2];s=1072;break D}b=0;M:{switch(m|0){case 0:H[H[j+48>>2]>>2]=o;continue f;case 1:H[H[j+48>>2]>>2]=o;continue f;case 2:h=H[j+48>>2];H[h>>2]=o;H[h+4>>2]=o>>31;continue f;case 3:G[H[j+48>>2]>>1]=o;continue f;case 4:F[H[j+48>>2]]=o;continue f;case 6:H[H[j+48>>2]>>2]=o;continue f;case 7:break M;default:continue f}}h=H[j+48>>2];H[h>>2]=o;H[h+4>>2]=o>>31;continue f}l=l>>>0<=8?8:l;h=h|8;b=120}i=u;k=H[j+52>>2];r=k;m=H[j+48>>2];t=m;if(k|m){A=b&32;while(1){i=i-1|0;F[i|0]=A|I[(t&15)+26080|0];t=(k&15)<<28|t>>>4;k=k>>>4|0;if(t|k){continue}break}}k=i;if(!(h&8)|!(m|r)){break C}s=(b>>>4|0)+1072|0;p=2;break C}b=u;k=H[j+52>>2];r=k;m=H[j+48>>2];t=m;if(k|m){while(1){b=b-1|0;F[b|0]=t&7|48;t=(k&7)<<29|t>>>3;k=k>>>3|0;if(t|k){continue}break}}k=b;if(!(h&8)){break C}b=y-b|0;l=(b|0)<(l|0)?l:b;break C}m=H[j+48>>2];b=H[j+52>>2];r=b;if((b|0)<0){k=0-(b+((m|0)!=0)|0)|0;r=k;m=0-m|0;H[j+48>>2]=m;H[j+52>>2]=k;p=1;s=1072;break D}if(h&2048){p=1;s=1073;break D}p=h&1;s=p?1074:1072}k=_a(m,r,u)}if((l|0)<0&w){break d}h=w?h&-65537:h;if(!((m|r)!=0|l)){k=u;l=0;break h}b=!(m|r)+(u-k|0)|0;l=(b|0)<(l|0)?l:b;break h}b=I[j+48|0];break i}m=l>>>0>=2147483647?2147483647:l;h=m;n=(h|0)!=0;b=H[j+48>>2];k=b?b:1686;b=k;N:{O:{P:{Q:{if(!(b&3)|!h){break Q}while(1){if(!I[b|0]){break P}h=h-1|0;n=(h|0)!=0;b=b+1|0;if(!(b&3)){break Q}if(h){continue}break}}if(!n){break O}if(!(!I[b|0]|h>>>0<4)){while(1){n=H[b>>2];if(((16843008-n|n)&-2139062144)!=-2139062144){break P}b=b+4|0;h=h-4|0;if(h>>>0>3){continue}break}}if(!h){break O}}while(1){if(!I[b|0]){break N}b=b+1|0;h=h-1|0;if(h){continue}break}}b=0}b=b?b-k|0:m;n=b+k|0;if((l|0)>=0){h=i;l=b;break h}h=i;l=b;if(I[n|0]){break d}break h}b=H[j+48>>2];if(b|H[j+52>>2]){break x}b=0;break i}if(l){i=H[j+48>>2];break w}b=0;Na(a,32,q,0,h);break v}H[j+12>>2]=0;H[j+8>>2]=b;i=j+8|0;H[j+48>>2]=i;l=-1}b=0;while(1){R:{k=H[i>>2];if(!k){break R}k=jc(j+4|0,k);if((k|0)<0){break b}if(k>>>0>l-b>>>0){break R}i=i+4|0;b=b+k|0;if(l>>>0>b>>>0){continue}}break}n=61;if((b|0)<0){break c}Na(a,32,q,b,h);if(!b){b=0;break v}n=0;i=H[j+48>>2];while(1){k=H[i>>2];if(!k){break v}m=j+4|0;k=jc(m,k);n=k+n|0;if(n>>>0>b>>>0){break v}La(a,m,k);i=i+4|0;if(b>>>0>n>>>0){continue}break}}Na(a,32,q,b,h^8192);b=(b|0)<(q|0)?q:b;continue f}if((l|0)<0&w){break d}n=61;b=ra[f|0](a,M[j+48>>3],q,l,h,b,m)|0;if((b|0)>=0){continue f}break c}i=I[b+1|0];b=b+1|0;continue}}if(a){break a}if(!v){break g}b=1;while(1){a=H[(b<<2)+e>>2];if(a){lc((b<<3)+d|0,a,c,g);o=1;b=b+1|0;if((b|0)!=10){continue}break a}break}while(1){if(H[(b<<2)+e>>2]){break j}o=1;b=b+1|0;if((b|0)!=10){continue}break}break a}n=28;break c}F[j+39|0]=b;l=1;k=z;h=i}m=n-k|0;l=(l|0)>(m|0)?l:m;if((l|0)>(p^2147483647)){break d}n=61;i=l+p|0;b=(i|0)<(q|0)?q:i;if(x>>>0>>0){break c}Na(a,32,b,i,h);La(a,s,p);Na(a,48,b,i,h^65536);Na(a,48,l,m,0);La(a,k,m);Na(a,32,b,i,h^8192);continue}break}break}o=0;break a}n=61}H[6605]=n}o=-1}na=j- -64|0;return o}function _c(a,b,c,d,e,f,g){a=a|0;b=+b;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,t=0,u=0,v=0,w=0,y=0,z=0,A=0,B=0,C=0;m=na-560|0;na=m;H[m+556>>2]=0;x(+b);i=s(1)|0;s(0)|0;a:{if((i|0)<0){q=1;z=1082;b=-b;x(+b);i=s(1)|0;s(0)|0;break a}if(e&2048){q=1;z=1085;break a}q=e&1;z=q?1088:1083;A=!q}b:{if((i&2146435072)==2146435072){g=q+3|0;Na(a,32,c,g,e&-65537);La(a,z,q);d=f&32;La(a,b!=b?d?1207:1435:d?1312:1476,3);Na(a,32,c,g,e^8192);k=(c|0)>(g|0)?c:g;break b}w=m+528|0;c:{d:{e:{b=kc(b,m+556|0);b=b+b;if(b!=0){g=H[m+556>>2];H[m+556>>2]=g-1;y=f|32;if((y|0)!=97){break e}break c}y=f|32;if((y|0)==97){break c}k=H[m+556>>2];break d}k=g-29|0;H[m+556>>2]=k;b=b*268435456}l=(d|0)<0?6:d;o=((k|0)>=0?488:0)+m|0;h=o;while(1){d=~~b>>>0;H[h>>2]=d;h=h+4|0;b=(b-+(d>>>0))*1e9;if(b!=0){continue}break}f:{if((k|0)<=0){i=k;j=o;g=h;break f}j=o;i=k;while(1){u=i>>>0>=29?29:i;g=h-4|0;g:{if(j>>>0>g>>>0){break g}d=0;i=0;while(1){p=H[g>>2];v=u&31;if((u&63)>>>0>=32){n=p<>>32-v;p=p<>>0>p>>>0?i+1|0:i;d=fe(p,n,1e9,0);i=qa;B=g,C=p+be(d,i,-1e9)|0,H[B>>2]=C;g=g-4|0;if(j>>>0<=g>>>0){continue}break}if(!n&p>>>0<1e9){break g}j=j-4|0;H[j>>2]=d}while(1){g=h;if(j>>>0>>0){h=g-4|0;if(!H[h>>2]){continue}}break}i=H[m+556>>2]-u|0;H[m+556>>2]=i;h=g;if((i|0)>0){continue}break}}if((i|0)<0){r=((l+25>>>0)/9|0)+1|0;u=(y|0)==102;while(1){d=0-i|0;v=d>>>0>=9?9:d;h:{if(g>>>0<=j>>>0){h=H[j>>2]?0:4;break h}p=1e9>>>v|0;n=-1<>2];H[h>>2]=i+(d>>>v|0);i=N(p,d&n);h=h+4|0;if(h>>>0>>0){continue}break}h=H[j>>2]?0:4;if(!i){break h}H[g>>2]=i;g=g+4|0}i=H[m+556>>2]+v|0;H[m+556>>2]=i;j=h+j|0;d=u?o:j;g=g-d>>2>(r|0)?d+(r<<2)|0:g;if((i|0)<0){continue}break}}i=0;i:{if(g>>>0<=j>>>0){break i}i=N(o-j>>2,9);h=10;d=H[j>>2];if(d>>>0<10){break i}while(1){i=i+1|0;h=N(h,10);if(d>>>0>=h>>>0){continue}break}}d=(l-((y|0)!=102?i:0)|0)-((y|0)==103&(l|0)!=0)|0;if((d|0)<(N(g-o>>2,9)-9|0)){n=d+9216|0;d=(n|0)/9|0;k=(((k|0)<0?-4092:-3604)+m|0)+(d<<2)|0;h=10;d=n+N(d,-9)|0;if((d|0)<=7){while(1){h=N(h,10);d=d+1|0;if((d|0)!=8){continue}break}}n=H[k>>2];r=(n>>>0)/(h>>>0)|0;p=N(r,h);d=k+4|0;j:{if((n|0)==(p|0)&(d|0)==(g|0)){break j}n=n-p|0;k:{if(!(r&1)){b=9007199254740992;if(!(F[k-4|0]&1)|((h|0)!=1e9|j>>>0>=k>>>0)){break k}}b=9007199254740994}t=(d|0)==(g|0)?1:1.5;d=h>>>1|0;t=d>>>0>n>>>0?.5:(d|0)==(n|0)?t:1.5;if(!(I[z|0]!=45|A)){t=-t;b=-b}H[k>>2]=p;if(b+t==b){break j}d=h+p|0;H[k>>2]=d;if(d>>>0>=1e9){while(1){H[k>>2]=0;k=k-4|0;if(k>>>0>>0){j=j-4|0;H[j>>2]=0}d=H[k>>2]+1|0;H[k>>2]=d;if(d>>>0>999999999){continue}break}}i=N(o-j>>2,9);h=10;d=H[j>>2];if(d>>>0<10){break j}while(1){i=i+1|0;h=N(h,10);if(d>>>0>=h>>>0){continue}break}}d=k+4|0;g=d>>>0>>0?d:g}while(1){n=g;h=g>>>0<=j>>>0;if(!h){g=g-4|0;if(!H[g>>2]){continue}}break}l:{if((y|0)!=103){d=e&8;break l}g=l?l:1;d=(g|0)>(i|0)&(i|0)>-5;l=(d?i^-1:-1)+g|0;f=(d?-1:-2)+f|0;d=e&8;if(d){break l}g=-9;m:{if(h){break m}k=H[n-4>>2];if(!k){break m}d=10;g=0;if((k>>>0)%10|0){break m}while(1){h=g;g=g+1|0;d=N(d,10);if(!((k>>>0)%(d>>>0)|0)){continue}break}g=h^-1}h=N(n-o>>2,9);if((f&-33)==70){d=0;g=(g+h|0)-9|0;g=(g|0)>0?g:0;l=(g|0)>(l|0)?l:g;break l}d=0;g=((h+i|0)+g|0)-9|0;g=(g|0)>0?g:0;l=(g|0)>(l|0)?l:g}k=-1;p=d|l;if(((p?2147483645:2147483646)|0)<(l|0)){break b}u=(((p|0)!=0)+l|0)+1|0;h=f&-33;n:{if((h|0)==70){if((u^2147483647)<(i|0)){break b}g=(i|0)>0?i:0;break n}g=i>>31;g=_a((g^i)-g|0,0,w);if((w-g|0)<=1){while(1){g=g-1|0;F[g|0]=48;if((w-g|0)<2){continue}break}}r=g-2|0;F[r|0]=f;F[g-1|0]=(i|0)<0?45:43;g=w-r|0;if((g|0)>(u^2147483647)){break b}}f=g+u|0;if((f|0)>(q^2147483647)){break b}k=f+q|0;Na(a,32,c,k,e);La(a,z,q);Na(a,48,c,k,e^65536);o:{p:{q:{if((h|0)==70){f=m+528|9;d=j>>>0>o>>>0?o:j;j=d;while(1){g=_a(H[j>>2],0,f);r:{if((d|0)!=(j|0)){if(m+528>>>0>=g>>>0){break r}while(1){g=g-1|0;F[g|0]=48;if(m+528>>>0>>0){continue}break}break r}if((f|0)!=(g|0)){break r}g=g-1|0;F[g|0]=48}La(a,g,f-g|0);j=j+4|0;if(o>>>0>=j>>>0){continue}break}if(p){La(a,1684,1)}if((l|0)<=0|j>>>0>=n>>>0){break q}while(1){g=_a(H[j>>2],0,f);if(g>>>0>m+528>>>0){while(1){g=g-1|0;F[g|0]=48;if(m+528>>>0>>0){continue}break}}La(a,g,(l|0)>=9?9:l);g=l-9|0;j=j+4|0;if(n>>>0<=j>>>0){break p}d=(l|0)>9;l=g;if(d){continue}break}break p}s:{if((l|0)<0){break s}f=j>>>0>>0?n:j+4|0;o=m+528|9;h=j;while(1){g=_a(H[h>>2],0,o);if((o|0)==(g|0)){g=g-1|0;F[g|0]=48}t:{if((h|0)!=(j|0)){if(m+528>>>0>=g>>>0){break t}while(1){g=g-1|0;F[g|0]=48;if(m+528>>>0>>0){continue}break}break t}La(a,g,1);g=g+1|0;if(!(d|l)){break t}La(a,1684,1)}i=g;g=o-g|0;La(a,i,(g|0)<(l|0)?g:l);l=l-g|0;h=h+4|0;if(f>>>0<=h>>>0){break s}if((l|0)>=0){continue}break}}Na(a,48,l+18|0,18,0);La(a,r,w-r|0);break o}g=l}Na(a,48,g+9|0,9,0)}Na(a,32,c,k,e^8192);k=(c|0)>(k|0)?c:k;break b}i=(f<<26>>31&9)+z|0;u:{if(d>>>0>12){break u}g=I[i|0];t=tc(52-(d<<2)|0);if((g|0)==45){b=-(t+(-b-t));break u}b=b+t-t}h=H[m+556>>2];g=h>>31;g=_a((g^h)-g|0,0,w);if((w|0)==(g|0)){g=g-1|0;F[g|0]=48;h=H[m+556>>2]}o=f&32;l=g-2|0;F[l|0]=f+15;F[g-1|0]=(h|0)<0?45:43;j=!(e&8)&(d|0)<=0;h=m+528|0;while(1){f=h;g=~~b;F[h|0]=o|I[g+26080|0];b=(b-+(g|0))*16;h=h+1|0;if(!(j&b==0|(h-(m+528|0)|0)!=1)){F[f+1|0]=46;h=f+2|0}if(b!=0){continue}break}k=-1;j=w-l|0;if((2147483643-(j+q|0)|0)<(d|0)){break b}g=m+528|0;o=h-g|0;f=d?(o-2|0)<(d|0)?d+2|0:o:o;d=q|2;h=f+(d+j|0)|0;Na(a,32,c,h,e);La(a,i,d);Na(a,48,c,h,e^65536);La(a,g,o);Na(a,48,f-o|0,0,0);La(a,l,j);Na(a,32,c,h,e^8192);k=(c|0)>(h|0)?c:h}na=m+560|0;return k|0}function Hc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;i=na-80|0;na=i;H[i+76>>2]=1;a:{b:{if(H[a+128>>2]!=1|H[a+132>>2]!=1|(H[a+108>>2]|H[a+112>>2])){break b}j=H[a+100>>2];if(H[j>>2]|H[j+4>>2]|(H[j+8>>2]!=H[a+116>>2]|H[j+12>>2]!=H[a+120>>2])){break b}if(!bb(a,i+72|0,0,i+68|0,i- -64|0,i+60|0,i+56|0,i+52|0,i+76|0,b,c)){break a}c:{d:{if(!H[i+76>>2]){break d}if(!hb(a,H[i+72>>2],0,0,b,c)){break d}b=H[a+100>>2];if(H[b+16>>2]){break c}e=1;break a}Ba(c,1,8776,0);break a}f=H[b+24>>2];while(1){b=N(h,52);Ca(H[(b+f|0)+44>>2]);c=H[a+100>>2];f=H[c+24>>2];j=b+f|0;l=H[a+232>>2];d=H[H[H[l+20>>2]>>2]+20>>2]+N(h,76)|0;H[j+44>>2]=H[d+36>>2];H[j+36>>2]=H[(b+H[H[l+24>>2]+24>>2]|0)+36>>2];H[d+36>>2]=0;e=1;h=h+1|0;if(h>>>0>2]){continue}break}break a}H[a+80>>2]=0;H[a+84>>2]=0;Ca(H[a+88>>2]);H[a+88>>2]=0;e:{if(!(H[a+28>>2]|H[a+32>>2]|H[a+36>>2]!=H[a+128>>2])){j=2;if(H[a+40>>2]==H[a+132>>2]){break e}}j=2;if(H[a+76>>2]){break e}if(!zb(b)){break e}q=H[a+128>>2];j=N(q,H[a+132>>2]);if(j){e=H[H[a+224>>2]+40>>2];f:{g:{if((j|0)==1){j=0;break g}k=j&1;m=j&-2;j=0;while(1){d=e+N(h,40)|0;g=H[d+4>>2];if(g){n=(H[d+16>>2]+N(g,24)|0)-8|0;g=H[n>>2];o=g;p=g>>>0>j>>>0;g=H[n+4>>2];n=p&(g|0)>=(l|0)|(g|0)>(l|0);j=n?o:j;l=n?g:l}g=H[d+44>>2];if(g){g=(H[d+56>>2]+N(g,24)|0)-8|0;d=H[g>>2];o=d;n=d>>>0>j>>>0;d=H[g+4>>2];g=n&(d|0)>=(l|0)|(d|0)>(l|0);j=g?o:j;l=g?d:l}h=h+2|0;f=f+2|0;if((m|0)!=(f|0)){continue}break}if(!k){break f}}d=e+N(h,40)|0;e=H[d+4>>2];if(!e){break f}e=(H[d+16>>2]+N(e,24)|0)-8|0;d=H[e>>2];g=d;o=d>>>0>j>>>0;d=H[e+4>>2];e=o&(d|0)>=(l|0)|(d|0)>(l|0);j=e?g:j;l=e?d:l}j=j+2|0;l=j>>>0<2?l+1|0:l}else{j=2;l=0}h=0;m=H[a+32>>2];p=H[a+40>>2];h:{if(m>>>0>=p>>>0){break h}d=H[a+28>>2];g=H[a+36>>2];if(d>>>0>=g>>>0){break h}k=g-d&3;s=H[H[a+224>>2]+40>>2];t=d-g>>>0>4294967292;while(1){n=s+N(N(m,q),40)|0;e=d;f=0;if(k){while(1){h=H[(n+N(e,40)|0)+4>>2]+h|0;e=e+1|0;f=f+1|0;if((k|0)!=(f|0)){continue}break}}if(!t){while(1){f=n+N(e,40)|0;h=H[f+124>>2]+(H[f+84>>2]+(H[f+44>>2]+(H[f+4>>2]+h|0)|0)|0)|0;e=e+4|0;if((g|0)!=(e|0)){continue}break}}m=m+1|0;if((p|0)!=(m|0)){continue}break}}g=Fa(h<<3);H[a+88>>2]=g;if(!h|!g){break e}h=0;e=H[a+40>>2];n=H[a+32>>2];i:{if(e>>>0<=n>>>0){break i}f=H[a+36>>2];if(f>>>0<=K[a+28>>2]){break i}while(1){g=H[a+28>>2];if(f>>>0>g>>>0){s=H[H[a+224>>2]+40>>2]+N(N(H[a+128>>2],n),40)|0;while(1){e=s+N(g,40)|0;d=H[e+4>>2];if(d){q=d&3;p=H[e+16>>2];k=0;j:{k:{if(d>>>0<4){e=0;break k}t=d&-4;e=0;m=0;while(1){d=p+N(e,24)|0;r=H[d+4>>2];f=h<<3;o=f+H[a+88>>2]|0;H[o>>2]=H[d>>2];H[o+4>>2]=r;r=H[d+28>>2];o=f+H[a+88>>2]|0;H[o+8>>2]=H[d+24>>2];H[o+12>>2]=r;r=H[d+52>>2];o=f+H[a+88>>2]|0;H[o+16>>2]=H[d+48>>2];H[o+20>>2]=r;o=H[d+76>>2];f=f+H[a+88>>2]|0;H[f+24>>2]=H[d+72>>2];H[f+28>>2]=o;e=e+4|0;h=h+4|0;m=m+4|0;if((t|0)!=(m|0)){continue}break}if(!q){break j}}while(1){f=p+N(e,24)|0;m=H[f+4>>2];d=H[a+88>>2]+(h<<3)|0;H[d>>2]=H[f>>2];H[d+4>>2]=m;e=e+1|0;h=h+1|0;k=k+1|0;if((q|0)!=(k|0)){continue}break}}f=H[a+36>>2]}g=g+1|0;if(f>>>0>g>>>0){continue}break}e=H[a+40>>2]}n=n+1|0;if(n>>>0>>0){continue}break}g=H[a+88>>2]}H[a+84>>2]=h;f=na-208|0;na=f;H[f+8>>2]=1;H[f+12>>2]=0;e=h<<3;l:{if(!e){break l}H[f+16>>2]=8;H[f+20>>2]=8;d=2;while(1){h=(f+16|0)+(d<<2)|0;k=H[h-4>>2]+(H[h-8>>2]+8|0)|0;H[h>>2]=k;d=d+1|0;if(e>>>0>k>>>0){continue}break}d=e-8|0;m:{if((d|0)<=0){k=1;d=1;e=0;break m}e=d+g|0;k=1;d=1;while(1){n:{if((k&3)==3){Ab(g,d,f+16|0);tb(f+8|0,2);d=d+2|0;break n}m=f+16|0;h=d-1|0;o:{if(K[m+(h<<2)>>2]>=e-g>>>0){sb(g,k,H[f+12>>2],d,0,m);break o}Ab(g,d,f+16|0)}if((d|0)==1){rb(f+8|0,1);d=0;break n}rb(f+8|0,h);d=1}k=H[f+8>>2]|1;H[f+8>>2]=k;g=g+8|0;if(e>>>0>g>>>0){continue}break}e=H[f+12>>2]}sb(g,k,e,d,0,f+16|0);e=H[f+12>>2];k=H[f+8>>2];if(!(e|((d|0)!=1|(k|0)!=1))){break l}while(1){p:{if((d|0)<=1){e=qc(k,e);tb(f+8|0,e);d=d+e|0;break p}h=f+8|0;rb(h,2);H[f+8>>2]=H[f+8>>2]^7;tb(h,1);m=g-8|0;k=f+16|0;e=d-2|0;sb(m-H[k+(e<<2)>>2]|0,H[f+8>>2],H[f+12>>2],d-1|0,1,k);rb(h,1);d=H[f+8>>2]|1;H[f+8>>2]=d;sb(m,d,H[f+12>>2],e,1,k);d=e}g=g-8|0;e=H[f+12>>2];k=H[f+8>>2];if(e|((d|0)!=1|(k|0)!=1)){continue}break}}na=f+208|0}e=H[a+128>>2];f=0;q:{while(1){r:{if(!(!H[H[a+180>>2]+5596>>2]|((e|0)!=1|H[a+132>>2]!=1))){H[i+72>>2]=0;H[a+228>>2]=0;H[a+8>>2]=H[a+8>>2]|128;d=0;break r}e=0;if(!bb(a,i+72|0,0,i+68|0,i- -64|0,i+60|0,i+56|0,i+52|0,i+76|0,b,c)){break a}if(!H[i+76>>2]){break q}d=H[i+72>>2]}e=d+1|0;g=hb(a,d,0,0,b,c);h=N(H[a+128>>2],H[a+132>>2]);if(!g){H[i+4>>2]=h;H[i>>2]=e;Ba(c,1,7537,i);e=0;break a}H[i+36>>2]=h;H[i+32>>2]=e;Ba(c,4,11795,i+32|0);if(!Ac(H[a+232>>2],H[H[a+100>>2]+24>>2])){e=0;break a}s:{if(!(H[a+128>>2]!=1|H[a+132>>2]!=1)){h=H[a+100>>2];g=H[a+96>>2];if(H[h>>2]!=H[g>>2]|H[h+4>>2]!=H[g+4>>2]|(H[h+8>>2]!=H[g+8>>2]|H[h+12>>2]!=H[g+12>>2])){break s}}d=H[a+180>>2]+N(d,5644)|0;h=H[d+5596>>2];if(!h){break s}Ca(h);H[d+5596>>2]=0;H[d+5600>>2]=0}H[i+16>>2]=e;Ba(c,4,16601,i+16|0);if(!(Pa(b)|qa)&H[a+8>>2]==64){break q}f=f+1|0;e=H[a+128>>2];if((f|0)==(N(e,H[a+132>>2])|0)){break q}d=H[a+84>>2];if(!d|(d|0)!=H[a+80>>2]){continue}break}hc(b,j,l,c)}e=zc(a,c)}na=i+80|0;return e|0}function Xa(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;d=H[a+32>>2];a:{if(d){break a}b:{h=H[a+16>>2];if((h|0)>=6){b=H[a+8>>2];f=H[a+12>>2];d=h;break b}b=H[a+20>>2];c:{d:{if((b|0)>=5){c=H[a>>2];d=H[c>>2];H[a>>2]=c+4;g=b-4|0;break d}if((b|0)<=0){d=-1;break c}c=H[a>>2];e:{if((b|0)==1){e=-1;b=0;break e}d=0;f:{g:{if((b|0)==2){e=-1;i=b;break g}f=b-1|0;k=f&1;j=f&-2;e=-1;i=b;while(1){f=c;H[a>>2]=c+1;l=I[c|0];c=c+2|0;H[a>>2]=c;H[a+20>>2]=i-1;f=I[f+1|0];i=i-2|0;H[a+20>>2]=i;e=((255<>2]=f;c=I[c|0];H[a+20>>2]=i-1;e=(255<>2]=c+1;d=(255<>2]=g}b=H[a+24>>2];c=d>>>24|0;H[a+24>>2]=(c|0)==255;g=d>>>16&255;k=(g|0)==255;f=d&255;e=(f|0)==255;j=b+e|0;b=d>>>8&255;i=(b|0)==255;j=k+(j+i|0)|0;d=(h-j|0)+32|0;H[a+16>>2]=d;l=H[a+12>>2];b=c|(g|(b|f<<(e?7:8))<<(i?7:8))<<(k?7:8);f=(j-h|0)+32|0;c=f&31;if((f&63)>>>0>=32){i=b<>>32-c;g=b<>2];c=i|l;f=c;H[a+8>>2]=b;H[a+12>>2]=c;if((d|0)>=6){break b}d=0;break a}e=H[a+28>>2];i=H[(e<<2)+20752>>2];h:{if((f|0)<0){d=d-1|0;c=(-1<=11?11:e)+1|0;break h}g=b;h=63-i|0;c=h&31;if((h&63)>>>0>=32){g=f>>>c|0}else{g=((1<>>c}c=(g&(-1<>2]=d;H[a+28>>2]=e;g=b;h=i&31;if((i&63)>>>0>=32){b=b<>>32-h|f<>2]=g;H[a+12>>2]=b;i=H[a+44>>2]|c>>31;j=H[a+40>>2]&-64|c;H[a+40>>2]=j;H[a+44>>2]=i;if((d|0)<6){d=1;break a}b=H[(e<<2)+20752>>2];i:{if((f|0)<0){d=d-1|0;c=(-1<=11?11:e)+1|0;break i}k=g;h=63-b|0;c=h&31;if((h&63)>>>0>=32){k=f>>>c|0}else{k=((1<>>c}c=(k&(-1<>2]=d;H[a+28>>2]=e;k=g;h=b&31;if((b&63)>>>0>=32){b=g<>>32-h|f<>2]=k;H[a+12>>2]=b;b=c>>31<<7|c>>>25|i;h=b;j=j&-8065|c<<7;H[a+40>>2]=j;H[a+44>>2]=b;if((d|0)<6){d=2;break a}b=H[(e<<2)+20752>>2];j:{if((f|0)<0){d=d-1|0;c=(-1<=11?11:e)+1|0;break j}g=k;i=63-b|0;c=i&31;if((i&63)>>>0>=32){g=f>>>c|0}else{g=((1<>>c}c=(g&(-1<>2]=d;H[a+28>>2]=e;l=k;g=b&31;if((b&63)>>>0>=32){i=k<>>32-g|f<>2]=g;f=i;H[a+12>>2]=f;b=c>>31<<14|c>>>18|h;i=b;k=j&-1032193|c<<14;H[a+40>>2]=k;H[a+44>>2]=b;if((d|0)<6){d=3;break a}b=H[(e<<2)+20752>>2];k:{if((f|0)<0){d=d-1|0;c=(-1<=11?11:e)+1|0;break k}j=g;h=63-b|0;c=h&31;if((h&63)>>>0>=32){j=f>>>c|0}else{j=((1<>>c}c=(j&(-1<>2]=d;H[a+28>>2]=e;j=g;h=b&31;if((b&63)>>>0>=32){b=g<>>32-h|f<>2]=g;H[a+12>>2]=b;b=c>>31<<21|c>>>11|i;j=b;k=k&-132120577|c<<21;H[a+40>>2]=k;H[a+44>>2]=b;if((d|0)<6){d=4;break a}b=H[(e<<2)+20752>>2];l:{if((f|0)<0){c=(-1<=11?11:e)+1|0;d=d-1|0;break l}h=g;i=63-b|0;c=i&31;if((i&63)>>>0>=32){i=f>>>c|0}else{i=((1<>>c}c=(i&(-1<>2]=d;H[a+28>>2]=h;i=g;e=b&31;if((b&63)>>>0>=32){b=g<>>32-e|f<>2]=g;f=b;H[a+12>>2]=b;b=j&-4|(c>>31<<28|c>>>4);j=b;k=k&268435455|c<<28;H[a+40>>2]=k;H[a+44>>2]=b;if((d|0)<6){d=5;break a}b=H[(h<<2)+20752>>2];m:{if((f|0)<0){e=(-1<=11?11:h)+1|0;i=d-1|0;break m}i=g;e=63-b|0;c=e&31;if((e&63)>>>0>=32){i=f>>>c|0}else{i=((1<>>c}e=(i&(-1<>2]=i;H[a+28>>2]=h;d=g;c=b&31;if((b&63)>>>0>=32){b=d<>>32-c|f<>2]=g;H[a+12>>2]=b;b=j&-505|e<<3;l=b;H[a+40>>2]=k;H[a+44>>2]=b;d=6;if((i|0)<6){break a}b=H[(h<<2)+20752>>2];n:{if((c|0)<0){e=(-1<=11?11:h)+1|0;d=i-1|0;break n}d=g;e=63-b|0;f=e&31;if((e&63)>>>0>=32){f=c>>>f|0}else{f=((1<>>f}e=(f&(-1<>2]=d;H[a+28>>2]=h;j=g;f=b&31;if((b&63)>>>0>=32){i=g<>>32-f|c<>2]=g;f=i;H[a+12>>2]=f;i=k;b=l&-64513|e<<10;k=b;H[a+40>>2]=i;H[a+44>>2]=b;if((d|0)<6){d=7;break a}b=H[(h<<2)+20752>>2];o:{if((f|0)<0){d=d-1|0;c=(-1<=11?11:h)+1|0;break o}j=g;e=63-b|0;c=e&31;if((e&63)>>>0>=32){j=f>>>c|0}else{j=((1<>>c}c=(j&(-1<>2]=d;H[a+28>>2]=e;d=g;e=b&31;if((b&63)>>>0>=32){b=d<>>32-e|f<>2]=g;H[a+12>>2]=b;H[a+40>>2]=i;H[a+44>>2]=k&-8257537|c<<17;d=8}H[a+32>>2]=d-1;f=H[a+44>>2];b=f>>>7|0;c=H[a+40>>2];H[a+40>>2]=(f&127)<<25|c>>>7;H[a+44>>2]=b;return c&127}function Rb(a,b,c,d,e,f,g,h,i){var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0;p=na-32|0;na=p;H[p+24>>2]=f;r=H[(N(H[d+28>>2],76)+b|0)+28>>2]+N(H[d+32>>2],152)|0;a:{if(!(H[d+40>>2]|!H[r+24>>2])){k=r+28|0;while(1){b:{if(Nb(k)){break b}b=H[d+36>>2];if(b>>>0>=K[k+24>>2]/40>>>0){Ba(i,1,2836,0);break a}b=H[k+20>>2]+N(b,40)|0;cc(H[b+32>>2]);cc(H[b+36>>2]);o=N(H[b+20>>2],H[b+16>>2]);if(!o){break b}q=o&7;b=H[b+24>>2];if(o>>>0>=8){o=o&-8;j=0;while(1){H[b+516>>2]=0;H[b+520>>2]=0;H[b+448>>2]=0;H[b+452>>2]=0;H[b+380>>2]=0;H[b+384>>2]=0;H[b+312>>2]=0;H[b+316>>2]=0;H[b+244>>2]=0;H[b+248>>2]=0;H[b+176>>2]=0;H[b+180>>2]=0;H[b+108>>2]=0;H[b+112>>2]=0;H[b+40>>2]=0;H[b+44>>2]=0;b=b+544|0;j=j+8|0;if((o|0)!=(j|0)){continue}break}if(!q){break b}}j=0;while(1){H[b+40>>2]=0;H[b+44>>2]=0;b=b+68|0;j=j+1|0;if((q|0)!=(j|0)){continue}break}}k=k+36|0;n=n+1|0;if(n>>>0>2]){continue}break}}q=f;c:{if(!(I[c|0]&2)){break c}if(h>>>0<=5){Ba(i,2,4196,0);break c}if(!(I[f|0]==255&I[f+1|0]==145)){Ba(i,2,4238,0);break c}q=f+6|0;H[p+24>>2]=q}l=Fa(20);if(!l){break a}d:{if(F[a+108|0]&1){q=H[a+40>>2];o=a+44|0;h=a+40|0;break d}if(I[c+5640|0]&2){q=H[c+5168>>2];o=c+5180|0;h=c+5168|0;break d}H[p+28>>2]=(f+h|0)-q;o=p+28|0;h=p+24|0}a=H[o>>2];H[l+12>>2]=0;H[l+16>>2]=0;H[l+8>>2]=q;H[l>>2]=q;H[l+4>>2]=a+q;if(!Qa(l,1)){ec(l);a=fc(l);cb(l);a=a+q|0;b=H[h>>2];d=H[o>>2];if(I[c|0]&4){if(b+(d-a|0)>>>0<=1){Ba(i,1,4422,0);break a}if(!(I[a|0]==255&I[a+1|0]==146)){Ba(i,1,4401,0);break a}a=a+2|0}a=a-b|0;H[o>>2]=d-a;H[h>>2]=a+b;H[e>>2]=0;H[g>>2]=H[p+24>>2]-f;x=1;break a}if(H[r+24>>2]){t=r+28|0;while(1){a=H[d+36>>2];b=H[t+20>>2];e:{if(Nb(t)){break e}u=b+N(a,40)|0;z=N(H[u+20>>2],H[u+16>>2]);if(!z){break e}k=H[u+24>>2];v=0;while(1){f:{g:{if(!H[k+40>>2]){a=ac(l,H[u+32>>2],v,H[d+40>>2]+1|0);break g}a=Qa(l,1)}if(!a){H[k+36>>2]=0;break f}if(!H[k+40>>2]){b=0;while(1){a=b;b=b+1|0;if(!ac(l,H[u+36>>2],v,a)){continue}break}b=H[t+28>>2];H[k+32>>2]=3;H[k+24>>2]=b;H[k+28>>2]=(b-a|0)+1}a=1;h:{if(!Qa(l,1)){break h}a=2;if(!Qa(l,1)){break h}a=Qa(l,2);if((a|0)!=3){a=a+3|0;break h}a=Qa(l,5);if((a|0)!=31){a=a+6|0;break h}a=Qa(l,7)+37|0}H[k+36>>2]=a;b=0;while(1){a=b;b=b+1|0;if(Qa(l,1)){continue}break}H[k+32>>2]=a+H[k+32>>2];i:{a=H[k+40>>2];j:{k:{if(!a){a=H[(H[c+5584>>2]+N(H[d+28>>2],1080)|0)+16>>2];if(!H[k+48>>2]){b=Ga(H[k>>2],240);if(!b){break i}H[k>>2]=b;y(b+N(H[k+48>>2],24)|0,0,240);H[k+48>>2]=10}j=H[k>>2];jb(j);b=a&4?1:a&1?10:109;a=0;break k}b=H[k>>2];n=a-1|0;j=b+N(n,24)|0;if(H[j+4>>2]!=H[j+12>>2]){break j}n=H[(H[c+5584>>2]+N(H[d+28>>2],1080)|0)+16>>2];j=H[k+48>>2];if(j>>>0>>0){j=j+10|0;b=Ga(b,N(j,24));if(!b){break i}H[k>>2]=b;y(b+N(H[k+48>>2],24)|0,0,240);H[k+48>>2]=j;b=H[k>>2]}j=N(a,24)+b|0;jb(j);b=1;l:{if(n&4){break l}b=109;if(!(n&1)){break l}b=H[j-12>>2];b=(b|0)==1?2:(b|0)==10?2:1}}n=a;H[j+12>>2]=b}a=H[k+36>>2];if(I[(H[c+5584>>2]+N(H[d+28>>2],1080)|0)+16|0]&64){while(1){m=N(n,24);s=n?a:1;H[(m+H[k>>2]|0)+16>>2]=s;w=H[k+32>>2];j=0;b=a;if(s>>>0>=2){while(1){j=j+1|0;s=b>>>0>3;b=b>>>1|0;if(s){continue}break}}b=j+w|0;if(b>>>0>=33){H[p+16>>2]=b;Ba(i,1,15535,p+16|0);break i}j=Qa(l,b);b=H[k>>2];m=m+b|0;H[m+20>>2]=j;a=a-H[m+16>>2]|0;if((a|0)<=0){break f}j=H[(H[c+5584>>2]+N(H[d+28>>2],1080)|0)+16>>2];m=H[k+48>>2];if(m>>>0>>0){m=m+10|0;b=Ga(b,N(m,24));if(!b){break i}H[k>>2]=b;y(b+N(H[k+48>>2],24)|0,0,240);H[k+48>>2]=m;b=H[k>>2]}n=n+1|0;b=b+N(n,24)|0;jb(b);if(j&4){H[b+12>>2]=1;continue}if(j&1){j=b;b=H[b-12>>2];H[j+12>>2]=(b|0)==1?2:(b|0)==10?2:1}else{H[b+12>>2]=109}continue}}while(1){m=N(n,24);j=m+H[k>>2]|0;b=H[j+12>>2]-H[j+4>>2]|0;b=(a|0)>(b|0)?b:a;H[j+16>>2]=b;s=H[k+32>>2];j=0;if(b>>>0>=2){while(1){j=j+1|0;w=b>>>0>3;b=b>>>1|0;if(w){continue}break}}b=j+s|0;if(b>>>0>=33){H[p>>2]=b;Ba(i,1,15535,p);break i}j=Qa(l,b);b=H[k>>2];m=m+b|0;H[m+20>>2]=j;a=a-H[m+16>>2]|0;if((a|0)<=0){break f}j=H[(H[c+5584>>2]+N(H[d+28>>2],1080)|0)+16>>2];m=H[k+48>>2];if(m>>>0>>0){m=m+10|0;b=Ga(b,N(m,24));if(!b){break i}H[k>>2]=b;y(b+N(H[k+48>>2],24)|0,0,240);H[k+48>>2]=m;b=H[k>>2]}n=n+1|0;b=b+N(n,24)|0;jb(b);if(j&4){H[b+12>>2]=1;continue}if(j&1){j=b;b=H[b-12>>2];H[j+12>>2]=(b|0)==1?2:(b|0)==10?2:1}else{H[b+12>>2]=109}continue}}cb(l);break a}k=k+68|0;v=v+1|0;if((z|0)!=(v|0)){continue}break}}t=t+36|0;A=A+1|0;if(A>>>0>2]){continue}break}}if(!ec(l)){cb(l);break a}a=fc(l);cb(l);b=a+q|0;a=H[h>>2];if(I[c|0]&4){if(a+(H[o>>2]-b|0)>>>0<=1){Ba(i,1,4422,0);break a}if(!(I[b|0]==255&I[b+1|0]==146)){Ba(i,1,4401,0);break a}b=b+2|0}if((a|0)==(b|0)){break a}H[o>>2]=H[o>>2]+(a-b|0);H[h>>2]=b;x=1;H[e>>2]=1;H[g>>2]=H[p+24>>2]-f}na=p+32|0;return x}function Fb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;a:{if(!c){break a}b:{e=H[a+184>>2];if(!e){break b}f=H[a+96>>2];if(!f|!H[f+16>>2]|(e|0)!=H[H[f+24>>2]+40>>2]){break b}f=H[c+16>>2];if(!f){break b}n=H[c+24>>2];if(H[n+40>>2]|H[n+44>>2]){break b}i=f&7;c:{if(f>>>0>=8){p=f&-8;while(1){f=N(h,52)+n|0;H[f+404>>2]=e;H[f+352>>2]=e;H[f+300>>2]=e;H[f+248>>2]=e;H[f+196>>2]=e;H[f+144>>2]=e;H[f+92>>2]=e;H[f+40>>2]=e;h=h+8|0;g=g+8|0;if((g|0)!=(p|0)){continue}break}if(!i){break c}}while(1){H[(N(h,52)+n|0)+40>>2]=e;h=h+1|0;j=j+1|0;if((i|0)!=(j|0)){continue}break}}e=0;p=0;n=na-32|0;na=n;v=H[c+16>>2];d:{if(!v){e=1;break d}h=H[c>>2];f=h>>31;q=f;e:{if((f|0)<0){break e}i=H[c+4>>2];f=i>>31;m=f;if((f|0)<0){break e}g=H[c+8>>2];f=g>>31;s=f;if((f|0)<0){break e}j=H[c+12>>2];r=j>>31;if((r|0)<0){break e}f=H[c+24>>2];y=h-1|0;w=q-!h|0;z=i-1|0;x=m-!i|0;A=g-1|0;B=s-!g|0;C=j-1|0;D=r-!j|0;while(1){e=H[f>>2];h=e+y|0;i=e>>>0>h>>>0?w+1|0:w;j=fe(h,i,e,0);H[f+16>>2]=j;i=H[f+4>>2];h=i+z|0;g=i>>>0>h>>>0?x+1|0:x;r=fe(h,g,i,0);H[f+20>>2]=r;h=H[f+40>>2];g=h&31;if((h&63)>>>0>=32){q=1<>>32-g}s=m-1|0;g=q-!m|0;u=g;t=e>>31;l=t+B|0;o=l+1|0;g=l;l=e+A|0;g=ee(l,l>>>0>>0?o:g,e,t);e=u+(g>>31)|0;o=e+1|0;l=e;e=g+s|0;t=g>>>0>e>>>0?o:l;g=h&31;l=(j>>31)+u|0;E=l+1|0;o=l;l=j+s|0;j=j>>>0>l>>>0?E:o;if((h&63)>>>0>=32){g=t>>g}else{g=((1<>>g}e=h&31;if((h&63)>>>0>=32){e=j>>e}else{e=((1<>>e}e=g-e|0;if((e|0)<0){H[n+4>>2]=e;H[n>>2]=p;Ba(d,1,13510,n);e=0;break d}H[f+8>>2]=e;e=i>>31;g=e+D|0;o=g+1|0;l=g;g=i+C|0;j=g>>>0>>0?o:l;i=ee(g,j,i,e);e=(i>>31)+u|0;g=e+1|0;l=e;e=i+s|0;g=i>>>0>e>>>0?g:l;i=h&31;j=q+(r>>31)|0;o=j+1|0;l=j;j=m+r|0;q=j>>>0>>0?o:l;m=j-1|0;if((h&63)>>>0>=32){l=g>>i}else{l=((1<>>i}i=q-!j|0;e=h&31;if((h&63)>>>0>=32){m=i>>e}else{m=((1<>>e}e=l-m|0;if((e|0)<0){H[n+20>>2]=e;H[n+16>>2]=p;Ba(d,1,13579,n+16|0);e=0;break d}H[f+12>>2]=e;f=f+52|0;e=1;p=p+1|0;if((v|0)!=(p|0)){continue}break}break d}Ba(d,1,6720,0)}na=n+32|0;if(e){break b}return 0}e=H[a+100>>2];if(!e){e=Db();H[a+100>>2]=e;if(!e){break a}}wc(c,e);if(!Va(H[a+216>>2],22,d)){break a}h=H[a+216>>2];f=H[h>>2];e=H[h+8>>2];f:{if(f){k=1;g:{if((f|0)!=1){n=f&1;i=f&-2;f=0;while(1){m=0;h:{if(!k){break h}m=0;if(!(ra[H[e>>2]](a,b,d)|0)){break h}m=(ra[H[e+4>>2]](a,b,d)|0)!=0}k=m;e=e+8|0;f=f+2|0;if((i|0)!=(f|0)){continue}break}if(!n){break g}}if(!k){k=0;break g}k=(ra[H[e>>2]](a,b,d)|0)!=0}Oa(h);if(k){break f}Ta(H[a+96>>2]);H[a+96>>2]=0;return 0}Oa(h)}f=0;b=0;d=0;i:{j:{k:{e=H[a+60>>2];if(!e){if(H[c+16>>2]){break k}k=1;break i}h=Fa(N(e,52));if(!h){break j}e=0;if(H[c+16>>2]){b=H[c+24>>2];while(1){e=N(d,52);Ca(H[(e+b|0)+44>>2]);b=H[c+24>>2];H[(e+b|0)+44>>2]=0;d=d+1|0;e=H[c+16>>2];if(d>>>0>>0){continue}break}}if(H[a+60>>2]){d=H[H[a+100>>2]+24>>2];e=0;while(1){b=h+N(e,52)|0;f=N(H[H[a+64>>2]+(e<<2)>>2],52);d=f+d|0;H[b+48>>2]=H[d+48>>2];k=H[d+44>>2];H[b+40>>2]=H[d+40>>2];H[b+44>>2]=k;k=H[d+36>>2];H[b+32>>2]=H[d+32>>2];H[b+36>>2]=k;k=H[d+28>>2];H[b+24>>2]=H[d+24>>2];H[b+28>>2]=k;k=H[d+20>>2];H[b+16>>2]=H[d+16>>2];H[b+20>>2]=k;k=H[d+12>>2];H[b+8>>2]=H[d+8>>2];H[b+12>>2]=k;k=H[d+4>>2];H[b>>2]=H[d>>2];H[b+4>>2]=k;d=H[H[a+100>>2]+24>>2];f=f+d|0;H[b+36>>2]=H[f+36>>2];H[b+44>>2]=H[f+44>>2];H[f+44>>2]=0;e=e+1|0;f=H[a+60>>2];if(e>>>0>>0){continue}break}e=H[c+16>>2]}if(e){b=H[H[a+100>>2]+24>>2];d=0;while(1){e=N(d,52);Ca(H[(e+b|0)+44>>2]);b=H[H[a+100>>2]+24>>2];H[(e+b|0)+44>>2]=0;d=d+1|0;if(d>>>0>2]){continue}break}f=H[a+60>>2]}H[c+16>>2]=f;Ca(H[c+24>>2]);H[c+24>>2]=h;k=1;break i}e=H[c+24>>2];d=H[H[a+100>>2]+24>>2];while(1){f=N(b,52);e=f+e|0;H[e+36>>2]=H[(d+f|0)+36>>2];Ca(H[e+44>>2]);e=H[c+24>>2];m=f+e|0;d=H[H[a+100>>2]+24>>2];f=f+d|0;H[m+44>>2]=H[f+44>>2];H[f+44>>2]=0;b=b+1|0;if(b>>>0>2]){continue}break}k=1;break i}Ta(H[a+96>>2]);H[a+96>>2]=0;k=0}}return k|0}function yb(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;j=(c<<2)+b|0;e=H[a>>2];f=H[a+12>>2]<<5;i=e+f|0;l=e-f|0;e=H[a+16>>2];k=H[a+28>>2];h=H[a+20>>2];m=H[a+8>>2];a:{b:{if(i&15|(b&15|d>>>0<8)){if(e>>>0>=h>>>0){break a}c:{switch(d-1|0){case 1:f=e+1|0;if(h-e&1){j=i+(e<<6)|0;e=(e<<2)+b|0;L[j>>2]=L[e>>2];L[j+4>>2]=L[e+(c<<2)>>2];e=f}if((f|0)==(h|0)){break a}while(1){f=i+(e<<6)|0;j=(e<<2)+b|0;L[f>>2]=L[j>>2];g=f;f=c<<2;L[g+4>>2]=L[f+j>>2];j=e+1|0;g=i+(j<<6)|0;j=(j<<2)+b|0;L[g>>2]=L[j>>2];L[g+4>>2]=L[f+j>>2];e=e+2|0;if((h|0)!=(e|0)){continue}break};break a;case 0:break c;default:break b}}f=e;g=h-e&3;if(g){j=0;while(1){L[i+(f<<6)>>2]=L[(f<<2)+b>>2];f=f+1|0;j=j+1|0;if((g|0)!=(j|0)){continue}break}}if(e-h>>>0>4294967292){break a}while(1){L[i+(f<<6)>>2]=L[(f<<2)+b>>2];e=f+1|0;L[i+(e<<6)>>2]=L[(e<<2)+b>>2];e=f+2|0;L[i+(e<<6)>>2]=L[(e<<2)+b>>2];e=f+3|0;L[i+(e<<6)>>2]=L[(e<<2)+b>>2];f=f+4|0;if((h|0)!=(f|0)){continue}break}break a}if(e>>>0>=h>>>0){break a}while(1){f=i+(e<<6)|0;L[f>>2]=L[(e<<2)+b>>2];g=c+e|0;L[f+4>>2]=L[(g<<2)+b>>2];g=c+g|0;L[f+8>>2]=L[(g<<2)+b>>2];g=c+g|0;L[f+12>>2]=L[(g<<2)+b>>2];g=c+g|0;L[f+16>>2]=L[(g<<2)+b>>2];g=c+g<<2;L[f+20>>2]=L[g+b>>2];g=g+j|0;L[f+24>>2]=L[g>>2];L[f+28>>2]=L[g+(c<<2)>>2];e=e+1|0;if((h|0)!=(e|0)){continue}break}break a}while(1){f=i+(e<<6)|0;L[f>>2]=L[(e<<2)+b>>2];g=c+e|0;L[f+4>>2]=L[(g<<2)+b>>2];g=c+g|0;L[f+8>>2]=L[(g<<2)+b>>2];d:{if((d|0)==3){break d}g=c+g|0;L[f+12>>2]=L[(g<<2)+b>>2];if((d|0)==4){break d}g=c+g|0;L[f+16>>2]=L[(g<<2)+b>>2];if((d|0)==5){break d}g=c+g|0;L[f+20>>2]=L[(g<<2)+b>>2];if((d|0)==6){break d}g=j+(g<<2)|0;L[f+24>>2]=L[g>>2];if((d|0)==7){break d}L[f+28>>2]=L[g+(c<<2)>>2]}e=e+1|0;if((h|0)!=(e|0)){continue}break}}b=(m<<2)+b|0;f=b+(c<<2)|0;e=H[a+24>>2];i=l+32|0;e:{if(i&15|(b&15|d>>>0<8)){if(e>>>0>=k>>>0){break e}f:{switch(d-1|0){case 1:a=e+1|0;if(k-e&1){d=i+(e<<6)|0;e=b+(e<<2)|0;L[d>>2]=L[e>>2];L[d+4>>2]=L[e+(c<<2)>>2];e=a}if((a|0)==(k|0)){break e}while(1){a=i+(e<<6)|0;d=b+(e<<2)|0;L[a>>2]=L[d>>2];f=a;a=c<<2;L[f+4>>2]=L[a+d>>2];d=e+1|0;f=i+(d<<6)|0;d=b+(d<<2)|0;L[f>>2]=L[d>>2];L[f+4>>2]=L[a+d>>2];e=e+2|0;if((k|0)!=(e|0)){continue}break};break e;case 0:c=e;a=k-e&3;if(a){f=0;while(1){L[i+(c<<6)>>2]=L[b+(c<<2)>>2];c=c+1|0;f=f+1|0;if((a|0)!=(f|0)){continue}break}}if(e-k>>>0>4294967292){break e}while(1){L[i+(c<<6)>>2]=L[b+(c<<2)>>2];a=c+1|0;L[i+(a<<6)>>2]=L[b+(a<<2)>>2];a=c+2|0;L[i+(a<<6)>>2]=L[b+(a<<2)>>2];a=c+3|0;L[i+(a<<6)>>2]=L[b+(a<<2)>>2];c=c+4|0;if((k|0)!=(c|0)){continue}break};break e;default:break f}}while(1){a=i+(e<<6)|0;L[a>>2]=L[b+(e<<2)>>2];h=c+e|0;L[a+4>>2]=L[b+(h<<2)>>2];h=c+h|0;L[a+8>>2]=L[b+(h<<2)>>2];g:{if((d|0)==3){break g}h=c+h|0;L[a+12>>2]=L[b+(h<<2)>>2];if((d|0)==4){break g}h=c+h|0;L[a+16>>2]=L[b+(h<<2)>>2];if((d|0)==5){break g}h=c+h|0;L[a+20>>2]=L[b+(h<<2)>>2];if((d|0)==6){break g}h=f+(h<<2)|0;L[a+24>>2]=L[h>>2];if((d|0)==7){break g}L[a+28>>2]=L[h+(c<<2)>>2]}e=e+1|0;if((k|0)!=(e|0)){continue}break}break e}if(e>>>0>=k>>>0){break e}while(1){a=i+(e<<6)|0;L[a>>2]=L[b+(e<<2)>>2];d=c+e|0;L[a+4>>2]=L[b+(d<<2)>>2];d=c+d|0;L[a+8>>2]=L[b+(d<<2)>>2];d=c+d|0;L[a+12>>2]=L[b+(d<<2)>>2];d=c+d|0;L[a+16>>2]=L[b+(d<<2)>>2];d=c+d<<2;L[a+20>>2]=L[d+b>>2];d=d+f|0;L[a+24>>2]=L[d>>2];L[a+28>>2]=L[d+(c<<2)>>2];e=e+1|0;if((k|0)!=(e|0)){continue}break}}}function Hd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;i=na-16|0;na=i;if(H[a+8>>2]==16){k=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{k=H[a+12>>2]}a:{if(!c){Ba(d,1,4259,0);break a}j=H[a+96>>2];e=1;Da(b,i,1);g=H[i>>2];if(g>>>0>=2){Ba(d,2,9792,0);break a}if((g+1|0)!=(c|0)){e=0;Ba(d,2,4259,0);break a}b:{if((g|0)!=1){break b}d=H[j+16>>2];if(!d){break b}j=d&7;c=H[k+5584>>2];if(d>>>0>=8){d=d&-8;e=0;while(1){H[c+8636>>2]=0;H[c+7556>>2]=0;H[c+6476>>2]=0;H[c+5396>>2]=0;H[c+4316>>2]=0;H[c+3236>>2]=0;H[c+2156>>2]=0;H[c+1076>>2]=0;c=c+8640|0;e=e+8|0;if((d|0)!=(e|0)){continue}break}if(!j){break b}}e=0;while(1){H[c+1076>>2]=0;c=c+1080|0;e=e+1|0;if((j|0)!=(e|0)){continue}break}}c=H[k+5608>>2];if(c){Ca(c);H[k+5608>>2]=0;g=H[i>>2]}if(!g){e=1;break a}while(1){b=b+1|0;Da(b,i+4|0,1);c:{if(!H[k+5632>>2]){break c}j=H[k+5628>>2];if(H[j>>2]!=H[i+4>>2]){break c}c=H[j+4>>2];d=H[a+96>>2];if((c|0)!=H[d+16>>2]){break c}g=H[j+8>>2];d:{if(!g){break d}e=0;h=N(c,c);if(H[g+16>>2]!=(N(h,H[(H[g>>2]<<2)+24896>>2])|0)){break a}c=Fa(h<<2);H[k+5608>>2]=c;if(!c){break a}e=H[g+12>>2];e:{switch(H[g>>2]-1|0){default:f=0;g=na-16|0;na=g;if(h){while(1){Da(e,g+12|0,2);L[c>>2]=K[g+12>>2];c=c+4|0;e=e+2|0;f=f+1|0;if((h|0)!=(f|0)){continue}break}}na=g+16|0;break d;case 0:f=0;g=na-16|0;na=g;if(h){while(1){Da(e,g+12|0,4);L[c>>2]=K[g+12>>2];c=c+4|0;e=e+4|0;f=f+1|0;if((h|0)!=(f|0)){continue}break}}na=g+16|0;break d;case 1:f=0;if(!h){break d}while(1){Fc(e,i+8|0);L[c>>2]=L[i+8>>2];c=c+4|0;e=e+4|0;f=f+1|0;if((h|0)!=(f|0)){continue}break};break d;case 2:break e}}f=0;if(!h){break d}while(1){Hb(e,i+8|0);L[c>>2]=M[i+8>>3];c=c+4|0;e=e+8|0;f=f+1|0;if((h|0)!=(f|0)){continue}break}}j=H[j+12>>2];if(!j){break c}e=0;h=H[d+16>>2];if(H[j+16>>2]!=(N(h,H[(H[j>>2]<<2)+24896>>2])|0)){break a}g=Fa(h<<2);if(!g){break a}c=H[j+12>>2];f:{g:{switch(H[j>>2]-1|0){default:f=0;e=g;if(!h){break f}while(1){Da(c,i+8|0,2);H[e>>2]=H[i+8>>2];e=e+4|0;c=c+2|0;f=f+1|0;if((h|0)!=(f|0)){continue}break};break f;case 0:f=0;e=g;if(!h){break f}while(1){Da(c,i+8|0,4);H[e>>2]=H[i+8>>2];e=e+4|0;c=c+4|0;f=f+1|0;if((h|0)!=(f|0)){continue}break};break f;case 1:f=0;e=g;if(!h){break f}while(1){Fc(c,i+8|0);H[e>>2]=~~L[i+8>>2];e=e+4|0;c=c+4|0;f=f+1|0;if((h|0)!=(f|0)){continue}break};break f;case 2:break g}}f=0;e=g;if(!h){break f}while(1){Hb(c,i+8|0);H[e>>2]=~~M[i+8>>3];e=e+4|0;c=c+8|0;f=f+1|0;if((h|0)!=(f|0)){continue}break}}d=H[d+16>>2];h:{if(!d){break h}h=d&7;c=H[k+5584>>2];i:{if(d>>>0<8){e=g;break i}j=d&-8;d=0;e=g;while(1){H[c+1076>>2]=H[e>>2];H[c+2156>>2]=H[e+4>>2];H[c+3236>>2]=H[e+8>>2];H[c+4316>>2]=H[e+12>>2];H[c+5396>>2]=H[e+16>>2];H[c+6476>>2]=H[e+20>>2];H[c+7556>>2]=H[e+24>>2];H[c+8636>>2]=H[e+28>>2];c=c+8640|0;e=e+32|0;d=d+8|0;if((j|0)!=(d|0)){continue}break}if(!h){break h}}d=0;while(1){H[c+1076>>2]=H[e>>2];c=c+1080|0;e=e+4|0;d=d+1|0;if((h|0)!=(d|0)){continue}break}}Ca(g)}e=1;l=l+1|0;if(l>>>0>2]){continue}break}}na=i+16|0;return e|0}function _d(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=na-128|0;na=e;H[e+120>>2]=0;a:{if((c|0)!=8){Ba(d,1,4047,0);Ba(d,1,4047,0);break a}Da(b,a+228|0,2);Da(b+2|0,e+124|0,4);Da(b+6|0,e+116|0,1);Da(b+7|0,e+120|0,1);c=H[a+228>>2];i=H[a+128>>2];if(c>>>0>=N(i,H[a+132>>2])>>>0){H[e+112>>2]=c;Ba(d,1,7843,e+112|0);break a}f=H[a+180>>2]+N(c,5644)|0;h=(c>>>0)/(i>>>0)|0;b=H[e+116>>2];b:{g=H[a+44>>2];if((g|0)>=0&(c|0)!=(g|0)){break b}g=H[f+5588>>2]+1|0;if((g|0)==(b|0)){break b}H[e+104>>2]=g;H[e+100>>2]=b;H[e+96>>2]=c;Ba(d,1,7867,e+96|0);f=0;break a}H[f+5588>>2]=b;c:{b=H[e+124>>2];if(b-1>>>0<=12){if((b|0)!=12){break c}H[e+64>>2]=12;Ba(d,2,11864,e- -64|0);b=H[e+124>>2]}if(!b){Ba(d,4,10695,0);H[a+56>>2]=1}d:{e:{f:{g:{b=H[f+5592>>2];if(b){g=H[e+116>>2];if(g>>>0>>0){break g}H[e+52>>2]=b;H[e+48>>2]=g;Ba(d,1,5150,e+48|0);H[a+56>>2]=1;f=0;break a}g=H[e+120>>2];if(g){break f}break d}g=H[e+120>>2];if(!g){break e}}b=(I[a+92|0]>>>4&1)+g|0;H[e+120>>2]=b;g=H[e+116>>2];j=H[f+5592>>2];if(g>>>0>j-1>>>0){H[e+20>>2]=j;H[e+16>>2]=g;Ba(d,1,5051,e+16|0);H[a+56>>2]=1;f=0;break a}if(b>>>0<=g>>>0){H[e+36>>2]=b;H[e+32>>2]=g;Ba(d,1,5250,e+32|0);H[a+56>>2]=1;f=0;break a}H[f+5592>>2]=b}if((H[e+116>>2]+1|0)!=(b|0)){break d}F[a+92|0]=I[a+92|0]|1}b=H[e+124>>2];H[a+8>>2]=16;H[a+24>>2]=H[a+56>>2]?0:b-12|0;f=H[a+44>>2];h:{if((f|0)==-1){f=4;b=c-N(h,i)|0;if(!(b>>>0>2]|b>>>0>=K[a+36>>2]|h>>>0>2])){f=h>>>0>=K[a+40>>2]?4:0}F[a+92|0]=I[a+92|0]&251|f;b=H[a+228>>2];break h}b=H[a+228>>2];F[a+92|0]=I[a+92|0]&251|((f|0)!=(b|0)?4:0)}c=H[H[a+224>>2]+40>>2]+N(b,40)|0;H[c>>2]=b;H[c+12>>2]=H[e+116>>2];f=H[e+120>>2];if(!H[a+76>>2]){if(K[c+4>>2]>=f>>>0){f=1;break a}H[e>>2]=b;Ba(d,2,1612,e);H[a+76>>2]=1;f=H[e+120>>2]}c=H[H[a+224>>2]+40>>2];b=H[a+228>>2];h=c+N(b,40)|0;if(f){H[h+4>>2]=f;b=H[e+120>>2];H[h+8>>2]=b;c=H[h+16>>2];if(!c){b=Ea(b,24);H[(H[H[a+224>>2]+40>>2]+N(H[a+228>>2],40)|0)+16>>2]=b;if(b){f=1;break a}f=0;Ba(d,1,6947,0);break a}b=Ga(c,N(b,24));c=H[H[a+224>>2]+40>>2]+N(H[a+228>>2],40)|0;if(!b){Ca(H[c+16>>2]);f=0;H[(H[H[a+224>>2]+40>>2]+N(H[a+228>>2],40)|0)+16>>2]=0;Ba(d,1,6947,0);break a}H[c+16>>2]=b;f=1;break a}i:{g=H[h+16>>2];if(g){break i}H[h+8>>2]=10;g=Ea(10,24);c=H[H[a+224>>2]+40>>2];b=H[a+228>>2];h=c+N(b,40)|0;H[h+16>>2]=g;if(g){break i}f=0;H[h+8>>2]=0;Ba(d,1,6947,0);break a}f=1;b=N(b,40)+c|0;c=H[e+116>>2];if(K[b+8>>2]>c>>>0){break a}h=b;b=c+1|0;H[h+8>>2]=b;b=Ga(g,N(b,24));c=H[H[a+224>>2]+40>>2]+N(H[a+228>>2],40)|0;if(!b){Ca(H[c+16>>2]);f=0;a=H[H[a+224>>2]+40>>2]+N(H[a+228>>2],40)|0;H[a+8>>2]=0;H[a+16>>2]=0;Ba(d,1,6947,0);break a}H[c+16>>2]=b;break a}H[e+80>>2]=b;Ba(d,1,12133,e+80|0);f=0}na=e+128|0;return f|0}function mb(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;f=H[a+8>>2];e=f+H[a+4>>2]|0;a:{if(!H[a+12>>2]){if((e|0)<2|(d|0)<=0){break a}q=e&2147483644;m=e&3;r=e&1;s=f+1|0;g=H[a>>2];o=g+(e<<2)|0;t=e-4>>>1|0;a=e-1|0;u=g+(a<<2)|0;v=N(c,f)<<2;l=e>>>0<4;w=N(a>>>1|0,c)<<2;while(1){f=H[b+v>>2];e=H[b>>2]-(f+1>>1)|0;a=0;h=0;if(!l){while(1){j=a+1|0;x=H[(N(j,c)<<2)+b>>2];i=H[(N(a+s|0,c)<<2)+b>>2];p=g+(h<<2)|0;H[p>>2]=e;k=e;e=x-((f+i|0)+2>>2)|0;H[p+4>>2]=(k+e>>1)+f;h=h+2|0;k=(a|0)!=(t|0);f=i;a=j;if(k){continue}break}}H[g+(h<<2)>>2]=e;if(r){a=H[b+w>>2]-(f+1>>1)|0;H[u>>2]=a;e=a+e>>1;a=-8}else{a=-4}H[a+o>>2]=e+f;f=0;a=0;h=0;e=0;b:{if(!l){while(1){H[(N(a,c)<<2)+b>>2]=H[g+(a<<2)>>2];e=a|1;H[(N(e,c)<<2)+b>>2]=H[g+(e<<2)>>2];e=a|2;H[(N(e,c)<<2)+b>>2]=H[g+(e<<2)>>2];e=a|3;H[(N(e,c)<<2)+b>>2]=H[g+(e<<2)>>2];a=a+4|0;h=h+4|0;if((q|0)!=(h|0)){continue}break}e=a;if(!m){break b}}while(1){H[(N(c,e)<<2)+b>>2]=H[g+(e<<2)>>2];e=e+1|0;f=f+1|0;if((m|0)!=(f|0)){continue}break}}b=b+4|0;n=n+1|0;if((n|0)!=(d|0)){continue}break}break a}c:{switch(e-1|0){case 0:if((d|0)<=0){break a}a=d&3;if(d>>>0>=4){d=d&2147483644;c=0;while(1){H[b>>2]=H[b>>2]/2;H[b+4>>2]=H[b+4>>2]/2;H[b+8>>2]=H[b+8>>2]/2;H[b+12>>2]=H[b+12>>2]/2;b=b+16|0;c=c+4|0;if((d|0)!=(c|0)){continue}break}if(!a){break a}}c=0;while(1){H[b>>2]=H[b>>2]/2;b=b+4|0;c=c+1|0;if((a|0)!=(c|0)){continue}break};break a;case 1:if((d|0)<=0){break a}a=H[a>>2];e=0;f=N(c,f)<<2;while(1){i=b+f|0;j=H[b>>2]-(H[i>>2]+1>>1)|0;H[a+4>>2]=j;i=j+H[i>>2]|0;H[a>>2]=i;H[b>>2]=i;H[(c<<2)+b>>2]=H[a+4>>2];b=b+4|0;e=e+1|0;if((e|0)!=(d|0)){continue}break};break a;default:break c}}if((e|0)<3|(d|0)<=0){break a}q=e&2147483644;m=e&3;g=H[a>>2];r=(g+(e<<2)|0)-4|0;a=e-2|0;s=g+(a<<2)|0;o=e&1;i=!o;t=((e-i|0)-4>>>1|0)+1|0;u=N(c,f)<<2;v=a-i>>>0<2;w=N((e>>>1|0)-1|0,c)<<2;x=e-1>>>0<3;while(1){l=b+u|0;f=H[l+(c<<2)>>2];a=H[l>>2];e=H[b>>2]-((f+a|0)+2>>2)|0;H[g>>2]=e+a;a=1;h=1;if(!v){while(1){p=H[(N(a,c)<<2)+b>>2];j=a+1|0;i=H[l+(N(j,c)<<2)>>2];y=g+(h<<2)|0;H[y>>2]=e;k=e;e=p-((f+i|0)+2>>2)|0;H[y+4>>2]=(k+e>>1)+f;h=h+2|0;k=(a|0)!=(t|0);f=i;a=j;if(k){continue}break}}H[g+(h<<2)>>2]=e;d:{if(!o){a=H[b+w>>2]-(f+1>>1)|0;H[s>>2]=(e+a>>1)+f;break d}a=e+f|0}H[r>>2]=a;f=0;a=0;h=0;e=0;e:{if(!x){while(1){H[(N(a,c)<<2)+b>>2]=H[g+(a<<2)>>2];e=a|1;H[(N(e,c)<<2)+b>>2]=H[g+(e<<2)>>2];e=a|2;H[(N(e,c)<<2)+b>>2]=H[g+(e<<2)>>2];e=a|3;H[(N(e,c)<<2)+b>>2]=H[g+(e<<2)>>2];a=a+4|0;h=h+4|0;if((q|0)!=(h|0)){continue}break}e=a;if(!m){break e}}while(1){H[(N(c,e)<<2)+b>>2]=H[g+(e<<2)>>2];e=e+1|0;f=f+1|0;if((m|0)!=(f|0)){continue}break}}b=b+4|0;n=n+1|0;if((n|0)!=(d|0)){continue}break}}}function Ub(a,b,c,d,e,f,g){var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;a:{n=N(e,3);h=H[b>>2]>>>n|0;if(h&2097168){break a}h=h&495;if(!h){break a}o=a+28|0;l=o+(I[h+H[a+108>>2]|0]<<2)|0;H[a+104>>2]=l;k=H[l>>2];i=H[k>>2];h=H[a+4>>2]-i|0;H[a+4>>2]=h;j=H[a>>2];b:{if(j>>>16>>>0>>0){m=H[k+4>>2];H[a+4>>2]=i;h=h>>>0>>0;H[l>>2]=H[k+(h?8:12)>>2];k=h?m:!m;h=H[a+8>>2];while(1){c:{if(h){break c}h=H[a+16>>2];m=h+1|0;l=I[h+1|0];if(I[h|0]==255){if(l>>>0>=144){H[a+12>>2]=H[a+12>>2]+1;j=j+65280|0;h=8;break c}H[a+16>>2]=m;j=(l<<9)+j|0;h=7;break c}H[a+16>>2]=m;h=8;j=(l<<8)+j|0}h=h-1|0;H[a+8>>2]=h;j=j<<1;H[a>>2]=j;i=i<<1;H[a+4>>2]=i;if(i>>>0<32768){continue}break}h=i;break b}j=j-(i<<16)|0;H[a>>2]=j;if(!(h&32768)){m=H[k+4>>2];i=h>>>0>>0;H[l>>2]=H[k+(i?12:8)>>2];k=i?!m:m;i=H[a+8>>2];while(1){d:{if(i){break d}i=H[a+16>>2];m=i+1|0;l=I[i+1|0];if(I[i|0]==255){if(l>>>0>=144){H[a+12>>2]=H[a+12>>2]+1;j=j+65280|0;i=8;break d}H[a+16>>2]=m;j=(l<<9)+j|0;i=7;break d}H[a+16>>2]=m;i=8;j=(l<<8)+j|0}i=i-1|0;H[a+8>>2]=i;j=j<<1;H[a>>2]=j;h=h<<1;H[a+4>>2]=h;if(h>>>0<32768){continue}break}break b}k=H[k+4>>2]}e:{if(!k){break e}p=b-4|0;i=H[b>>2];k=H[b+4>>2]>>>n+17&4|(H[p>>2]>>>n+19&1|(i>>>n+16&64|i>>>n&170|i>>>(e?n+12|0:14)&16));m=o+(I[k+24384|0]<<2)|0;H[a+104>>2]=m;l=H[m>>2];i=H[l>>2];h=h-i|0;H[a+4>>2]=h;o=I[k+24640|0];f:{if(j>>>16>>>0>>0){k=H[l+4>>2];H[a+4>>2]=i;h=h>>>0>>0;H[m>>2]=H[l+(h?8:12)>>2];l=h?k:!k;h=H[a+8>>2];while(1){g:{if(h){break g}h=H[a+16>>2];m=h+1|0;k=I[h+1|0];if(I[h|0]==255){if(k>>>0>=144){H[a+12>>2]=H[a+12>>2]+1;j=j+65280|0;h=8;break g}H[a+16>>2]=m;j=(k<<9)+j|0;h=7;break g}H[a+16>>2]=m;h=8;j=(k<<8)+j|0}h=h-1|0;H[a+8>>2]=h;j=j<<1;H[a>>2]=j;i=i<<1;H[a+4>>2]=i;if(i>>>0<32768){continue}break}break f}k=j-(i<<16)|0;H[a>>2]=k;if(!(h&32768)){j=H[l+4>>2];i=h>>>0>>0;H[m>>2]=H[l+(i?12:8)>>2];l=i?!j:j;j=H[a+8>>2];while(1){h:{if(j){break h}j=H[a+16>>2];m=j+1|0;i=I[j+1|0];if(I[j|0]==255){if(i>>>0>=144){H[a+12>>2]=H[a+12>>2]+1;k=k+65280|0;j=8;break h}H[a+16>>2]=m;k=(i<<9)+k|0;j=7;break h}H[a+16>>2]=m;j=8;k=(i<<8)+k|0}j=j-1|0;H[a+8>>2]=j;k=k<<1;H[a>>2]=k;h=h<<1;H[a+4>>2]=h;if(h>>>0<32768){continue}break}break f}l=H[l+4>>2]}H[c>>2]=(l|0)==(o|0)?d:0-d|0;H[p>>2]=H[p>>2]|32<>2]=H[b>>2]|(c<<19|16)<>2]=H[b+4>>2]|8<>2]=H[a+4>>2]|32768;H[a>>2]=H[a>>2]|c<<31|65536;a=a-4|0;H[a>>2]=H[a>>2]|131072}if((e|0)!=3){break e}a=(f<<2)+b|0;H[a+4>>2]=H[a+4>>2]|1;H[a>>2]=H[a>>2]|c<<18|2;a=a-4|0;H[a>>2]=H[a>>2]|4}H[b>>2]=H[b>>2]|2097152<>2]>>>m|0;if(g&2097168){break a}n=a+28|0;k=n+(I[H[a+108>>2]+(g&495)|0]<<2)|0;H[a+104>>2]=k;j=H[k>>2];h=H[j>>2];g=H[a+4>>2]-h|0;H[a+4>>2]=g;i=H[a>>2];b:{if(i>>>16>>>0>>0){l=H[j+4>>2];H[a+4>>2]=h;g=g>>>0>>0;H[k>>2]=H[j+(g?8:12)>>2];j=g?l:!l;g=H[a+8>>2];while(1){c:{if(g){break c}g=H[a+16>>2];l=g+1|0;k=I[g+1|0];if(I[g|0]==255){if(k>>>0>=144){H[a+12>>2]=H[a+12>>2]+1;i=i+65280|0;g=8;break c}H[a+16>>2]=l;i=(k<<9)+i|0;g=7;break c}H[a+16>>2]=l;g=8;i=(k<<8)+i|0}g=g-1|0;H[a+8>>2]=g;i=i<<1;H[a>>2]=i;h=h<<1;H[a+4>>2]=h;if(h>>>0<32768){continue}break}g=h;break b}i=i-(h<<16)|0;H[a>>2]=i;if(!(g&32768)){l=H[j+4>>2];h=g>>>0>>0;H[k>>2]=H[j+(h?12:8)>>2];j=h?!l:l;h=H[a+8>>2];while(1){d:{if(h){break d}h=H[a+16>>2];l=h+1|0;k=I[h+1|0];if(I[h|0]==255){if(k>>>0>=144){H[a+12>>2]=H[a+12>>2]+1;i=i+65280|0;h=8;break d}H[a+16>>2]=l;i=(k<<9)+i|0;h=7;break d}H[a+16>>2]=l;h=8;i=(k<<8)+i|0}h=h-1|0;H[a+8>>2]=h;i=i<<1;H[a>>2]=i;g=g<<1;H[a+4>>2]=g;if(g>>>0<32768){continue}break}break b}j=H[j+4>>2]}if(!j){break a}j=n;n=b-4|0;h=H[b>>2];o=H[b+4>>2]>>>m+17&4|(H[n>>2]>>>m+19&1|(h>>>m+16&64|h>>>m&170|h>>>(e?m+12|0:14)&16));l=j+(I[o+24384|0]<<2)|0;H[a+104>>2]=l;k=H[l>>2];h=H[k>>2];g=g-h|0;H[a+4>>2]=g;e:{if(i>>>16>>>0>>0){j=H[k+4>>2];H[a+4>>2]=h;g=g>>>0>>0;H[l>>2]=H[k+(g?8:12)>>2];k=g?j:!j;g=H[a+8>>2];while(1){f:{if(g){break f}g=H[a+16>>2];l=g+1|0;j=I[g+1|0];if(I[g|0]==255){if(j>>>0>=144){H[a+12>>2]=H[a+12>>2]+1;i=i+65280|0;g=8;break f}H[a+16>>2]=l;i=(j<<9)+i|0;g=7;break f}H[a+16>>2]=l;g=8;i=(j<<8)+i|0}g=g-1|0;H[a+8>>2]=g;i=i<<1;H[a>>2]=i;h=h<<1;H[a+4>>2]=h;if(h>>>0<32768){continue}break}break e}j=i-(h<<16)|0;H[a>>2]=j;if(!(g&32768)){i=H[k+4>>2];h=g>>>0>>0;H[l>>2]=H[k+(h?12:8)>>2];k=h?!i:i;i=H[a+8>>2];while(1){g:{if(i){break g}i=H[a+16>>2];l=i+1|0;h=I[i+1|0];if(I[i|0]==255){if(h>>>0>=144){H[a+12>>2]=H[a+12>>2]+1;j=j+65280|0;i=8;break g}H[a+16>>2]=l;j=(h<<9)+j|0;i=7;break g}H[a+16>>2]=l;i=8;j=(h<<8)+j|0}i=i-1|0;H[a+8>>2]=i;j=j<<1;H[a>>2]=j;g=g<<1;H[a+4>>2]=g;if(g>>>0<32768){continue}break}break e}k=H[k+4>>2]}g=c;c=I[o+24640|0];H[g>>2]=(c|0)==(k|0)?d:0-d|0;H[n>>2]=H[n>>2]|32<>2]=H[b>>2]|(d<<19|16)<>2]=H[b+4>>2]|8<>2]<<2)+b|0;H[c+4>>2]=H[c+4>>2]|32768;H[c>>2]=H[c>>2]|d<<31|65536;c=c-4|0;H[c>>2]=H[c>>2]|131072}if((e|0)!=3){break a}a=(H[a+124>>2]<<2)+b|0;H[a+4>>2]=H[a+4>>2]|4;H[a+12>>2]=H[a+12>>2]|1;H[a+8>>2]=H[a+8>>2]|d<<18|2}}function Cd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;e=na-112|0;na=e;j=1024;a:{b:{h=Ea(1,1024);if(h){l=e+92|0;k=e+108|0;while(1){c:{d:{d=e+104|0;e:{if((Ja(b,d,8,c)|0)!=8){break e}Da(d,e+88|0,4);Da(k,l,4);f=8;f:{g:{h:{i:{switch(H[e+88>>2]){case 0:d=Pa(b);g=qa;if((g|0)<0){g=1}else{g=d>>>0<4294967288&(g|0)<=0}if(g){break h}Ba(c,1,8449,0);break e;case 1:break i;default:break f}}d=e+104|0;if((Ja(b,d,8,c)|0)!=8){break e}Da(d,e+100|0,4);if(!H[e+100>>2]){break g}Ba(c,1,8449,0);break e}H[e+88>>2]=d+8;break f}Da(k,e+88|0,4);f=16}d=H[e+92>>2];if((d|0)==1785737827){b=H[a+100>>2];if(b&4){H[a+100>>2]=b|8;break e}Ba(c,1,5702,0);Ca(h);a=0;break a}i=H[e+88>>2];if(!i){Ba(c,1,3268,0);Ca(h);a=0;break a}if(f>>>0>i>>>0){H[e+4>>2]=d;H[e>>2]=i;Ba(c,1,13933,e);break b}j:{k:{l:{m:{n:{o:{p:{q:{r:{s:{if((d|0)<=1668246641){if((d|0)==1651532643){break r}if((d|0)==1667523942){break p}if((d|0)!=1668112752){break s}g=25264;break n}if((d|0)<=1783635999){if((d|0)==1668246642){break o}g=25232;if((d|0)==1768449138){break n}if((d|0)!=1718909296){break s}g=25208;break l}if((d|0)==1885564018){break q}if((d|0)==1783636e3){break m}g=25216;if((d|0)==1785737832){break l}}d=H[a+100>>2];if(d&1){break j}Ba(c,1,2062,0);Ca(h);a=0;break a}g=25248;break n}g=25256;break n}g=25272;break n}g=25240}H[e+76>>2]=d&255;H[e+64>>2]=d>>>24;H[e+72>>2]=d>>>8&255;H[e+68>>2]=d>>>16&255;Ba(c,2,2011,e- -64|0);f=i-f|0;if(I[a+100|0]&4){break k}d=H[e+92>>2];H[e+48>>2]=d>>>24;H[e+60>>2]=d&255;H[e+52>>2]=d>>>16&255;H[e+56>>2]=d>>>8&255;Ba(c,2,6771,e+48|0);H[a+100>>2]=H[a+100>>2]|2147483647;d=qb(b,f,c);if(!qa&(d|0)==(f|0)){continue}Ba(c,1,3748,0);Ca(h);a=0;break a}g=25200}f=i-f|0}d=f;f=Pa(b);i=qa;if((i|0)<0){f=1}else{f=(i|0)<=0&d>>>0>f>>>0}if(f){f=H[e+88>>2];a=H[e+92>>2];m=e,n=Pa(b),H[m+40>>2]=n;H[e+36>>2]=d;H[e+32>>2]=a&255;H[e+20>>2]=a>>>24;H[e+16>>2]=f;H[e+28>>2]=a>>>8&255;H[e+24>>2]=a>>>16&255;Ba(c,1,15680,e+16|0);break b}if(d>>>0<=j>>>0){f=h;break c}j=d;f=Ga(h,d);if(f){break c}Ca(h);Ba(c,1,2193,0);a=0;break a}if(!(d&2)){Ba(c,1,2132,0);Ca(h);a=0;break a}H[a+100>>2]=d|2147483647;d=i-f|0;f=qb(b,d,c);if(!qa&(d|0)==(f|0)){continue}if(!(I[a+100|0]&8)){break d}Ba(c,2,3748,0)}Ca(h);a=1;break a}Ba(c,1,3748,0);Ca(h);a=0;break a}if((Ja(b,f,d,c)|0)!=(d|0)){Ba(c,1,3798,0);Ca(f);a=0;break a}h=f;if(ra[H[g+4>>2]](a,f,d,c)|0){continue}break}Ca(f);a=0;break a}Ba(c,1,4923,0);a=0;break a}Ca(h);a=0}na=e+112|0;return a|0}function Id(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;f=na-16|0;na=f;if(H[a+8>>2]==16){i=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{i=H[a+12>>2]}a:{if(c>>>0<=1){Ba(d,1,4721,0);a=0;break a}Da(b,f+12|0,2);if(H[f+12>>2]){Ba(d,2,5897,0);a=1;break a}if(c>>>0<=6){Ba(d,1,4721,0);a=0;break a}Da(b+2|0,f+8|0,1);e=H[i+5628>>2];h=H[i+5632>>2];b:{c:{if(!h){break c}j=H[f+8>>2];a=e;while(1){if((j|0)!=H[a>>2]){a=a+20|0;g=g+1|0;if((h|0)!=(g|0)){continue}break c}break}j=0;if((g|0)!=(h|0)){break b}}if(H[i+5636>>2]==(h|0)){a=h+10|0;H[i+5636>>2]=a;a=Ga(e,N(a,20));if(!a){Ca(H[i+5628>>2]);H[i+5636>>2]=0;H[i+5628>>2]=0;H[i+5632>>2]=0;Ba(d,1,4747,0);a=0;break a}H[i+5628>>2]=a;e=H[i+5632>>2];j=N(H[i+5636>>2]-e|0,20);if(j){y(a+N(e,20)|0,0,j)}h=H[i+5632>>2];e=H[i+5628>>2]}a=e+N(h,20)|0;j=1}H[a>>2]=H[f+8>>2];Da(b+3|0,f+12|0,2);if(H[f+12>>2]){Ba(d,2,5897,0);a=1;break a}Da(b+5|0,f+4|0,2);e=H[f+4>>2];if(e>>>0>=2){Ba(d,2,3130,0);a=1;break a}h=c-7|0;if(e){c=b+7|0;while(1){if(h>>>0<=2){Ba(d,1,4721,0);a=0;break a}Da(c,f+12|0,1);if(H[f+12>>2]!=1){Ba(d,2,5579,0);a=1;break a}Da(c+1|0,f,2);e=H[f>>2];b=e&32767;H[a+4>>2]=b;h=h-3|0;e=(e>>>15|0)+1|0;k=N(e,b)+2|0;if(h>>>0>>0){Ba(d,1,4721,0);a=0;break a}c=c+3|0;g=0;if(b){while(1){Da(c,f+12|0,e);if(H[f+12>>2]!=(g|0)){Ba(d,2,6259,0);a=1;break a}c=c+e|0;g=g+1|0;if(g>>>0>2]){continue}break}}Da(c,f,2);e=H[f>>2];b=e&32767;H[f>>2]=b;if((b|0)!=H[a+4>>2]){Ba(d,2,3306,0);a=1;break a}e=(e>>>15|0)+1|0;l=N(e,b)+3|0;k=h-k|0;if(l>>>0>k>>>0){Ba(d,1,4721,0);a=0;break a}c=c+2|0;g=0;if(b){while(1){Da(c,f+12|0,e);if(H[f+12>>2]!=(g|0)){Ba(d,2,6259,0);a=1;break a}c=c+e|0;g=g+1|0;if(g>>>0>2]){continue}break}}Da(c,f+12|0,3);e=H[f+12>>2];H[a+8>>2]=0;H[a+12>>2]=0;F[a+16|0]=!(e&65536)|I[a+16|0]&254;h=e&255;H[f+8>>2]=h;d:{if(!h){break d}m=H[i+5620>>2];if(m){g=H[i+5616>>2];b=0;while(1){if((h|0)==H[g+8>>2]){H[a+8>>2]=g;break d}g=g+20|0;b=b+1|0;if((m|0)!=(b|0)){continue}break}}Ba(d,1,4721,0);a=0;break a}e=e>>>8&255;H[f+8>>2]=e;e:{if(!e){break e}h=H[i+5620>>2];if(h){g=H[i+5616>>2];b=0;while(1){if((e|0)==H[g+8>>2]){H[a+12>>2]=g;break e}g=g+20|0;b=b+1|0;if((h|0)!=(b|0)){continue}break}}Ba(d,1,4721,0);a=0;break a}h=k-l|0;c=c+3|0;n=n+1|0;if(n>>>0>2]){continue}break}}if(h){Ba(d,1,4721,0);a=0;break a}a=1;if(!j){break a}H[i+5632>>2]=H[i+5632>>2]+1;a=1}na=f+16|0;return a|0}function Tc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;if(K[a+44>>2]>=8){i=H[a+40>>2];l=8;while(1){k=H[a+12>>2]<<5;e=H[a>>2];g=H[a+36>>2];b=H[a+16>>2];h=H[a+20>>2];a:{if(b>>>0>=h>>>0){break a}j=e+k|0;d=b+1|0;if(h-b&1){c=j+(b<<6)|0;b=(N(b,g)<<2)+i|0;f=H[b+28>>2];H[c+24>>2]=H[b+24>>2];H[c+28>>2]=f;f=H[b+20>>2];H[c+16>>2]=H[b+16>>2];H[c+20>>2]=f;f=H[b+12>>2];H[c+8>>2]=H[b+8>>2];H[c+12>>2]=f;f=H[b+4>>2];H[c>>2]=H[b>>2];H[c+4>>2]=f;b=d}if((d|0)==(h|0)){break a}while(1){d=(N(b,g)<<2)+i|0;f=H[d+28>>2];c=j+(b<<6)|0;H[c+24>>2]=H[d+24>>2];H[c+28>>2]=f;f=H[d+20>>2];H[c+16>>2]=H[d+16>>2];H[c+20>>2]=f;f=H[d+12>>2];H[c+8>>2]=H[d+8>>2];H[c+12>>2]=f;f=H[d+4>>2];H[c>>2]=H[d>>2];H[c+4>>2]=f;d=b+1|0;c=j+(d<<6)|0;d=(N(d,g)<<2)+i|0;f=H[d+28>>2];H[c+24>>2]=H[d+24>>2];H[c+28>>2]=f;f=H[d+20>>2];H[c+16>>2]=H[d+16>>2];H[c+20>>2]=f;f=H[d+12>>2];H[c+8>>2]=H[d+8>>2];H[c+12>>2]=f;f=H[d+4>>2];H[c>>2]=H[d>>2];H[c+4>>2]=f;b=b+2|0;if((h|0)!=(b|0)){continue}break}}b=H[a+24>>2];h=H[a+28>>2];b:{if(b>>>0>=h>>>0){break b}j=(e-k|0)+32|0;k=(N(g,H[a+8>>2])<<2)+i|0;d=b+1|0;if(h-b&1){c=j+(b<<6)|0;b=k+(N(b,g)<<2)|0;e=H[b+28>>2];H[c+24>>2]=H[b+24>>2];H[c+28>>2]=e;e=H[b+20>>2];H[c+16>>2]=H[b+16>>2];H[c+20>>2]=e;e=H[b+12>>2];H[c+8>>2]=H[b+8>>2];H[c+12>>2]=e;e=H[b+4>>2];H[c>>2]=H[b>>2];H[c+4>>2]=e;b=d}if((d|0)==(h|0)){break b}while(1){d=k+(N(b,g)<<2)|0;e=H[d+28>>2];c=j+(b<<6)|0;H[c+24>>2]=H[d+24>>2];H[c+28>>2]=e;e=H[d+20>>2];H[c+16>>2]=H[d+16>>2];H[c+20>>2]=e;e=H[d+12>>2];H[c+8>>2]=H[d+8>>2];H[c+12>>2]=e;e=H[d+4>>2];H[c>>2]=H[d>>2];H[c+4>>2]=e;d=b+1|0;c=j+(d<<6)|0;d=k+(N(d,g)<<2)|0;e=H[d+28>>2];H[c+24>>2]=H[d+24>>2];H[c+28>>2]=e;e=H[d+20>>2];H[c+16>>2]=H[d+16>>2];H[c+20>>2]=e;e=H[d+12>>2];H[c+8>>2]=H[d+8>>2];H[c+12>>2]=e;e=H[d+4>>2];H[c>>2]=H[d>>2];H[c+4>>2]=e;b=b+2|0;if((h|0)!=(b|0)){continue}break}}Sa(a);b=0;if(H[a+32>>2]){while(1){d=H[a>>2]+(b<<5)|0;c=H[d+28>>2];g=(N(H[a+36>>2],b)<<2)+i|0;H[g+24>>2]=H[d+24>>2];H[g+28>>2]=c;c=H[d+20>>2];H[g+16>>2]=H[d+16>>2];H[g+20>>2]=c;c=H[d+12>>2];H[g+8>>2]=H[d+8>>2];H[g+12>>2]=c;c=H[d+4>>2];H[g>>2]=H[d>>2];H[g+4>>2]=c;b=b+1|0;if(b>>>0>2]){continue}break}}i=i+32|0;l=l+8|0;if(l>>>0<=K[a+44>>2]){continue}break}}Ca(H[a>>2]);Ca(a)}function Zc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=b;b=H[b>>2]+7&-8;H[d>>2]=b+16;o=a;f=H[b>>2];a=H[b+4>>2];d=H[b+8>>2];c=H[b+12>>2];p=c;h=na-32|0;na=h;b=c&65535;e=c;c=d;d=e>>>16&32767;g=d;a:{if(d-15361>>>0<=2045){b=b<<4|c>>>28;d=c<<4|a>>>28;e=g-15360|0;a=a&268435455;b:{if((a|0)==134217728&(f|0)!=0|a>>>0>134217728){c=b;d=d+1|0;b=d?c:c+1|0;break b}if(f|(a|0)!=134217728){break b}a=d;d=d+(d&1)|0;b=a>>>0>d>>>0?b+1|0:b}c=b>>>0>1048575;f=c?0:d;a=c?0:b;b=0;c=c+e|0;b=c>>>0>>0?1:b;break a}if(!(!(c|f|(a|b))|(d|0)!=32767)){e=b<<4|c>>>28;f=c<<4|a>>>28;a=e|524288;c=2047;b=0;break a}if(g>>>0>17406){f=0;a=0;c=2047;b=0;break a}e=!(d|k);l=e?15360:15361;k=l-g|0;if((k|0)>112){f=0;a=0;c=0;b=0;break a}d=c;b=e?b:b|65536;if((g|0)!=(l|0)){m=f;c=a;i=d;e=b;l=128-k|0;c:{if(l&64){g=f;e=l+-64|0;c=e&31;if((e&63)>>>0>=32){e=f<>>32-c|a<>>0>=32){g=i<>>32-j|e<>>0>=32){e=0;i=c>>>i|0}else{e=c>>>i|0;i=((1<>>i}i=n|i;e=e|g;n=m;j=l&31;if((l&63)>>>0>=32){g=m<>>32-j|c<>2]=m;H[h+20>>2]=c;H[h+24>>2]=i;H[h+28>>2]=e;m=(H[h+16>>2]|H[h+24>>2]|(H[h+20>>2]|H[h+28>>2]))!=0}d:{if(k&64){c=d;f=k+-64|0;a=f&31;if((f&63)>>>0>=32){e=0;f=b>>>a|0}else{e=b>>>a|0;f=((1<>>a}a=e;d=0;b=0;break d}if(!k){break d}g=d;c=64-k|0;e=c&31;if((c&63)>>>0>=32){c=d<>>32-e|b<>>0>=32){g=0;a=a>>>f|0}else{g=a>>>f|0;a=((1<>>f}f=i|a;a=c|g;e=d;d=k&31;if((k&63)>>>0>=32){c=0;d=b>>>d|0}else{c=b>>>d|0;d=((1<>>d}b=c}H[h>>2]=f;H[h+4>>2]=a;H[h+8>>2]=d;H[h+12>>2]=b;a=H[h+8>>2];d=H[h+4>>2];f=a<<4|d>>>28;a=H[h+12>>2]<<4|a>>>28;c=d&268435455;b=H[h>>2]|m;e:{if((c|0)==134217728&(b|0)!=0|c>>>0>134217728){f=f+1|0;a=f?a:a+1|0;break e}if(b|(c|0)!=134217728){break e}b=a;a=f;f=f+(f&1)|0;a=a>>>0>f>>>0?b+1|0:b}c=a>>>0>1048575;a=c?a^1048576:a;b=0}na=h+32|0;u(0,f|0);u(1,a|(p&-2147483648|c<<20));q=o,r=+w(),M[q>>3]=r}function Ac(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;q=H[a+24>>2];if(!H[q+16>>2]){return 1}r=H[q+24>>2];o=H[H[H[a+20>>2]>>2]+20>>2];while(1){d=H[r+36>>2];H[b+36>>2]=d;f=H[o+28>>2];c=f+N(d,152)|0;t=H[a+64>>2];a:{if(t){d=f+N(H[o+24>>2],152)|0;p=H[d-144>>2]-H[d-152>>2]|0;f=c+12|0;e=c+4|0;d=H[c+8>>2];g=H[c>>2];c=36;break a}f=c+148|0;e=c+140|0;d=H[c+144>>2];g=H[c+136>>2];p=d-g|0;c=52}u=H[c+o>>2];b:{c:{if(!u){break c}k=H[e>>2];l=H[f>>2];f=d-g|0;e=H[b+40>>2];c=e&31;if((e&63)>>>0>=32){c=-1<>>32-c}m=h^-1;j=H[b+20>>2];h=m+j|0;i=c^-1;c=i;j=h>>>0>>0?c+1|0:c;c=e&31;if((e&63)>>>0>=32){h=j>>>c|0}else{h=((1<>>c}c=H[b+16>>2];j=c+m|0;m=c>>>0>j>>>0?i+1|0:i;i=e&31;c=H[b+8>>2];if((e&63)>>>0>=32){i=m>>>i|0}else{i=((1<>>i}e=c+i|0;d:{if(g>>>0>i>>>0){m=g-i|0;i=0;if(e>>>0>=d>>>0){d=f;j=0;break d}d=e-g|0;j=f-d|0;break d}i=i-g|0;if(e>>>0>=d>>>0){d=f-i|0;j=0;m=0;break d}j=d-e|0;m=0;d=c}f=l-k|0;e=H[b+12>>2];g=e+h|0;e:{if(h>>>0>>0){s=k-h|0;h=0;n=0;if(g>>>0>=l>>>0){break e}n=f;f=g-k|0;n=n-f|0;break e}h=h-k|0;if(g>>>0>=l>>>0){f=f-h|0;s=0;n=0;break e}s=0;f=e;n=l-g|0}k=n;g=0;if((h|i|(j|k)|(d|f))<0){break b}k=N(h,p)+i|0;l=H[b+44>>2];h=N(c,s)+m|0;f:{g:{if(!(k|l|(h|(c|0)!=(p|0))|(c|0)!=(d|0))){if((e|0)!=(f|0)){break g}d=(t?36:52)+o|0;H[b+44>>2]=H[d>>2];H[d>>2]=0;break c}if(l){break f}}be(e,0,c);if(qa|!e){break b}c=N(c,e);if(c>>>0>1073741823){break b}c=Ia(c<<2);H[b+44>>2]=c;if(!c){break b}e=H[b+8>>2];g=H[b+12>>2];if((e|0)==(d|0)&(g|0)==(f|0)){break f}e=N(e,g)<<2;if(!e){break f}y(c,0,e)}if(!f){break c}d=d<<2;g=H[b+44>>2]+(h<<2)|0;c=(k<<2)+u|0;if((f|0)!=1){k=f&1;l=f&2147483646;f=0;while(1){h=!d;if(!h){B(g,c,d)}i=p<<2;c=i+c|0;e=(H[b+8>>2]<<2)+g|0;if(!h){B(e,c,d)}c=c+i|0;g=e+(H[b+8>>2]<<2)|0;f=f+2|0;if((l|0)!=(f|0)){continue}break}if(!k){break c}}if(!d){break c}B(g,c,d)}o=o+76|0;r=r+52|0;b=b+52|0;g=1;v=v+1|0;if(v>>>0>2]){continue}}break}return g}function vb(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0;if(a){a:{if(H[a>>2]){b=H[a+12>>2];if(b){ib(b);Ca(H[a+12>>2]);H[a+12>>2]=0}b=H[a+16>>2];if(b){Ca(b);H[a+16>>2]=0;H[a+20>>2]=0}Ca(H[a+64>>2]);H[a+60>>2]=0;H[a+64>>2]=0;Ca(H[a+72>>2]);H[a+72>>2]=0;Ca(H[a+88>>2]);H[a+88>>2]=0;break a}b=H[a+44>>2];if(b){Ca(b);H[a+44>>2]=0}b=H[a+32>>2];if(b){Ca(b);H[a+32>>2]=0;H[a+36>>2]=0}b=H[a+52>>2];if(!b){break a}Ca(b);H[a+52>>2]=0;H[a+56>>2]=0}Qb(H[a+232>>2]);b=H[a+180>>2];if(b){e=N(H[a+128>>2],H[a+132>>2]);if(e){while(1){ib(b);b=b+5644|0;c=c+1|0;if((e|0)!=(c|0)){continue}break}b=H[a+180>>2]}Ca(b);H[a+180>>2]=0}b=H[a+140>>2];if(b){c=H[a+136>>2];if(c){b=0;while(1){e=H[H[a+140>>2]+(b<<3)>>2];if(e){Ca(e);c=H[a+136>>2]}b=b+1|0;if(c>>>0>b>>>0){continue}break}b=H[a+140>>2]}H[a+136>>2]=0;Ca(b);H[a+140>>2]=0}Ca(H[a+160>>2]);H[a+144>>2]=0;H[a+160>>2]=0;Ca(H[a+124>>2]);H[a+124>>2]=0;if(!(I[a+212|0]&2)){Ca(H[a+192>>2])}y(a+104|0,0,112);ob(H[a+216>>2]);H[a+216>>2]=0;ob(H[a+220>>2]);H[a+216>>2]=0;d=H[a+224>>2];if(d){b=H[d+28>>2];if(b){Ca(b);H[d+28>>2]=0}c=H[d+40>>2];if(c){if(H[d+36>>2]){while(1){e=N(g,40);b=H[(e+c|0)+36>>2];if(b){Ca(b);c=H[d+40>>2];H[(e+c|0)+36>>2]=0}b=H[(c+e|0)+16>>2];if(b){Ca(b);c=H[d+40>>2];H[(e+c|0)+16>>2]=0}b=H[(c+e|0)+24>>2];if(b){Ca(b);c=H[d+40>>2];H[(e+c|0)+24>>2]=0}g=g+1|0;if(g>>>0>2]){continue}break}}Ca(c);H[d+40>>2]=0}Ca(d)}H[a+224>>2]=0;Ta(H[a+96>>2]);H[a+96>>2]=0;Ta(H[a+100>>2]);H[a+100>>2]=0;f=H[a+236>>2];if(f){b:{if(!H[f+8>>2]){break b}if(H[f+12>>2]){H[f+40>>2]=0;while(1){if(H[f+24>>2]>0){continue}break}}H[f+16>>2]=1;Ca(H[f>>2]);c=H[f+28>>2];if(!c){break b}while(1){b=H[c+4>>2];Ca(c);H[f+28>>2]=b;c=b;if(b){continue}break}}d=H[f+36>>2];if(d){g=H[d+4>>2];if((g|0)>0){b=0;while(1){e=H[d>>2]+N(b,12)|0;c=H[e+8>>2];if(c){ra[c|0](H[e+4>>2]);g=H[d+4>>2]}b=b+1|0;if((g|0)>(b|0)){continue}break}}Ca(H[d>>2]);Ca(d)}Ca(f)}H[a+236>>2]=0;Ca(a)}}function bc(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;k=na-256|0;na=k;a:{if(!a){a=0;break a}if(!(H[a>>2]==(b|0)&H[a+4>>2]==(c|0))){H[a+4>>2]=c;H[a>>2]=b;H[k>>2]=c;H[k+128>>2]=b;e=c;g=b;while(1){o=h;h=h+1|0;j=h<<2;l=(e+1|0)/2|0;H[j+k>>2]=l;n=j+(k+128|0)|0;j=(g+1|0)/2|0;H[n>>2]=j;i=N(e,g);f=i+f|0;e=l;g=j;if(i>>>0>1){continue}break}H[a+8>>2]=f;b:{c:{d:{if(!f){b=H[a+12>>2];if(!b){break d}Ca(b);H[a+12>>2]=0;break d}f=f<<4;if(f>>>0<=K[a+16>>2]){break b}b=Ga(H[a+12>>2],f);if(b){break c}Ba(d,1,6451,0);b=H[a+12>>2];if(!b){break d}Ca(b);H[a+12>>2]=0}Ca(a);a=0;break a}H[a+12>>2]=b;c=H[a+16>>2];d=f-c|0;if(d){y(b+c|0,0,d)}H[a+16>>2]=f;c=H[a+4>>2];b=H[a>>2]}g=H[a+12>>2];if(o){l=0;f=(N(b,c)<<4)+g|0;e=f;while(1){b=l<<2;h=H[b+k>>2];e:{if((h|0)<=0){break e}j=h-1|0;d=0;f:{g:{b=H[b+(k+128|0)>>2];if((b|0)<=0){i=h&3;if(h>>>0>=4){break g}h=0;break f}while(1){c=f;f=b;while(1){h:{H[g>>2]=e;if((f|0)==1){g=g+16|0;e=e+16|0;break h}H[g+16>>2]=e;e=e+16|0;g=g+32|0;i=(f|0)>2;f=f-2|0;if(i){continue}}break}i=((d|0)==(j|0)|d)&1;f=i?e:c+(b<<4)|0;e=i?e:c;d=d+1|0;if((h|0)!=(d|0)){continue}break}break e}m=h&2147483644;h=0;c=0;while(1){n=(h|0)==(j|0);h=h+4|0;f=n?e:f;e=f;c=c+4|0;if((m|0)!=(c|0)){continue}break}if(i){break f}break e}while(1){c=f;m=((h|0)==(j|0)|h)&1;f=m?e:(b<<4)+f|0;e=m?e:c;h=h+1|0;d=d+1|0;if((i|0)!=(d|0)){continue}break}}l=l+1|0;if((o|0)!=(l|0)){continue}break}}H[g>>2]=0}b=H[a+8>>2];if(!b){break a}c=b&3;e=H[a+12>>2];if(b>>>0>=4){b=b&-4;g=0;while(1){H[e+60>>2]=0;H[e+52>>2]=999;H[e+56>>2]=0;H[e+44>>2]=0;H[e+36>>2]=999;H[e+40>>2]=0;H[e+28>>2]=0;H[e+20>>2]=999;H[e+24>>2]=0;H[e+12>>2]=0;H[e+4>>2]=999;H[e+8>>2]=0;e=e- -64|0;g=g+4|0;if((b|0)!=(g|0)){continue}break}if(!c){break a}}g=0;while(1){H[e+12>>2]=0;H[e+4>>2]=999;H[e+8>>2]=0;e=e+16|0;g=g+1|0;if((c|0)!=(g|0)){continue}break}}na=k+256|0;return a}function fb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;i=a>>>0<=8?8:a;l=i+48|0;a:{b:{while(1){if(a-1&a|b>>>0>4294967239){break b}c=H[6867];d=c;g=H[6866];b=b>>>0<=8?8:b+3&-4;c:{if(b>>>0<=127){e=(b>>>3|0)-1|0;break c}f=Q(b);e=((b>>>29-f^4)-(f<<2)|0)+110|0;if(b>>>0<=4095){break c}f=((b>>>30-f^2)-(f<<1)|0)+71|0;e=f>>>0>=63?63:f}h=e;e=h&31;if((h&63)>>>0>=32){f=0;c=c>>>e|0}else{f=c>>>e|0;c=((1<>>e}if(c|f){while(1){e=f;d:{if(e|c){d=e-1|0;f=d+1|0;g=d;d=c-1|0;g=(d|0)!=-1?f:g;f=Q(e^g);f=(f|0)==32?Q(c^d)+32|0:f;d=63-f|0;qa=0-(f>>>0>63)|0;break d}qa=0;d=64}g=d;d=g&31;if((g&63)>>>0>=32){f=0;j=e>>>d|0}else{f=e>>>d|0;j=((1<>>d}h=g+h|0;c=h<<4;e=H[c+26440>>2];d=c+26432|0;e:{if((e|0)!=(d|0)){c=Cb(e,i,b);if(c){break a}c=H[e+4>>2];g=H[e+8>>2];H[c+8>>2]=g;H[g+4>>2]=c;H[e+8>>2]=d;H[e+4>>2]=H[d+4>>2];H[d+4>>2]=e;H[H[e+4>>2]+8>>2]=e;h=h+1|0;c=(f&1)<<31|j>>>1;f=f>>>1|0;break e}m=H[6867];g=h&63;c=g;e=c&31;if(c>>>0>=32){c=0;d=-1>>>e|0}else{c=-1>>>e|0;d=c|(1<>>0>=32){c=d<>>32-e|c<>>0>=32){c=-1<>>32-c}n=d&-2;d=g&31;if(g>>>0>=32){g=0;d=c>>>d|0}else{g=c>>>d|0;d=((1<>>d}c=d|k;qa=e|g;H[6866]=H[6866]&c;H[6867]=qa&m;c=j^1}if(c|f){continue}break}g=H[6866];d=H[6867]}f=Q(d);e=63-((f|0)==32?Q(g)+32|0:f)|0;f:{if(!(d|g)){h=0;break f}c=e<<4;h=H[c+26440>>2];if(!d&g>>>0<1073741824){break f}f=98;d=c+26432|0;if((d|0)==(h|0)){break f}while(1){c=Cb(h,i,b);if(c){break a}h=H[h+8>>2];if((d|0)==(h|0)){break f}c=f;f=c-1|0;if(c){continue}break}}f=a>>>0>8;a=i;if(sc((f?l:48)+b|0)){continue}break}if(!h){break b}a=(e<<4)+26432|0;if((a|0)==(h|0)){break b}while(1){c=Cb(h,i,b);if(c){break a}h=H[h+8>>2];if((a|0)!=(h|0)){continue}break}}c=0}return c}function wb(a,b,c,d,e,f,g,h){var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;m=H[H[a+24>>2]+24>>2]+N(b,52)|0;l=H[m+4>>2];k=l-1|0;o=H[a+60>>2];j=k+o|0;p=0-!l|0;i=p;r=H[H[H[a+20>>2]>>2]+20>>2]+N(b,76)|0;n=H[r+12>>2];i=fe(j,j>>>0>>0?i+1|0:i,l,0);q=i>>>0>n>>>0?n:i;j=H[m>>2];m=j-1|0;s=H[a+56>>2];n=m+s|0;o=0-!j|0;i=o;t=H[r+8>>2];i=fe(n,n>>>0>>0?i+1|0:i,j,0);n=i>>>0>t>>>0?t:i;i=p;t=H[r+4>>2];s=H[a+52>>2];k=s+k|0;i=fe(k,k>>>0>>0?i+1|0:i,l,0);k=i>>>0>>0?t:i;i=o;p=H[r>>2];l=m;m=H[a+48>>2];l=l+m|0;i=fe(l,l>>>0>>0?i+1|0:i,j,0);i=i>>>0

>>0?p:i;l=0;p=H[(H[H[a+32>>2]+5584>>2]+N(b,1080)|0)+20>>2];c=H[r+20>>2]+(c?0-c|0:-1)|0;a:{if(!c){a=n;l=i;b=k;break a}m=c-1|0;j=(d&1)<>>0>>0){a=c&31;l=i-j|0;if((c&63)>>>0>=32){i=-1<>>32-a;a=-1<>>0>>0?i+1|0:i;b=a;a=c&31;if((c&63)>>>0>=32){l=i>>>a|0}else{l=((1<>>a}}a=0;b=0;d=d>>>1<>>0>>0){b=c&31;o=k-d|0;if((c&63)>>>0>=32){i=-1<>>32-b;b=-1<>>0>>0?i+1|0:i;k=b;b=c&31;if((c&63)>>>0>=32){b=i>>>b|0}else{b=((1<>>b}}if(j>>>0>>0){a=c&31;k=n-j|0;if((c&63)>>>0>=32){i=-1<>>32-a;a=-1<>>0>>0?i+1|0:i;j=a;a=c&31;if((c&63)>>>0>=32){a=i>>>a|0}else{a=((1<>>a}}if(d>>>0>=q>>>0){q=0;break a}k=q-d|0;d=c&31;if((c&63)>>>0>=32){i=-1<>>32-d;d=-1<>>0>>0?i+1|0:i;j=d;d=c&31;if((c&63)>>>0>=32){q=i>>>d|0}else{q=((1<>>d}}c=(p|0)==1?2:3;d=c+a|0;d=(a>>>0>d>>>0?-1:d)>>>0>e>>>0;a=c+q|0;d=d&(a>>>0>>0?-1:a)>>>0>f>>>0;a=l-c|0;d=d&(a>>>0<=l>>>0?a:0)>>>0>>0;a=b-c|0;return d&(a>>>0<=b>>>0?a:0)>>>0>>0}function kb(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;g=H[a+16>>2];if(g>>>0>=32){return H[a+8>>2]}b=H[a+20>>2];a:{if((b|0)>=4){d=H[a>>2];c=H[d-3>>2];e=b-4|0;H[a+20>>2]=e;H[a>>2]=d-4;break a}if((b|0)<=0){e=b;break a}f=H[a>>2];d=24;b:{if((b|0)==1){break b}l=b&1;k=b&2147483646;while(1){h=f-1|0;H[a>>2]=h;i=I[f|0];f=f-2|0;H[a>>2]=f;H[a+20>>2]=b-1;h=I[h|0];b=b-2|0;H[a+20>>2]=b;c=i<>2]=f-1;f=I[f|0];H[a+20>>2]=b-1;c=f<>2];k=c&255;H[a+24>>2]=k>>>0>143;b=b?(c&2130706432)==2130706432?7:8:8;h=b+(c>>>0<=2415919103?8:(c&8323072)==8323072?7:8)|0;f=c>>>16&255;i=h+(f>>>0<=143?8:(c&32512)==32512?7:8)|0;d=c>>>8&255;l=i+(g+(d>>>0<=143?8:(c&127)==127?7:8)|0)|0;H[a+16>>2]=l;j=H[a+12>>2];b=f<>>24|d<>>0>=32){d=b<>>32-c;b=b<>2];b=d|j;h=b;H[a+8>>2]=g;H[a+12>>2]=b;if(l>>>0<=31){c:{if((e|0)>=4){b=H[a>>2];c=H[b-3>>2];H[a+20>>2]=e-4;H[a>>2]=b-4;break c}if((e|0)<=0){c=0;break c}b=H[a>>2];d:{if((e|0)==1){d=24;c=0;break d}i=e&1;j=e&2147483646;d=24;c=0;f=0;while(1){m=b-1|0;H[a>>2]=m;n=I[b|0];b=b-2|0;H[a>>2]=b;H[a+20>>2]=e-1;m=I[m|0];e=e-2|0;H[a+20>>2]=e;c=n<>2]=b-1;b=I[b|0];H[a+20>>2]=e-1;c=b<>2]=e>>>0>143;k=k>>>0<=143?8:(c&2130706432)==2130706432?7:8;i=k+(c>>>0<=2415919103?8:(c&8323072)==8323072?7:8)|0;f=c>>>16&255;j=i+(f>>>0<=143?8:(c&32512)==32512?7:8)|0;d=c>>>8&255;H[a+16>>2]=j+(l+(d>>>0<=143?8:(c&127)==127?7:8)|0);b=a;a=f<>>24|d<>>0>=32){c=a<>>32-e;a=a<>2]=g;H[b+12>>2]=c|h}return g}function Lc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;j=H[a+96>>2];l=N(H[a+128>>2],H[a+132>>2]);a:{if(l){b=H[j+16>>2];m=N(b,1080);k=N(b,b)<<2;e=H[a+12>>2];b=H[a+180>>2];while(1){n=H[b+5584>>2];B(b,e,5644);H[b+5608>>2]=0;H[b+5588>>2]=-1;H[b+5168>>2]=0;H[b+5636>>2]=0;H[b+5616>>2]=0;H[b+5624>>2]=0;H[b+5628>>2]=0;H[b+5584>>2]=n;F[b+5640|0]=I[b+5640|0]&252;b:{if(!H[e+5608>>2]){break b}d=Fa(k);H[b+5608>>2]=d;if(!d){return 0}if(!k){break b}B(d,H[e+5608>>2],k)}d=N(H[e+5624>>2],20);f=Fa(d);H[b+5616>>2]=f;i=0;if(!f){break a}if(d){B(f,H[e+5616>>2],d)}g=H[e+5620>>2];if(g){d=H[e+5616>>2];f=H[b+5616>>2];h=0;while(1){if(H[d+12>>2]){g=Fa(H[d+16>>2]);H[f+12>>2]=g;if(!g){return 0}o=H[d+16>>2];if(o){B(g,H[d+12>>2],o)}g=H[e+5620>>2]}H[b+5624>>2]=H[b+5624>>2]+1;f=f+20|0;d=d+20|0;h=h+1|0;if(h>>>0>>0){continue}break}}d=N(H[e+5636>>2],20);f=Fa(d);H[b+5628>>2]=f;if(!f){break a}if(d){B(f,H[e+5628>>2],d)}i=H[e+5636>>2];H[b+5636>>2]=i;if(i){d=H[e+5628>>2];f=H[b+5628>>2];h=0;while(1){g=H[d+8>>2];if(g){H[f+8>>2]=H[b+5616>>2]+(g-H[e+5616>>2]|0)}g=H[d+12>>2];if(g){H[f+12>>2]=H[b+5616>>2]+(g-H[e+5616>>2]|0)}f=f+20|0;d=d+20|0;h=h+1|0;if((i|0)!=(h|0)){continue}break}}if(m){B(n,H[e+5584>>2],m)}b=b+5644|0;p=p+1|0;if((p|0)!=(l|0)){continue}break}}i=1;e=Ea(1,72);b=0;c:{if(!e){break c}F[e+40|0]=I[e+40|0]&254|1;d=Ea(1,4);H[e+20>>2]=d;b=e;if(d){break c}Ca(b);b=0}H[a+232>>2]=b;if(!b){return 0}f=H[a+236>>2];e=0;H[b+28>>2]=a+104;H[b+24>>2]=j;d=Ea(1,848);H[H[b+20>>2]>>2]=d;d:{if(!d){break d}d=Ea(H[j+16>>2],76);h=H[H[b+20>>2]>>2];H[h+20>>2]=d;if(!d){break d}H[h+16>>2]=H[j+16>>2];e=H[a+188>>2];H[b+44>>2]=f;H[b>>2]=e;e=1}if(e){break a}Qb(H[a+232>>2]);i=0;H[a+232>>2]=0;Ba(c,1,3668,0)}return i|0}function $d(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;f=na-80|0;na=f;H[f+76>>2]=1;j=H[a+44>>2];d=H[a+224>>2];e=H[d+40>>2];a:{b:{if(!e|!H[e+16>>2]){break b}c:{e=e+N(j,40)|0;if(!H[e+4>>2]){e=H[d+8>>2];d=H[d+12>>2];e=e+2|0;d=e>>>0<2?d+1|0:d;if(ab(b,e,d,c)){break c}d=0;Ba(c,1,5440,0);break a}d=H[e+16>>2];if(!ab(b,H[d>>2],H[d+4>>2],c)){Ba(c,1,5440,0);d=0;break a}if((Ja(b,H[a+16>>2],2,c)|0)!=2){Ba(c,1,2472,0);d=0;break a}Da(H[a+16>>2],f+72|0,2);if(H[f+72>>2]==65424){break c}Ba(c,1,4073,0);d=0;break a}if(H[a+8>>2]!=256){break b}H[a+8>>2]=8}e=N(H[a+132>>2],H[a+128>>2]);d:{if(!e){break d}i=e&7;h=H[a+180>>2];d=0;if(e>>>0>=8){k=e&-8;while(1){e=h+N(g,5644)|0;H[e+45096>>2]=-1;H[e+39452>>2]=-1;H[e+33808>>2]=-1;H[e+28164>>2]=-1;H[e+22520>>2]=-1;H[e+16876>>2]=-1;H[e+11232>>2]=-1;H[e+5588>>2]=-1;g=g+8|0;l=l+8|0;if((k|0)!=(l|0)){continue}break}if(!i){break d}}while(1){H[(h+N(g,5644)|0)+5588>>2]=-1;g=g+1|0;d=d+1|0;if((i|0)!=(d|0)){continue}break}}d=0;if(!bb(a,f+72|0,0,f+68|0,f- -64|0,f+60|0,f+56|0,f+52|0,f+76|0,b,c)){break a}i=j+1|0;while(1){e:{if(!H[f+76>>2]){break e}e=H[f+72>>2];if(!hb(a,e,0,0,b,c)){break a}h=H[a+128>>2];k=H[a+132>>2];g=e+1|0;H[f+32>>2]=g;H[f+36>>2]=N(h,k);Ba(c,4,11795,f+32|0);if(!Ac(H[a+232>>2],H[H[a+100>>2]+24>>2])){break a}d=H[a+180>>2]+N(e,5644)|0;h=H[d+5596>>2];if(h){Ca(h);H[d+5596>>2]=0;H[d+5600>>2]=0}H[f+16>>2]=g;Ba(c,4,16601,f+16|0);if((e|0)==(j|0)){d=H[a+224>>2];e=H[d+8>>2];d=H[d+12>>2];e=e+2|0;d=e>>>0<2?d+1|0:d;if(ab(b,e,d,c)){break e}d=0;Ba(c,1,5440,0);break a}H[f+4>>2]=i;H[f>>2]=g;Ba(c,2,13648,f);d=0;if(bb(a,f+72|0,0,f+68|0,f- -64|0,f+60|0,f+56|0,f+52|0,f+76|0,b,c)){continue}break a}break}d=zc(a,c)}na=f+80|0;return d|0}function Ma(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;h=H[a+16>>2];if(h>>>0>=32){return H[a+8>>2]}c=H[a+24>>2];a:{if((c|0)>=4){b=H[a>>2];d=H[b>>2];e=c-4|0;H[a+24>>2]=e;H[a>>2]=b+4;break a}d=H[a+28>>2]?-1:0;if((c|0)<=0){e=c;break a}b=H[a>>2];if((c|0)!=1){j=c&1;i=c&2147483646;while(1){e=b;H[a>>2]=b+1;k=I[b|0];b=b+2|0;H[a>>2]=b;H[a+24>>2]=c-1;e=I[e+1|0];c=c-2|0;H[a+24>>2]=c;d=((255<>2]=b+1;b=I[b|0];H[a+24>>2]=c-1;d=(255<>2];i=d>>>24|0;H[a+20>>2]=(i|0)==255;c=d>>>16&255;f=d>>>8&255;b=b?7:8;d=d&255;g=b+((d|0)==255?7:8)|0;k=((f|0)==255?7:8)+g|0;j=(h+((c|0)==255?7:8)|0)+k|0;H[a+16>>2]=j;l=H[a+12>>2];b=d|(f<>>0>=32){d=b<>>32-c;b=b<>2];b=d|l;k=b;H[a+8>>2]=h;H[a+12>>2]=b;if(j>>>0<=31){b:{if((e|0)>=4){b=H[a>>2];d=H[b>>2];H[a+24>>2]=e-4;H[a>>2]=b+4;break b}f=0;d=H[a+28>>2]?-1:0;if((e|0)<=0){break b}b=H[a>>2];if((e|0)!=1){l=e&1;m=e&2147483646;g=0;while(1){c=b;H[a>>2]=b+1;n=I[b|0];b=b+2|0;H[a>>2]=b;H[a+24>>2]=e-1;c=I[c+1|0];e=e-2|0;H[a+24>>2]=e;d=((255<>2]=b+1;b=I[b|0];H[a+24>>2]=e-1;d=(255<>>24|0;H[a+20>>2]=(e|0)==255;c=d>>>16&255;f=d>>>8&255;g=(i|0)==255?7:8;d=d&255;i=g+((d|0)==255?7:8)|0;l=((f|0)==255?7:8)+i|0;H[a+16>>2]=(((c|0)==255?7:8)+j|0)+l;b=a;a=d|(f<>>0>=32){c=a<>>32-e;a=a<>2]=h;H[b+12>>2]=c|k}return h}function Dc(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0;h=na-32|0;na=h;if(H[a+8>>2]==16){f=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{f=H[a+12>>2]}a:{if(K[d>>2]<=4){a=0;Ba(e,1,2607,0);break a}f=H[f+5584>>2]+N(b,1080)|0;Da(c,f+4|0,1);g=H[f+4>>2]+1|0;H[f+4>>2]=g;if(g>>>0>=34){H[h+4>>2]=33;H[h>>2]=g;Ba(e,1,7635,h);a=0;break a}j=H[a+184>>2];if(j>>>0>=g>>>0){H[h+24>>2]=g;H[h+20>>2]=j;H[h+16>>2]=b;Ba(e,1,16423,h+16|0);H[a+8>>2]=H[a+8>>2]|32768;a=0;break a}Da(c+1|0,f+8|0,1);H[f+8>>2]=H[f+8>>2]+2;Da(c+2|0,f+12|0,1);a=H[f+12>>2]+2|0;H[f+12>>2]=a;b=H[f+8>>2];if(!(!(b>>>0>10|a>>>0>10)&a+b>>>0<13)){a=0;Ba(e,1,5468,0);break a}Da(c+3|0,f+16|0,1);if(I[f+16|0]&128){a=0;Ba(e,1,6564,0);break a}Da(c+4|0,f+20|0,1);if(K[f+20>>2]>=2){a=0;Ba(e,1,6499,0);break a}b=H[d>>2]-5|0;H[d>>2]=b;a=1;g=H[f+4>>2];if(!(F[f|0]&1)){if(!g){break a}j=g&3;d=f+944|0;e=f+812|0;b=0;c=0;if(g>>>0>=4){k=g&-4;g=0;while(1){f=c<<2;H[f+e>>2]=15;H[d+f>>2]=15;i=f|4;H[i+e>>2]=15;H[d+i>>2]=15;i=f|8;H[i+e>>2]=15;H[d+i>>2]=15;f=f|12;H[f+e>>2]=15;H[d+f>>2]=15;c=c+4|0;g=g+4|0;if((k|0)!=(g|0)){continue}break}if(!j){break a}}while(1){a=c<<2;H[a+e>>2]=15;H[a+d>>2]=15;a=1;c=c+1|0;b=b+1|0;if((j|0)!=(b|0)){continue}break}break a}if(b>>>0>=g>>>0){b:{if(!g){g=0;break b}Da(c+5|0,h+28|0,1);a=H[h+28>>2];H[f+944>>2]=a>>>4;H[f+812>>2]=a&15;g=H[f+4>>2];if(g>>>0>=2){j=f+944|0;k=f+812|0;a=c+6|0;c=1;while(1){Da(a,h+28|0,1);c:{b=H[h+28>>2];if(b>>>0>=16){g=b&15;if(g){break c}}a=0;Ba(e,1,6025,0);break a}i=c<<2;H[i+k>>2]=g;H[j+i>>2]=b>>>4;a=a+1|0;c=c+1|0;g=H[f+4>>2];if(c>>>0>>0){continue}break}}b=H[d>>2]}H[d>>2]=b-g;a=1;break a}a=0;Ba(e,1,2607,0)}na=h+32|0;return a}function dc(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;j=na-256|0;na=j;g=Ea(1,20);a:{if(!g){Ba(c,1,6413,0);g=0;break a}H[g+4>>2]=b;H[g>>2]=a;H[j>>2]=b;H[j+128>>2]=a;while(1){p=h;h=h+1|0;e=h<<2;d=(b+1|0)/2|0;H[e+j>>2]=d;i=e+(j+128|0)|0;e=(a+1|0)/2|0;H[i>>2]=e;i=N(a,b);f=i+f|0;b=d;a=e;if(i>>>0>1){continue}break}H[g+8>>2]=f;if(!f){Ca(g);g=0;break a}d=Ea(f,16);H[g+12>>2]=d;if(!d){Ba(c,1,3564,0);Ca(g);g=0;break a}l=H[g+8>>2];H[g+16>>2]=l<<4;a=d;if(p){f=(N(H[g+4>>2],H[g>>2])<<4)+d|0;b=f;while(1){c=n<<2;e=H[c+j>>2];b:{if((e|0)<=0){break b}o=e-1|0;i=0;c:{d:{c=H[c+(j+128|0)>>2];if((c|0)<=0){k=e&3;if(e>>>0>=4){break d}h=0;break c}while(1){h=f;f=c;while(1){e:{H[a>>2]=b;if((f|0)==1){a=a+16|0;b=b+16|0;break e}H[a+16>>2]=b;b=b+16|0;a=a+32|0;k=(f|0)>2;f=f-2|0;if(k){continue}}break}k=((i|0)==(o|0)|i)&1;f=k?b:h+(c<<4)|0;b=k?b:h;i=i+1|0;if((e|0)!=(i|0)){continue}break}break b}m=e&2147483644;h=0;e=0;while(1){q=(h|0)==(o|0);h=h+4|0;f=q?b:f;b=f;e=e+4|0;if((m|0)!=(e|0)){continue}break}if(k){break c}break b}while(1){e=f;m=((h|0)==(o|0)|h)&1;f=m?b:e+(c<<4)|0;b=m?b:e;h=h+1|0;i=i+1|0;if((k|0)!=(i|0)){continue}break}}n=n+1|0;if((n|0)!=(p|0)){continue}break}}H[a>>2]=0;f:{if(!l){break f}a=l&3;if(l>>>0>=4){c=l&-4;b=0;while(1){H[d+60>>2]=0;H[d+52>>2]=999;H[d+56>>2]=0;H[d+44>>2]=0;H[d+36>>2]=999;H[d+40>>2]=0;H[d+28>>2]=0;H[d+20>>2]=999;H[d+24>>2]=0;H[d+12>>2]=0;H[d+4>>2]=999;H[d+8>>2]=0;d=d- -64|0;b=b+4|0;if((c|0)!=(b|0)){continue}break}if(!a){break f}}b=0;while(1){H[d+12>>2]=0;H[d+4>>2]=999;H[d+8>>2]=0;d=d+16|0;b=b+1|0;if((a|0)!=(b|0)){continue}break}}}na=j+256|0;return g}function Wb(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;H[a+8>>2]=0;H[a+12>>2]=0;H[a>>2]=b;H[a+16>>2]=0;H[a+20>>2]=0;H[a+28>>2]=d;h=c-1|0;H[a+24>>2]=h;n=b&3;a:{if((c|0)<=0){e=b;b=d;break a}e=b+1|0;H[a>>2]=e;b=I[b|0]}g=b;i=8;H[a+16>>2]=8;j=(g|0)==255;H[a+20>>2]=j;H[a+8>>2]=g;H[a+12>>2]=0;b:{if((n|0)==3){break b}k=c-2|0;H[a+24>>2]=k;c:{if((c|0)<2){b=e;e=d;break c}b=e+1|0;H[a>>2]=b;e=I[e|0]}j=(e|0)==255;H[a+20>>2]=j;i=(g|0)==255?15:16;H[a+16>>2]=i;g=g|e<<8;H[a+8>>2]=g;H[a+12>>2]=0;if((n|0)==2){e=b;c=h;h=k;break b}o=c-3|0;H[a+24>>2]=o;d:{if((c|0)<3){f=b;b=d;break d}f=b+1|0;H[a>>2]=f;b=I[b|0]}j=(b|0)==255;H[a+20>>2]=j;l=((e|0)==255?7:8)+i|0;H[a+16>>2]=l;e=i&31;if((i&63)>>>0>=32){m=b<>>32-e;e=b<>2]=g;H[a+12>>2]=m;if((n|0)==1){e=f;i=l;c=k;h=o;break b}h=c-4|0;H[a+24>>2]=h;e:{if((c|0)<4){e=f;c=d;break e}e=f+1|0;H[a>>2]=e;c=I[f|0]}j=(c|0)==255;H[a+20>>2]=j;i=l+((b|0)==255?7:8)|0;H[a+16>>2]=i;b=l&31;if((l&63)>>>0>=32){f=c<>>32-b;b=c<>2]=g;H[a+12>>2]=b;c=o}f:{if((c|0)>=5){d=H[e>>2];H[a+24>>2]=c-5;H[a>>2]=e+4;break f}b=0;d=d?-1:0;if((c|0)<2){break f}while(1){c=e+1|0;H[a>>2]=c;e=I[e|0];f=h-1|0;H[a+24>>2]=f;d=(255<>>0>1;e=c;h=f;if(k){continue}break}}b=d>>>24|0;H[a+20>>2]=(b|0)==255;c=d>>>16&255;e=d>>>8&255;h=j?7:8;d=d&255;f=h+((d|0)==255?7:8)|0;k=((e|0)==255?7:8)+f|0;H[a+16>>2]=(((c|0)==255?7:8)+i|0)+k;b=d|(e<>>0>=32){d=a<>>32-b;a=a<>2]=a|g;H[c+12>>2]=d|m}function Ga(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;if(!b){return 0}a:{if(!a){a=fb(8,b);break a}b:{if(b>>>0>4294967239){break b}h=b>>>0<=8?8:b+3&-4;d=h+8|0;j=a-4|0;f=j;e=H[f>>2];b=e+f|0;c=H[b>>2];c:{d:{e:{if((c|0)!=H[(b+c|0)-4>>2]){c=c+e|0;if(c>>>0>=d+16>>>0){e=H[b+4>>2];b=H[b+8>>2];H[e+8>>2]=b;H[b+4>>2]=e;b=d+f|0;c=c-d|0;H[b>>2]=c;H[(b+(c&-4)|0)-4>>2]=c|1;e=H[b>>2]-8|0;f:{if(e>>>0<=127){g=(e>>>3|0)-1|0;break f}c=Q(e);g=((e>>>29-c^4)-(c<<2)|0)+110|0;if(e>>>0<=4095){break f}c=((e>>>30-c^2)-(c<<1)|0)+71|0;g=c>>>0>=63?63:c}c=g;e=c<<4;H[b+4>>2]=e+26432;e=e+26440|0;H[b+8>>2]=H[e>>2];H[e>>2]=b;H[H[b+8>>2]+4>>2]=b;e=H[6867];b=c&31;if((c&63)>>>0>=32){c=1<>>32-b}H[6866]=g|H[6866];H[6867]=c|e;H[f>>2]=d;H[(f+(d&-4)|0)-4>>2]=d;c=1;break c}if(c>>>0>>0){break e}d=H[b+4>>2];b=H[b+8>>2];H[d+8>>2]=b;H[b+4>>2]=d;H[f>>2]=c;H[(f+(c&-4)|0)-4>>2]=c;c=1;break c}if(e>>>0>=d+16>>>0){H[f>>2]=d;H[(f+(d&-4)|0)-4>>2]=d;b=d+f|0;c=e-d|0;H[b>>2]=c;H[(b+(c&-4)|0)-4>>2]=c|1;d=H[b>>2]-8|0;g:{if(d>>>0<=127){c=(d>>>3|0)-1|0;break g}f=Q(d);c=((d>>>29-f^4)-(f<<2)|0)+110|0;if(d>>>0<=4095){break g}c=((d>>>30-f^2)-(f<<1)|0)+71|0;c=c>>>0>=63?63:c}d=c<<4;H[b+4>>2]=d+26432;d=d+26440|0;H[b+8>>2]=H[d>>2];H[d>>2]=b;H[H[b+8>>2]+4>>2]=b;d=H[6867];b=c&31;if((c&63)>>>0>=32){c=1<>>32-b;b=e}H[6866]=b|H[6866];H[6867]=c|d;c=1;break c}c=1;if(d>>>0<=e>>>0){break d}}c=0}}if(c){break a}b=fb(8,h);if(!b){break b}i=H[j>>2]-8|0;$a(b,a,h>>>0>>0?h:i);Ca(a);i=b}a=i}return a}function Zd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;h=na-16|0;na=h;k=H[a+96>>2];if(H[a+8>>2]==16){e=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{e=H[a+12>>2]}F[e+5640|0]=I[e+5640|0]|1;a:{if(c>>>0<=4){b=0;Ba(d,1,4565,0);break a}Da(b,e,1);if(K[e>>2]>=8){b=0;Ba(d,1,4531,0);break a}Da(b+1|0,h+8|0,1);f=H[h+8>>2];H[e+4>>2]=f;if((f|0)>=5){Ba(d,1,4490,0);H[e+4>>2]=-1}Da(b+2|0,e+8|0,2);g=H[e+8>>2];if(g-65536>>>0<=4294901760){H[h>>2]=g;Ba(d,1,8111,h);b=0;break a}f=H[a+188>>2];H[e+12>>2]=f?f:g;Da(b+4|0,e+16|0,1);if(K[e+16>>2]>=2){b=0;Ba(d,1,5536,0);break a}f=b+5|0;H[h+12>>2]=c-5;b=H[k+16>>2];b:{if(!b){break b}k=b&7;i=H[e>>2]&1;e=H[e+5584>>2];c=0;if(b>>>0>=8){b=b&-8;g=0;while(1){j=e+N(c,1080)|0;H[j+7560>>2]=i;H[j+6480>>2]=i;H[j+5400>>2]=i;H[j+4320>>2]=i;H[j+3240>>2]=i;H[j+2160>>2]=i;H[j+1080>>2]=i;H[j>>2]=i;c=c+8|0;g=g+8|0;if((b|0)!=(g|0)){continue}break}if(!k){break b}}while(1){H[e+N(c,1080)>>2]=i;c=c+1|0;l=l+1|0;if((k|0)!=(l|0)){continue}break}}b=0;if(!Dc(a,0,f,h+12|0,d)){Ba(d,1,4565,0);break a}if(H[h+12>>2]){Ba(d,1,4565,0);break a}if(H[a+8>>2]==16){b=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{b=H[a+12>>2]}if(K[H[a+96>>2]+16>>2]>=2){b=H[b+5584>>2];f=H[b+4>>2]<<2;l=b+944|0;e=b+812|0;c=b;g=1;while(1){H[c+1084>>2]=H[b+4>>2];H[c+1088>>2]=H[b+8>>2];H[c+1092>>2]=H[b+12>>2];H[c+1096>>2]=H[b+16>>2];H[c+1100>>2]=H[b+20>>2];d=!f;if(!d){B(c+1892|0,e,f)}if(!d){B(c+2024|0,l,f)}c=c+1080|0;g=g+1|0;if(g>>>0>2]+16>>2]){continue}break}}b=1}na=h+16|0;return b|0}function sd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=na-80|0;na=e;a:{if(c>>>0<=2){Ba(d,1,14478,0);break a}if(I[a+124|0]){Ba(d,4,11193,0);g=1;break a}g=1;Da(b,a+40|0,1);Da(b+1|0,a+52|0,1);Da(b+2|0,a+44|0,1);f=b+3|0;b:{c:{d:{e:{f:{h=H[a+40>>2];switch(h-1|0){case 0:break f;case 1:break e;default:break d}}if(c>>>0<=6){H[e+16>>2]=c;Ba(d,1,15155,e+16|0);g=0;break a}if(!((c|0)==7|H[a+48>>2]==14)){H[e+48>>2]=c;Ba(d,2,15155,e+48|0)}Da(f,a+48|0,4);if(H[a+48>>2]!=14){break b}f=Fa(36);if(!f){g=0;Ba(d,1,7993,0);break a}H[f>>2]=14;H[e+64>>2]=0;H[e+56>>2]=0;H[e+72>>2]=0;H[e+60>>2]=0;H[e+68>>2]=0;H[e+76>>2]=0;g=4470064;H[e+52>>2]=4470064;H[f+4>>2]=1145390592;g:{if((c|0)!=7){if((c|0)==35){Da(b+7|0,e+76|0,4);Da(b+11|0,e+72|0,4);Da(b+15|0,e+68|0,4);Da(b+19|0,e- -64|0,4);Da(b+23|0,e+60|0,4);Da(b+27|0,e+56|0,4);Da(b+31|0,e+52|0,4);H[f+4>>2]=0;g=H[e+52>>2];c=H[e+56>>2];d=H[e+64>>2];i=H[e+68>>2];j=H[e+76>>2];h=H[e+72>>2];b=H[e+60>>2];break g}H[e+32>>2]=c;Ba(d,2,15191,e+32|0)}c=0;d=0;h=0;b=0}H[f+24>>2]=b;H[f+16>>2]=i;H[f+8>>2]=j;H[f+32>>2]=g;H[f+28>>2]=c;H[f+20>>2]=d;H[f+12>>2]=h;H[a+112>>2]=0;H[a+108>>2]=f;break b}b=c-3|0;H[a+112>>2]=b;d=Ea(1,b);H[a+108>>2]=d;if(!d){break c}if((c|0)<=3){break b}c=0;while(1){Da(f,e+76|0,1);F[H[a+108>>2]+c|0]=H[e+76>>2];f=f+1|0;c=c+1|0;if((b|0)!=(c|0)){continue}break}break b}if(h>>>0<3){break a}H[e>>2]=h;Ba(d,4,15950,e);break a}g=0;H[a+112>>2]=0;break a}g=1;F[a+124|0]=1}na=e+80|0;return g|0}function Ja(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0;h=H[a+48>>2];if(h>>>0>=c>>>0){if(c){B(b,H[a+36>>2],c)}H[a+36>>2]=H[a+36>>2]+c;H[a+48>>2]=H[a+48>>2]-c;b=H[a+60>>2];d=H[a+56>>2]+c|0;b=d>>>0>>0?b+1|0:b;H[a+56>>2]=d;H[a+60>>2]=b;return c}if(I[a+68|0]&4){if(h){B(b,H[a+36>>2],h)}b=H[a+48>>2];H[a+48>>2]=0;H[a+36>>2]=b+H[a+36>>2];g=H[a+60>>2];c=b;b=H[a+56>>2]+b|0;g=c>>>0>b>>>0?g+1|0:g;H[a+56>>2]=b;H[a+60>>2]=g;return h?h:-1}a:{if(h){if(h){B(b,H[a+36>>2],h)}i=H[a+32>>2];H[a+36>>2]=i;e=H[a+48>>2];H[a+48>>2]=0;f=H[a+60>>2];g=H[a+56>>2]+e|0;f=g>>>0>>0?f+1|0:f;H[a+56>>2]=g;H[a+60>>2]=f;c=c-e|0;b=b+e|0;break a}i=H[a+32>>2];H[a+36>>2]=i}b:{while(1){c:{e=H[a>>2];f=H[a+16>>2];g=H[a+64>>2];d:{if(g>>>0>c>>>0){f=ra[f|0](i,g,e)|0;H[a+48>>2]=f;if((f|0)==-1){break b}if(c>>>0>f>>>0){if(f){B(b,H[a+36>>2],f)}i=H[a+32>>2];H[a+36>>2]=i;e=H[a+48>>2];break d}if(c){B(b,H[a+36>>2],c)}H[a+36>>2]=H[a+36>>2]+c;H[a+48>>2]=H[a+48>>2]-c;b=H[a+60>>2];d=H[a+56>>2]+c|0;b=d>>>0>>0?b+1|0:b;H[a+56>>2]=d;H[a+60>>2]=b;return c+h|0}e=ra[f|0](b,c,e)|0;H[a+48>>2]=e;if((e|0)==-1){break b}if(c>>>0<=e>>>0){break c}i=H[a+32>>2];H[a+36>>2]=i;f=e}H[a+48>>2]=0;g=H[a+60>>2];j=H[a+56>>2]+e|0;g=j>>>0>>0?g+1|0:g;H[a+56>>2]=j;H[a+60>>2]=g;b=b+e|0;c=c-e|0;h=f+h|0;continue}break}H[a+48>>2]=0;H[a+36>>2]=H[a+32>>2];f=H[a+60>>2];b=H[a+56>>2]+e|0;f=b>>>0>>0?f+1|0:f;H[a+56>>2]=b;H[a+60>>2]=f;return e+h|0}Ba(d,4,15630,0);H[a+48>>2]=0;H[a+68>>2]=H[a+68>>2]|4;return h?h:-1}function Gb(){var a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;a:{c=Ea(1,256);if(c){H[c>>2]=1;H[c+208>>2]=1;F[c+212|0]=I[c+212|0]|6;a=Ea(1,5644);H[c+12>>2]=a;if(!a){break a}a=Ea(1,1e3);H[c+16>>2]=a;if(!a){break a}H[c+48>>2]=0;H[c+52>>2]=0;H[c+44>>2]=-1;H[c+20>>2]=1e3;b:{a=Ea(1,48);if(a){H[a+24>>2]=0;H[a+32>>2]=100;b=Ea(100,24);H[a+28>>2]=b;if(b){break b}Ca(a)}H[c+224>>2]=0;break a}H[a+40>>2]=0;H[c+224>>2]=a;a=pb();H[c+220>>2]=a;if(!a){break a}a=pb();H[c+216>>2]=a;if(!a){break a}a=1419;c:{while(1){b=I[a|0];if(!b|(b|0)==61){break c}a=a+1|0;if(a&3){continue}break}d:{e:{d=H[a>>2];if(((d|16843008-d)&-2139062144)!=-2139062144){break e}while(1){b=d^1027423549;if(((16843008-b|b)&-2139062144)!=-2139062144){break e}d=H[a+4>>2];b=a+4|0;a=b;if(((16843008-d|d)&-2139062144)==-2139062144){continue}break}break d}b=a}while(1){a=b;e=I[a|0];if(!e){break c}b=a+1|0;if((e|0)!=61){continue}break}}b=0;f:{if((a|0)==1419){break f}e=a-1419|0;g:{if(I[e+1419|0]){break g}h=H[6870];if(!h){break g}a=H[h>>2];if(!a){break g}while(1){h:{d=1419;b=a;i=e;g=0;i:{if(!e){break i}f=I[1419];if(f){j:{while(1){g=I[b|0];if((g|0)!=(f|0)|!g){break j}i=i-1|0;if(!i){break j}b=b+1|0;f=I[d+1|0];d=d+1|0;if(f){continue}break}f=0}}else{f=0}g=f-I[b|0]|0}if(!g){a=a+e|0;if(I[a|0]==61){break h}}a=H[h+4>>2];h=h+4|0;if(a){continue}break g}break}j=a+1|0}b=j}k:{if(!b){break k}}a=gc();H[c+236>>2]=a;if(!a){a=gc();H[c+236>>2]=a;if(!a){break a}}}else{c=0}return c}vb(c);return 0}function id(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=H[a+48>>2];if(e>>>0>=b>>>0){H[a+48>>2]=e-b;H[a+36>>2]=H[a+36>>2]+b;e=c+H[a+60>>2]|0;d=b+H[a+56>>2]|0;e=d>>>0>>0?e+1|0:e;H[a+56>>2]=d;H[a+60>>2]=e;qa=c;return b|0}if(I[a+68|0]&4){H[a+48>>2]=0;H[a+36>>2]=e+H[a+36>>2];g=H[a+60>>2];c=H[a+56>>2];b=c+e|0;H[a+56>>2]=b;H[a+60>>2]=b>>>0>>0?g+1|0:g;qa=e?0:-1;return(e?e:-1)|0}if(e){H[a+48>>2]=0;H[a+36>>2]=H[a+32>>2];f=e;b=b-e|0}a:{if((c|0)>0){i=1}else{i=!!b&(c|0)>=0}if(i){while(1){i=H[a+12>>2];e=c+g|0;h=b+f|0;e=H[a+60>>2]+(h>>>0>>0?e+1|0:e)|0;j=h;h=h+H[a+56>>2]|0;e=j>>>0>h>>>0?e+1|0:e;if((e|0)==(i|0)&h>>>0>K[a+8>>2]|e>>>0>i>>>0){Ba(d,4,15630,0);H[a+48>>2]=0;H[a+36>>2]=H[a+32>>2];b=g+H[a+60>>2]|0;c=f+H[a+56>>2]|0;b=c>>>0>>0?b+1|0:b;H[a+56>>2]=c;H[a+60>>2]=b;d=H[a+8>>2];f=d-c|0;e=H[a+12>>2];g=e-((c>>>0>d>>>0)+b|0)|0;i=ra[H[a+28>>2]](d,e,H[a>>2])|0;h=H[a+68>>2];if(i){H[a+56>>2]=d;H[a+60>>2]=e}H[a+68>>2]=h|4;a=(c|0)==(d|0)&(b|0)==(e|0);b=a?-1:f;break a}e=ra[H[a+24>>2]](b,c,H[a>>2])|0;i=qa;h=i;if((e&h)==-1){Ba(d,4,15630,0);H[a+68>>2]=H[a+68>>2]|4;e=g+H[a+60>>2]|0;b=f+H[a+56>>2]|0;e=b>>>0>>0?e+1|0:e;H[a+56>>2]=b;H[a+60>>2]=e;a=!(g|f);b=a?-1:f;break a}g=g+h|0;f=e+f|0;g=f>>>0>>0?g+1|0:g;i=b;b=b-e|0;c=c-((e>>>0>i>>>0)+h|0)|0;if(!!b&(c|0)>=0|(c|0)>0){continue}break}}b=g+H[a+60>>2]|0;c=f+H[a+56>>2]|0;b=c>>>0>>0?b+1|0:b;H[a+56>>2]=c;H[a+60>>2]=b;qa=g;return f|0}qa=a?-1:g;return b|0}function Sa(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;a:{b:{if(!H[a+12>>2]){k=1;if(H[a+4>>2]>0|H[a+8>>2]>1){break b}break a}e=1;if(H[a+8>>2]>0){break b}if(H[a+4>>2]<2){break a}}b=H[a>>2];f=b+(e<<5)|0;g=H[a+16>>2];h=H[a+20>>2];if(g>>>0>>0){d=g;while(1){c=(d<<6)+f|0;L[c>>2]=L[c>>2]*O(1.2301740646362305);L[c+4>>2]=L[c+4>>2]*O(1.2301740646362305);L[c+8>>2]=L[c+8>>2]*O(1.2301740646362305);L[c+12>>2]=L[c+12>>2]*O(1.2301740646362305);L[c+16>>2]=L[c+16>>2]*O(1.2301740646362305);L[c+20>>2]=L[c+20>>2]*O(1.2301740646362305);L[c+24>>2]=L[c+24>>2]*O(1.2301740646362305);L[c+28>>2]=L[c+28>>2]*O(1.2301740646362305);d=d+1|0;if((h|0)!=(d|0)){continue}break}}i=b+(k<<5)|0;j=H[a+28>>2];c=H[a+24>>2];if(j>>>0>c>>>0){d=c;while(1){b=(d<<6)+i|0;L[b>>2]=L[b>>2]*O(1.625732421875);L[b+4>>2]=L[b+4>>2]*O(1.625732421875);L[b+8>>2]=L[b+8>>2]*O(1.625732421875);L[b+12>>2]=L[b+12>>2]*O(1.625732421875);L[b+16>>2]=L[b+16>>2]*O(1.625732421875);L[b+20>>2]=L[b+20>>2]*O(1.625732421875);L[b+24>>2]=L[b+24>>2]*O(1.625732421875);L[b+28>>2]=L[b+28>>2]*O(1.625732421875);d=d+1|0;if((j|0)!=(d|0)){continue}break}}b=f+32|0;d=H[a+8>>2];a=H[a+4>>2];e=a-e|0;e=(d|0)<(e|0)?d:e;lb(i,b,g,h,e,O(-.4435068666934967));l=i+32|0;d=d-k|0;a=(a|0)<(d|0)?a:d;lb(f,l,c,j,a,O(-.8829110860824585));lb(i,b,g,h,e,O(.05298011749982834));lb(f,l,c,j,a,O(1.5861343145370483))}}function Xb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;e=H[a+28>>2]+N(b,152)|0;c=H[e-144>>2]-H[e-152>>2]|0;d=H[e-140>>2]-H[e-148>>2]|0;f=d>>>0>=64?64:d;g=c>>>0>=64?64:c;a:{if(!(!c|!d|(!g|!f)|g>>>0>4294967295/(f>>>0)>>>2>>>0)){e=Ea(1,28);H[e+12>>2]=f;H[e+8>>2]=g;H[e+4>>2]=d;H[e>>2]=c;j=d;d=d+f|0;i=j>>>0>d>>>0;d=fe(d-1|0,i-!d|0,f,0);H[e+20>>2]=d;j=c;c=c+g|0;f=j>>>0>c>>>0;c=fe(c-1|0,f-!c|0,g,0);H[e+16>>2]=c;be(d,0,c);b:{if(qa){break b}c=Ea(4,N(c,d));H[e+24>>2]=c;if(!c){break b}break a}Ca(e)}e=0}if(!e){return 0}c:{if(b){while(1){q=N(p,152);g=q+H[a+28>>2]|0;c=H[g+24>>2];if(c){j=g+28|0;d=H[g+20>>2];f=H[g+16>>2];n=0;while(1){if(N(d,f)){i=N(n,36)+j|0;o=0;while(1){k=H[i+20>>2]+N(o,40)|0;c=H[k+20>>2];h=H[k+16>>2];if(N(c,h)){f=0;while(1){l=H[k+24>>2]+N(f,68)|0;r=H[l+60>>2];if(r){h=H[l+8>>2];d=h-H[i>>2]|0;m=H[i+16>>2];if(m&1){c=H[a+28>>2]+q|0;d=(H[c-144>>2]+d|0)-H[c-152>>2]|0}s=H[l+12>>2];c=s-H[i+4>>2]|0;if(m&2){m=H[a+28>>2]+q|0;c=(c+H[m-140>>2]|0)-H[m-148>>2]|0}h=H[l+16>>2]-h|0;if(!Ya(e,d,c,d+h|0,(H[l+20>>2]-s|0)+c|0,r,1,h)){break c}h=H[k+16>>2];c=H[k+20>>2]}f=f+1|0;if(f>>>0>>0){continue}break}f=H[g+16>>2];d=H[g+20>>2]}o=o+1|0;if(o>>>0>>0){continue}break}c=H[g+24>>2]}n=n+1|0;if(n>>>0>>0){continue}break}}p=p+1|0;if((p|0)!=(b|0)){continue}break}}return e}Ua(e);return 0}function Ld(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;h=na-16|0;na=h;if(H[a+8>>2]==16){e=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{e=H[a+12>>2]}a:{if(c>>>0<=1){Ba(d,1,4132,0);a=0;break a}Da(b,h+12|0,2);b:{if(H[h+12>>2]){Ba(d,2,3608,0);break b}if(c>>>0<=6){Ba(d,1,4132,0);a=0;break a}Da(b+2|0,h+12|0,2);g=H[e+5616>>2];k=I[h+12|0];f=H[e+5620>>2];c:{d:{if(!f){break d}a=g;while(1){if(H[a+8>>2]!=(k|0)){a=a+20|0;i=i+1|0;if((i|0)!=(f|0)){continue}break d}break}if((f|0)!=(i|0)){break c}}if(H[e+5624>>2]==(f|0)){a=f+10|0;H[e+5624>>2]=a;a=Ga(g,N(a,20));g=H[e+5616>>2];if(!a){Ca(g);H[e+5624>>2]=0;H[e+5616>>2]=0;H[e+5620>>2]=0;Ba(d,1,4158,0);a=0;break a}e:{if((a|0)==(g|0)){break e}l=H[e+5632>>2];if(!l){break e}m=H[e+5628>>2];i=0;while(1){f=N(i,20)+m|0;j=H[f+8>>2];if(j){H[f+8>>2]=a+(j-g|0)}j=H[f+12>>2];if(j){H[f+12>>2]=a+(j-g|0)}i=i+1|0;if((l|0)!=(i|0)){continue}break}}H[e+5616>>2]=a;g=H[e+5620>>2];f=N(H[e+5624>>2]-g|0,20);if(f){y(a+N(g,20)|0,0,f)}f=H[e+5620>>2];g=H[e+5616>>2]}H[e+5620>>2]=f+1;a=N(f,20)+g|0}e=H[a+12>>2];if(e){Ca(e);H[a+12>>2]=0;H[a+16>>2]=0}H[a+8>>2]=k;e=H[h+12>>2];H[a>>2]=e>>>10&3;H[a+4>>2]=e>>>8&3;Da(b+4|0,h+12|0,2);if(H[h+12>>2]){Ba(d,2,3023,0);break b}c=c-6|0;e=Fa(c);H[a+12>>2]=e;if(!e){Ba(d,1,4132,0);a=0;break a}if(c){B(e,b+6|0,c)}H[a+16>>2]=c}a=1}na=h+16|0;return a|0}function Qb(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;if(a){b=H[a+20>>2];if(b){g=H[b>>2];if(g){d=H[g+20>>2];if(H[g+16>>2]){i=F[a+40|0]&1?16:17;while(1){c=H[d+28>>2];if(c){b=H[d+32>>2];l=(b>>>0)/152|0;j=0;if(b>>>0>=152){while(1){b=H[c+48>>2];if(b){f=H[c+52>>2];h=(f>>>0)/40|0;e=0;if(f>>>0>=40){while(1){Za(H[b+32>>2]);H[b+32>>2]=0;Za(H[b+36>>2]);H[b+36>>2]=0;ra[i|0](b);b=b+40|0;e=e+1|0;if((h|0)!=(e|0)){continue}break}b=H[c+48>>2]}Ca(b);H[c+48>>2]=0}b=H[c+84>>2];if(b){f=H[c+88>>2];h=(f>>>0)/40|0;e=0;if(f>>>0>=40){while(1){Za(H[b+32>>2]);H[b+32>>2]=0;Za(H[b+36>>2]);H[b+36>>2]=0;ra[i|0](b);b=b+40|0;e=e+1|0;if((h|0)!=(e|0)){continue}break}b=H[c+84>>2]}Ca(b);H[c+84>>2]=0}b=H[c+120>>2];if(b){f=H[c+124>>2];h=(f>>>0)/40|0;e=0;if(f>>>0>=40){while(1){Za(H[b+32>>2]);H[b+32>>2]=0;Za(H[b+36>>2]);H[b+36>>2]=0;ra[i|0](b);b=b+40|0;e=e+1|0;if((h|0)!=(e|0)){continue}break}b=H[c+120>>2]}Ca(b);H[c+120>>2]=0}c=c+152|0;j=j+1|0;if((l|0)!=(j|0)){continue}break}c=H[d+28>>2]}Ca(c);H[d+28>>2]=0}a:{if(!H[d+40>>2]){break a}b=H[d+36>>2];if(!b){break a}Ca(b);H[d+44>>2]=0;H[d+48>>2]=0;H[d+36>>2]=0;H[d+40>>2]=0}Ca(H[d+52>>2]);d=d+76|0;k=k+1|0;if(k>>>0>2]){continue}break}d=H[g+20>>2]}Ca(d);H[g+20>>2]=0;Ca(H[H[a+20>>2]>>2]);b=H[a+20>>2];H[b>>2]=0}Ca(b);H[a+20>>2]=0}Ca(H[a+68>>2]);Ca(a)}}function Ob(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;e=H[a+24>>2];j=H[e+16>>2];if(!j){return 0}f=H[e+24>>2];e=H[H[H[a+20>>2]>>2]+20>>2];a:{b:{if(!b){b=0;while(1){c=H[f+24>>2];a=H[e+28>>2]+N(H[e+24>>2],152)|0;d=H[a-140>>2];g=H[a-144>>2]-H[a-152>>2]|0;a=H[a-148>>2];h=d-a|0;be(g,0,h);if(!(!qa|(a|0)==(d|0))){break a}a=(c>>>3|0)+((c&7)!=0)|0;c=(a|0)==3?4:a;a=!c;d=N(g,h);be(c,0,d);if(!(!qa|a)){break a}a=-1;c=N(c,d);if(c>>>0>(b^-1)>>>0){break b}e=e+76|0;f=f+52|0;b=b+c|0;a=b;i=i+1|0;if((j|0)!=(i|0)){continue}break}break b}b=0;if(!H[a+64>>2]){while(1){c=H[f+24>>2];a=H[e+28>>2]+N(H[e+24>>2],152)|0;d=H[a-4>>2];g=H[a-8>>2]-H[a-16>>2]|0;a=H[a-12>>2];h=d-a|0;be(g,0,h);if(!(!qa|(a|0)==(d|0))){break a}a=(c>>>3|0)+((c&7)!=0)|0;c=(a|0)==3?4:a;a=!c;d=N(g,h);be(c,0,d);if(!(!qa|a)){break a}a=-1;c=N(c,d);if(c>>>0>(b^-1)>>>0){break b}e=e+76|0;f=f+52|0;b=b+c|0;a=b;i=i+1|0;if((j|0)!=(i|0)){continue}break}break b}while(1){c=H[f+24>>2];a=H[e+28>>2]+N(H[e+24>>2],152)|0;d=H[a-140>>2];g=H[a-144>>2]-H[a-152>>2]|0;a=H[a-148>>2];h=d-a|0;be(g,0,h);if(!(!qa|(a|0)==(d|0))){break a}a=(c>>>3|0)+((c&7)!=0)|0;c=(a|0)==3?4:a;a=!c;d=N(g,h);be(c,0,d);if(!(!qa|a)){break a}a=-1;c=N(c,d);if(c>>>0>(b^-1)>>>0){break b}e=e+76|0;f=f+52|0;b=b+c|0;a=b;i=i+1|0;if((j|0)!=(i|0)){continue}break}}return a}return-1}function Yb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;c=H[a+8>>2];e=c+H[a+4>>2]|0;a:{if(!H[a+12>>2]){if((e|0)<2){break a}h=(c<<2)+b|0;d=H[h>>2];c=H[b>>2]-(d+1>>1)|0;i=H[a>>2];if(e>>>0>=4){k=(e-4>>>1|0)+1|0;a=1;while(1){f=d;d=a<<2;m=H[d+b>>2];d=H[d+h>>2];j=c;l=i+(g<<2)|0;H[l>>2]=c;c=m-((d+f|0)+2>>2)|0;H[l+4>>2]=f+(j+c>>1);g=g+2|0;f=(a|0)!=(k|0);a=a+1|0;if(f){continue}break}}H[i+(g<<2)>>2]=c;if(e&1){f=e-1|0;a=H[(f<<1)+b>>2]-(d+1>>1)|0;H[i+(f<<2)>>2]=a;c=a+c>>1;j=-8}else{j=-4}a=e<<2;H[j+(a+i|0)>>2]=c+d;if(!a){break a}B(b,i,a);return}b:{switch(e-1|0){case 0:H[b>>2]=H[b>>2]/2;return;case 1:a=H[a>>2];c=(c<<2)+b|0;d=H[b>>2]-(H[c>>2]+1>>1)|0;H[a+4>>2]=d;H[a>>2]=d+H[c>>2];c=H[a+4>>2];H[b>>2]=H[a>>2];H[b+4>>2]=c;return;default:break b}}if((e|0)<3){break a}h=H[a>>2];k=(c<<2)+b|0;d=H[k+4>>2];a=H[k>>2];c=H[b>>2]-((d+a|0)+2>>2)|0;H[h>>2]=c+a;g=1;m=e-2|0;l=e&1;a=!l;if(m-a>>>0>=2){o=((e-a|0)-4>>>1|0)+1|0;a=1;while(1){f=d;p=H[(a<<2)+b>>2];j=a+1|0;d=H[k+(j<<2)>>2];i=c;n=h+(g<<2)|0;H[n>>2]=c;c=p-((d+f|0)+2>>2)|0;H[n+4>>2]=f+(i+c>>1);g=g+2|0;f=(a|0)!=(o|0);a=j;if(f){continue}break}}H[h+(g<<2)>>2]=c;c:{if(!l){g=H[((e<<1)+b|0)-4>>2]-(d+1>>1)|0;H[h+(m<<2)>>2]=(g+c>>1)+d;break c}g=c+d|0}a=e<<2;H[(a+h|0)-4>>2]=g;if(!a){break a}B(b,h,a)}}function ce(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;a:{b:{c:{d:{e:{f:{g:{h:{i:{j:{e=b;if(e){if(!c){break j}if(!d){break i}e=Q(d)-Q(e)|0;if(e>>>0<=31){break h}break b}if((d|0)==1|d>>>0>1){break b}b=(a>>>0)/(c>>>0)|0;oa=a-N(b,c)|0;pa=0;qa=0;return b}if(!a){break g}if(!d){break f}f=d-1|0;if(f&d){break f}oa=a;pa=e&f;a=e>>>de(d)|0;qa=0;return a}f=c-1|0;if(!(f&c)){break e}k=(Q(c)+33|0)-Q(e)|0;g=0-k|0;break c}k=e+1|0;g=63-e|0;break c}oa=0;a=(e>>>0)/(d>>>0)|0;pa=e-N(a,d)|0;qa=0;return a}e=Q(d)-Q(e)|0;if(e>>>0<31){break d}break b}oa=a&f;pa=0;if((c|0)==1){break a}c=de(c);d=c&31;if((c&63)>>>0>=32){e=0;a=b>>>d|0}else{e=b>>>d|0;a=((1<>>d}qa=e;return a}k=e+1|0;g=63-e|0}f=a;e=k&63;h=e&31;if((e&63)>>>0>=32){e=0;f=b>>>h|0}else{e=b>>>h|0;f=((1<>>h}h=g&63;g=a;i=h&31;if((h&63)>>>0>=32){j=a<>>32-i|b<>>31;f=f<<1|b>>>31;l=e;i=g-(e+(f>>>0>h>>>0)|0)|0;m=i>>31;j=m;e=f;i=c&j;f=e-i|0;e=l-((d&j)+(e>>>0>>0)|0)|0;j=b<<1|a>>>31;a=n|a<<1;b=j|o;l=m&1;n=l;k=k-1|0;if(k){continue}break}}oa=f;pa=e;j=b<<1|a>>>31;a=l|a<<1;qa=j|o;return a}oa=a;pa=b;a=0;b=0}qa=b;return a}function Cc(a,b,c,d,e){var f=0,g=0,h=0,i=0;h=na-16|0;na=h;if(H[a+8>>2]==16){a=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{a=H[a+12>>2]}f=H[d>>2];a:{if(!f){d=0;Ba(e,1,2642,0);break a}a=H[a+5584>>2];H[d>>2]=f-1;Da(c,h+12|0,1);g=N(b,1080)+a|0;a=H[h+12>>2];H[g+804>>2]=a>>>5;b=a&31;H[g+24>>2]=b;a=c+1|0;b:{c:{d:{e:{f:{switch(b|0){case 0:f=H[d>>2];break e;case 1:break d;default:break f}}f=H[d>>2]>>>1|0}if(f>>>0>=98){H[h+4>>2]=97;H[h+8>>2]=97;H[h>>2]=f;Ba(e,2,16056,h);b=H[g+24>>2]}if(b){b=f;if(b){break d}a=0;break c}if(f){b=g+28|0;c=0;while(1){Da(a,h+12|0,1);if(c>>>0<=96){e=H[h+12>>2];i=b+(c<<3)|0;H[i+4>>2]=0;H[i>>2]=e>>>3}a=a+1|0;c=c+1|0;if((f|0)!=(c|0)){continue}break}}a=H[d>>2];if(a>>>0>>0){d=0;break a}a=a-f|0;break b}e=g+28|0;c=0;while(1){Da(a,h+12|0,2);if(c>>>0<=96){f=e+(c<<3)|0;i=H[h+12>>2];H[f+4>>2]=i&2047;H[f>>2]=i>>>11}a=a+2|0;c=c+1|0;if((c|0)!=(b|0)){continue}break}a=b<<1}b=H[d>>2];if(a>>>0>b>>>0){d=0;break a}a=b-a|0}H[d>>2]=a;d=1;if(H[g+24>>2]!=1){break a}f=g+28|0;c=H[g+32>>2];e=H[g+28>>2];a=1;while(1){b=f+(a<<3)|0;H[b+12>>2]=c;H[b+4>>2]=c;g=e-((a>>>0)/3|0)|0;H[b+8>>2]=(g|0)>0?g:0;g=b;b=e-((a-1>>>0)/3|0)|0;H[g>>2]=(b|0)>0?b:0;a=a+2|0;if((a|0)!=97){continue}break}}na=h+16|0;return d}function ud(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;h=na-16|0;na=h;a:{if(!(I[a+100|0]&2)){Ba(d,1,11356,0);a=0;break a}H[a+104>>2]=0;b:{c:{d:{if(c){while(1){if(c>>>0<=7){Ba(d,1,3403,0);break b}g=h+12|0;Da(b,g,4);e=H[h+12>>2];Da(b+4|0,g,4);f=8;g=H[h+12>>2];e:{f:{g:{switch(e|0){case 1:if(c>>>0<16){e=3443;break c}Da(b+8|0,h+8|0,4);if(H[h+8>>2]){e=8449;break c}Da(b+12|0,h+12|0,4);e=H[h+12>>2];if(e){break f}e=3268;break c;case 0:break g;default:break e}}Ba(d,1,3268,0);break b}f=16}if(e>>>0>>0){Ba(d,1,9148,0);break b}if(c>>>0>>0){Ba(d,1,9076,0);a=0;break a}h:{i:{j=b+f|0;k=e-f|0;j:{k:{l:{m:{if((g|0)<=1668246641){if((g|0)==1651532643){break m}if((g|0)==1667523942){break k}if((g|0)!=1668112752){break i}f=25264;break j}if((g|0)==1885564018){break l}f=25232;if((g|0)==1768449138){break j}if((g|0)!=1668246642){break i}f=25240;break j}f=25248;break j}f=25256;break j}f=25272}if(ra[H[f+4>>2]](a,j,k,d)|0){break h}a=0;break a}H[a+104>>2]=H[a+104>>2]|2147483647}i=(g|0)==1768449138?1:i;b=b+e|0;c=c-e|0;if(c){continue}break}if(i){break d}}Ba(d,1,8976,0);a=0;break a}F[a+132|0]=1;H[a+100>>2]=H[a+100>>2]|4;a=1;break a}Ba(d,1,e,0)}Ba(d,1,1968,0);a=0}na=h+16|0;return a|0}function Rd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;e=na-32|0;na=e;f=1;a:{if(c>>>0<=1){f=0;Ba(d,1,10062,0);break a}if(H[a+76>>2]){break a}Da(b,e+28|0,1);Da(b+1|0,e+24|0,1);h=H[e+24>>2];g=h>>>4&3;if((g|0)==3){H[a+76>>2]=1;Ba(d,2,11558,0);break a}c=c-2|0;h=(h>>>5&2)+2|0;i=h+g|0;j=(c>>>0)/(i>>>0)|0;if((N(j,i)|0)!=(c|0)){H[a+76>>2]=1;Ba(d,2,11139,0);break a}if(c>>>0>>0){break a}b:{c=H[a+68>>2];if(c>>>0<=(j^-1)>>>0){c=c+j|0;if(c>>>0<536870912){break b}}H[a+76>>2]=1;Ba(d,2,9400,0);break a}i=Ga(H[a+72>>2],c<<3);if(!i){H[a+76>>2]=1;Ba(d,2,9443,0);break a}c=b+2|0;H[a+72>>2]=i;c:{if(g){while(1){Da(c,e+20|0,g);b=H[e+20>>2];if(b>>>0>=N(H[a+132>>2],H[a+128>>2])>>>0){break c}b=c+g|0;Da(b,e+16|0,h);c=H[a+68>>2];f=i+(c<<3)|0;G[f>>1]=H[e+20>>2];H[f+4>>2]=H[e+16>>2];f=1;H[a+68>>2]=c+1;c=b+h|0;k=k+1|0;if((k|0)!=(j|0)){continue}break}break a}b=H[a+68>>2];g=0;while(1){H[e+20>>2]=b;if(N(H[a+132>>2],H[a+128>>2])>>>0<=b>>>0){break c}Da(c,e+16|0,h);k=H[a+68>>2];f=i+(k<<3)|0;G[f>>1]=b;H[f+4>>2]=H[e+16>>2];f=1;b=k+1|0;H[a+68>>2]=b;c=c+h|0;g=g+1|0;if((j|0)!=(g|0)){continue}break}break a}H[a+76>>2]=1;H[e>>2]=b;Ba(d,2,7799,e)}na=e+32|0;return f|0}function Bd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;a:{if(!Va(H[b+8>>2],46,d)){break a}i=H[b+4>>2];e=H[i>>2];g=H[i+8>>2];b:{if(e){f=1;c:{if((e|0)!=1){k=e&1;e=e&-2;while(1){h=0;d:{if(!f){break d}h=0;if(!(ra[H[g>>2]](b,a,d)|0)){break d}h=(ra[H[g+4>>2]](b,a,d)|0)!=0}f=h;g=g+8|0;j=j+2|0;if((e|0)!=(j|0)){continue}break}if(!k){break c}}if(!f){f=0;break c}f=(ra[H[g>>2]](b,a,d)|0)!=0}Oa(i);if(f){break b}break a}Oa(i)}i=H[b+8>>2];e=H[i>>2];g=H[i+8>>2];e:{if(e){f=1;f:{if((e|0)!=1){k=e&1;e=e&-2;j=0;while(1){h=0;g:{if(!f){break g}h=0;if(!(ra[H[g>>2]](b,a,d)|0)){break g}h=(ra[H[g+4>>2]](b,a,d)|0)!=0}f=h;g=g+8|0;j=j+2|0;if((e|0)!=(j|0)){continue}break}if(!k){break f}}if(!f){f=0;break f}f=(ra[H[g>>2]](b,a,d)|0)!=0}Oa(i);if(!f){break a}break e}Oa(i)}if(!I[b+132|0]){Ba(d,1,11696,0);return 0}if(!I[b+133|0]){Ba(d,1,11667,0);return 0}l=Jb(a,H[b>>2],c,d);if(!c|!l){break a}a=H[c>>2];if(!a){break a}c=H[b+48>>2]-12|0;if(c>>>0<=12){c=H[(c<<2)+25280>>2]}else{c=-1}H[a+20>>2]=c;c=H[b+108>>2];if(!c){break a}H[a+28>>2]=c;H[a+32>>2]=H[b+112>>2];H[b+108>>2]=0}return l|0}function Jb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;e=Db();H[b+96>>2]=e;a:{b:{if(!e){break b}c:{if(Va(H[b+220>>2],18,d)){if(Va(H[b+220>>2],19,d)){break c}}break a}i=H[b+220>>2];f=H[i>>2];g=H[i+8>>2];d:{if(f){e=1;e:{if((f|0)!=1){k=f&1;f=f&-2;while(1){h=0;f:{if(!e){break f}h=0;if(!(ra[H[g>>2]](b,a,d)|0)){break f}h=(ra[H[g+4>>2]](b,a,d)|0)!=0}e=h;g=g+8|0;j=j+2|0;if((f|0)!=(j|0)){continue}break}if(!k){break e}}if(!e){e=0;break e}e=(ra[H[g>>2]](b,a,d)|0)!=0}Oa(i);if(e){break d}break a}Oa(i)}g:{if(Va(H[b+216>>2],20,d)){if(Va(H[b+216>>2],21,d)){break g}}break a}i=H[b+216>>2];f=H[i>>2];g=H[i+8>>2];h:{if(f){e=1;i:{if((f|0)!=1){k=f&1;f=f&-2;j=0;while(1){h=0;j:{if(!e){break j}h=0;if(!(ra[H[g>>2]](b,a,d)|0)){break j}h=(ra[H[g+4>>2]](b,a,d)|0)!=0}e=h;g=g+8|0;j=j+2|0;if((f|0)!=(j|0)){continue}break}if(!k){break i}}if(!e){e=0;break i}e=(ra[H[g>>2]](b,a,d)|0)!=0}Oa(i);if(e){break h}break a}Oa(i)}a=Db();H[c>>2]=a;if(!a){break b}wc(H[b+96>>2],a);l=1}return l|0}Ta(H[b+96>>2]);H[b+96>>2]=0;return 0}function sc(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0;b=H[6524];c=a+7&-8;a=c+7|0;d=a>>>0<7?1:d;e=a&-8;a=e+b|0;a:{b:{if(!(a>>>0>>0?d+1|0:d)){if(a>>>0<=sa()<<16>>>0){break b}if(ga(a|0)|0){break b}}H[6605]=48;b=-1;break a}H[6524]=a}d=b;if((d|0)!=-1){a=d+c|0;H[a-4>>2]=16;f=a-16|0;H[f>>2]=16;b=H[6864];if(b){e=H[b+8>>2]}else{e=0}c:{d:{if((e|0)==(d|0)){e=H[d-4>>2]&-2;g=d-e|0;h=H[g-4>>2];H[b+8>>2]=a;b=h&-2;a=g-b|0;if(H[(a+H[a>>2]|0)-4>>2]&1){f=H[a+4>>2];g=H[a+8>>2];H[f+8>>2]=g;H[g+4>>2]=f;b=(b+(c+e|0)|0)-16|0;H[a>>2]=b;break c}a=d-16|0;break d}H[d>>2]=16;H[d+8>>2]=a;H[d+4>>2]=b;H[d+12>>2]=16;H[6864]=d;a=d+16|0}b=f-a|0;H[a>>2]=b}H[((b&-4)+a|0)-4>>2]=b|1;c=H[a>>2]-8|0;e:{if(c>>>0<=127){b=(c>>>3|0)-1|0;break e}e=Q(c);b=((c>>>29-e^4)-(e<<2)|0)+110|0;if(c>>>0<=4095){break e}b=((c>>>30-e^2)-(e<<1)|0)+71|0;b=b>>>0>=63?63:b}c=b<<4;H[a+4>>2]=c+26432;c=c+26440|0;H[a+8>>2]=H[c>>2];H[c>>2]=a;H[H[a+8>>2]+4>>2]=a;c=H[6867];a=b&31;if((b&63)>>>0>=32){b=1<>>32-a}H[6866]=e|H[6866];H[6867]=b|c}return(d|0)!=-1}function wc(a,b){var c=0,d=0,e=0,f=0,g=0;H[b>>2]=H[a>>2];H[b+4>>2]=H[a+4>>2];H[b+8>>2]=H[a+8>>2];H[b+12>>2]=H[a+12>>2];c=H[b+24>>2];if(c){d=H[b+16>>2];if(d){c=0;while(1){f=H[(H[b+24>>2]+N(c,52)|0)+44>>2];if(f){Ca(f);d=H[b+16>>2]}c=c+1|0;if(d>>>0>c>>>0){continue}break}c=H[b+24>>2]}Ca(c);H[b+24>>2]=0}c=H[a+16>>2];H[b+16>>2]=c;c=Fa(N(c,52));H[b+24>>2]=c;if(c){if(H[b+16>>2]){f=0;while(1){g=N(f,52);d=g+c|0;c=H[a+24>>2]+g|0;H[d+48>>2]=H[c+48>>2];e=H[c+44>>2];H[d+40>>2]=H[c+40>>2];H[d+44>>2]=e;e=H[c+36>>2];H[d+32>>2]=H[c+32>>2];H[d+36>>2]=e;e=H[c+28>>2];H[d+24>>2]=H[c+24>>2];H[d+28>>2]=e;e=H[c+20>>2];H[d+16>>2]=H[c+16>>2];H[d+20>>2]=e;e=H[c+12>>2];H[d+8>>2]=H[c+8>>2];H[d+12>>2]=e;e=H[c+4>>2];H[d>>2]=H[c>>2];H[d+4>>2]=e;c=H[b+24>>2];H[(g+c|0)+44>>2]=0;f=f+1|0;if(f>>>0>2]){continue}break}}H[b+20>>2]=H[a+20>>2];c=H[a+32>>2];H[b+32>>2]=c;a:{if(c){c=Fa(c);H[b+28>>2]=c;if(!c){H[b+28>>2]=0;H[b+32>>2]=0;return}b=H[a+32>>2];if(!b){break a}B(c,H[a+28>>2],b);return}H[b+28>>2]=0}return}H[b+16>>2]=0;H[b+24>>2]=0}function lb(a,b,c,d,e,f){var g=0,h=O(0),i=0,j=O(0);g=(c<<6)+b|0;b=c?g+-64|0:a;i=d>>>0>>0?d:e;if(i>>>0>c>>>0){h=L[b>>2];while(1){a=b;b=g;g=b-32|0;j=h;h=L[b>>2];L[g>>2]=O(O(j+h)*f)+L[g>>2];g=b-28|0;L[g>>2]=O(O(L[a+4>>2]+L[b+4>>2])*f)+L[g>>2];g=b-24|0;L[g>>2]=O(O(L[a+8>>2]+L[b+8>>2])*f)+L[g>>2];g=b-20|0;L[g>>2]=O(O(L[a+12>>2]+L[b+12>>2])*f)+L[g>>2];g=b-16|0;L[g>>2]=O(O(L[a+16>>2]+L[b+16>>2])*f)+L[g>>2];g=b-12|0;L[g>>2]=O(O(L[a+20>>2]+L[b+20>>2])*f)+L[g>>2];g=b-8|0;L[g>>2]=O(O(L[a+24>>2]+L[b+24>>2])*f)+L[g>>2];g=b-4|0;L[g>>2]=O(O(L[a+28>>2]+L[b+28>>2])*f)+L[g>>2];g=b- -64|0;c=c+1|0;if((i|0)!=(c|0)){continue}break}}if(d>>>0>e>>>0){a=g-32|0;f=O(f+f);L[a>>2]=O(L[b>>2]*f)+L[a>>2];a=g-28|0;L[a>>2]=O(L[b+4>>2]*f)+L[a>>2];a=g-24|0;L[a>>2]=O(L[b+8>>2]*f)+L[a>>2];a=g-20|0;L[a>>2]=O(L[b+12>>2]*f)+L[a>>2];a=g-16|0;L[a>>2]=O(L[b+16>>2]*f)+L[a>>2];a=g-12|0;L[a>>2]=O(L[b+20>>2]*f)+L[a>>2];a=g-8|0;L[a>>2]=O(L[b+24>>2]*f)+L[a>>2];a=g-4|0;L[a>>2]=O(L[b+28>>2]*f)+L[a>>2]}}function Uc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;if(K[a+44>>2]>=8){e=H[a+36>>2];n=e<<5;o=N(e,28);p=N(e,24);q=N(e,20);r=e<<4;i=N(e,12);j=e<<3;g=H[a+40>>2];k=8;while(1){yb(a,g,H[a+36>>2],8);Sa(a);h=H[a+32>>2];if(h){f=H[a>>2];b=0;a:{if((h|0)!=1){s=h&1;t=h&-2;l=0;while(1){c=(b<<2)+g|0;d=f+(b<<5)|0;L[c>>2]=L[d>>2];m=e<<2;L[c+m>>2]=L[d+4>>2];L[c+j>>2]=L[d+8>>2];L[c+i>>2]=L[d+12>>2];d=b|1;c=(d<<2)+g|0;d=f+(d<<5)|0;L[c>>2]=L[d>>2];L[c+m>>2]=L[d+4>>2];L[c+j>>2]=L[d+8>>2];L[c+i>>2]=L[d+12>>2];b=b+2|0;l=l+2|0;if((t|0)!=(l|0)){continue}break}if(!s){break a}}c=(b<<2)+g|0;b=f+(b<<5)|0;L[c>>2]=L[b>>2];L[c+(e<<2)>>2]=L[b+4>>2];L[c+j>>2]=L[b+8>>2];L[c+i>>2]=L[b+12>>2]}d=H[a>>2];b=0;while(1){f=(b<<2)+g|0;c=d+(b<<5)|0;L[f+r>>2]=L[c+16>>2];L[f+q>>2]=L[c+20>>2];L[f+p>>2]=L[c+24>>2];L[f+o>>2]=L[c+28>>2];b=b+1|0;if((h|0)!=(b|0)){continue}break}}g=g+n|0;k=k+8|0;if(k>>>0<=K[a+44>>2]){continue}break}}Ca(H[a>>2]);Ca(a)}function pd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;f=na-16|0;na=f;a:{if(H[a+120>>2]|c>>>0<3){break a}Da(b,f+12|0,2);k=J[f+12>>1];if(k-1025>>>0<=4294966271){H[f>>2]=k;Ba(d,1,3526,f);break a}Da(b+2|0,f+12|0,1);i=J[f+12>>1];if(!i){Ba(d,1,3174,0);break a}if(i+3>>>0>c>>>0){break a}h=Fa(N(i,k)<<2);if(!h){break a}j=Fa(i);if(!j){Ca(h);break a}l=Fa(i);if(!l){Ca(h);Ca(j);break a}g=Fa(20);if(!g){Ca(h);Ca(j);Ca(l);break a}d=b+3|0;H[g+8>>2]=j;H[g+4>>2]=l;G[g+16>>1]=k;H[g>>2]=h;m=H[f+12>>2];H[g+12>>2]=0;F[g+18|0]=m;H[a+120>>2]=g;while(1){Da(d,f+12|0,1);F[e+j|0]=(I[f+12|0]&127)+1;F[e+l|0]=(H[f+12>>2]&128)>>>7;d=d+1|0;e=e+1|0;if((i|0)!=(e|0)){continue}break}g=0;while(1){e=0;a=0;while(1){e=I[e+j|0]+7>>>3|0;e=e>>>0>=4?4:e;if((e+(d-b|0)|0)>(c|0)){e=0;break a}Da(d,f+12|0,e);H[h>>2]=H[f+12>>2];h=h+4|0;d=d+e|0;a=a+1|0;e=a&65535;if(i>>>0>e>>>0){continue}break}e=1;g=g+1|0;if((g&65535)>>>0>>0){continue}break}}na=f+16|0;return e|0}function hd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;f=-1;e=-1;if(!(I[a+68|0]&8)){f=H[a+32>>2];H[a+36>>2]=f;a:{b:{c:{e=H[a+48>>2];if(e){while(1){e=ra[H[a+20>>2]](f,e,H[a>>2])|0;if((e|0)==-1){break c}f=e+H[a+36>>2]|0;H[a+36>>2]=f;e=H[a+48>>2]-e|0;H[a+48>>2]=e;if(e){continue}break}f=H[a+32>>2]}H[a+36>>2]=f;if(!!b&(c|0)>=0|(c|0)>0){break b}f=0;e=0;break a}H[a+68>>2]=H[a+68>>2]|8;Ba(d,4,15604,0);H[a+48>>2]=0;H[a+68>>2]=H[a+68>>2]|8;qa=-1;return-1}f=0;e=0;while(1){g=ra[H[a+24>>2]](b,c,H[a>>2])|0;h=qa;i=h;if((g&h)==-1){Ba(d,4,15589,0);H[a+68>>2]=H[a+68>>2]|8;b=e+H[a+60>>2]|0;c=f+H[a+56>>2]|0;b=c>>>0>>0?b+1|0:b;H[a+56>>2]=c;H[a+60>>2]=b;a=!(e|f);b=a?-1:f;qa=a?-1:e;return b|0}e=e+i|0;f=f+g|0;e=f>>>0>>0?e+1|0:e;h=b;b=b-g|0;c=c-(i+(g>>>0>h>>>0)|0)|0;if(!!b&(c|0)>=0|(c|0)>0){continue}break}}b=e+H[a+60>>2]|0;c=f+H[a+56>>2]|0;b=c>>>0>>0?b+1|0:b;H[a+56>>2]=c;H[a+60>>2]=b}qa=e;return f|0}function Nd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;g=na-16|0;na=g;a:{if(c>>>0<=1){Ba(d,1,3983,0);a=0;break a}if(F[a+212|0]&1){Ba(d,1,12668,0);a=0;break a}a=H[a+180>>2]+N(H[a+228>>2],5644)|0;F[a+5640|0]=I[a+5640|0]|2;Da(b,g+12|0,1);e=H[a+5164>>2];b:{if(!e){f=H[g+12>>2]+1|0;e=Ea(f,8);H[a+5164>>2]=e;if(!e){Ba(d,1,4009,0);a=0;break a}H[a+5160>>2]=f;break b}f=H[g+12>>2];if(f>>>0>2]){break b}h=e;e=f+1|0;f=Ga(h,e<<3);if(!f){Ba(d,1,4009,0);a=0;break a}H[a+5164>>2]=f;h=H[a+5160>>2];i=e-h<<3;if(i){y(f+(h<<3)|0,0,i)}H[a+5160>>2]=e;e=H[a+5164>>2]}h=e;e=H[g+12>>2];if(H[h+(e<<3)>>2]){H[g>>2]=e;Ba(d,1,7063,g);a=0;break a}c=c-1|0;e=Fa(c);a=H[a+5164>>2];f=a+(H[g+12>>2]<<3)|0;H[f>>2]=e;if(!e){Ba(d,1,4009,0);a=0;break a}H[f+4>>2]=c;if(c){B(H[a+(H[g+12>>2]<<3)>>2],b+1|0,c)}a=1}na=g+16|0;return a|0}function Cb(a,b,c){var d=0,e=0,f=0,g=0;e=a+4|0;d=(e+b|0)-1&0-b;b=H[a>>2];if(d+c>>>0<=(b+a|0)-4>>>0){f=H[a+4>>2];g=H[a+8>>2];H[f+8>>2]=g;H[g+4>>2]=f;if((d|0)!=(e|0)){d=d-e|0;f=a-(H[a-4>>2]&-2)|0;e=d+H[f>>2]|0;H[f>>2]=e;H[(f+(e&-4)|0)-4>>2]=e;a=a+d|0;b=b-d|0;H[a>>2]=b}a:{if(c+24>>>0<=b>>>0){e=a+c|0;b=(b-c|0)-8|0;H[e+8>>2]=b;g=e+8|0;H[(g+(b&-4)|0)-4>>2]=b|1;d=H[e+8>>2]-8|0;b:{if(d>>>0<=127){b=(d>>>3|0)-1|0;break b}f=Q(d);b=((d>>>29-f^4)-(f<<2)|0)+110|0;if(d>>>0<=4095){break b}b=((d>>>30-f^2)-(f<<1)|0)+71|0;b=b>>>0>=63?63:b}d=b<<4;H[e+12>>2]=d+26432;d=d+26440|0;H[e+16>>2]=H[d>>2];H[d>>2]=g;H[H[e+16>>2]+4>>2]=g;d=H[6866];f=H[6867];e=b&31;if((b&63)>>>0>=32){b=1<>>32-e}H[6866]=g|d;H[6867]=b|f;b=c+8|0;H[a>>2]=b;c=(b&-4)+a|0;break a}c=a+b|0}H[c-4>>2]=b;a=a+4|0}else{a=0}return a}function Td(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;g=na-16|0;na=g;i=H[H[a+96>>2]+16>>2];h=i>>>0<257?1:2;e=(h<<1)+5|0;f=(c>>>0)/(e>>>0)|0;a:{if(!((N(e,f)|0)==(c|0)&c>>>0>=e>>>0)){Ba(d,1,4643,0);a=0;break a}if(H[a+8>>2]==16){e=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{e=H[a+12>>2]}a=0;c=I[e+5640|0];a=c&4?H[e+420>>2]+1|0:a;f=f+a|0;if(f>>>0>=32){H[g>>2]=f;Ba(d,1,7781,g);a=0;break a}F[e+5640|0]=c|4;if(a>>>0>>0){c=(e+N(a,148)|0)+424|0;while(1){Da(b,c,1);b=b+1|0;Da(b,c+4|0,h);b=b+h|0;Da(b,c+8|0,2);d=H[c+8>>2];j=H[e+8>>2];H[c+8>>2]=d>>>0>>0?d:j;Da(b+2|0,c+12|0,1);b=b+3|0;Da(b,c+16|0,h);b=b+h|0;Da(b,g+12|0,1);H[c+36>>2]=H[g+12>>2];d=H[c+16>>2];H[c+16>>2]=d>>>0>>0?d:i;c=c+148|0;b=b+1|0;a=a+1|0;if((f|0)!=(a|0)){continue}break}}H[e+420>>2]=f-1;a=1}na=g+16|0;return a|0}function ib(a){var b=0,c=0,d=0,e=0;a:{if(!a){break a}b=H[a+5164>>2];if(b){c=H[a+5160>>2];if(c){b=0;while(1){d=H[H[a+5164>>2]+(b<<3)>>2];if(d){Ca(d);c=H[a+5160>>2]}b=b+1|0;if(c>>>0>b>>>0){continue}break}b=H[a+5164>>2]}H[a+5160>>2]=0;Ca(b);H[a+5164>>2]=0}b=H[a+5172>>2];if(b){Ca(b);H[a+5172>>2]=0}b=H[a+5584>>2];if(b){Ca(b);H[a+5584>>2]=0}b=H[a+5612>>2];if(b){Ca(b);H[a+5612>>2]=0}b=H[a+5608>>2];if(b){Ca(b);H[a+5608>>2]=0}b=H[a+5628>>2];if(b){Ca(b);H[a+5636>>2]=0;H[a+5628>>2]=0;H[a+5632>>2]=0}b=H[a+5616>>2];if(b){e=H[a+5620>>2];if(e){c=0;while(1){d=H[b+12>>2];if(d){Ca(d);H[b+12>>2]=0;e=H[a+5620>>2]}b=b+20|0;c=c+1|0;if(e>>>0>c>>>0){continue}break}b=H[a+5616>>2]}Ca(b);H[a+5616>>2]=0}b=H[a+5604>>2];if(b){Ca(b);H[a+5604>>2]=0}b=H[a+5596>>2];if(!b){break a}Ca(b);H[a+5596>>2]=0;H[a+5600>>2]=0}}function td(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;e=na-32|0;na=e;a:{if(H[a+72>>2]){Ba(d,2,7015,0);c=1;break a}if((c|0)!=14){c=0;Ba(d,1,14445,0);break a}Da(b,a+16|0,4);Da(b+4|0,a+12|0,4);Da(b+8|0,a+20|0,2);f=H[a+12>>2];b:{g=H[a+16>>2];c=H[a+20>>2];c:{if(!g){break c}c=H[a+20>>2];if(!f){break c}if(c){break b}c=0}H[e+8>>2]=c;H[e+4>>2]=g;H[e>>2]=f;Ba(d,1,14289,e);c=0;break a}if(c>>>0>=16385){c=0;Ba(d,1,14203,0);break a}c=Ea(c,12);H[a+72>>2]=c;if(!c){c=0;Ba(d,1,14240,0);break a}c=1;Da(b+10|0,a+24|0,1);Da(b+11|0,a+28|0,1);f=H[a+28>>2];if((f|0)!=7){H[e+16>>2]=f;Ba(d,4,16272,e+16|0)}Da(b+12|0,a+32|0,1);Da(b+13|0,a+36|0,1);b=H[a>>2];F[b+212|0]=I[b+212|0]&251|(H[a+24>>2]==255?4:0);b=H[a>>2];H[b+240>>2]=H[a+12>>2];H[b+244>>2]=H[a+16>>2];F[a+133|0]=1}na=e+32|0;return c|0}function lc(a,b,c,d){a:{switch(b-9|0){case 0:b=H[c>>2];H[c>>2]=b+4;H[a>>2]=H[b>>2];return;case 6:b=H[c>>2];H[c>>2]=b+4;b=G[b>>1];H[a>>2]=b;H[a+4>>2]=b>>31;return;case 7:b=H[c>>2];H[c>>2]=b+4;H[a>>2]=J[b>>1];H[a+4>>2]=0;return;case 8:b=H[c>>2];H[c>>2]=b+4;b=F[b|0];H[a>>2]=b;H[a+4>>2]=b>>31;return;case 9:b=H[c>>2];H[c>>2]=b+4;H[a>>2]=I[b|0];H[a+4>>2]=0;return;case 16:b=H[c>>2]+7&-8;H[c>>2]=b+8;M[a>>3]=M[b>>3];return;case 17:ra[d|0](a,c);default:return;case 1:case 4:case 14:b=H[c>>2];H[c>>2]=b+4;b=H[b>>2];H[a>>2]=b;H[a+4>>2]=b>>31;return;case 2:case 5:case 11:case 15:b=H[c>>2];H[c>>2]=b+4;H[a>>2]=H[b>>2];H[a+4>>2]=0;return;case 3:case 10:case 12:case 13:break a}}b=H[c>>2]+7&-8;H[c>>2]=b+8;c=H[b+4>>2];H[a>>2]=H[b>>2];H[a+4>>2]=c}function Od(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;g=na-16|0;na=g;a:{if(c>>>0<=1){Ba(d,1,4311,0);a=0;break a}F[a+212|0]=I[a+212|0]|1;Da(b,g+12|0,1);e=H[a+140>>2];b:{if(!e){f=H[g+12>>2]+1|0;e=Ea(f,8);H[a+140>>2]=e;if(!e){Ba(d,1,4337,0);a=0;break a}H[a+136>>2]=f;break b}f=H[g+12>>2];if(f>>>0>2]){break b}h=e;e=f+1|0;f=Ga(h,e<<3);if(!f){Ba(d,1,4337,0);a=0;break a}H[a+140>>2]=f;h=H[a+136>>2];i=e-h<<3;if(i){y(f+(h<<3)|0,0,i)}H[a+136>>2]=e;e=H[a+140>>2]}h=e;e=H[g+12>>2];if(H[h+(e<<3)>>2]){H[g>>2]=e;Ba(d,1,7085,g);a=0;break a}c=c-1|0;e=Fa(c);a=H[a+140>>2];f=a+(H[g+12>>2]<<3)|0;H[f>>2]=e;if(!e){Ba(d,1,4337,0);a=0;break a}H[f+4>>2]=c;if(c){B(H[a+(H[g+12>>2]<<3)>>2],b+1|0,c)}a=1}na=g+16|0;return a|0}function cd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;e=na-32|0;na=e;d=H[a+28>>2];H[e+16>>2]=d;g=H[a+20>>2];H[e+28>>2]=c;H[e+24>>2]=b;b=(d|0)==(g|0);i=b?1:2;f=e+16|0;b=b?f|8:f;d=g-d|0;H[e+20>>2]=d;g=c+d|0;a:{while(1){b:{c:{d:{if(!rc(Z(H[a+60>>2],b|0,i|0,e+12|0)|0)){f=H[e+12>>2];if((f|0)==(g|0)){break d}if((f|0)>=0){break c}break b}if((g|0)!=-1){break b}}b=H[a+44>>2];H[a+28>>2]=b;H[a+20>>2]=b;H[a+16>>2]=b+H[a+48>>2];a=c;break a}h=H[b+4>>2];j=h>>>0>>0;d=(j?8:0)+b|0;h=f-(j?h:0)|0;H[d>>2]=h+H[d>>2];b=(j?12:4)+b|0;H[b>>2]=H[b>>2]-h;g=g-f|0;i=i-j|0;b=d;continue}break}H[a+28>>2]=0;H[a+16>>2]=0;H[a+20>>2]=0;H[a>>2]=H[a>>2]|32;a=0;if((i|0)==2){break a}a=c-H[b+4>>2]|0}na=e+32|0;return a|0}function Ca(a){a=a|0;var b=0,c=0,d=0,e=0,f=0;if(a){b=a-4|0;f=H[b>>2];c=f;d=b;e=H[a-8>>2];a=e&-2;if((a|0)!=(e|0)){d=b-a|0;c=H[d+4>>2];e=H[d+8>>2];H[c+8>>2]=e;H[e+4>>2]=c;c=a+f|0}a=b+f|0;b=H[a>>2];if((b|0)!=H[(a+b|0)-4>>2]){f=H[a+4>>2];a=H[a+8>>2];H[f+8>>2]=a;H[a+4>>2]=f;c=b+c|0}H[d>>2]=c;H[((c&-4)+d|0)-4>>2]=c|1;b=H[d>>2]-8|0;a:{if(b>>>0<=127){a=(b>>>3|0)-1|0;break a}c=Q(b);a=((b>>>29-c^4)-(c<<2)|0)+110|0;if(b>>>0<=4095){break a}a=((b>>>30-c^2)-(c<<1)|0)+71|0;a=a>>>0>=63?63:a}b=a<<4;H[d+4>>2]=b+26432;b=b+26440|0;H[d+8>>2]=H[b>>2];H[b>>2]=d;H[H[d+8>>2]+4>>2]=d;b=H[6866];c=H[6867];d=a&31;if((a&63)>>>0>=32){a=1<>>32-d}H[6866]=e|b;H[6867]=a|c}}function Xc(a,b){a=a|0;b=+b;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;c=a<<3;h=c+28672|0;e=M[c+28704>>3];if(e!=0){g=M[h>>3];b=S(g,b);d=b-g;i=~~d>>>0;if(P(d)>=1){c=~~(d>0?R(T(d*2.3283064365386963e-10),4294967295):U((d-+(~~d>>>0>>>0))*2.3283064365386963e-10))>>>0}else{c=0}j=~~e>>>0;if(P(e)>=1){f=~~(e>0?R(T(e*2.3283064365386963e-10),4294967295):U((e-+(~~e>>>0>>>0))*2.3283064365386963e-10))>>>0}else{f=0}c=fe(i,c,j,f);f=qa;c=c+1|0;f=c?f:f+1|0;d=(+(c>>>0)+ +(f>>>0)*4294967296)*e+g;g=d-b}M[h>>3]=d;fa(a|0,+g)|0;c=(a|0)==2?27:(a|0)==1?26:14;a=c-1|0;a:{if(H[6901]>>>a&1){H[6903]=H[6903]|1<>2];if(a){ra[a|0](c)}}}function nd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0;e=na-16|0;na=e;a:{if(H[a+116>>2]){break a}if(c>>>0<=1){Ba(d,1,8882,0);break a}Da(b,e+12|0,2);f=H[e+12>>2];h=f&65535;if(!h){Ba(d,1,8915,0);break a}if(N(h,6)+2>>>0>c>>>0){Ba(d,1,8882,0);break a}d=Fa(N(f,6));if(!d){break a}c=Fa(8);H[a+116>>2]=c;if(!c){Ca(d);break a}H[c>>2]=d;f=c;c=J[e+12>>1];G[f+4>>1]=c;if(!c){g=1;break a}c=0;while(1){g=e+12|0;Da(b+2|0,g,2);f=d+N(c,6)|0;G[f>>1]=H[e+12>>2];Da(b+4|0,g,2);G[f+2>>1]=H[e+12>>2];b=b+6|0;Da(b,g,2);G[f+4>>1]=H[e+12>>2];g=1;c=c+1|0;if(c>>>0>2]+4>>1]){continue}break}}na=e+16|0;return g|0}function Ib(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;g=na-32|0;na=g;f=H[a+96>>2];a:{if(!f){Ba(d,1,13752,0);e=0;break a}f=Ea(4,H[f+16>>2]);e=0;if(!f){break a}if(b){j=H[a+96>>2];while(1){b:{e=H[(h<<2)+c>>2];c:{if(e>>>0>=K[j+16>>2]){H[g+16>>2]=e;Ba(d,1,2443,g+16|0);break c}i=f+(e<<2)|0;if(!H[i>>2]){break b}H[g>>2]=e;Ba(d,1,3487,g)}Ca(f);e=0;break a}H[i>>2]=1;h=h+1|0;if((h|0)!=(b|0)){continue}break}}Ca(f);Ca(H[a+64>>2]);d:{if(b){d=b<<2;e=Fa(d);H[a+64>>2]=e;if(!e){H[a+60>>2]=0;e=0;break a}if(!d){break d}B(e,c,d);break d}H[a+64>>2]=0}H[a+60>>2]=b;e=1}na=g+32|0;return e|0}function xc(a){a=a|0;var b=0,c=0;if(a){vb(H[a>>2]);H[a>>2]=0;b=H[a+72>>2];if(b){Ca(b);H[a+72>>2]=0}b=H[a+68>>2];if(b){Ca(b);H[a+68>>2]=0}b=H[a+108>>2];if(b){Ca(b);H[a+108>>2]=0}b=H[a+116>>2];if(b){c=H[b>>2];if(c){Ca(c);b=H[a+116>>2];H[b>>2]=0}Ca(b);H[a+116>>2]=0}b=H[a+120>>2];if(b){c=H[b+12>>2];if(c){Ca(c);b=H[a+120>>2];H[b+12>>2]=0}c=H[b+4>>2];if(c){Ca(c);b=H[a+120>>2];H[b+4>>2]=0}c=H[b+8>>2];if(c){Ca(c);b=H[a+120>>2];H[b+8>>2]=0}c=H[b>>2];if(c){Ca(c);b=H[a+120>>2];H[b>>2]=0}Ca(b);H[a+120>>2]=0}b=H[a+4>>2];if(b){ob(b);H[a+4>>2]=0}b=H[a+8>>2];if(b){ob(b);H[a+8>>2]=0}Ca(a)}}function sb(a,b,c,d,e,f){var g=0,h=0,i=0,j=0,k=0;g=na-272|0;na=g;H[g+268>>2]=c;H[g+264>>2]=b;H[g>>2]=a;k=!e;a:{b:{c:{d:{if(!(!c&(b|0)==1)){h=1;e=a;while(1){i=(d<<2)+f|0;a=e-H[i>>2]|0;if((Bc(a,H[g>>2])|0)>0){j=k^-1;k=1;if(!(((d|0)<2|j)&1)){i=H[i-8>>2];j=e-8|0;if((Bc(j,a)|0)>=0){break d}if((Bc(j-i|0,a)|0)>=0){break d}}H[((h&63)<<2)+g>>2]=a;b=qc(b,c);tb(g+264|0,b);h=h+1|0;d=b+d|0;e=a;c=H[g+268>>2];b=H[g+264>>2];if(c|(b|0)!=1){continue}break c}break}if(!k){break a}a=e;b=h&63;break b}if(e){break a}b=1;break b}a=e}b=h&63}pc(g,b);Ab(a,d,f)}na=g+272|0}function Yd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=na-16|0;na=e;if(H[a+8>>2]==16){g=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{g=H[a+12>>2]}h=H[a+96>>2];f=K[h+16>>2]<257?1:2;a:{if(f>>>0>=c>>>0){c=0;Ba(d,1,4669,0);break a}H[e+12>>2]=(f^-1)+c;Da(b,e+8|0,f);i=H[e+8>>2];if(i>>>0>=K[h+16>>2]){c=0;Ba(d,1,14067,0);break a}c=1;b=b+f|0;Da(b,H[g+5584>>2]+N(i,1080)|0,1);if(!Dc(a,H[e+8>>2],b+1|0,e+12|0,d)){c=0;Ba(d,1,4669,0);break a}if(!H[e+12>>2]){break a}c=0;Ba(d,1,4669,0)}na=e+16|0;return c|0}function zc(a,b){var c=0,d=0,e=0,f=0,g=0;f=na-32|0;na=f;c=H[a+60>>2];a:{b:{if(c){g=1;while(1){e=H[H[a+64>>2]+(d<<2)>>2];if(!H[(H[H[a+100>>2]+24>>2]+N(e,52)|0)+44>>2]){H[f+16>>2]=e;Ba(b,2,7604,f+16|0);g=0;c=H[a+60>>2]}d=d+1|0;if(c>>>0>d>>>0){continue}break}break b}g=1;c=H[a+100>>2];e=1;if(!H[c+16>>2]){break a}while(1){if(!H[(H[c+24>>2]+N(d,52)|0)+44>>2]){H[f>>2]=d;Ba(b,2,7604,f);g=0;c=H[a+100>>2]}d=d+1|0;if(d>>>0>2]){continue}break}}e=1;if(g){break a}Ba(b,1,2897,0);e=0}na=f+32|0;return e}function od(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0;f=na-16|0;na=f;e=H[a+120>>2];a:{if(!e){Ba(d,1,8836,0);c=0;break a}if(H[e+12>>2]){Ba(d,1,11598,0);c=0;break a}e=I[e+18|0];g=e<<2;if(g>>>0>c>>>0){Ba(d,1,8803,0);c=0;break a}g=Fa(g);c=0;if(!g){break a}if(e){d=0;while(1){c=f+12|0;Da(b,c,2);h=g+(d<<2)|0;G[h>>1]=H[f+12>>2];Da(b+2|0,c,1);F[h+2|0]=H[f+12>>2];Da(b+3|0,c,1);F[h+3|0]=H[f+12>>2];b=b+4|0;d=d+1|0;if((e|0)!=(d|0)){continue}break}}H[H[a+120>>2]+12>>2]=g;c=1}na=f+16|0;return c|0}function Jd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=na-16|0;na=e;g=H[H[a+96>>2]+16>>2];a:{if((g+2|0)!=(c|0)){Ba(d,1,4617,0);break a}Da(b,e+12|0,2);if(H[e+12>>2]!=(g|0)){Ba(d,1,4617,0);break a}if(!g){f=1;break a}c=b+2|0;a=H[H[a+96>>2]+24>>2];b=0;while(1){Da(c,e+8|0,1);f=H[e+8>>2];h=f&127;i=h+1|0;H[a+24>>2]=i;H[a+32>>2]=f>>>7&1;if(h>>>0>=31){H[e+4>>2]=i;H[e>>2]=b;Ba(d,1,15402,e);f=0;break a}a=a+52|0;f=1;c=c+1|0;b=b+1|0;if((g|0)!=(b|0)){continue}break}}na=e+16|0;return f|0}function oc(a,b,c,d,e){var f=0,g=0;f=na-208|0;na=f;H[f+204>>2]=c;c=f+160|0;y(c,0,40);H[f+200>>2]=H[f+204>>2];if((nc(0,b,f+200|0,f+80|0,c,d,e)|0)>=0){c=H[a>>2];H[a>>2]=c&-33;a:{b:{c:{if(!H[a+48>>2]){H[a+48>>2]=80;H[a+28>>2]=0;H[a+16>>2]=0;H[a+20>>2]=0;g=H[a+44>>2];H[a+44>>2]=f;break c}if(H[a+16>>2]){break b}}if(uc(a)){break a}}nc(a,b,f+200|0,f+80|0,f+160|0,d,e)}if(g){ra[H[a+36>>2]](a,0,0)|0;H[a+48>>2]=0;H[a+44>>2]=g;H[a+28>>2]=0;H[a+16>>2]=0;H[a+20>>2]=0}H[a>>2]=H[a>>2]|c&32}na=f+208|0}function Vd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0;e=na-16|0;na=e;a:{b:{h=e+8|0;c:{if(K[H[a+96>>2]+16>>2]<=256){if(c){f=-1;g=1;break c}Ba(d,1,4695,0);a=0;break a}if(c>>>0<=1){break b}f=-2;g=2}Da(b,h,g);H[e+12>>2]=c+f;c=H[e+8>>2];f=H[H[a+96>>2]+16>>2];if(c>>>0>=f>>>0){H[e+4>>2]=f;H[e>>2]=c;Ba(d,1,7712,e);a=0;break a}if(!Cc(a,c,b+g|0,e+12|0,d)){Ba(d,1,4695,0);a=0;break a}a=1;if(!H[e+12>>2]){break a}Ba(d,1,4695,0);a=0;break a}Ba(d,1,4695,0);a=0}na=e+16|0;return a|0}function qd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;f=H[a+32>>2];H[a+36>>2]=f;a:{e=H[a+48>>2];if(e){while(1){e=ra[H[a+20>>2]](f,e,H[a>>2])|0;if((e|0)==-1){break a}f=e+H[a+36>>2]|0;H[a+36>>2]=f;e=H[a+48>>2]-e|0;H[a+48>>2]=e;if(e){continue}break}f=H[a+32>>2]}H[a+48>>2]=0;H[a+36>>2]=f;if(!(ra[H[a+28>>2]](b,c,H[a>>2])|0)){H[a+68>>2]=H[a+68>>2]|8;return 0}H[a+56>>2]=b;H[a+60>>2]=c;return 1}H[a+68>>2]=H[a+68>>2]|8;Ba(d,4,15604,0);H[a+68>>2]=H[a+68>>2]|8;return 0}function Ba(a,b,c,d){var e=0,f=0;e=na-528|0;na=e;a:{if(!a){break a}b:{c:{switch(b-1|0){case 0:b=a+12|0;break b;case 1:b=a+16|0;a=a+4|0;break b;case 3:break c;default:break a}}b=a+20|0;a=a+8|0}b=H[b>>2];if(!b|!c){break a}f=H[a>>2];y(e,0,512);H[e+524>>2]=d;a=na-160|0;na=a;H[a+148>>2]=e;H[a+152>>2]=511;y(a,0,144);H[a+76>>2]=-1;H[a+36>>2]=97;H[a+80>>2]=-1;H[a+44>>2]=a+159;H[a+84>>2]=a+148;F[e|0]=0;oc(a,c,d,95,96);na=a+160|0;F[e+511|0]=0;ra[b|0](e,f)}na=e+528|0}function cc(a){var b=0,c=0,d=0;a:{if(!a){break a}b=H[a+8>>2];if(!b){break a}c=b&3;a=H[a+12>>2];if(b>>>0>=4){d=b&-4;b=0;while(1){H[a+60>>2]=0;H[a+52>>2]=999;H[a+56>>2]=0;H[a+44>>2]=0;H[a+36>>2]=999;H[a+40>>2]=0;H[a+28>>2]=0;H[a+20>>2]=999;H[a+24>>2]=0;H[a+12>>2]=0;H[a+4>>2]=999;H[a+8>>2]=0;a=a- -64|0;b=b+4|0;if((d|0)!=(b|0)){continue}break}if(!c){break a}}b=0;while(1){H[a+12>>2]=0;H[a+4>>2]=999;H[a+8>>2]=0;a=a+16|0;b=b+1|0;if((c|0)!=(b|0)){continue}break}}}function vd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;if(H[a+100>>2]!=1){Ba(d,1,11401,0);return 0}a:{if(c>>>0<=7){break a}Da(b,a+56|0,4);Da(b+4|0,a+60|0,4);if(c&3){break a}c=c-8|0;e=c>>>2|0;H[a+64>>2]=e;b:{if(!c){break b}c=Ea(e,4);H[a+68>>2]=c;if(!c){Ba(d,1,2235,0);return 0}if(!H[a+64>>2]){break b}d=b+8|0;c=0;while(1){Da(d,H[a+68>>2]+(c<<2)|0,4);d=d+4|0;c=c+1|0;if(c>>>0>2]){continue}break}}H[a+100>>2]=H[a+100>>2]|2;return 1}Ba(d,1,5955,0);return 0}function Wd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;e=na-16|0;na=e;H[e+12>>2]=c;a:{if(!(!Cc(a,0,b,e+12|0,d)|H[e+12>>2])){if(H[a+8>>2]==16){b=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{b=H[a+12>>2]}f=1;if(K[H[a+96>>2]+16>>2]<2){break a}c=H[b+5584>>2];g=c+28|0;d=c;b=1;while(1){H[d+1104>>2]=H[c+24>>2];H[d+1884>>2]=H[c+804>>2];B(d+1108|0,g,776);d=d+1080|0;b=b+1|0;if(b>>>0>2]+16>>2]){continue}break}break a}Ba(d,1,4591,0)}na=e+16|0;return f|0}function ac(a,b,c,d){var e=0,f=0,g=0;f=na-128|0;na=f;e=f;b=H[b+12>>2]+(c<<4)|0;c=H[b>>2];if(c){while(1){H[e>>2]=b;e=e+4|0;b=c;c=H[c>>2];if(c){continue}break}}while(1){c=H[b+8>>2];if((g|0)>(c|0)){H[b+8>>2]=g;c=g}a:{if((c|0)>=(d|0)){break a}while(1){if(H[b+4>>2]<=(c|0)){break a}b:{if(Qa(a,1)){H[b+4>>2]=c;break b}c=c+1|0}if((c|0)<(d|0)){continue}break}}H[b+8>>2]=c;if((e|0)!=(f|0)){e=e-4|0;b=H[e>>2];g=c;continue}break}na=f+128|0;return H[b+4>>2]<(d|0)}function Dd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;a:{if(!Va(H[a+8>>2],46,c)){break a}h=H[a+8>>2];d=H[h>>2];f=H[h+8>>2];b:{if(d){e=1;c:{if((d|0)!=1){j=d&1;d=d&-2;while(1){g=0;d:{if(!e){break d}g=0;if(!(ra[H[f>>2]](a,b,c)|0)){break d}g=(ra[H[f+4>>2]](a,b,c)|0)!=0}e=g;f=f+8|0;i=i+2|0;if((d|0)!=(i|0)){continue}break}if(!j){break c}}if(!e){e=0;break c}e=(ra[H[f>>2]](a,b,c)|0)!=0}Oa(h);if(!e){break a}break b}Oa(h)}k=1}return k|0}function Xd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;e=na-16|0;na=e;g=H[H[a+96>>2]+16>>2];f=g>>>0<257?1:2;a:{if((f+2|0)!=(c|0)){a=0;Ba(d,1,4285,0);break a}if(H[a+8>>2]==16){c=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{c=H[a+12>>2]}Da(b,e+12|0,f);a=1;b=b+f|0;Da(b,e+8|0,1);f=H[e+12>>2];if(f>>>0>=g>>>0){H[e+4>>2]=g;H[e>>2]=f;Ba(d,1,14923,e);a=0;break a}Da(b+1|0,(H[c+5584>>2]+N(f,1080)|0)+808|0,1)}na=e+16|0;return a|0}function ae(){var a=0,b=0,c=0;while(1){b=a<<4;c=b+26432|0;H[b+26436>>2]=c;H[b+26440>>2]=c;a=a+1|0;if((a|0)!=64){continue}break}sc(48);a=na-16|0;na=a;a:{if(la(a+12|0,a+8|0)|0){break a}b=ub((H[a+12>>2]<<2)+4|0);H[6870]=b;if(!b){break a}b=ub(H[a+8>>2]);if(b){c=H[6870];H[c+(H[a+12>>2]<<2)>>2]=0;if(!(ka(c|0,b|0)|0)){break a}}H[6870]=0}na=a+16|0;H[6885]=8192;H[6883]=94272;H[6877]=42;H[6884]=65536}function db(a,b,c){var d=0;if(!H[a+12>>2]){ra[b|0](c,H[a+36>>2]);return}d=Fa(8);a:{if(!d){break a}H[d+4>>2]=c;H[d>>2]=b;b=Fa(8);if(!b){Ca(d);return}H[b>>2]=d;c=N(H[a+4>>2],100);H[a+40>>2]=c;while(1){if((c|0)>2]){continue}break}H[b+4>>2]=H[a+20>>2];H[a+20>>2]=b;H[a+24>>2]=H[a+24>>2]+1;b=H[a+28>>2];if(!b){break a}H[H[b>>2]+8>>2]=0;H[a+28>>2]=H[b+4>>2];H[a+32>>2]=H[a+32>>2]-1;Ca(b)}}function La(a,b,c){var d=0,e=0,f=0;if(!(I[a|0]&32)){a:{d=H[a+16>>2];if(!d){if(uc(a)){break a}d=H[a+16>>2]}e=H[a+20>>2];if(d-e>>>0>>0){ra[H[a+36>>2]](a,b,c)|0;break a}b:{c:{if(!c|H[a+80>>2]<0){break c}d=c;while(1){f=b+d|0;if(I[f-1|0]!=10){d=d-1|0;if(d){continue}break c}break}if(ra[H[a+36>>2]](a,b,d)>>>0>>0){break a}c=c-d|0;e=H[a+20>>2];break b}f=b}$a(e,f,c);H[a+20>>2]=H[a+20>>2]+c}}}function Ec(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;H[a+184>>2]=b;d=H[a+96>>2];a:{if(!d){break a}f=H[d+24>>2];if(!f){break a}e=H[a+12>>2];if(!e|!H[e+5584>>2]){break a}e=H[d+16>>2];if(!e){return 1}d=0;while(1){if(K[(H[H[a+12>>2]+5584>>2]+N(d,1080)|0)+4>>2]<=b>>>0){Ba(c,1,9177,0);return 0}H[(N(d,52)+f|0)+40>>2]=b;g=1;d=d+1|0;if((e|0)!=(d|0)){continue}break}}return g|0}function xb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;if(a){c=H[a+4>>2];if(c){Ca(c);H[a+4>>2]=0}if(b){c=a;while(1){d=H[c+200>>2];if(d){e=0;f=H[c+196>>2];if(f){while(1){g=H[d+12>>2];if(g){Ca(g);H[d+12>>2]=0;f=H[c+196>>2]}d=d+16|0;e=e+1|0;if(e>>>0>>0){continue}break}d=H[c+200>>2]}Ca(d);H[c+200>>2]=0}c=c+240|0;h=h+1|0;if((h|0)!=(b|0)){continue}break}}Ca(a)}}function Yc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0;e=H[a+84>>2];f=H[e>>2];d=H[e+4>>2];h=H[a+28>>2];g=H[a+20>>2]-h|0;g=d>>>0>>0?d:g;if(g){$a(f,h,g);f=g+H[e>>2]|0;H[e>>2]=f;d=H[e+4>>2]-g|0;H[e+4>>2]=d}d=c>>>0>d>>>0?d:c;if(d){$a(f,b,d);f=d+H[e>>2]|0;H[e>>2]=f;H[e+4>>2]=H[e+4>>2]-d}F[f|0]=0;b=H[a+44>>2];H[a+28>>2]=b;H[a+20>>2]=b;return c|0}function ld(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0;e=H[c+8>>2];d=e>>>0<=1?1:e;f=H[c+4>>2];g=f-H[c>>2]|0;while(1){h=d;d=d<<1;if(h-g>>>0>>0){continue}break}if((e|0)!=(h|0)){d=Fa(h);if(!d){return-1}e=H[c>>2];if(e){if(g){B(d,e,g)}Ca(H[c>>2])}H[c+8>>2]=h;H[c>>2]=d;f=d+g|0;H[c+4>>2]=f}if(b){B(f,a,b)}H[c+4>>2]=H[c+4>>2]+b;return b|0}function Vb(a){H[a+100>>2]=20832;H[a+96>>2]=20832;H[a+92>>2]=20832;H[a+88>>2]=20832;H[a+84>>2]=20832;H[a+80>>2]=20832;H[a+76>>2]=20832;H[a+72>>2]=20832;H[a+68>>2]=20832;H[a+64>>2]=20832;H[a+60>>2]=20832;H[a+56>>2]=20832;H[a+52>>2]=20832;H[a+48>>2]=20832;H[a+44>>2]=20832;H[a+40>>2]=20832;H[a+36>>2]=20832;H[a+32>>2]=20832;H[a+28>>2]=20832}function Qa(a,b){var c=0,d=0,e=0,f=0;if((b|0)<=0){return 0}c=H[a+12>>2];d=H[a+16>>2];while(1){e=b;a:{if(d){break a}c=c<<8&65280;H[a+12>>2]=c;d=(c|0)==65280?7:8;H[a+16>>2]=d;b=H[a+8>>2];if(b>>>0>=K[a+4>>2]){break a}H[a+8>>2]=b+1;c=I[b|0]|c;H[a+12>>2]=c}d=d-1|0;H[a+16>>2]=d;b=e-1|0;f=(c>>>d&1)<>>0>1){continue}break}return f}function rd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;f=na-16|0;na=f;e=H[a+24>>2];if((e|0)!=255){H[f>>2]=e;Ba(d,2,2678,f)}a:{b:{if(H[a+20>>2]==(c|0)){if(c){break b}e=1;break a}e=0;Ba(d,1,14510,0);break a}c=0;while(1){e=1;Da(b,(H[a+72>>2]+N(c,12)|0)+8|0,1);b=b+1|0;c=c+1|0;if(c>>>0>2]){continue}break}}na=f+16|0;return e|0}function Da(a,b,c){var d=0,e=0;H[b>>2]=0;a:{if(!c){break a}d=c&3;b=b+c|0;if(c>>>0>=4){e=c&-4;c=0;while(1){F[b-1|0]=I[a|0];F[b-2|0]=I[a+1|0];F[b-3|0]=I[a+2|0];b=b-4|0;F[b|0]=I[a+3|0];a=a+4|0;c=c+4|0;if((e|0)!=(c|0)){continue}break}if(!d){break a}}c=0;while(1){b=b-1|0;F[b|0]=I[a|0];a=a+1|0;c=c+1|0;if((d|0)!=(c|0)){continue}break}}}function Pd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;e=na-16|0;na=e;a:{if(!c){Ba(d,1,4106,0);a=0;break a}Da(b,e+12|0,1);f=c-1|0;a=1;if(!f){break a}a=0;c=0;while(1){b=b+1|0;Da(b,e+8|0,1);g=H[e+8>>2];c=g<<24>>31&(g&127|c)<<7;a=a+1|0;if((f|0)!=(a|0)){continue}break}a=1;if(!c){break a}Ba(d,1,4106,0);a=0}na=e+16|0;return a|0}function Ab(a,b,c){var d=0,e=0,f=0,g=0,h=0;d=na-256|0;na=d;H[d>>2]=a;f=1;if((b|0)>=2){while(1){a:{g=H[d>>2];a=a-8|0;h=b-2|0;e=a-H[(h<<2)+c>>2]|0;if((Bc(g,e)|0)>=0){if((Bc(g,a)|0)>=0){break a}}g=e;e=(Bc(e,a)|0)>=0;a=e?g:a;H[((f&63)<<2)+d>>2]=a;f=f+1|0;b=e?b-1|0:h;if((b|0)>1){continue}}break}a=f&63}else{a=1}pc(d,a);na=d+256|0}function _b(a,b,c,d){var e=0,f=0,g=O(0),h=0,i=O(0),j=0,k=O(0);if(d){while(1){e=f<<2;h=e+b|0;i=L[h>>2];j=a+e|0;g=L[j>>2];e=c+e|0;k=L[e>>2];L[j>>2]=O(k*O(1.4019999504089355))+g;L[h>>2]=O(g+O(i*O(-.3441300094127655)))+O(k*O(-.714139997959137));L[e>>2]=g+O(i*O(1.7719999551773071));f=f+1|0;if((f|0)!=(d|0)){continue}break}}}function tc(a){var b=0;b=1;a:{if((a|0)>=1024){b=898846567431158e293;if(a>>>0<2047){a=a-1023|0;break a}b=Infinity;a=(a>>>0>=3069?3069:a)-2046|0;break a}if((a|0)>-1023){break a}b=2004168360008973e-307;if(a>>>0>4294965304){a=a+969|0;break a}b=0;a=(a>>>0<=4294964336?-2960:a)+1938|0}u(0,0);u(1,a+1023<<20);return b*+w()}function pc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;c=8;f=na-256|0;na=f;if(b>>>0>=2){h=(b<<2)+a|0;H[h>>2]=f;while(1){e=c>>>0>=256?256:c;$a(H[h>>2],H[a>>2],e);d=0;while(1){g=(d<<2)+a|0;d=d+1|0;$a(H[g>>2],H[(d<<2)+a>>2],e);H[g>>2]=H[g>>2]+e;if((b|0)!=(d|0)){continue}break}c=c-e|0;if(c){continue}break}}na=f+256|0}function _a(a,b,c){var d=0,e=0,f=0,g=0;if((b|0)==1|b>>>0>1){while(1){d=a;e=b;c=c-1|0;a=fe(a,b,10,0);b=qa;f=c,g=be(a,b,246)+d|48,F[f|0]=g;if(e>>>0>9){continue}break}}if(!b&a>>>0>=10|b){while(1){c=c-1|0;b=a;a=(b>>>0)/10|0;F[c|0]=b+N(a,246)|48;if(b>>>0>99){continue}break}}if(a){c=c-1|0;F[c|0]=a|48}return c}function Pc(a){a=a|0;var b=0,c=0,d=0,e=0;b=H[a+24>>2];if(b){c=H[a+28>>2];e=(c>>>0)/52|0;if(c>>>0>=52){while(1){c=H[b>>2];if(c){Ca(c-1|0);H[b>>2]=0}c=H[b+4>>2];if(c){Ca(c);H[b+4>>2]=0}c=H[b+8>>2];if(c){Ca(c);H[b+8>>2]=0}b=b+52|0;d=d+1|0;if((e|0)!=(d|0)){continue}break}b=H[a+24>>2]}Ca(b);H[a+24>>2]=0}}function Qc(a){a=a|0;var b=0,c=0,d=0,e=0;b=H[a+24>>2];if(b){c=H[a+28>>2];e=(c>>>0)/68|0;if(c>>>0>=68){while(1){c=H[b>>2];if(c){Ca(c);H[b>>2]=0}c=H[b+4>>2];if(c){Ca(c);H[b+4>>2]=0}Ca(H[b+60>>2]);H[b+60>>2]=0;b=b+68|0;d=d+1|0;if((e|0)!=(d|0)){continue}break}b=H[a+24>>2]}Ca(b);H[a+24>>2]=0}}function Vc(a,b){a=a|0;b=b|0;var c=0,d=0;c=H[a+32>>2];b=H[a+28>>2];d=b+8|0;if(c>>>0>=d>>>0){while(1){mb(a,H[a+24>>2]+(b<<2)|0,H[a+20>>2],8);c=H[a+32>>2];b=d;d=b+8|0;if(c>>>0>=d>>>0){continue}break}}if(b>>>0>>0){mb(a,H[a+24>>2]+(b<<2)|0,H[a+20>>2],c-b|0)}Ca(H[a>>2]);Ca(a)}function wd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=na-16|0;na=e;a:{if(H[a+100>>2]){Ba(d,1,11302,0);a=0;break a}if((c|0)!=4){Ba(d,1,5991,0);a=0;break a}Da(b,e+12|0,4);if(H[e+12>>2]!=218793738){Ba(d,1,5007,0);a=0;break a}H[a+100>>2]=H[a+100>>2]|1;a=1}na=e+16|0;return a|0}function Va(a,b,c){var d=0,e=0;a:{d=H[a>>2];e=H[a+4>>2];b:{if((d|0)!=(e|0)){e=H[a+8>>2];break b}d=e+10|0;H[a+4>>2]=d;e=Ga(H[a+8>>2],d<<2);if(!e){break a}H[a+8>>2]=e;d=H[a>>2]}H[(d<<2)+e>>2]=b;H[a>>2]=d+1;return 1}Ca(H[a+8>>2]);H[a>>2]=0;H[a+4>>2]=0;Ba(c,1,6123,0);return 0}function mc(a){var b=0,c=0,d=0,e=0,f=0;d=H[a>>2];b=F[d|0]-48|0;if(b>>>0>9){return 0}while(1){e=-1;if(c>>>0<=214748364){c=N(c,10);e=(c^2147483647)>>>0>>0?-1:c+b|0}b=d+1|0;H[a>>2]=b;f=F[d+1|0];c=e;d=b;b=f-48|0;if(b>>>0<10){continue}break}return c} +function kc(a,b){var c=0,d=0,e=0;x(+a);d=s(1)|0;e=s(0)|0;c=d>>>20&2047;if((c|0)!=2047){if(!c){if(a==0){c=0}else{a=kc(a*0x10000000000000000,b);c=H[b>>2]+-64|0}H[b>>2]=c;return a}H[b>>2]=c-1022;u(0,e|0);u(1,d&-2146435073|1071644672);a=+w()}return a}function Ta(a){var b=0,c=0,d=0;if(a){b=H[a+24>>2];if(b){c=H[a+16>>2];if(c){b=0;while(1){d=H[(H[a+24>>2]+N(b,52)|0)+44>>2];if(d){Ca(d);c=H[a+16>>2]}b=b+1|0;if(c>>>0>b>>>0){continue}break}b=H[a+24>>2]}Ca(b)}b=H[a+28>>2];if(b){Ca(b)}Ca(a)}}function Ka(a,b,c,d,e,f,g,h){var i=0,j=0;i=+O(e-a|0);e=~~(i*1.402)+c|0;H[f>>2]=(e|0)>=0?(b|0)>(e|0)?e:b:0;j=+O(d-a|0);a=c-~~(j*.344+i*.714)|0;H[g>>2]=(a|0)>=0?(a|0)<(b|0)?a:b:0;a=~~(j*1.772)+c|0;H[h>>2]=(a|0)>=0?(a|0)<(b|0)?a:b:0}function kd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;d=H[c+4>>2];e=H[c>>2]+H[c+8>>2]|0;if((d|0)==(e|0)){qa=-1;return-1}H[c+4>>2]=a+d;f=a;c=e-d|0;d=c;e=a>>>0>>0;a=c>>31;c=e&(a|0)>=(b|0)|(a|0)>(b|0);d=c?f:d;qa=c?b:a;return d|0}function ee(a,b,c,d){var e=0,f=0,g=0,h=0;f=b^d;g=f>>31;e=b>>31;a=a^e;h=a-e|0;e=(b^e)-((a>>>0>>0)+e|0)|0;a=d>>31;b=c^a;f=f>>31;a=fe(h,e,b-a|0,(a^d)-((a>>>0>b>>>0)+a|0)|0)^f;b=a-f|0;qa=(g^qa)-((a>>>0>>0)+g|0)|0;return b}function Ua(a){var b=0,c=0,d=0,e=0;if(a){b=H[a+20>>2];c=H[a+16>>2];if(N(b,c)){while(1){e=H[H[a+24>>2]+(d<<2)>>2];if(e){Ca(e);c=H[a+16>>2];b=H[a+20>>2]}d=d+1|0;if(d>>>0>>0){continue}break}}Ca(H[a+24>>2]);Ca(a)}}function $b(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0;if(d){while(1){e=f<<2;g=e+a|0;h=c+e|0;i=H[h>>2];j=b+e|0;k=H[j>>2];e=H[g>>2]-(i+k>>2)|0;H[g>>2]=e+i;H[j>>2]=e;H[h>>2]=e+k;f=f+1|0;if((f|0)!=(d|0)){continue}break}}}function ab(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;H[a+48>>2]=0;H[a+36>>2]=H[a+32>>2];e=ra[H[a+28>>2]](b,c,H[a>>2])|0;d=H[a+68>>2];if(!e){H[a+68>>2]=d|4;return 0}H[a+56>>2]=b;H[a+60>>2]=c;H[a+68>>2]=d&-5;return 1}function Na(a,b,c,d,e){var f=0;f=na-256|0;na=f;if(!(e&73728|(c|0)<=(d|0))){d=c-d|0;c=d>>>0<256;vc(f,b,c?d:256);if(!c){while(1){La(a,f,256);d=d-256|0;if(d>>>0>255){continue}break}}La(a,f,d)}na=f+256|0}function be(a,b,c){var d=0,e=0,f=0,g=0,h=0;e=c>>>16|0;d=a>>>16|0;h=N(e,d);f=c&65535;a=a&65535;g=N(f,a);d=(g>>>16|0)+N(d,f)|0;a=(d&65535)+N(a,e)|0;qa=h+N(b,c)+(d>>>16)+(a>>>16)|0;return g&65535|a<<16}function uc(a){var b=0;b=H[a+72>>2];H[a+72>>2]=b-1|b;b=H[a>>2];if(b&8){H[a>>2]=b|32;return-1}H[a+4>>2]=0;H[a+8>>2]=0;b=H[a+44>>2];H[a+28>>2]=b;H[a+20>>2]=b;H[a+16>>2]=b+H[a+48>>2];return 0}function ec(a){var b=0,c=0;a:{if(I[a+12|0]==255){H[a+12>>2]=65280;H[a+16>>2]=7;b=H[a+8>>2];c=0;if(b>>>0>=K[a+4>>2]){break a}H[a+8>>2]=b+1;H[a+12>>2]=I[b|0]|65280}H[a+16>>2]=0;c=1}return c}function md(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;e=H[c+4>>2];d=H[c>>2]+H[c+8>>2]|0;if((e|0)==(d|0)){return-1}d=d-e|0;b=b>>>0>d>>>0?d:b;if(b){B(a,e,b)}H[c+4>>2]=b+H[c+4>>2];return b|0}function Wc(a,b){a=a|0;b=b|0;b=H[a+28>>2];if(b>>>0>2]){while(1){Yb(a,H[a+24>>2]+(N(H[a+20>>2],b)<<2)|0);b=b+1|0;if(b>>>0>2]){continue}break}}Ca(H[a>>2]);Ca(a)}function rb(a,b){var c=0,d=0;a:{b:{if(b>>>0<=31){d=H[a>>2];c=H[a+4>>2];break b}c=H[a>>2];H[a+4>>2]=c;H[a>>2]=0;b=b-32|0;if(!b){break a}}H[a>>2]=d<>2]=c<>>32-b}}function Bc(a,b){a=a|0;b=b|0;var c=0,d=0;c=H[a>>2];d=H[b>>2];a=H[a+4>>2];b=H[b+4>>2];return(c>>>0>d>>>0&(a|0)>=(b|0)|(a|0)>(b|0))-(c>>>0>>0&(a|0)<=(b|0)|(a|0)<(b|0))|0}function tb(a,b){var c=0,d=0;c=H[a+4>>2];a:{b:{if(b>>>0<=31){d=c;c=H[a>>2];break b}H[a+4>>2]=0;H[a>>2]=c;b=b-32|0;if(!b){break a}}H[a+4>>2]=d>>>b;H[a>>2]=d<<32-b|c>>>b}}function dd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=na-16|0;na=e;a=rc(ea(H[a+60>>2],b|0,c|0,d&255,e+8|0)|0);na=e+16|0;qa=a?-1:H[e+12>>2];return(a?-1:H[e+8>>2])|0}function Hb(a,b){F[b+7|0]=I[a|0];F[b+6|0]=I[a+1|0];F[b+5|0]=I[a+2|0];F[b+4|0]=I[a+3|0];F[b+3|0]=I[a+4|0];F[b+2|0]=I[a+5|0];F[b+1|0]=I[a+6|0];F[b|0]=I[a+7|0]}function Pa(a){var b=0,c=0,d=0,e=0;b=H[a+12>>2];e=b;c=H[a+8>>2];if(!(b|c)){qa=0;return 0}d=H[a+56>>2];b=c-d|0;qa=e-(H[a+60>>2]+(c>>>0>>0)|0)|0;return b}function ic(a,b){var c=0;c=na-16|0;na=c;if(a){if(b&3){a=28}else{a=fb(b,a);H[c+12>>2]=a;a=a?0:48}a=a?0:H[c+12>>2]}else{a=0}na=c+16|0;return a}function Rc(a){a=a|0;var b=0;if(a){b=H[a+116>>2];if(b){Ca(b);H[a+116>>2]=0}b=H[a+120>>2];if(b){Ca(b);H[a+120>>2]=0}Ca(H[a+148>>2]);Ca(a)}} +function Md(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if(H[H[a+96>>2]+16>>2]<<2!=(c|0)){Ba(d,1,4464,0);a=0}else{a=1}return a|0}function gc(){var a=0,b=0;a=Ea(1,44);a:{if(a){H[a+16>>2]=0;b=Ea(1,8);H[a+36>>2]=b;if(b){break a}Ca(a)}a=0}return a}function Mb(a,b){a=a|0;b=b|0;if(!(!a|!b)){H[a+188>>2]=H[b+4>>2];H[a+184>>2]=H[b>>2];H[a+248>>2]=H[b+8248>>2]&2}}function pb(){var a=0,b=0;a=Ea(1,12);if(a){H[a+4>>2]=10;b=Ea(10,4);H[a+8>>2]=b;if(b){return a}Ca(a)}return 0}function Ad(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;D()}function eb(a){var b=0;if(a){b=H[a+4>>2];if(b){ra[b|0](H[a>>2])}Ca(H[a+32>>2]);H[a+32>>2]=0;Ca(a)}}function Lb(a,b){a=a|0;b=b|0;a:{if(!a){break a}H[a+208>>2]=b;if(!b){break a}F[a+92|0]=I[a+92|0]|8}}function jd(a,b,c){a=a|0;b=b|0;c=c|0;b=H[c+8>>2];H[c+4>>2]=H[c>>2]+(a>>>0>b>>>0?b:a);return 1}function Qd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if(c){a=1}else{Ba(d,1,4375,0);a=0}return a|0}function jc(a,b){if(!((b&-128)==57216|b>>>0<=127)){H[6605]=25;return-1}F[a|0]=b;return 1}function jb(a){H[a+16>>2]=0;H[a+20>>2]=0;H[a+8>>2]=0;H[a+12>>2]=0;H[a>>2]=0;H[a+4>>2]=0}function Ra(a){if(H[a+12>>2]){H[a+40>>2]=0;while(1){if(H[a+24>>2]>0){continue}break}}}function Nc(a,b,c){a=a|0;b=b|0;c=c|0;return!H[a+8>>2]&(H[a+216>>2]!=0&H[a+220>>2]!=0)}function Fc(a,b){F[b+3|0]=I[a|0];F[b+2|0]=I[a+1|0];F[b+1|0]=I[a+2|0];F[b|0]=I[a+3|0]}function gb(a){if(a){ra[H[(H[a+76>>2]?20:16)+a>>2]](H[a+48>>2]);H[a+48>>2]=0;Ca(a)}}function Fd(a,b){a=a|0;b=b|0;Mb(H[a>>2],b);F[a+124|0]=0;H[a+128>>2]=H[b+8248>>2]&1}function Ea(a,b){if(!a|!b){a=0}else{b=N(a,b);a=fb(8,b);if(a){vc(a,0,b)}}return a}function Bb(a,b){var c=0;c=na-16|0;na=c;H[c+12>>2]=b;oc(26104,a,b,0,0);na=c+16|0}function qc(a,b){if((a|0)!=1){return de(a-1|0)}if(!b){return 0}return de(b)|32}function he(a){var b=0;while(1){if(a){a=a-1&a;b=b+1|0;continue}break}return b} +function Za(a){var b=0;if(a){b=H[a+12>>2];if(b){Ca(b);H[a+12>>2]=0}Ca(a)}}function Kc(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;D()}function yd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Ib(H[a>>2],b,c,d)|0}function zd(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;D()}function Nb(a){return H[a+12>>2]==H[a+4>>2]|H[a+8>>2]==H[a>>2]}function xd(a,b,c){a=a|0;b=b|0;c=c|0;return Ec(H[a>>2],b,c)|0}function ob(a){var b=0;if(a){b=H[a+8>>2];if(b){Ca(b)}Ca(a)}}function $c(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;qa=0;return 0}function Ya(a,b,c,d,e,f,g,h){return Zb(a,b,c,d,e,f,g,h,0)}function Gc(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;D()}function hc(a,b,c,d){return ra[H[a+44>>2]](a,b,c,d)|0}function Wa(a,b,c){H[((b<<2)+a|0)+28>>2]=(c<<5)+20832}function Eb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return 1}function qb(a,b,c){return ra[H[a+40>>2]](a,b,0,c)|0}function de(a){if(a){return 31-Q(a-1^a)|0}return 32}function Kd(a,b,c){a=a|0;b=b|0;c=c|0;qa=-1;return-1}function Ha(a,b,c,d,e,f,g,h){Zb(a,b,c,d,e,f,g,h,1)}function rc(a){if(!a){return 0}H[6605]=a;return-1}function ge(a,b,c){ce(a,0,b,c);qa=pa;return oa}function yc(a,b,c){a=a|0;b=b|0;c=c|0;return-1}function Ud(a,b,c){a=a|0;b=b|0;c=c|0;return 0}function Kb(a,b,c){a=a|0;b=b|0;c=c|0;return 1}function fe(a,b,c,d){a=ce(a,b,c,d);return a}function Fa(a){if(!a){return 0}return ub(a)}function Ed(a,b){a=a|0;b=b|0;Lb(H[a>>2],b)}function fc(a){return H[a+8>>2]-H[a>>2]|0}function ad(a){a=a|0;ia();ha(a+128|0);D()}function Jc(a,b,c){a=a|0;b=b|0;c=c|0;D()}function ub(a){a=a|0;return fb(8,a)|0}function zb(a){return H[a+28>>2]!=2}function fd(a,b){a=a|0;b=b|0;_(a|0)}function ed(a,b){a=a|0;b=b|0;Y(a|0)}function vc(a,b,c){if(c){y(a,b,c)}}function $a(a,b,c){if(c){B(a,b,c)}}function Oc(a,b){a=a|0;b=b|0;D()}function nb(a){return ic(a,32)}function Ia(a){return ic(a,16)}function bd(a){a=a|0;ja();D()}function Db(){return Ea(1,36)}function Pb(a,b){a=a|0;b=b|0}function cb(a){if(a){Ca(a)}}function Oa(a){H[a>>2]=0}function Ic(a){a=a|0;D()} +// EMSCRIPTEN_END_FUNCS +a=I;m(n);var ra=[null,Pb,Ud,Kd,yc,yc,ab,qd,id,hd,Wc,Vc,Uc,Tc,Sc,Rc,Qc,Pc,Kb,Nc,Mc,Lc,Hc,Bc,$d,_d,Zd,Yd,Xd,Wd,Vd,Td,Sd,Rd,Qd,Pd,Od,Nd,Md,Eb,Ld,Jd,Eb,Eb,Id,Hd,Cd,wd,vd,ud,td,sd,rd,pd,od,nd,md,ld,kd,jd,Ic,Ic,Jc,Kb,Fb,Lb,Mb,vb,Jb,Oc,Ib,Ec,Gc,Kc,hb,bb,Ic,Ic,Jc,Dd,Gd,Oc,yd,xd,Gc,Kc,Ed,Fd,xc,zd,Ad,Bd,Pb,fd,ed,_c,Zc,Yc,ad,bd,Ic,cd,dd,Ic,$c];function sa(){return E.byteLength>>16}function xa(ya){ya=ya|0;var ta=sa()|0;var ua=ta+ya|0;if(ta{instantiateWasm(info,inst=>resolve(receiveInstance(inst)))})}wasmBinaryFile??=findWasmBinary();var result=instantiateSync(wasmBinaryFile,info);return receiveInstance(result[0])}class ExitStatus{name="ExitStatus";constructor(status){this.message=`Program terminated with exit(${status})`;this.status=status}}var HEAP8;var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var onPostRuns=[];var onPreRuns=[];var noExitRuntime=true;var __abort_js=()=>abort("");var runtimeKeepaliveCounter=0;var __emscripten_runtime_keepalive_clear=()=>{noExitRuntime=false;runtimeKeepaliveCounter=0};var timers={};var handleException=e=>{if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)};var keepRuntimeAlive=()=>noExitRuntime||runtimeKeepaliveCounter>0;var _proc_exit=code=>{EXITSTATUS=code;if(!keepRuntimeAlive()){Module["onExit"]?.(code);ABORT=true}quit_(code,new ExitStatus(code))};var exitJS=(status,implicit)=>{EXITSTATUS=status;_proc_exit(status)};var _exit=exitJS;var maybeExit=()=>{if(!keepRuntimeAlive()){try{_exit(EXITSTATUS)}catch(e){handleException(e)}}};var callUserCallback=func=>{if(ABORT){return}try{return func()}catch(e){handleException(e)}finally{maybeExit()}};var _emscripten_get_now=()=>performance.now();var __setitimer_js=(which,timeout_ms)=>{if(timers[which]){clearTimeout(timers[which].id);delete timers[which]}if(!timeout_ms)return 0;var id=setTimeout(()=>{delete timers[which];callUserCallback(()=>__emscripten_timeout(which,_emscripten_get_now()))},timeout_ms);timers[which]={id,timeout_ms};return 0};var HEAP32;function _copy_pixels_1(compG_ptr,nb_pixels){compG_ptr>>=2;const imageData=Module.imageData=new Uint8ClampedArray(nb_pixels);const compG=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=HEAP32.subarray(compR_ptr,compR_ptr+nb_pixels);const compG=HEAP32.subarray(compG_ptr,compG_ptr+nb_pixels);const compB=HEAP32.subarray(compB_ptr,compB_ptr+nb_pixels);for(let i=0;i>=2;compG_ptr>>=2;compB_ptr>>=2;compA_ptr>>=2;const imageData=Module.imageData=new Uint8ClampedArray(nb_pixels*4);const compR=HEAP32.subarray(compR_ptr,compR_ptr+nb_pixels);const compG=HEAP32.subarray(compG_ptr,compG_ptr+nb_pixels);const compB=HEAP32.subarray(compB_ptr,compB_ptr+nb_pixels);const compA=HEAP32.subarray(compA_ptr,compA_ptr+nb_pixels);for(let i=0;i2147483648;var alignMemory=(size,alignment)=>Math.ceil(size/alignment)*alignment;var growMemory=size=>{var oldHeapSize=wasmMemory.buffer.byteLength;var pages=(size-oldHeapSize+65535)/65536|0;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var HEAPU8;var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignMemory(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};var ENV={};var getExecutableName=()=>thisProgram;var getEnvStrings=()=>{if(!getEnvStrings.strings){var lang=(globalThis.navigator?.language??"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 stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63;i++}}heap[outIdx]=0;return outIdx-startIdx};var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);var HEAPU32;var _environ_get=(__environ,environ_buf)=>{var bufSize=0;var envp=0;for(var string of getEnvStrings()){var ptr=environ_buf+bufSize;HEAPU32[__environ+envp>>2]=ptr;bufSize+=stringToUTF8(string,ptr,Infinity)+1;envp+=4}return 0};var lengthBytesUTF8=str=>{var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var _environ_sizes_get=(penviron_count,penviron_buf_size)=>{var strings=getEnvStrings();HEAPU32[penviron_count>>2]=strings.length;var bufSize=0;for(var string of strings){bufSize+=lengthBytesUTF8(string)+1}HEAPU32[penviron_buf_size>>2]=bufSize;return 0};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=new TextDecoder;var findStringEnd=(heapOrArray,idx,maxBytesToRead,ignoreNul)=>{var maxIdx=idx+maxBytesToRead;if(ignoreNul)return maxIdx;while(heapOrArray[idx]&&!(idx>=maxIdx))++idx;return idx};var UTF8ArrayToString=(heapOrArray,idx=0,maxBytesToRead,ignoreNul)=>{var endPtr=findStringEnd(heapOrArray,idx,maxBytesToRead,ignoreNul);return UTF8Decoder.decode(heapOrArray.buffer?heapOrArray.subarray(idx,endPtr):new Uint8Array(heapOrArray.slice(idx,endPtr)))};var printChar=(stream,curr)=>{var buffer=printCharBuffers[stream];if(!curr||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer));buffer.length=0}else{buffer.push(curr)}};var UTF8ToString=(ptr,maxBytesToRead,ignoreNul)=>{if(!ptr)return"";var end=findStringEnd(HEAPU8,ptr,maxBytesToRead,ignoreNul);return UTF8Decoder.decode(HEAPU8.subarray(ptr,end))};var _fd_write=(fd,iov,iovcnt,pnum)=>{var num=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;for(var j=0;j>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=HEAP32.subarray(compG_ptr,compG_ptr+nb_pixels);for(let i=0;i>=2;compA_ptr>>=2;const imageData=Module.imageData=new Uint8ClampedArray(nb_pixels*4);const compG=HEAP32.subarray(compG_ptr,compG_ptr+nb_pixels);const compA=HEAP32.subarray(compA_ptr,compA_ptr+nb_pixels);for(let i=0;i>=2;compG_ptr>>=2;compB_ptr>>=2;const imageData=Module.imageData=new Uint8ClampedArray(nb_pixels*4);const compR=HEAP32.subarray(compR_ptr,compR_ptr+nb_pixels);const compG=HEAP32.subarray(compG_ptr,compG_ptr+nb_pixels);const compB=HEAP32.subarray(compB_ptr,compB_ptr+nb_pixels);for(let i=0;i{HEAP8.set(array,buffer)};{if(Module["noExitRuntime"])noExitRuntime=Module["noExitRuntime"];if(Module["print"])out=Module["print"];if(Module["printErr"])err=Module["printErr"];if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];if(Module["arguments"])programArgs=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];var preInit=Module["preInit"];if(preInit){if(typeof preInit=="function")Module["preInit"]=preInit=[preInit];while(preInit.length>0){preInit.shift()()}}}Module["writeArrayToMemory"]=writeArrayToMemory;var _malloc,_free,_jp2_decode,__emscripten_timeout,dynCall_iji,dynCall_jji,dynCall_iiji,dynCall_jiji,memory,__indirect_function_table,wasmMemory;function assignWasmExports(wasmExports){_malloc=Module["_malloc"]=wasmExports["t"];_free=Module["_free"]=wasmExports["u"];_jp2_decode=Module["_jp2_decode"]=wasmExports["v"];__emscripten_timeout=wasmExports["w"];dynCall_iji=wasmExports["dynCall_iji"];dynCall_jji=wasmExports["dynCall_jji"];dynCall_iiji=wasmExports["dynCall_iiji"];dynCall_jiji=wasmExports["dynCall_jiji"];memory=wasmMemory=wasmExports["r"];__indirect_function_table=wasmExports["__indirect_function_table"]}var wasmImports={n:__abort_js,m:__emscripten_runtime_keepalive_clear,j:__setitimer_js,f:_copy_pixels_1,e:_copy_pixels_3,d:_copy_pixels_4,k:_emscripten_resize_heap,o:_environ_get,p:_environ_sizes_get,i:_fd_seek,b:_fd_write,q:_gray_to_rgba,h:_graya_to_rgba,c:_jsPrintWarning,l:_proc_exit,g:_rgb_to_rgba,a:_storeErrorMessage};async function run(){preRun();var setStatus=Module["setStatus"];if(setStatus){setStatus("Running...");await new Promise(resolve=>setTimeout(resolve,1));setTimeout(setStatus,1,"")}if(ABORT)return;initRuntime();Module["onRuntimeInitialized"]?.();postRun()}var wasmExports;wasmExports=createWasm();await run(); +;return Module}export default OpenJPEG; diff --git a/public/assets/vendor/pdfjs-6.4.299/web/wasm/qcms_bg.wasm b/public/assets/vendor/pdfjs-6.4.299/web/wasm/qcms_bg.wasm new file mode 100644 index 0000000000000000000000000000000000000000..ea1d07bc4439d034d5a188bb78ef317c33f56787 GIT binary patch literal 96589 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 z∨f%aSYCs&#AoC$2+=YF-I0-H`1c$H8Kzd8N7NLe?C{G&konthJqE$EJV647azf zTsuB?LvzPUv&yuuG=xnmvIvf^0Egy8IPX4!dv%fjC~m1dfqu#r^DF6Hte?y7?Y0?(M_xC0KX40=LDz629F?_8h{~F#b0vzt}JMi~alYi-&~iKUCuXNZ=3g{DX1N>mYsTzZ<{$KlI;I68{PO z%|-El5X6V{8?Q$d9?i1!Ts%*FK)mEEeuiI)Uz*=Ce#`mkuackgYEG(r!LW*-a8)9J z;)Hi=_^suqzc7zPXYoLdTN^*&SI8sPwoZOs{8Zkx&;9Var=rjO@v~nTANg7T7nXm! z;^;d^`Z+M(^_rz43AzX!nzX?-1B~ln51$)1%RR- zFO~m-LjL}Jr^)|0@{7N^6}AZ}H?+>`6twJ~z%s}C4bm*+r@qi%*as4UeXEGzlF6~` zoPO&eE+}^=Bu4yidj{Q&3Z(+6VN?lRi17*PxQIMz&pRso!y;1ooHOTTD#i1+PgZsI=i~My1RP1)_1pb zw|2L6w|94RcXoGmcX#)6ukUH;Y3*t2Y47Ri>Fnw1>F(+2S-&0-*Hb-e4hmXNqV?7wXbVh z;9a-@^HL?U5^~%duNu#e4NeYZvJ=tD5tMk7sIemPw;*+RHAG3-l^I;KeSfUXYOT&} zUAw+}Z7Wv;hT1E`cyz64>0Z;?v9kOIS~59Nj@qGXZAVS9DxxA#MR>dG(LV0TTk<6MMBV*h9M{a=await fetch(a,{credentials:"same-origin"});if(a.ok)return a.arrayBuffer();throw Error(a.status+" : "+a.url);};var q=console.error.bind(console),r,t=!1,u,v,w,x=!1;function y(){var a=z.buffer;A=new Int8Array(a);new Int16Array(a);B=new Uint8Array(a);new Uint16Array(a);C=new Int32Array(a);D=new Uint32Array(a);new Float32Array(a);new Float64Array(a);new BigInt64Array(a);new BigUint64Array(a)} +function E(a){e.onAbort?.(a);a=`Aborted(${a})`;q(a);t=!0;a=new WebAssembly.RuntimeError(a+". Build with -sASSERTIONS for more info.");w?.(a);throw a;}var F;async function ba(a){if(!r)try{var b=await m(a);return new Uint8Array(b)}catch{}if(a==F&&r)a=new Uint8Array(r);else throw"both async and sync fetching of the wasm failed";return a}async function ca(a,b){try{var c=await ba(a);return await WebAssembly.instantiate(c,b)}catch(d){q(`failed to asynchronously prepare wasm: ${d}`),E(d)}} +async function da(a){var b=F;if(!r)try{var c=fetch(b,{credentials:"same-origin"});return await WebAssembly.instantiateStreaming(c,a)}catch(d){q(`wasm streaming compile failed: ${d}`),q("falling back to ArrayBuffer instantiation")}return ca(b,a)}class G{name="ExitStatus";constructor(a){this.message=`Program terminated with exit(${a})`;this.status=a}} +var C,A,D,B,H=a=>{for(;a.length>0;)a.shift()(e)},I=[],J=[],ea=()=>{var a=e.preRun.shift();J.push(a)},K=!0,L=0,fa=[0,31,60,91,121,152,182,213,244,274,305,335],ha=[0,31,59,90,120,151,181,212,243,273,304,334],M={},N=a=>{if(!(a instanceof G||a=="unwind"))throw a;},O=a=>{u=a;K||L>0||(e.onExit?.(a),t=!0);throw new G(a);},ia=a=>{if(!t)try{a()}catch(b){N(b)}finally{if(!(K||L>0))try{u=a=u,O(a)}catch(b){N(b)}}},P=(a,b,c)=>{var d=B;if(c>0){c=b+c-1;for(var g=0;g= +c)break;d[b++]=f}else if(f<=2047){if(b+1>=c)break;d[b++]=192|f>>6;d[b++]=128|f&63}else if(f<=65535){if(b+2>=c)break;d[b++]=224|f>>12;d[b++]=128|f>>6&63;d[b++]=128|f&63}else{if(b+3>=c)break;d[b++]=240|f>>18;d[b++]=128|f>>12&63;d[b++]=128|f>>6&63;d[b++]=128|f&63;g++}}d[b]=0}},ja=new TextDecoder,Q=a=>{if(a){for(var b=a,c=B,d=b+void 0;c[b]&&!(b>=d);)++b;a=ja.decode(B.subarray(a,b))}else a="";return a},R=a=>{for(var b=0,c=0;c=55296&&d<=57343? +(b+=4,++c):b+=3}return b},T=a=>{var b=R(a)+1,c=S(b);c&&P(a,c,b);return c};function U(){}var la=(a,b,c,d)=>{var g={string:k=>{var n=0;if(k!==null&&k!==void 0&&k!==0){n=R(k)+1;var X=V(n);P(k,X,n);n=X}return n},array:k=>{var n=V(k.length);A.set(k,n);return n}};a=e["_"+a];var f=[],p=0;if(d)for(var l=0;l{a=Q(a);b=b!==null?JSON.parse(Q(b)):[];try{let d=e.externalCall(a,b);return d?T(d):null}catch(d){return e.HEAPU8[c]=1,T(d.message)}};e.noExitRuntime&&(K=e.noExitRuntime);e.printErr&&(q=e.printErr);e.wasmBinary&&(r=e.wasmBinary);if(e.preInit)for(typeof e.preInit=="function"&&(e.preInit=[e.preInit]);e.preInit.length>0;)e.preInit.shift()();e.ccall=la;e.cwrap=(a,b,c,d)=>{var g=!c||c.every(f=>f==="number"||f==="boolean");return b!=="string"&&g&&!d?e["_"+a]:(...f)=>la(a,b,c,f,d)}; +e.stringToNewUTF8=T; +var S,ma,ka,V,W,z,na={e:()=>E(""),a:()=>{K=!1;L=0},b:function(a,b){a=a<-9007199254740992||a>9007199254740992?NaN:Number(a);a=new Date(a*1E3);C[b>>2]=a.getSeconds();C[b+4>>2]=a.getMinutes();C[b+8>>2]=a.getHours();C[b+12>>2]=a.getDate();C[b+16>>2]=a.getMonth();C[b+20>>2]=a.getFullYear()-1900;C[b+24>>2]=a.getDay();var c=a.getFullYear();C[b+28>>2]=(c%4!==0||c%100===0&&c%400!==0?ha:fa)[a.getMonth()]+a.getDate()-1|0;C[b+36>>2]=-(a.getTimezoneOffset()*60);c=(new Date(a.getFullYear(),6,1)).getTimezoneOffset(); +var d=(new Date(a.getFullYear(),0,1)).getTimezoneOffset();C[b+32>>2]=(c!=d&&a.getTimezoneOffset()==Math.min(d,c))|0},i:(a,b)=>{M[a]&&(clearTimeout(M[a].id),delete M[a]);if(!b)return 0;var c=setTimeout(()=>{delete M[a];ia(()=>ma(a,performance.now()))},b);M[a]={id:c,A:b};return 0},c:(a,b,c,d)=>{var g=(new Date).getFullYear(),f=(new Date(g,0,1)).getTimezoneOffset();g=(new Date(g,6,1)).getTimezoneOffset();D[a>>2]=Math.max(f,g)*60;C[b>>2]=Number(f!=g);b=p=>{var l=Math.abs(p);return`UTC${p>=0?"-":"+"}${String(Math.floor(l/ +60)).padStart(2,"0")}${String(l%60).padStart(2,"0")}`};a=b(f);b=b(g);gDate.now(),j:a=>{var b=B.length;a>>>=0;if(a>2147483648)return!1;for(var c=1;c<=4;c*=2){var d=b*(1+.2/c);d=Math.min(d,a+100663296);a:{d=(Math.min(2147483648,Math.ceil(Math.max(a,d)/65536)*65536)-z.buffer.byteLength+65535)/65536|0;try{z.grow(d);y();var g=1; +break a}catch(f){}g=void 0}if(g)return!0}return!1},m:function(a){a=Q(a);window.console.log(a)},h:function(a){a=Q(a);return Date.parse(a)},l:function(a,b,c,d){a=Q(a);b=Q(b);c=Q(c);c=`Quickjs -- ${a}: ${b}\n${c}`;d!==0?window.alert(c):window.console.error(c)},k:O},Z; +Z=await (async function(){function a(c){c=Z=c.exports;e._evalInSandbox=c.p;e._nukeSandbox=c.q;e._init=c.r;e._commFun=c.s;e._dumpMemoryUse=c.t;S=c.u;e._free=c.v;ma=c.w;ka=c.x;V=c.y;W=c.z;z=c.n;y();return Z}var b={a:na};if(e.instantiateWasm)return new Promise(c=>{e.instantiateWasm(b,(d,g)=>{c(a(d,g))})});F??=e.locateFile?e.locateFile?e.locateFile("quickjs-eval.wasm",h):h+"quickjs-eval.wasm":(new URL("quickjs-eval.wasm",import.meta.url)).href;return function(c){return a(c.instance)}(await da(b))}()); +(function(){function a(){e.calledRun=!0;if(!t){x=!0;Z.o();v?.(e);e.onRuntimeInitialized?.();if(e.postRun)for(typeof e.postRun=="function"&&(e.postRun=[e.postRun]);e.postRun.length;){var b=e.postRun.shift();I.push(b)}H(I)}}if(e.preRun)for(typeof e.preRun=="function"&&(e.preRun=[e.preRun]);e.preRun.length;)ea();H(J);e.setStatus?(e.setStatus("Running..."),setTimeout(()=>{setTimeout(()=>e.setStatus(""),1);a()},1)):a()})();x?moduleRtn=e:moduleRtn=new Promise((a,b)=>{v=a;w=b}); +;return moduleRtn}export default QuickJS; diff --git a/public/assets/vendor/pdfjs-6.4.299/web/wasm/quickjs-eval.wasm b/public/assets/vendor/pdfjs-6.4.299/web/wasm/quickjs-eval.wasm new file mode 100644 index 0000000000000000000000000000000000000000..42980e94aa4d7359e4113c968c67800b45462764 GIT binary patch literal 469105 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 Q@rd*O{#RJV6I4S z1S~j4tOTmNy9!iJcdCfLpg{rZG)d?F6t63s&rm{is&h56`WUMcL$_O?#<1!)0+{8y zJyOh1(Go-}ydSw8Onb##4f|?|UHLBz?@|tDQVR(Q@k(+gg~LaJ34?D~1aOpahr=C# zoWkKB0e2+a^Z^TUlb_B%JWOg8E|FoaxH}9s0}fa2gEI1akWGJ-4@5d%29zU;v5t|F z6pOSic$pADHu7l8jl|j_@3y>*;i#`9T^%WfT^$+5t`>DbUWmZmJZ~zW;unGVVH6*2 z!o!sNQ@vpzv_?jSNgcz&CD>sdqr$^GB6S?HgMrPYHgLnhrtLc=} zzN7l0Z^9zrueLY!D>vdkA`jIq!q5%PxRF@1M&W3GPDex||2GUTH@`uM0o2aM$iMbEeu`sOA3)Jm@kkht|w#bOC)Aaie>UrED$gJ9LZi>IUK?K3T;$b zGcqA^<>cD$%X8#AT?Mmn7|}O-&fLOz;5|pAnD!|?C!RA%_1SK-Wu@l&#=7k(kbW&S zN2Qn>CR&|iZ5dPWhK~aG6l>u`pL3$mVe#dp*b1g)dZ)T(kA^H}If*+6H3XvcK3Eo43 z5yW}WIy2&+T$Sfn`=G2H ziyYCFef-=_?DL4**b6ULu)Sw4vck0mQtyJ)unnzGg}?Mrr>OkO51S8d`CIJf6>oL= zVDqcJ1E$TRR%1a;WuYb>Brx^Sb{NA|q3|8RpY;115cm8-{cysy@U6H|au1Cz6$8&-eId7sAP}U2T=}v}9~Qe3l_UVy

lsQFXAbQRweO8*#e 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 Z>(#qsyBR()DLEw-A6o^5M&_H!{(rnBRdN6T literal 0 HcmV?d00001 diff --git a/storage/plugins/digital-library/README.md b/storage/plugins/digital-library/README.md index ee120fc48..0c3e9dbc1 100644 --- a/storage/plugins/digital-library/README.md +++ b/storage/plugins/digital-library/README.md @@ -103,6 +103,7 @@ Una volta caricati i contenuti: #### Nella Scheda Libro - **Bottone "Leggi PDF"**: Apre un lightbox a tutto schermo, adattato a telefono e tablet, con chiusura tramite pulsante o Esc. La chiusura restituisce il focus al pulsante di lettura. +- **Lettore chiaro self-hosted**: PDF.js, worker, font, WASM e traduzioni sono inclusi nella distribuzione e serviti dal dominio della biblioteca, senza CDN. I PDF dello stesso dominio usano questo lettore; quelli esterni mantengono il lettore del browser, senza proxy né modifiche ai controlli di origine. - **Link "Apri in una nuova scheda"**: Consente di usare il lettore del browser in una scheda separata. - **Bottone "Scarica eBook"**: Download diretto del file PDF/ePub - **Bottone "Ascolta Audiobook"**: Apre il player audio diff --git a/storage/plugins/digital-library/assets/css/digital-library.css b/storage/plugins/digital-library/assets/css/digital-library.css index cf7651821..7aabb8c15 100644 --- a/storage/plugins/digital-library/assets/css/digital-library.css +++ b/storage/plugins/digital-library/assets/css/digital-library.css @@ -352,9 +352,15 @@ dialog.digital-pdf-lightbox::backdrop { } .digital-pdf-lightbox__action:hover { background: var(--pk-accent-soft, #fdeaf2); } .digital-pdf-lightbox__action:focus-visible { outline: 2px solid var(--pk-accent, #d70161); outline-offset: 2px; } -.digital-pdf-lightbox__frame { flex: 1; min-height: 0; width: calc(100% - 24px); margin: 12px 12px max(12px, env(safe-area-inset-bottom)); border: 0; border-radius: 8px; background: rgba(250, 248, 249, .8); } +.digital-pdf-lightbox__frame { + flex: 1; min-height: 0; align-self: center; + width: calc(100% - clamp(32px, 8vw, 144px)); max-width: 1280px; + margin: 20px 0 max(20px, env(safe-area-inset-bottom)); + border: 1px solid var(--pk-line, #ece8ea); border-radius: 12px; + background: rgba(250, 248, 249, .8); +} @media (max-width: 600px) { - .digital-pdf-lightbox__frame { width: calc(100% - 16px); margin: 8px 8px max(8px, env(safe-area-inset-bottom)); border-radius: 6px; } + .digital-pdf-lightbox__frame { width: calc(100% - 24px); margin: 12px 0 max(12px, env(safe-area-inset-bottom)); border-radius: 8px; } .digital-pdf-lightbox__toolbar { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 4px 8px; } .digital-pdf-lightbox__toolbar h2 { grid-column: 1; grid-row: 1; } .digital-pdf-lightbox__toolbar a { grid-column: 1; grid-row: 2; justify-self: start; padding: 4px 0; border: 0; background: transparent; } diff --git a/storage/plugins/digital-library/views/frontend-pdf-lightbox.php b/storage/plugins/digital-library/views/frontend-pdf-lightbox.php index ebca038d6..553d48b54 100644 --- a/storage/plugins/digital-library/views/frontend-pdf-lightbox.php +++ b/storage/plugins/digital-library/views/frontend-pdf-lightbox.php @@ -3,6 +3,7 @@ $escapedViewerId = \App\Support\HtmlHelper::e($viewerId); $escapedPdfHref = \App\Support\HtmlHelper::e($pdfHref); $escapedPdfLabel = \App\Support\HtmlHelper::e($pdfLabel); +$escapedReaderHref = \App\Support\HtmlHelper::e(url('/assets/vendor/pdfjs-6.4.299/web/viewer.html')); ?> - + diff --git a/storage/plugins/digital-library/views/frontend-pdf-script.php b/storage/plugins/digital-library/views/frontend-pdf-script.php index 3bcd049cc..f09b645c1 100644 --- a/storage/plugins/digital-library/views/frontend-pdf-script.php +++ b/storage/plugins/digital-library/views/frontend-pdf-script.php @@ -9,6 +9,35 @@ }); if (window.digitalPdfLightboxBound) return; window.digitalPdfLightboxBound = true; + // PDF.js dispatches this before initialization; scope the configuration to + // our frames and keep its origin validation and document loading intact. + document.addEventListener('webviewerloaded', function (event) { + var source = event.detail && event.detail.source; + var frame = Array.from(document.querySelectorAll('.digital-pdf-lightbox__frame')).find(function (candidate) { + return candidate.contentWindow === source; + }); + if (!frame || !source.PDFViewerApplicationOptions) return; + var options = source.PDFViewerApplicationOptions; + options.set('disablePreferences', true); + options.set('viewerCssTheme', 1); + options.set('defaultZoomValue', 'auto'); + options.set('sidebarViewOnLoad', 0); + options.set('enableScripting', false); + options.set('enableAltTextModelDownload', false); + options.set('enableGuessAltText', false); + options.set('annotationEditorMode', -1); + source.document.addEventListener('keydown', function (keyEvent) { + if (keyEvent.key !== 'Escape') return; + var findbar = source.document.getElementById('findbar'); + var searchWasOpen = findbar && !findbar.classList.contains('hidden'); + // Let the reader close its search/menu first, if it consumes Esc. + queueMicrotask(function () { + if (searchWasOpen || keyEvent.defaultPrevented || source.document.querySelector('dialog[open]')) return; + var dialog = frame.closest('dialog'); + if (dialog && dialog.open) dialog.close(); + }); + }); + }); function openViewer(toggle, event) { var viewer = document.getElementById(toggle.getAttribute('aria-controls')); if (!viewer || !viewer.matches('dialog.digital-pdf-lightbox')) return; @@ -24,7 +53,18 @@ function openViewer(toggle, event) { toggle.setAttribute('aria-expanded', 'true'); var frame = viewer.querySelector('iframe'); var src = frame.getAttribute('data-src'); - frame.setAttribute('src', src + (src.indexOf('#') === -1 ? '#view=FitH&navpanes=0' : '')); + var file = new URL(src, document.baseURI); + if (file.origin === window.location.origin && frame.getAttribute('data-reader')) { + var hash = new URLSearchParams(file.hash.slice(1)); + if (!hash.has('zoom')) hash.set('zoom', 'auto'); + file.hash = ''; + src = frame.getAttribute('data-reader') + '?file=' + encodeURIComponent(file.href) + '#' + hash.toString(); + } else { + // Off-origin attachments remain readable even when their host does + // not permit JavaScript fetches; no CORS/origin bypass or proxy. + src += src.indexOf('#') === -1 ? '#view=FitH&navpanes=0' : ''; + } + frame.setAttribute('src', src); viewer.addEventListener('close', function () { frame.removeAttribute('src'); toggle.setAttribute('aria-expanded', 'false'); diff --git a/tests/digital-attachments-445.spec.js b/tests/digital-attachments-445.spec.js index bf47c8b3f..631a40410 100644 --- a/tests/digital-attachments-445.spec.js +++ b/tests/digital-attachments-445.spec.js @@ -113,7 +113,9 @@ test.describe.serial('Multiple digital contents (#445)', () => { await expect(page.locator('.digital-attachments-list a[href$=".epub"]')).toBeVisible(); await expect(page.locator('.digital-attachments-list')).toContainText('A review <&>'); await expect(page.locator('#audiobook-player-container')).toHaveCount(0); - const read = page.locator('[data-digital-pdf-toggle]').first(); + // The first PDF is a legacy URL without a file; use the actual uploaded PDF. + const read = page.locator('[data-digital-pdf-toggle]').nth(1); + await page.emulateMedia({ colorScheme: 'dark' }); await read.click(); const reader = page.locator('dialog.digital-pdf-lightbox[open]'); await expect(reader).toBeVisible(); @@ -122,6 +124,22 @@ test.describe.serial('Multiple digital contents (#445)', () => { expect(bounds.y).toBe(0); expect(bounds.width).toBe(page.viewportSize().width); expect(bounds.height).toBe(page.viewportSize().height); + const iframe = reader.locator('iframe'); + const readerUrl = new URL(await iframe.getAttribute('src'), BASE); + expect(readerUrl.origin).toBe(new URL(BASE).origin); + expect(readerUrl.pathname).toContain('/assets/vendor/pdfjs-6.4.299/web/viewer.html'); + const pdfUrl = new URL(readerUrl.searchParams.get('file')); + expect(pdfUrl.origin).toBe(readerUrl.origin); + const pdfResponse = await page.request.get(pdfUrl.href); + expect(pdfResponse.ok()).toBeTruthy(); + expect(pdfResponse.headers()['content-type']).toContain('application/pdf'); + const pdfReader = page.frameLocator('dialog.digital-pdf-lightbox[open] iframe'); + await expect(pdfReader.locator('.page[data-loaded="true"] canvas').first()).toBeVisible(); + await expect(pdfReader.locator('body')).toHaveCSS('color-scheme', 'light'); + await expect(pdfReader.locator('body')).toHaveCSS('background-color', 'rgb(244, 241, 243)'); + const frameBounds = await iframe.boundingBox(); + expect(frameBounds.x).toBeGreaterThanOrEqual(12); + expect(frameBounds.x + frameBounds.width).toBeLessThanOrEqual(page.viewportSize().width - 12); await reader.getByRole('button', { name: 'Chiudi', exact: true }).press('Escape'); await expect(reader).toHaveCount(0); await expect(read).toBeFocused(); From bda864a60c235cd115ef4eb4141a3f3a7083741e Mon Sep 17 00:00:00 2001 From: fabiodalez-dev Date: Mon, 12 Oct 2026 16:34:51 +0200 Subject: [PATCH 12/20] Include the PDF engine and worker in releases and test local assets --- .gitignore | 2 + .../assets/vendor/pdfjs-6.4.299/build/pdf.mjs | 34672 ++++++++ .../pdfjs-6.4.299/build/pdf.sandbox.mjs | 2502 + .../vendor/pdfjs-6.4.299/build/pdf.worker.mjs | 71124 ++++++++++++++++ tests/digital-attachments-445.unit.php | 6 + 5 files changed, 108306 insertions(+) create mode 100644 public/assets/vendor/pdfjs-6.4.299/build/pdf.mjs create mode 100644 public/assets/vendor/pdfjs-6.4.299/build/pdf.sandbox.mjs create mode 100644 public/assets/vendor/pdfjs-6.4.299/build/pdf.worker.mjs diff --git a/.gitignore b/.gitignore index 9ccd6b211..641a7fcaf 100644 --- a/.gitignore +++ b/.gitignore @@ -421,6 +421,8 @@ yarn.lock dist/ !public/assets/star-rating/dist/ build/ +!/public/assets/vendor/pdfjs-6.4.299/build/ +!/public/assets/vendor/pdfjs-6.4.299/build/** frontend/dist/ frontend/build/ frontend/storage/ diff --git a/public/assets/vendor/pdfjs-6.4.299/build/pdf.mjs b/public/assets/vendor/pdfjs-6.4.299/build/pdf.mjs new file mode 100644 index 000000000..85a3220c5 --- /dev/null +++ b/public/assets/vendor/pdfjs-6.4.299/build/pdf.mjs @@ -0,0 +1,34672 @@ +/** + * @licstart The following is the entire license notice for the + * JavaScript code in this page + * + * 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * @licend The above is the entire license notice for the + * JavaScript code in this page + */ + +/** + * pdfjsVersion = 6.4.299 + * pdfjsBuild = d0991a0d5 + */ +/******/ var __webpack_modules__ = ({ + +/***/ 463 +(module) { + + +var $TypeError = TypeError; + +module.exports = function (argument) { + if (typeof argument == 'string') return argument; + throw new $TypeError('Argument is not a string'); +}; + + +/***/ }, + +/***/ 804 +(module) { + + +var commonAlphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; +var base64Alphabet = commonAlphabet + '+/'; +var base64UrlAlphabet = commonAlphabet + '-_'; + +var inverse = function (characters) { + // TODO: use `Object.create(null)` in `core-js@4` + var result = {}; + var index = 0; + for (; index < 64; index++) result[characters.charAt(index)] = index; + return result; +}; + +module.exports = { + i2c: base64Alphabet, + c2i: inverse(base64Alphabet), + i2cUrl: base64UrlAlphabet, + c2iUrl: inverse(base64UrlAlphabet) +}; + + +/***/ }, + +/***/ 529 +(module) { + + +// `CreateIterResultObject` abstract operation +// https://tc39.es/ecma262/#sec-createiterresultobject +module.exports = function (value, done) { + return { value: value, done: done }; +}; + + +/***/ }, + +/***/ 837 +(module) { + + +var $TypeError = TypeError; +var MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF; // 2 ** 53 - 1 == 9007199254740991 + +module.exports = function (it) { + if (it > MAX_SAFE_INTEGER) throw new $TypeError('Maximum allowed index exceeded'); + return it; +}; + + +/***/ }, + +/***/ 2 +(module) { + + +module.exports = { + IndexSizeError: { s: 'INDEX_SIZE_ERR', c: 1, m: 1 }, + DOMStringSizeError: { s: 'DOMSTRING_SIZE_ERR', c: 2, m: 0 }, + HierarchyRequestError: { s: 'HIERARCHY_REQUEST_ERR', c: 3, m: 1 }, + WrongDocumentError: { s: 'WRONG_DOCUMENT_ERR', c: 4, m: 1 }, + InvalidCharacterError: { s: 'INVALID_CHARACTER_ERR', c: 5, m: 1 }, + NoDataAllowedError: { s: 'NO_DATA_ALLOWED_ERR', c: 6, m: 0 }, + NoModificationAllowedError: { s: 'NO_MODIFICATION_ALLOWED_ERR', c: 7, m: 1 }, + NotFoundError: { s: 'NOT_FOUND_ERR', c: 8, m: 1 }, + NotSupportedError: { s: 'NOT_SUPPORTED_ERR', c: 9, m: 1 }, + InUseAttributeError: { s: 'INUSE_ATTRIBUTE_ERR', c: 10, m: 1 }, + InvalidStateError: { s: 'INVALID_STATE_ERR', c: 11, m: 1 }, + SyntaxError: { s: 'SYNTAX_ERR', c: 12, m: 1 }, + InvalidModificationError: { s: 'INVALID_MODIFICATION_ERR', c: 13, m: 1 }, + NamespaceError: { s: 'NAMESPACE_ERR', c: 14, m: 1 }, + InvalidAccessError: { s: 'INVALID_ACCESS_ERR', c: 15, m: 1 }, + ValidationError: { s: 'VALIDATION_ERR', c: 16, m: 0 }, + TypeMismatchError: { s: 'TYPE_MISMATCH_ERR', c: 17, m: 1 }, + SecurityError: { s: 'SECURITY_ERR', c: 18, m: 1 }, + NetworkError: { s: 'NETWORK_ERR', c: 19, m: 1 }, + AbortError: { s: 'ABORT_ERR', c: 20, m: 1 }, + URLMismatchError: { s: 'URL_MISMATCH_ERR', c: 21, m: 1 }, + QuotaExceededError: { s: 'QUOTA_EXCEEDED_ERR', c: 22, m: 1 }, + TimeoutError: { s: 'TIMEOUT_ERR', c: 23, m: 1 }, + InvalidNodeTypeError: { s: 'INVALID_NODE_TYPE_ERR', c: 24, m: 1 }, + DataCloneError: { s: 'DATA_CLONE_ERR', c: 25, m: 1 } +}; + + +/***/ }, + +/***/ 944 +(module) { + + +var $TypeError = TypeError; + +module.exports = function (options) { + var alphabet = options && options.alphabet; + if (alphabet === undefined || alphabet === 'base64' || alphabet === 'base64url') return alphabet || 'base64'; + throw new $TypeError('Incorrect `alphabet` option'); +}; + + +/***/ }, + +/***/ 767 +(module) { + + +// `GetIteratorDirect(obj)` abstract operation +// https://tc39.es/ecma262/#sec-getiteratordirect +module.exports = function (obj) { + return { + iterator: obj, + next: obj.next, + done: false + }; +}; + + +/***/ }, + +/***/ 117 +(module) { + + +// we can't use just `it == null` since of `document.all` special case +// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot-aec +module.exports = function (it) { + return it === null || it === undefined; +}; + + +/***/ }, + +/***/ 859 +(module) { + + +// release references held by exhausted / closed iterator helpers to allow GC of the source chain +module.exports = function (state) { + state.iterator = state.next = state.nextHandler = state.mapper = state.predicate = state.inner = + state.iterables = state.iters = state.openIters = state.padding = state.finishResults = state.buffer = null; +}; + + +/***/ }, + +/***/ 684 +(module) { + + +// Should throw an error on invalid iterator +// https://issues.chromium.org/issues/336839115 +module.exports = function (methodName, argument) { + // eslint-disable-next-line es/no-iterator -- required for testing + var method = typeof Iterator == 'function' && Iterator.prototype[methodName]; + if (method) try { + method.call({ next: null }, argument).next(); + } catch (error) { + return true; + } +}; + + +/***/ }, + +/***/ 269 +(module) { + + +module.exports = Object.create ? Object.create(null) : {}; + + +/***/ }, + +/***/ 741 +(module) { + + +var ceil = Math.ceil; +var floor = Math.floor; + +// `Math.trunc` method +// https://tc39.es/ecma262/#sec-math.trunc +// eslint-disable-next-line es/no-math-trunc -- safe +module.exports = Math.trunc || function trunc(x) { + var n = +x; + return (n > 0 ? floor : ceil)(n); +}; + + +/***/ }, + +/***/ 149 +(module) { + + +var $RangeError = RangeError; + +module.exports = function (it) { + // eslint-disable-next-line no-self-compare -- NaN check + if (it === it) return it; + throw new $RangeError('NaN is not allowed'); +}; + + +/***/ }, + +/***/ 717 +(__unused_webpack_module, exports) { + + +// eslint-disable-next-line es/no-object-getownpropertysymbols -- safe +exports.f = Object.getOwnPropertySymbols; + + +/***/ }, + +/***/ 103 +(module) { + + +module.exports = function (exec) { + try { + return { error: false, value: exec() }; + } catch (error) { + return { error: true, value: error }; + } +}; + + +/***/ }, + +/***/ 750 +(module, __unused_webpack_exports, __webpack_require__) { + + +var isNullOrUndefined = __webpack_require__(117); + +var $TypeError = TypeError; + +// `RequireObjectCoercible` abstract operation +// https://tc39.es/ecma262/#sec-requireobjectcoercible +module.exports = function (it) { + if (isNullOrUndefined(it)) throw new $TypeError("Can't call method on " + it); + return it; +}; + + +/***/ }, + +/***/ 835 +(module) { + + +// Should get iterator record of a set-like object before cloning this +// https://bugs.webkit.org/show_bug.cgi?id=289430 +module.exports = function (METHOD_NAME) { + try { + // eslint-disable-next-line es/no-set -- needed for test + var baseSet = new Set(); + var setLike = { + size: 0, + has: function () { return true; }, + keys: function () { + // eslint-disable-next-line es/no-object-defineproperty -- needed for test + return Object.defineProperty({}, 'next', { + get: function () { + baseSet.clear(); + baseSet.add(4); + return function () { + return { done: true }; + }; + } + }); + } + }; + var result = baseSet[METHOD_NAME](setLike); + + return result.size === 1 && result.values().next().value === 4; + } catch (error) { + return false; + } +}; + + +/***/ }, + +/***/ 291 +(module, __unused_webpack_exports, __webpack_require__) { + + +var trunc = __webpack_require__(741); + +// `ToIntegerOrInfinity` abstract operation +// https://tc39.es/ecma262/#sec-tointegerorinfinity +module.exports = function (argument) { + var number = +argument; + // eslint-disable-next-line no-self-compare -- NaN check + return number !== number || number === 0 ? 0 : trunc(number); +}; + + +/***/ }, + +/***/ 14 +(module, __unused_webpack_exports, __webpack_require__) { + + +var toIntegerOrInfinity = __webpack_require__(291); + +var min = Math.min; + +// `ToLength` abstract operation +// https://tc39.es/ecma262/#sec-tolength +module.exports = function (argument) { + var len = toIntegerOrInfinity(argument); + return len > 0 ? min(len, 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991 +}; + + +/***/ }, + +/***/ 981 +(module, __unused_webpack_exports, __webpack_require__) { + + +var requireObjectCoercible = __webpack_require__(750); + +var $Object = Object; + +// `ToObject` abstract operation +// https://tc39.es/ecma262/#sec-toobject +module.exports = function (argument) { + return $Object(requireObjectCoercible(argument)); +}; + + +/***/ }, + +/***/ 590 +(module, __unused_webpack_exports, __webpack_require__) { + + +var toIntegerOrInfinity = __webpack_require__(291); + +var $RangeError = RangeError; + +module.exports = function (it) { + var result = toIntegerOrInfinity(it); + if (result < 0) throw new $RangeError("The argument can't be less than 0"); + return result; +}; + + +/***/ }, + +/***/ 812 +(module) { + + +var $TypeError = TypeError; + +module.exports = function (passed, required) { + if (passed < required) throw new $TypeError('Not enough arguments'); + return passed; +}; + + +/***/ } + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ const __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ const cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ const module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/concatenation wrap */ +/******/ // wrap a concatenated module body as a lazy, memoized accessor; mod is +/******/ // set before the body runs so re-entrant calls (require cycles) observe +/******/ // the partial exports like Node.js +/******/ __webpack_require__.cw = (body) => { +/******/ var mod; +/******/ return () => { +/******/ if (body) { +/******/ var fn = body; +/******/ body = 0; +/******/ mod = { exports: {} }; +/******/ fn.call(mod.exports, mod, mod.exports); +/******/ } +/******/ return mod.exports; +/******/ }; +/******/ }; +/******/ +/******/ /* webpack/runtime/define property getters */ +/******/ // define getter/value 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] }); +/******/ } +/******/ } +/******/ }; +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)); +/******/ +/************************************************************************/ + +// MODULE: ./node_modules/core-js/internals/a-callable.js +var a_callable_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var isCallable = (is_callable_namespaceFn()); +var tryToString = (try_to_string_namespaceFn()); + +var $TypeError = TypeError; + +// `Assert: IsCallable(argument) is true` +module.exports = function (argument) { + if (isCallable(argument)) return argument; + throw new $TypeError(tryToString(argument) + ' is not a function'); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/a-possible-prototype.js +var a_possible_prototype_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var isPossiblePrototype = (is_possible_prototype_namespaceFn()); + +var $String = String; +var $TypeError = TypeError; + +module.exports = function (argument) { + if (isPossiblePrototype(argument)) return argument; + throw new $TypeError("Can't set " + $String(argument) + ' as a prototype'); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/a-set.js +var a_set_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var has = (set_helpers_namespaceFn().has); + +// Perform ? RequireInternalSlot(M, [[SetData]]) +module.exports = function (it) { + has(it); + return it; +}; + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/a-string.js +var a_string_namespaceFn = () => { + return __webpack_require__(463); +}; + +// MODULE: ./node_modules/core-js/internals/a-weak-key.js +var a_weak_key_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var WeakMapHelpers = (weak_map_helpers_namespaceFn()); + +var weakmap = new WeakMapHelpers.WeakMap(); +var set = WeakMapHelpers.set; +var remove = WeakMapHelpers.remove; + +module.exports = function (key) { + set(weakmap, key, 1); + remove(weakmap, key); + return key; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/a-weak-map.js +var a_weak_map_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var has = (weak_map_helpers_namespaceFn().has); + +// Perform ? RequireInternalSlot(M, [[WeakMapData]]) +module.exports = function (it) { + has(it); + return it; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/add-to-unscopables.js +var add_to_unscopables_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var wellKnownSymbol = (well_known_symbol_namespaceFn()); +var create = (object_create_namespaceFn()); +var defineProperty = (object_define_property_namespaceFn().f); + +var UNSCOPABLES = wellKnownSymbol('unscopables'); +var ArrayPrototype = Array.prototype; + +// Array.prototype[@@unscopables] +// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables +if (ArrayPrototype[UNSCOPABLES] === undefined) { + defineProperty(ArrayPrototype, UNSCOPABLES, { + configurable: true, + value: create(null) + }); +} + +// add a key to Array.prototype[@@unscopables] +module.exports = function (key) { + ArrayPrototype[UNSCOPABLES][key] = true; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/an-instance.js +var an_instance_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var isPrototypeOf = (object_is_prototype_of_namespaceFn()); + +var $TypeError = TypeError; + +module.exports = function (it, Prototype) { + if (isPrototypeOf(Prototype, it)) return it; + throw new $TypeError('Incorrect invocation'); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/an-object-or-undefined.js +var an_object_or_undefined_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var isObject = (is_object_namespaceFn()); + +var $String = String; +var $TypeError = TypeError; + +module.exports = function (argument) { + if (argument === undefined || isObject(argument)) return argument; + throw new $TypeError($String(argument) + ' is not an object or undefined'); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/an-object.js +var an_object_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var isObject = (is_object_namespaceFn()); + +var $String = String; +var $TypeError = TypeError; + +// `Assert: Type(argument) is Object` +module.exports = function (argument) { + if (isObject(argument)) return argument; + throw new $TypeError($String(argument) + ' is not an object'); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/an-uint8-array.js +var an_uint8_array_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var classof = (classof_namespaceFn()); + +var $TypeError = TypeError; + +// Perform ? RequireInternalSlot(argument, [[TypedArrayName]]) +// If argument.[[TypedArrayName]] is not "Uint8Array", throw a TypeError exception +module.exports = function (argument) { + if (classof(argument) === 'Uint8Array') return argument; + throw new $TypeError('Argument is not an Uint8Array'); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/array-buffer-basic-detection.js +var array_buffer_basic_detection_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +// eslint-disable-next-line es/no-typed-arrays -- safe +module.exports = typeof ArrayBuffer != 'undefined' && typeof DataView != 'undefined'; + +}); + +// MODULE: ./node_modules/core-js/internals/array-buffer-byte-length.js +var array_buffer_byte_length_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var globalThis = (global_this_namespaceFn()); +var uncurryThisAccessor = (function_uncurry_this_accessor_namespaceFn()); +var classof = (classof_raw_namespaceFn()); + +var ArrayBuffer = globalThis.ArrayBuffer; +var TypeError = globalThis.TypeError; + +// Includes +// - Perform ? RequireInternalSlot(O, [[ArrayBufferData]]). +// - If IsSharedArrayBuffer(O) is true, throw a TypeError exception. +module.exports = ArrayBuffer && uncurryThisAccessor(ArrayBuffer.prototype, 'byteLength', 'get') || function (O) { + if (classof(O) !== 'ArrayBuffer') throw new TypeError('ArrayBuffer expected'); + return O.byteLength; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/array-buffer-is-detached.js +var array_buffer_is_detached_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var globalThis = (global_this_namespaceFn()); +var NATIVE_ARRAY_BUFFER = (array_buffer_basic_detection_namespaceFn()); +var arrayBufferByteLength = (array_buffer_byte_length_namespaceFn()); + +var DataView = globalThis.DataView; + +module.exports = function (O) { + if (!NATIVE_ARRAY_BUFFER || arrayBufferByteLength(O) !== 0) return false; + try { + // eslint-disable-next-line no-new -- thrower + new DataView(O); + return false; + } catch (error) { + return true; + } +}; + +}); + +// MODULE: ./node_modules/core-js/internals/array-buffer-not-detached.js +var array_buffer_not_detached_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var isDetached = (array_buffer_is_detached_namespaceFn()); + +var $TypeError = TypeError; + +module.exports = function (it) { + if (isDetached(it)) throw new $TypeError('ArrayBuffer is detached'); + return it; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/array-buffer-view-core.js +var array_buffer_view_core_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var NATIVE_ARRAY_BUFFER = (array_buffer_basic_detection_namespaceFn()); +var DESCRIPTORS = (descriptors_namespaceFn()); +var globalThis = (global_this_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); +var isObject = (is_object_namespaceFn()); +var hasOwn = (has_own_property_namespaceFn()); +var classof = (classof_namespaceFn()); +var tryToString = (try_to_string_namespaceFn()); +var createNonEnumerableProperty = (create_non_enumerable_property_namespaceFn()); +var defineBuiltIn = (define_built_in_namespaceFn()); +var defineBuiltInAccessor = (define_built_in_accessor_namespaceFn()); +var isPrototypeOf = (object_is_prototype_of_namespaceFn()); +var getPrototypeOf = (object_get_prototype_of_namespaceFn()); +var setPrototypeOf = (object_set_prototype_of_namespaceFn()); +var wellKnownSymbol = (well_known_symbol_namespaceFn()); +var uid = (uid_namespaceFn()); +var InternalStateModule = (internal_state_namespaceFn()); + +var enforceInternalState = InternalStateModule.enforce; +var getInternalState = InternalStateModule.get; +var Int8Array = globalThis.Int8Array; +var Int8ArrayPrototype = Int8Array && Int8Array.prototype; +var Uint8ClampedArray = globalThis.Uint8ClampedArray; +var Uint8ClampedArrayPrototype = Uint8ClampedArray && Uint8ClampedArray.prototype; +var TypedArray = Int8Array && getPrototypeOf(Int8Array); +var TypedArrayPrototype = Int8ArrayPrototype && getPrototypeOf(Int8ArrayPrototype); +var ObjectPrototype = Object.prototype; +var TypeError = globalThis.TypeError; + +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); +var TYPED_ARRAY_TAG = uid('TYPED_ARRAY_TAG'); +var TYPED_ARRAY_CONSTRUCTOR = 'TypedArrayConstructor'; +// Fixing native typed arrays in Opera Presto crashes the browser, see #595 +var NATIVE_ARRAY_BUFFER_VIEWS = NATIVE_ARRAY_BUFFER && !!setPrototypeOf && classof(globalThis.opera) !== 'Opera'; +var TYPED_ARRAY_TAG_REQUIRED = false; +var NAME, Constructor, Prototype; + +var TypedArrayConstructorsList = { + Int8Array: 1, + Uint8Array: 1, + Uint8ClampedArray: 1, + Int16Array: 2, + Uint16Array: 2, + Int32Array: 4, + Uint32Array: 4, + Float32Array: 4, + Float64Array: 8 +}; + +var BigIntArrayConstructorsList = { + BigInt64Array: 8, + BigUint64Array: 8 +}; + +var isView = function isView(it) { + if (!isObject(it)) return false; + var klass = classof(it); + return klass === 'DataView' + || hasOwn(TypedArrayConstructorsList, klass) + || hasOwn(BigIntArrayConstructorsList, klass); +}; + +var getTypedArrayConstructor = function (it) { + var proto = getPrototypeOf(it); + if (!isObject(proto)) return; + var state = getInternalState(proto); + return (state && hasOwn(state, TYPED_ARRAY_CONSTRUCTOR)) ? state[TYPED_ARRAY_CONSTRUCTOR] : getTypedArrayConstructor(proto); +}; + +var isTypedArray = function (it) { + if (!isObject(it)) return false; + var klass = classof(it); + return hasOwn(TypedArrayConstructorsList, klass) + || hasOwn(BigIntArrayConstructorsList, klass); +}; + +var aTypedArray = function (it) { + if (isTypedArray(it)) return it; + throw new TypeError('Target is not a typed array'); +}; + +var aTypedArrayConstructor = function (C) { + if (isCallable(C) && (!setPrototypeOf || isPrototypeOf(TypedArray, C))) return C; + throw new TypeError(tryToString(C) + ' is not a typed array constructor'); +}; + +var exportTypedArrayMethod = function (KEY, property, forced, options) { + if (!DESCRIPTORS) return; + if (forced) for (var ARRAY in TypedArrayConstructorsList) { + var TypedArrayConstructor = globalThis[ARRAY]; + if (TypedArrayConstructor && hasOwn(TypedArrayConstructor.prototype, KEY)) try { + delete TypedArrayConstructor.prototype[KEY]; + } catch (error) { + // old WebKit bug - some methods are non-configurable + try { + TypedArrayConstructor.prototype[KEY] = property; + } catch (error2) { /* empty */ } + } + } + if (!TypedArrayPrototype[KEY] || forced) { + defineBuiltIn(TypedArrayPrototype, KEY, forced ? property + : NATIVE_ARRAY_BUFFER_VIEWS && Int8ArrayPrototype[KEY] || property, options); + } +}; + +var exportTypedArrayStaticMethod = function (KEY, property, forced) { + var ARRAY, TypedArrayConstructor; + if (!DESCRIPTORS) return; + if (setPrototypeOf) { + if (forced) for (ARRAY in TypedArrayConstructorsList) { + TypedArrayConstructor = globalThis[ARRAY]; + if (TypedArrayConstructor && hasOwn(TypedArrayConstructor, KEY)) try { + delete TypedArrayConstructor[KEY]; + } catch (error) { /* empty */ } + } + if (!TypedArray[KEY] || forced) { + // V8 ~ Chrome 49-50 `%TypedArray%` methods are non-writable non-configurable + try { + return defineBuiltIn(TypedArray, KEY, forced ? property : NATIVE_ARRAY_BUFFER_VIEWS && TypedArray[KEY] || property); + } catch (error) { /* empty */ } + } else return; + } + for (ARRAY in TypedArrayConstructorsList) { + TypedArrayConstructor = globalThis[ARRAY]; + if (TypedArrayConstructor && (!TypedArrayConstructor[KEY] || forced)) { + defineBuiltIn(TypedArrayConstructor, KEY, property); + } + } +}; + +for (NAME in TypedArrayConstructorsList) { + Constructor = globalThis[NAME]; + Prototype = Constructor && Constructor.prototype; + if (Prototype) enforceInternalState(Prototype)[TYPED_ARRAY_CONSTRUCTOR] = Constructor; + else NATIVE_ARRAY_BUFFER_VIEWS = false; +} + +for (NAME in BigIntArrayConstructorsList) { + Constructor = globalThis[NAME]; + Prototype = Constructor && Constructor.prototype; + if (Prototype) enforceInternalState(Prototype)[TYPED_ARRAY_CONSTRUCTOR] = Constructor; +} + +// WebKit bug - typed arrays constructors prototype is Object.prototype +if (!NATIVE_ARRAY_BUFFER_VIEWS || !isCallable(TypedArray) || TypedArray === Function.prototype) { + // eslint-disable-next-line no-shadow -- safe + TypedArray = function TypedArray() { + throw new TypeError('Incorrect invocation'); + }; + if (NATIVE_ARRAY_BUFFER_VIEWS) for (NAME in TypedArrayConstructorsList) { + if (globalThis[NAME]) setPrototypeOf(globalThis[NAME], TypedArray); + } +} + +if (!NATIVE_ARRAY_BUFFER_VIEWS || !TypedArrayPrototype || TypedArrayPrototype === ObjectPrototype) { + TypedArrayPrototype = TypedArray.prototype; + if (NATIVE_ARRAY_BUFFER_VIEWS) for (NAME in TypedArrayConstructorsList) { + if (globalThis[NAME]) setPrototypeOf(globalThis[NAME].prototype, TypedArrayPrototype); + } +} + +// WebKit bug - one more object in Uint8ClampedArray prototype chain +if (NATIVE_ARRAY_BUFFER_VIEWS && getPrototypeOf(Uint8ClampedArrayPrototype) !== TypedArrayPrototype) { + setPrototypeOf(Uint8ClampedArrayPrototype, TypedArrayPrototype); +} + +if (DESCRIPTORS && !hasOwn(TypedArrayPrototype, TO_STRING_TAG)) { + TYPED_ARRAY_TAG_REQUIRED = true; + defineBuiltInAccessor(TypedArrayPrototype, TO_STRING_TAG, { + configurable: true, + get: function () { + return isObject(this) ? this[TYPED_ARRAY_TAG] : undefined; + } + }); + for (NAME in TypedArrayConstructorsList) if (globalThis[NAME]) { + createNonEnumerableProperty(globalThis[NAME].prototype, TYPED_ARRAY_TAG, NAME); + } +} + +module.exports = { + NATIVE_ARRAY_BUFFER_VIEWS: NATIVE_ARRAY_BUFFER_VIEWS, + TYPED_ARRAY_TAG: TYPED_ARRAY_TAG_REQUIRED && TYPED_ARRAY_TAG, + aTypedArray: aTypedArray, + aTypedArrayConstructor: aTypedArrayConstructor, + exportTypedArrayMethod: exportTypedArrayMethod, + exportTypedArrayStaticMethod: exportTypedArrayStaticMethod, + getTypedArrayConstructor: getTypedArrayConstructor, + isView: isView, + isTypedArray: isTypedArray, + TypedArray: TypedArray, + TypedArrayPrototype: TypedArrayPrototype +}; + +}); + +// MODULE: ./node_modules/core-js/internals/array-from-constructor-and-list.js +var array_from_constructor_and_list_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var lengthOfArrayLike = (length_of_array_like_namespaceFn()); + +module.exports = function (Constructor, list, $length) { + var index = 0; + var length = arguments.length > 2 ? $length : lengthOfArrayLike(list); + var result = new Constructor(length); + while (length > index) result[index] = list[index++]; + return result; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/array-includes.js +var array_includes_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var toIndexedObject = (to_indexed_object_namespaceFn()); +var toAbsoluteIndex = (to_absolute_index_namespaceFn()); +var lengthOfArrayLike = (length_of_array_like_namespaceFn()); + +// `Array.prototype.{ indexOf, includes }` methods implementation +var createMethod = function (IS_INCLUDES) { + return function ($this, el, fromIndex) { + var O = toIndexedObject($this); + var length = lengthOfArrayLike(O); + if (length === 0) return !IS_INCLUDES && -1; + var index = toAbsoluteIndex(fromIndex, length); + var value; + // Array#includes uses SameValueZero equality algorithm + // eslint-disable-next-line no-self-compare -- NaN check + if (IS_INCLUDES && el !== el) while (length > index) { + value = O[index++]; + // eslint-disable-next-line no-self-compare -- NaN check + if (value !== value) return true; + // Array#indexOf ignores holes, Array#includes - not + } else for (;length > index; index++) { + if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0; + } return !IS_INCLUDES && -1; + }; +}; + +module.exports = { + // `Array.prototype.includes` method + // https://tc39.es/ecma262/#sec-array.prototype.includes + includes: createMethod(true), + // `Array.prototype.indexOf` method + // https://tc39.es/ecma262/#sec-array.prototype.indexof + indexOf: createMethod(false) +}; + +}); + +// MODULE: ./node_modules/core-js/internals/array-set-length.js +var array_set_length_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var DESCRIPTORS = (descriptors_namespaceFn()); +var isArray = (is_array_namespaceFn()); + +var $TypeError = TypeError; +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; + +// Safari < 13 does not throw an error in this case +var SILENT_ON_NON_WRITABLE_LENGTH_SET = DESCRIPTORS && !function () { + // makes no sense without proper strict mode support + if (this !== undefined) return true; + try { + // eslint-disable-next-line es/no-object-defineproperty -- safe + Object.defineProperty([], 'length', { writable: false }).length = 1; + } catch (error) { + return error instanceof TypeError; + } +}(); + +module.exports = SILENT_ON_NON_WRITABLE_LENGTH_SET ? function (O, length) { + if (isArray(O) && !getOwnPropertyDescriptor(O, 'length').writable) { + throw new $TypeError('Cannot set read only .length'); + } return O.length = length; +} : function (O, length) { + return O.length = length; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/array-slice.js +var array_slice_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); + +module.exports = uncurryThis([].slice); + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/base64-map.js +var base64_map_namespaceFn = () => { + return __webpack_require__(804); +}; + +// MODULE: ./node_modules/core-js/internals/call-with-safe-iteration-closing.js +var call_with_safe_iteration_closing_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var anObject = (an_object_namespaceFn()); +var iteratorClose = (iterator_close_namespaceFn()); + +// call something on iterator step with safe closing on error +module.exports = function (iterator, fn, value, ENTRIES) { + try { + return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value); + } catch (error) { + iteratorClose(iterator, 'throw', error); + } +}; + +}); + +// MODULE: ./node_modules/core-js/internals/classof-raw.js +var classof_raw_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); + +var toString = uncurryThis({}.toString); +var stringSlice = uncurryThis(''.slice); + +module.exports = function (it) { + return stringSlice(toString(it), 8, -1); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/classof.js +var classof_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var TO_STRING_TAG_SUPPORT = (to_string_tag_support_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); +var classofRaw = (classof_raw_namespaceFn()); +var wellKnownSymbol = (well_known_symbol_namespaceFn()); + +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); +var $Object = Object; + +// ES3 wrong here +var CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) === 'Arguments'; + +// fallback for IE11 Script Access Denied error +var tryGet = function (it, key) { + try { + return it[key]; + } catch (error) { /* empty */ } +}; + +// getting tag from ES6+ `Object.prototype.toString` +module.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) { + var O, tag, result; + return it === undefined ? 'Undefined' : it === null ? 'Null' + // @@toStringTag case + : typeof (tag = tryGet(O = $Object(it), TO_STRING_TAG)) == 'string' ? tag + // builtinTag case + : CORRECT_ARGUMENTS ? classofRaw(O) + // ES3 arguments fallback + : (result = classofRaw(O)) === 'Object' && isCallable(O.callee) ? 'Arguments' : result; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/copy-constructor-properties.js +var copy_constructor_properties_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var hasOwn = (has_own_property_namespaceFn()); +var ownKeys = (own_keys_namespaceFn()); +var getOwnPropertyDescriptorModule = (object_get_own_property_descriptor_namespaceFn()); +var definePropertyModule = (object_define_property_namespaceFn()); + +module.exports = function (target, source, exceptions) { + var keys = ownKeys(source); + var defineProperty = definePropertyModule.f; + var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f; + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + if (!hasOwn(target, key) && !(exceptions && hasOwn(exceptions, key))) { + defineProperty(target, key, getOwnPropertyDescriptor(source, key)); + } + } +}; + +}); + +// MODULE: ./node_modules/core-js/internals/correct-prototype-getter.js +var correct_prototype_getter_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var fails = (fails_namespaceFn()); + +module.exports = !fails(function () { + function F() { /* empty */ } + F.prototype.constructor = null; + // eslint-disable-next-line es/no-object-getprototypeof -- required for testing + return Object.getPrototypeOf(new F()) !== F.prototype; +}); + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/create-iter-result-object.js +var create_iter_result_object_namespaceFn = () => { + return __webpack_require__(529); +}; + +// MODULE: ./node_modules/core-js/internals/create-non-enumerable-property.js +var create_non_enumerable_property_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var DESCRIPTORS = (descriptors_namespaceFn()); +var definePropertyModule = (object_define_property_namespaceFn()); +var createPropertyDescriptor = (create_property_descriptor_namespaceFn()); + +module.exports = DESCRIPTORS ? function (object, key, value) { + return definePropertyModule.f(object, key, createPropertyDescriptor(1, value)); +} : function (object, key, value) { + object[key] = value; + return object; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/create-property-descriptor.js +var create_property_descriptor_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +module.exports = function (bitmap, value) { + return { + enumerable: !(bitmap & 1), + configurable: !(bitmap & 2), + writable: !(bitmap & 4), + value: value + }; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/create-property.js +var create_property_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var DESCRIPTORS = (descriptors_namespaceFn()); +var definePropertyModule = (object_define_property_namespaceFn()); +var createPropertyDescriptor = (create_property_descriptor_namespaceFn()); + +module.exports = function (object, key, value) { + if (DESCRIPTORS) definePropertyModule.f(object, key, createPropertyDescriptor(0, value)); + else object[key] = value; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/define-built-in-accessor.js +var define_built_in_accessor_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var makeBuiltIn = (make_built_in_namespaceFn()); +var defineProperty = (object_define_property_namespaceFn()); + +module.exports = function (target, name, descriptor) { + if (descriptor.get) makeBuiltIn(descriptor.get, name, { getter: true }); + if (descriptor.set) makeBuiltIn(descriptor.set, name, { setter: true }); + return defineProperty.f(target, name, descriptor); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/define-built-in.js +var define_built_in_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var isCallable = (is_callable_namespaceFn()); +var definePropertyModule = (object_define_property_namespaceFn()); +var makeBuiltIn = (make_built_in_namespaceFn()); +var defineGlobalProperty = (define_global_property_namespaceFn()); + +module.exports = function (O, key, value, options) { + if (!options) options = {}; + var simple = options.enumerable; + var name = options.name !== undefined ? options.name : key; + if (isCallable(value)) makeBuiltIn(value, name, options); + if (options.global) { + if (simple) O[key] = value; + else defineGlobalProperty(key, value); + } else { + try { + if (!options.unsafe) delete O[key]; + else if (O[key]) simple = true; + } catch (error) { /* empty */ } + if (simple) O[key] = value; + else definePropertyModule.f(O, key, { + value: value, + enumerable: false, + configurable: !options.nonConfigurable, + writable: !options.nonWritable + }); + } return O; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/define-built-ins.js +var define_built_ins_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var defineBuiltIn = (define_built_in_namespaceFn()); + +module.exports = function (target, src, options) { + for (var key in src) defineBuiltIn(target, key, src[key], options); + return target; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/define-global-property.js +var define_global_property_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var globalThis = (global_this_namespaceFn()); + +// eslint-disable-next-line es/no-object-defineproperty -- safe +var defineProperty = Object.defineProperty; + +module.exports = function (key, value) { + try { + defineProperty(globalThis, key, { value: value, configurable: true, writable: true }); + } catch (error) { + globalThis[key] = value; + } return value; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/descriptors.js +var descriptors_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var fails = (fails_namespaceFn()); + +// Detect IE8's incomplete defineProperty implementation +module.exports = !fails(function () { + // eslint-disable-next-line es/no-object-defineproperty -- required for testing + return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] !== 7; +}); + +}); + +// MODULE: ./node_modules/core-js/internals/document-create-element.js +var document_create_element_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var globalThis = (global_this_namespaceFn()); +var isObject = (is_object_namespaceFn()); + +var document = globalThis.document; +// typeof document.createElement is 'object' in old IE +var EXISTS = isObject(document) && isObject(document.createElement); + +module.exports = function (it) { + return EXISTS ? document.createElement(it) : {}; +}; + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/does-not-exceed-safe-integer.js +var does_not_exceed_safe_integer_namespaceFn = () => { + return __webpack_require__(837); +}; + +// EXTERNAL MODULE: ./node_modules/core-js/internals/dom-exception-constants.js +var dom_exception_constants_namespaceFn = () => { + return __webpack_require__(2); +}; + +// MODULE: ./node_modules/core-js/internals/enum-bug-keys.js +var enum_bug_keys_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +// IE8- don't enum bug keys +module.exports = [ + 'constructor', + 'hasOwnProperty', + 'isPrototypeOf', + 'propertyIsEnumerable', + 'toLocaleString', + 'toString', + 'valueOf' +]; + +}); + +// MODULE: ./node_modules/core-js/internals/environment-user-agent.js +var environment_user_agent_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var globalThis = (global_this_namespaceFn()); + +var navigator = globalThis.navigator; +var userAgent = navigator && navigator.userAgent; + +module.exports = userAgent ? String(userAgent) : ''; + +}); + +// MODULE: ./node_modules/core-js/internals/environment-v8-version.js +var environment_v8_version_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var globalThis = (global_this_namespaceFn()); +var userAgent = (environment_user_agent_namespaceFn()); + +var process = globalThis.process; +var Deno = globalThis.Deno; +var versions = process && process.versions || Deno && Deno.version; +var v8 = versions && versions.v8; +var match, version; + +if (v8) { + match = v8.split('.'); + // in old Chrome, versions of V8 isn't V8 = Chrome / 10 + // but their correct versions are not interesting for us + version = match[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1]); +} + +// BrowserFS NodeJS `process` polyfill incorrectly set `.v8` to `0.0` +// so check `userAgent` even if `.v8` exists, but 0 +if (!version && userAgent) { + match = userAgent.match(/Edge\/(\d+)/); + if (!match || match[1] >= 74) { + match = userAgent.match(/Chrome\/(\d+)/); + if (match) version = +match[1]; + } +} + +module.exports = version; + +}); + +// MODULE: ./node_modules/core-js/internals/error-stack-clear.js +var error_stack_clear_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); + +var $Error = Error; +var replace = uncurryThis(''.replace); + +var TEST = (function (arg) { return String(new $Error(arg).stack); })('zxcasd'); +// eslint-disable-next-line redos/no-vulnerable -- safe +var V8_OR_CHAKRA_STACK_ENTRY = /\n\s*at [^:]*:[^\n]*/; +var IS_V8_OR_CHAKRA_STACK = V8_OR_CHAKRA_STACK_ENTRY.test(TEST); + +module.exports = function (stack, dropEntries) { + if (IS_V8_OR_CHAKRA_STACK && typeof stack == 'string' && !$Error.prepareStackTrace) { + while (dropEntries--) stack = replace(stack, V8_OR_CHAKRA_STACK_ENTRY, ''); + } return stack; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/export.js +var export_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var globalThis = (global_this_namespaceFn()); +var getOwnPropertyDescriptor = (object_get_own_property_descriptor_namespaceFn().f); +var createNonEnumerableProperty = (create_non_enumerable_property_namespaceFn()); +var defineBuiltIn = (define_built_in_namespaceFn()); +var defineGlobalProperty = (define_global_property_namespaceFn()); +var copyConstructorProperties = (copy_constructor_properties_namespaceFn()); +var isForced = (is_forced_namespaceFn()); + +/* + options.target - name of the target object + options.global - target is the global object + options.stat - export as static methods of target + options.proto - export as prototype methods of target + options.real - real prototype method for the `pure` version + options.forced - export even if the native feature is available + options.bind - bind methods to the target, required for the `pure` version + options.wrap - wrap constructors to preventing global pollution, required for the `pure` version + options.unsafe - use the simple assignment of property instead of delete + defineProperty + options.sham - add a flag to not completely full polyfills + options.enumerable - export as enumerable property + options.dontCallGetSet - prevent calling a getter on target + options.name - the .name of the function if it does not match the key +*/ +module.exports = function (options, source) { + var TARGET = options.target; + var GLOBAL = options.global; + var STATIC = options.stat; + var FORCED, target, key, targetProperty, sourceProperty, descriptor; + if (GLOBAL) { + target = globalThis; + } else if (STATIC) { + target = globalThis[TARGET] || defineGlobalProperty(TARGET, {}); + } else { + target = globalThis[TARGET] && globalThis[TARGET].prototype; + } + if (target) for (key in source) { + sourceProperty = source[key]; + if (options.dontCallGetSet) { + descriptor = getOwnPropertyDescriptor(target, key); + targetProperty = descriptor && descriptor.value; + } else targetProperty = target[key]; + FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced); + // contained in target + if (!FORCED && targetProperty !== undefined) { + if (typeof sourceProperty == typeof targetProperty) continue; + copyConstructorProperties(sourceProperty, targetProperty); + } + // add a flag to not completely full polyfills + if (options.sham || (targetProperty && targetProperty.sham)) { + createNonEnumerableProperty(sourceProperty, 'sham', true); + } + defineBuiltIn(target, key, sourceProperty, options); + } +}; + +}); + +// MODULE: ./node_modules/core-js/internals/fails.js +var fails_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +module.exports = function (exec) { + try { + return !!exec(); + } catch (error) { + return true; + } +}; + +}); + +// MODULE: ./node_modules/core-js/internals/function-apply.js +var function_apply_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var NATIVE_BIND = (function_bind_native_namespaceFn()); + +var FunctionPrototype = Function.prototype; +var apply = FunctionPrototype.apply; +var call = FunctionPrototype.call; + +// eslint-disable-next-line es/no-function-prototype-bind, es/no-reflect -- safe +module.exports = typeof Reflect == 'object' && Reflect.apply || (NATIVE_BIND ? call.bind(apply) : function () { + return call.apply(apply, arguments); +}); + +}); + +// MODULE: ./node_modules/core-js/internals/function-bind-context.js +var function_bind_context_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_clause_namespaceFn()); +var aCallable = (a_callable_namespaceFn()); +var NATIVE_BIND = (function_bind_native_namespaceFn()); + +var bind = uncurryThis(uncurryThis.bind); + +// optional / simple context binding +module.exports = function (fn, that) { + aCallable(fn); + return that === undefined ? fn : NATIVE_BIND ? bind(fn, that) : function (/* ...args */) { + return fn.apply(that, arguments); + }; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/function-bind-native.js +var function_bind_native_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var fails = (fails_namespaceFn()); + +module.exports = !fails(function () { + // eslint-disable-next-line es/no-function-prototype-bind -- safe + var test = function () { /* empty */ }.bind(); + // eslint-disable-next-line no-prototype-builtins -- safe + return typeof test != 'function' || test.hasOwnProperty('prototype'); +}); + +}); + +// MODULE: ./node_modules/core-js/internals/function-call.js +var function_call_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var NATIVE_BIND = (function_bind_native_namespaceFn()); + +var call = Function.prototype.call; +// eslint-disable-next-line es/no-function-prototype-bind -- safe +module.exports = NATIVE_BIND ? call.bind(call) : function () { + return call.apply(call, arguments); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/function-name.js +var function_name_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var DESCRIPTORS = (descriptors_namespaceFn()); +var hasOwn = (has_own_property_namespaceFn()); + +var FunctionPrototype = Function.prototype; +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var getDescriptor = DESCRIPTORS && Object.getOwnPropertyDescriptor; + +var EXISTS = hasOwn(FunctionPrototype, 'name'); +// additional protection from minified / mangled / dropped function names +var PROPER = EXISTS && function something() { /* empty */ }.name === 'something'; +var CONFIGURABLE = EXISTS && (!DESCRIPTORS || (DESCRIPTORS && getDescriptor(FunctionPrototype, 'name').configurable)); + +module.exports = { + ...(/* unused pure expression */ null && (EXISTS)), + ...(/* unused pure expression */ null && (PROPER)), + CONFIGURABLE: CONFIGURABLE +}; + +}); + +// MODULE: ./node_modules/core-js/internals/function-uncurry-this-accessor.js +var function_uncurry_this_accessor_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); +var aCallable = (a_callable_namespaceFn()); + +module.exports = function (object, key, method) { + try { + // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe + return uncurryThis(aCallable(Object.getOwnPropertyDescriptor(object, key)[method])); + } catch (error) { /* empty */ } +}; + +}); + +// MODULE: ./node_modules/core-js/internals/function-uncurry-this-clause.js +var function_uncurry_this_clause_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var classofRaw = (classof_raw_namespaceFn()); +var uncurryThis = (function_uncurry_this_namespaceFn()); + +module.exports = function (fn) { + // Nashorn bug: + // https://github.com/zloirock/core-js/issues/1128 + // https://github.com/zloirock/core-js/issues/1130 + if (classofRaw(fn) === 'Function') return uncurryThis(fn); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/function-uncurry-this.js +var function_uncurry_this_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var NATIVE_BIND = (function_bind_native_namespaceFn()); + +var FunctionPrototype = Function.prototype; +var call = FunctionPrototype.call; +// eslint-disable-next-line es/no-function-prototype-bind -- safe +var uncurryThisWithBind = NATIVE_BIND && FunctionPrototype.bind.bind(call, call); + +module.exports = NATIVE_BIND ? uncurryThisWithBind : function (fn) { + return function () { + return call.apply(fn, arguments); + }; +}; + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/get-alphabet-option.js +var get_alphabet_option_namespaceFn = () => { + return __webpack_require__(944); +}; + +// MODULE: ./node_modules/core-js/internals/get-built-in.js +var get_built_in_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var globalThis = (global_this_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); + +var aFunction = function (argument) { + return isCallable(argument) ? argument : undefined; +}; + +module.exports = function (namespace, method) { + return arguments.length < 2 ? aFunction(globalThis[namespace]) : globalThis[namespace] && globalThis[namespace][method]; +}; + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/get-iterator-direct.js +var get_iterator_direct_namespaceFn = () => { + return __webpack_require__(767); +}; + +// MODULE: ./node_modules/core-js/internals/get-iterator-flattenable.js +var get_iterator_flattenable_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var call = (function_call_namespaceFn()); +var anObject = (an_object_namespaceFn()); +var getIteratorDirect = (get_iterator_direct_namespaceFn()); +var getIteratorMethod = (get_iterator_method_internal_namespaceFn()); + +module.exports = function (obj, stringHandling) { + if (!stringHandling || typeof obj !== 'string') anObject(obj); + var method = getIteratorMethod(obj); + return getIteratorDirect(anObject(method !== undefined ? call(method, obj) : obj)); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/get-iterator-internal.js +var get_iterator_internal_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var call = (function_call_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); +var anObject = (an_object_namespaceFn()); +var tryToString = (try_to_string_namespaceFn()); +var getIteratorMethod = (get_iterator_method_internal_namespaceFn()); + +var $TypeError = TypeError; + +module.exports = function (argument, usingIterator) { + var iteratorMethod = arguments.length < 2 ? getIteratorMethod(argument) : usingIterator; + if (isCallable(iteratorMethod)) return anObject(call(iteratorMethod, argument)); + throw new $TypeError(tryToString(argument) + ' is not iterable'); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/get-iterator-method-internal.js +var get_iterator_method_internal_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var classof = (classof_raw_namespaceFn()); +var isNullOrUndefined = (is_null_or_undefined_namespaceFn()); +var getMethod = (get_method_namespaceFn()); +var wellKnownSymbol = (well_known_symbol_namespaceFn()); + +var ITERATOR = wellKnownSymbol('iterator'); +var ArrayPrototype = Array.prototype; + +module.exports = function (it) { + if (!isNullOrUndefined(it)) return getMethod(it, ITERATOR) + || getMethod(it, '@@iterator') + || (classof(it) === 'Arguments' ? ArrayPrototype[ITERATOR] : undefined); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/get-method.js +var get_method_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var aCallable = (a_callable_namespaceFn()); +var isNullOrUndefined = (is_null_or_undefined_namespaceFn()); + +// `GetMethod` abstract operation +// https://tc39.es/ecma262/#sec-getmethod +module.exports = function (V, P) { + var func = V[P]; + return isNullOrUndefined(func) ? undefined : aCallable(func); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/get-set-record.js +var get_set_record_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var aCallable = (a_callable_namespaceFn()); +var anObject = (an_object_namespaceFn()); +var call = (function_call_namespaceFn()); +var toIntegerOrInfinity = (to_integer_or_infinity_namespaceFn()); +var getIteratorDirect = (get_iterator_direct_namespaceFn()); + +var INVALID_SIZE = 'Invalid size'; +var $RangeError = RangeError; +var $TypeError = TypeError; +var max = Math.max; + +var SetRecord = function (set, intSize) { + this.set = set; + this.size = max(intSize, 0); + this.has = aCallable(set.has); + this.keys = aCallable(set.keys); +}; + +SetRecord.prototype = { + getIterator: function () { + return getIteratorDirect(anObject(call(this.keys, this.set))); + }, + includes: function (it) { + return call(this.has, this.set, it); + } +}; + +// `GetSetRecord` abstract operation +// https://tc39.es/proposal-set-methods/#sec-getsetrecord +module.exports = function (obj) { + anObject(obj); + var numSize = +obj.size; + // NOTE: If size is undefined, then numSize will be NaN + // eslint-disable-next-line no-self-compare -- NaN check + if (numSize !== numSize) throw new $TypeError(INVALID_SIZE); + var intSize = toIntegerOrInfinity(numSize); + if (intSize < 0) throw new $RangeError(INVALID_SIZE); + return new SetRecord(obj, intSize); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/global-this.js +var global_this_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var check = function (it) { + return it && it.Math === Math && it; +}; + +// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 +module.exports = + // eslint-disable-next-line es/no-global-this -- safe + check(typeof globalThis == 'object' && globalThis) || + check(typeof window == 'object' && window) || + // eslint-disable-next-line no-restricted-globals -- safe + check(typeof self == 'object' && self) || + check(typeof global == 'object' && global) || + check(typeof this == 'object' && this) || + // eslint-disable-next-line no-new-func -- fallback + (function () { return this; })() || Function('return this')(); + +}); + +// MODULE: ./node_modules/core-js/internals/has-own-property.js +var has_own_property_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); +var toObject = (to_object_namespaceFn()); + +var hasOwnProperty = uncurryThis({}.hasOwnProperty); + +// `HasOwnProperty` abstract operation +// https://tc39.es/ecma262/#sec-hasownproperty +// eslint-disable-next-line es/no-object-hasown -- safe +module.exports = Object.hasOwn || function hasOwn(it, key) { + return hasOwnProperty(toObject(it), key); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/hidden-keys.js +var hidden_keys_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +module.exports = {}; + +}); + +// MODULE: ./node_modules/core-js/internals/html.js +var html_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var getBuiltIn = (get_built_in_namespaceFn()); + +module.exports = getBuiltIn('document', 'documentElement'); + +}); + +// MODULE: ./node_modules/core-js/internals/ie8-dom-define.js +var ie8_dom_define_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var DESCRIPTORS = (descriptors_namespaceFn()); +var fails = (fails_namespaceFn()); +var createElement = (document_create_element_namespaceFn()); + +// Thanks to IE8 for its funny defineProperty +module.exports = !DESCRIPTORS && !fails(function () { + // eslint-disable-next-line es/no-object-defineproperty -- required for testing + return Object.defineProperty(createElement('div'), 'a', { + get: function () { return 7; } + }).a !== 7; +}); + +}); + +// MODULE: ./node_modules/core-js/internals/indexed-object.js +var indexed_object_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); +var fails = (fails_namespaceFn()); +var classof = (classof_raw_namespaceFn()); + +var $Object = Object; +var split = uncurryThis(''.split); + +// fallback for non-array-like ES3 and non-enumerable old V8 strings +module.exports = fails(function () { + // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346 + // eslint-disable-next-line no-prototype-builtins -- safe + return !$Object('z').propertyIsEnumerable(0); +}) ? function (it) { + return classof(it) === 'String' ? split(it, '') : $Object(it); +} : $Object; + +}); + +// MODULE: ./node_modules/core-js/internals/inherit-if-required.js +var inherit_if_required_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var isCallable = (is_callable_namespaceFn()); +var isObject = (is_object_namespaceFn()); +var setPrototypeOf = (object_set_prototype_of_namespaceFn()); + +// makes subclassing work correct for wrapped built-ins +module.exports = function ($this, dummy, Wrapper) { + var NewTarget, NewTargetPrototype; + if ( + // it can work only with native `setPrototypeOf` + setPrototypeOf && + // we haven't completely correct pre-ES6 way for getting `new.target`, so use this + isCallable(NewTarget = dummy.constructor) && + NewTarget !== Wrapper && + isObject(NewTargetPrototype = NewTarget.prototype) && + NewTargetPrototype !== Wrapper.prototype + ) setPrototypeOf($this, NewTargetPrototype); + return $this; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/inspect-source.js +var inspect_source_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); +var store = (shared_store_namespaceFn()); + +var functionToString = uncurryThis(Function.toString); + +// this helper broken in `core-js@3.4.1-3.4.4`, so we can't use `shared` helper +if (!isCallable(store.inspectSource)) { + store.inspectSource = function (it) { + return functionToString(it); + }; +} + +module.exports = store.inspectSource; + +}); + +// MODULE: ./node_modules/core-js/internals/internal-state.js +var internal_state_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var NATIVE_WEAK_MAP = (weak_map_basic_detection_namespaceFn()); +var globalThis = (global_this_namespaceFn()); +var isObject = (is_object_namespaceFn()); +var createNonEnumerableProperty = (create_non_enumerable_property_namespaceFn()); +var hasOwn = (has_own_property_namespaceFn()); +var shared = (shared_store_namespaceFn()); +var sharedKey = (shared_key_namespaceFn()); +var hiddenKeys = (hidden_keys_namespaceFn()); + +var OBJECT_ALREADY_INITIALIZED = 'Object already initialized'; +var TypeError = globalThis.TypeError; +var WeakMap = globalThis.WeakMap; +var set, get, has; + +var enforce = function (it) { + return has(it) ? get(it) : set(it, {}); +}; + +var getterFor = function (TYPE) { + return function (it) { + var state; + if (!isObject(it) || (state = get(it)).type !== TYPE) { + throw new TypeError('Incompatible receiver, ' + TYPE + ' required'); + } return state; + }; +}; + +if (NATIVE_WEAK_MAP || shared.state) { + var store = shared.state || (shared.state = new WeakMap()); + /* eslint-disable no-self-assign -- prototype methods protection */ + store.get = store.get; + store.has = store.has; + store.set = store.set; + /* eslint-enable no-self-assign -- prototype methods protection */ + set = function (it, metadata) { + if (store.has(it)) throw new TypeError(OBJECT_ALREADY_INITIALIZED); + metadata.facade = it; + store.set(it, metadata); + return metadata; + }; + get = function (it) { + return store.get(it) || {}; + }; + has = function (it) { + return store.has(it); + }; +} else { + var STATE = sharedKey('state'); + hiddenKeys[STATE] = true; + set = function (it, metadata) { + if (hasOwn(it, STATE)) throw new TypeError(OBJECT_ALREADY_INITIALIZED); + metadata.facade = it; + createNonEnumerableProperty(it, STATE, metadata); + return metadata; + }; + get = function (it) { + return hasOwn(it, STATE) ? it[STATE] : {}; + }; + has = function (it) { + return hasOwn(it, STATE); + }; +} + +module.exports = { + set: set, + get: get, + has: has, + enforce: enforce, + getterFor: getterFor +}; + +}); + +// MODULE: ./node_modules/core-js/internals/is-array-iterator-method.js +var is_array_iterator_method_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var wellKnownSymbol = (well_known_symbol_namespaceFn()); +var Iterators = (iterators_namespaceFn()); + +var ITERATOR = wellKnownSymbol('iterator'); +var ArrayPrototype = Array.prototype; + +// check on default Array iterator +module.exports = function (it) { + return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/is-array.js +var is_array_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var classof = (classof_raw_namespaceFn()); + +// `IsArray` abstract operation +// https://tc39.es/ecma262/#sec-isarray +// eslint-disable-next-line es/no-array-isarray -- safe +module.exports = Array.isArray || function isArray(argument) { + return classof(argument) === 'Array'; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/is-big-int-array.js +var is_big_int_array_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var classof = (classof_namespaceFn()); + +module.exports = function (it) { + var klass = classof(it); + return klass === 'BigInt64Array' || klass === 'BigUint64Array'; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/is-callable.js +var is_callable_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot +var documentAll = typeof document == 'object' && document.all; + +// `IsCallable` abstract operation +// https://tc39.es/ecma262/#sec-iscallable +// eslint-disable-next-line unicorn/no-typeof-undefined -- required for testing +module.exports = typeof documentAll == 'undefined' && documentAll !== undefined ? function (argument) { + return typeof argument == 'function' || argument === documentAll; +} : function (argument) { + return typeof argument == 'function'; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/is-forced.js +var is_forced_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var fails = (fails_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); + +var replacement = /#|\.prototype\./; + +var isForced = function (feature, detection) { + var value = data[normalize(feature)]; + return value === POLYFILL ? true + : value === NATIVE ? false + : isCallable(detection) ? fails(detection) + : !!detection; +}; + +var normalize = isForced.normalize = function (string) { + return String(string).replace(replacement, '.').toLowerCase(); +}; + +var data = isForced.data = {}; +var NATIVE = isForced.NATIVE = 'N'; +var POLYFILL = isForced.POLYFILL = 'P'; + +module.exports = isForced; + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/is-null-or-undefined.js +var is_null_or_undefined_namespaceFn = () => { + return __webpack_require__(117); +}; + +// MODULE: ./node_modules/core-js/internals/is-object.js +var is_object_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var isCallable = (is_callable_namespaceFn()); + +module.exports = function (it) { + return typeof it == 'object' ? it !== null : isCallable(it); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/is-possible-prototype.js +var is_possible_prototype_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var isObject = (is_object_namespaceFn()); + +module.exports = function (argument) { + return isObject(argument) || argument === null; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/is-pure.js +var is_pure_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +module.exports = false; + +}); + +// MODULE: ./node_modules/core-js/internals/is-raw-json.js +var is_raw_json_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var isObject = (is_object_namespaceFn()); +var getInternalState = (internal_state_namespaceFn().get); + +module.exports = function isRawJSON(O) { + if (!isObject(O)) return false; + var state = getInternalState(O); + return !!state && state.type === 'RawJSON'; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/is-symbol.js +var is_symbol_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var getBuiltIn = (get_built_in_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); +var isPrototypeOf = (object_is_prototype_of_namespaceFn()); +var USE_SYMBOL_AS_UID = (use_symbol_as_uid_namespaceFn()); + +var $Object = Object; + +module.exports = USE_SYMBOL_AS_UID ? function (it) { + return typeof it == 'symbol'; +} : function (it) { + var $Symbol = getBuiltIn('Symbol'); + return isCallable($Symbol) && isPrototypeOf($Symbol.prototype, $Object(it)); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/iterate-simple.js +var iterate_simple_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var call = (function_call_namespaceFn()); + +module.exports = function (record, fn, ITERATOR_INSTEAD_OF_RECORD) { + var iterator = ITERATOR_INSTEAD_OF_RECORD ? record : record.iterator; + var next = record.next; + var step, result; + while (!(step = call(next, iterator)).done) { + result = fn(step.value); + if (result !== undefined) return result; + } +}; + +}); + +// MODULE: ./node_modules/core-js/internals/iterate.js +var iterate_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var bind = (function_bind_context_namespaceFn()); +var call = (function_call_namespaceFn()); +var anObject = (an_object_namespaceFn()); +var tryToString = (try_to_string_namespaceFn()); +var isArrayIteratorMethod = (is_array_iterator_method_namespaceFn()); +var lengthOfArrayLike = (length_of_array_like_namespaceFn()); +var isPrototypeOf = (object_is_prototype_of_namespaceFn()); +var getIterator = (get_iterator_internal_namespaceFn()); +var getIteratorMethod = (get_iterator_method_internal_namespaceFn()); +var iteratorClose = (iterator_close_namespaceFn()); + +var $TypeError = TypeError; + +var Result = function (stopped, result) { + this.stopped = stopped; + this.result = result; +}; + +var ResultPrototype = Result.prototype; + +module.exports = function (iterable, unboundFunction, options) { + var that = options && options.that; + var AS_ENTRIES = !!(options && options.AS_ENTRIES); + var IS_RECORD = !!(options && options.IS_RECORD); + var IS_ITERATOR = !!(options && options.IS_ITERATOR); + var INTERRUPTED = !!(options && options.INTERRUPTED); + var fn = bind(unboundFunction, that); + var iterator, iterFn, index, length, result, next, step; + + var stop = function (condition) { + var $iterator = iterator; + iterator = undefined; + if ($iterator) iteratorClose($iterator, 'normal'); + return new Result(true, condition); + }; + + var callFn = function (value) { + if (AS_ENTRIES) { + anObject(value); + return INTERRUPTED ? fn(value[0], value[1], stop) : fn(value[0], value[1]); + } return INTERRUPTED ? fn(value, stop) : fn(value); + }; + + if (IS_RECORD) { + iterator = iterable.iterator; + } else if (IS_ITERATOR) { + iterator = iterable; + } else { + iterFn = getIteratorMethod(iterable); + if (!iterFn) throw new $TypeError(tryToString(iterable) + ' is not iterable'); + // optimisation for array iterators + if (isArrayIteratorMethod(iterFn)) { + for (index = 0, length = lengthOfArrayLike(iterable); length > index; index++) { + result = callFn(iterable[index]); + if (result && isPrototypeOf(ResultPrototype, result)) return result; + } return new Result(false); + } + iterator = getIterator(iterable, iterFn); + } + + next = IS_RECORD ? iterable.next : iterator.next; + while (!(step = call(next, iterator)).done) { + // `IteratorValue` errors should propagate without closing the iterator + var value = step.value; + try { + result = callFn(value); + } catch (error) { + if (iterator) iteratorClose(iterator, 'throw', error); + else throw error; + } + if (typeof result == 'object' && result && isPrototypeOf(ResultPrototype, result)) return result; + } return new Result(false); +}; + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/iterator-cleanup-state.js +var iterator_cleanup_state_namespaceFn = () => { + return __webpack_require__(859); +}; + +// MODULE: ./node_modules/core-js/internals/iterator-close-all.js +var iterator_close_all_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var iteratorClose = (iterator_close_namespaceFn()); + +module.exports = function (iters, kind, value) { + for (var i = iters.length - 1; i >= 0; i--) { + if (iters[i] === undefined) continue; + try { + value = iteratorClose(iters[i].iterator, kind, value); + } catch (error) { + kind = 'throw'; + value = error; + } + } + if (kind === 'throw') throw value; + return value; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/iterator-close.js +var iterator_close_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var call = (function_call_namespaceFn()); +var anObject = (an_object_namespaceFn()); +var getMethod = (get_method_namespaceFn()); + +module.exports = function (iterator, kind, value) { + var innerResult, innerError; + anObject(iterator); + try { + innerResult = getMethod(iterator, 'return'); + if (!innerResult) { + if (kind === 'throw') throw value; + return value; + } + innerResult = call(innerResult, iterator); + } catch (error) { + innerError = true; + innerResult = error; + } + if (kind === 'throw') throw value; + if (innerError) throw innerResult; + anObject(innerResult); + return value; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/iterator-create-proxy.js +var iterator_create_proxy_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var call = (function_call_namespaceFn()); +var create = (object_create_namespaceFn()); +var createNonEnumerableProperty = (create_non_enumerable_property_namespaceFn()); +var defineBuiltIns = (define_built_ins_namespaceFn()); +var wellKnownSymbol = (well_known_symbol_namespaceFn()); +var InternalStateModule = (internal_state_namespaceFn()); +var getMethod = (get_method_namespaceFn()); +var IteratorPrototype = (iterators_core_namespaceFn().IteratorPrototype); +var createIterResultObject = (create_iter_result_object_namespaceFn()); +var iteratorClose = (iterator_close_namespaceFn()); +var iteratorCloseAll = (iterator_close_all_namespaceFn()); +var cleanupState = (iterator_cleanup_state_namespaceFn()); + +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); +var ITERATOR_HELPER = 'IteratorHelper'; +var WRAP_FOR_VALID_ITERATOR = 'WrapForValidIterator'; +var NORMAL = 'normal'; +var THROW = 'throw'; +var setInternalState = InternalStateModule.set; + +var createIteratorProxyPrototype = function (IS_ITERATOR) { + var getInternalState = InternalStateModule.getterFor(IS_ITERATOR ? WRAP_FOR_VALID_ITERATOR : ITERATOR_HELPER); + + return defineBuiltIns(create(IteratorPrototype), { + next: function next() { + var state = getInternalState(this); + // for simplification: + // for `%WrapForValidIteratorPrototype%.next` or with `state.returnHandlerResult` our `nextHandler` returns `IterResultObject` + // for `%IteratorHelperPrototype%.next` - just a value + if (IS_ITERATOR) return state.nextHandler(); + if (state.done) return createIterResultObject(undefined, true); + try { + var result = state.nextHandler(); + if (state.done) cleanupState(state); + return state.returnHandlerResult ? result : createIterResultObject(result, state.done); + } catch (error) { + state.done = true; + cleanupState(state); + throw error; + } + }, + 'return': function () { + var state = getInternalState(this); + var iterator = state.iterator; + var inner = state.inner; + var openIters = state.openIters; + var done = state.done; + state.done = true; + if (IS_ITERATOR) { + var returnMethod = getMethod(iterator, 'return'); + return returnMethod ? call(returnMethod, iterator) : createIterResultObject(undefined, true); + } + cleanupState(state); + if (done) return createIterResultObject(undefined, true); + if (inner) try { + iteratorClose(inner.iterator, NORMAL); + } catch (error) { + return iteratorClose(iterator, THROW, error); + } + if (openIters) try { + iteratorCloseAll(openIters, NORMAL); + } catch (error) { + if (iterator) return iteratorClose(iterator, THROW, error); + throw error; + } + if (iterator) iteratorClose(iterator, NORMAL); + return createIterResultObject(undefined, true); + } + }); +}; + +var WrapForValidIteratorPrototype = createIteratorProxyPrototype(true); +var IteratorHelperPrototype = createIteratorProxyPrototype(false); + +createNonEnumerableProperty(IteratorHelperPrototype, TO_STRING_TAG, 'Iterator Helper'); + +module.exports = function (nextHandler, IS_ITERATOR, RETURN_HANDLER_RESULT) { + var IteratorProxy = function Iterator(record, state) { + if (state) { + state.iterator = record.iterator; + state.next = record.next; + } else state = record; + state.type = IS_ITERATOR ? WRAP_FOR_VALID_ITERATOR : ITERATOR_HELPER; + state.returnHandlerResult = !!RETURN_HANDLER_RESULT; + state.nextHandler = nextHandler; + state.counter = 0; + state.done = false; + setInternalState(this, state); + }; + + IteratorProxy.prototype = IS_ITERATOR ? WrapForValidIteratorPrototype : IteratorHelperPrototype; + + return IteratorProxy; +}; + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/iterator-helper-throws-on-invalid-iterator.js +var iterator_helper_throws_on_invalid_iterator_namespaceFn = () => { + return __webpack_require__(684); +}; + +// MODULE: ./node_modules/core-js/internals/iterator-helper-without-closing-on-early-error.js +var iterator_helper_without_closing_on_early_error_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var globalThis = (global_this_namespaceFn()); + +// https://github.com/tc39/ecma262/pull/3467 +module.exports = function (METHOD_NAME, ExpectedError) { + var Iterator = globalThis.Iterator; + var IteratorPrototype = Iterator && Iterator.prototype; + var method = IteratorPrototype && IteratorPrototype[METHOD_NAME]; + + var CLOSED = false; + + if (method) try { + method.call({ + next: function () { return { done: true }; }, + 'return': function () { CLOSED = true; } + }, -1); + } catch (error) { + // https://bugs.webkit.org/show_bug.cgi?id=291195 + if (!(error instanceof ExpectedError)) CLOSED = false; + } + + if (!CLOSED) return method; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/iterators-core.js +var iterators_core_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var fails = (fails_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); +var isObject = (is_object_namespaceFn()); +var create = (object_create_namespaceFn()); +var getPrototypeOf = (object_get_prototype_of_namespaceFn()); +var defineBuiltIn = (define_built_in_namespaceFn()); +var wellKnownSymbol = (well_known_symbol_namespaceFn()); +var IS_PURE = (is_pure_namespaceFn()); + +var ITERATOR = wellKnownSymbol('iterator'); +var BUGGY_SAFARI_ITERATORS = false; + +// `%IteratorPrototype%` object +// https://tc39.es/ecma262/#sec-%iteratorprototype%-object +var IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator; + +/* eslint-disable es/no-array-prototype-keys -- safe */ +if ([].keys) { + arrayIterator = [].keys(); + // Safari 8 has buggy iterators w/o `next` + if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true; + else { + PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator)); + if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype; + } +} + +var NEW_ITERATOR_PROTOTYPE = !isObject(IteratorPrototype) || fails(function () { + var test = {}; + // FF44- legacy iterators case + return IteratorPrototype[ITERATOR].call(test) !== test; +}); + +if (NEW_ITERATOR_PROTOTYPE) IteratorPrototype = {}; +else if (IS_PURE) IteratorPrototype = create(IteratorPrototype); + +// `%IteratorPrototype%[@@iterator]()` method +// https://tc39.es/ecma262/#sec-%iteratorprototype%-@@iterator +if (!isCallable(IteratorPrototype[ITERATOR])) { + defineBuiltIn(IteratorPrototype, ITERATOR, function () { + return this; + }); +} + +module.exports = { + IteratorPrototype: IteratorPrototype, + ...(/* unused pure expression */ null && (BUGGY_SAFARI_ITERATORS)) +}; + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/iterators.js +var iterators_namespaceFn = () => { + return __webpack_require__(269); +}; + +// MODULE: ./node_modules/core-js/internals/length-of-array-like.js +var length_of_array_like_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var toLength = (to_length_namespaceFn()); + +// `LengthOfArrayLike` abstract operation +// https://tc39.es/ecma262/#sec-lengthofarraylike +module.exports = function (obj) { + return toLength(obj.length); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/make-built-in.js +var make_built_in_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); +var fails = (fails_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); +var hasOwn = (has_own_property_namespaceFn()); +var DESCRIPTORS = (descriptors_namespaceFn()); +var CONFIGURABLE_FUNCTION_NAME = (function_name_namespaceFn().CONFIGURABLE); +var inspectSource = (inspect_source_namespaceFn()); +var InternalStateModule = (internal_state_namespaceFn()); + +var enforceInternalState = InternalStateModule.enforce; +var getInternalState = InternalStateModule.get; +var $String = String; +// eslint-disable-next-line es/no-object-defineproperty -- safe +var defineProperty = Object.defineProperty; +var stringSlice = uncurryThis(''.slice); +var replace = uncurryThis(''.replace); +var join = uncurryThis([].join); + +var CONFIGURABLE_LENGTH = DESCRIPTORS && !fails(function () { + return defineProperty(function () { /* empty */ }, 'length', { value: 8 }).length !== 8; +}); + +var TEMPLATE = String(String).split('String'); + +var makeBuiltIn = module.exports = function (value, name, options) { + if (stringSlice($String(name), 0, 7) === 'Symbol(') { + name = '[' + replace($String(name), /^Symbol\(([^)]*)\).*$/, '$1') + ']'; + } + if (options && options.getter) name = 'get ' + name; + if (options && options.setter) name = 'set ' + name; + if (!hasOwn(value, 'name') || (CONFIGURABLE_FUNCTION_NAME && value.name !== name)) { + if (DESCRIPTORS) defineProperty(value, 'name', { value: name, configurable: true }); + else value.name = name; + } + if (CONFIGURABLE_LENGTH && options && hasOwn(options, 'arity') && value.length !== options.arity) { + defineProperty(value, 'length', { value: options.arity }); + } + try { + if (options && hasOwn(options, 'constructor') && options.constructor) { + if (DESCRIPTORS) defineProperty(value, 'prototype', { writable: false }); + // in V8 ~ Chrome 53, prototypes of some methods, like `Array.prototype.values`, are non-writable + } else if (value.prototype) value.prototype = undefined; + } catch (error) { /* empty */ } + var state = enforceInternalState(value); + if (!hasOwn(state, 'source')) { + state.source = join(TEMPLATE, typeof name == 'string' ? name : ''); + } return value; +}; + +// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative +// eslint-disable-next-line no-extend-native -- required +Function.prototype.toString = makeBuiltIn(function toString() { + return isCallable(this) && getInternalState(this).source || inspectSource(this); +}, 'toString'); + +}); + +// MODULE: ./node_modules/core-js/internals/map-helpers.js +var map_helpers_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); + +// eslint-disable-next-line es/no-map -- safe +var MapPrototype = Map.prototype; + +module.exports = { + // eslint-disable-next-line es/no-map -- safe + Map: Map, + set: uncurryThis(MapPrototype.set), + get: uncurryThis(MapPrototype.get), + has: uncurryThis(MapPrototype.has), + remove: uncurryThis(MapPrototype['delete']), + proto: MapPrototype +}; + +}); + +// MODULE: ./node_modules/core-js/internals/native-raw-json.js +var native_raw_json_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +/* eslint-disable es/no-json -- safe */ +var fails = (fails_namespaceFn()); + +module.exports = !fails(function () { + var unsafeInt = '9007199254740993'; + // eslint-disable-next-line es/no-json-rawjson -- feature detection + var raw = JSON.rawJSON(unsafeInt); + // eslint-disable-next-line es/no-json-israwjson -- feature detection + return !JSON.isRawJSON(raw) || JSON.stringify(raw) !== unsafeInt; +}); + +}); + +// MODULE: ./node_modules/core-js/internals/new-promise-capability.js +var new_promise_capability_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var aCallable = (a_callable_namespaceFn()); + +var $TypeError = TypeError; + +var PromiseCapability = function (C) { + var resolve, reject; + this.promise = new C(function ($$resolve, $$reject) { + if (resolve !== undefined || reject !== undefined) throw new $TypeError('Bad Promise constructor'); + resolve = $$resolve; + reject = $$reject; + }); + this.resolve = aCallable(resolve); + this.reject = aCallable(reject); +}; + +// `NewPromiseCapability` abstract operation +// https://tc39.es/ecma262/#sec-newpromisecapability +module.exports.f = function (C) { + return new PromiseCapability(C); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/normalize-string-argument.js +var normalize_string_argument_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var toString = (to_string_namespaceFn()); + +module.exports = function (argument, $default) { + return argument === undefined ? arguments.length < 2 ? '' : $default : toString(argument); +}; + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/not-a-nan.js +var not_a_nan_namespaceFn = () => { + return __webpack_require__(149); +}; + +// MODULE: ./node_modules/core-js/internals/object-create.js +var object_create_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +/* global ActiveXObject -- old IE, WSH */ +var anObject = (an_object_namespaceFn()); +var definePropertiesModule = (object_define_properties_namespaceFn()); +var enumBugKeys = (enum_bug_keys_namespaceFn()); +var hiddenKeys = (hidden_keys_namespaceFn()); +var html = (html_namespaceFn()); +var documentCreateElement = (document_create_element_namespaceFn()); +var sharedKey = (shared_key_namespaceFn()); + +var GT = '>'; +var LT = '<'; +var PROTOTYPE = 'prototype'; +var SCRIPT = 'script'; +var IE_PROTO = sharedKey('IE_PROTO'); + +var EmptyConstructor = function () { /* empty */ }; + +var scriptTag = function (content) { + return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT; +}; + +// Create object with fake `null` prototype: use ActiveX Object with cleared prototype +var NullProtoObjectViaActiveX = function (activeXDocument) { + activeXDocument.write(scriptTag('')); + activeXDocument.close(); + var temp = activeXDocument.parentWindow.Object; + // eslint-disable-next-line no-useless-assignment -- avoid memory leak + activeXDocument = null; + return temp; +}; + +// Create object with fake `null` prototype: use iframe Object with cleared prototype +var NullProtoObjectViaIFrame = function () { + // Thrash, waste and sodomy: IE GC bug + var iframe = documentCreateElement('iframe'); + var JS = 'java' + SCRIPT + ':'; + var iframeDocument; + iframe.style.display = 'none'; + html.appendChild(iframe); + // https://github.com/zloirock/core-js/issues/475 + iframe.src = String(JS); + iframeDocument = iframe.contentWindow.document; + iframeDocument.open(); + iframeDocument.write(scriptTag('document.F=Object')); + iframeDocument.close(); + return iframeDocument.F; +}; + +// Check for document.domain and active x support +// No need to use active x approach when document.domain is not set +// see https://github.com/es-shims/es5-shim/issues/150 +// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346 +// avoid IE GC bug +var activeXDocument; +var NullProtoObject = function () { + try { + activeXDocument = new ActiveXObject('htmlfile'); + } catch (error) { /* ignore */ } + NullProtoObject = typeof document != 'undefined' + ? document.domain && activeXDocument + ? NullProtoObjectViaActiveX(activeXDocument) // old IE + : NullProtoObjectViaIFrame() + : NullProtoObjectViaActiveX(activeXDocument); // WSH + var length = enumBugKeys.length; + while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]]; + return NullProtoObject(); +}; + +hiddenKeys[IE_PROTO] = true; + +// `Object.create` method +// https://tc39.es/ecma262/#sec-object.create +// eslint-disable-next-line es/no-object-create -- safe +module.exports = Object.create || function create(O, Properties) { + var result; + if (O !== null) { + EmptyConstructor[PROTOTYPE] = anObject(O); + result = new EmptyConstructor(); + EmptyConstructor[PROTOTYPE] = null; + // add "__proto__" for Object.getPrototypeOf polyfill + result[IE_PROTO] = O; + } else result = NullProtoObject(); + return Properties === undefined ? result : definePropertiesModule.f(result, Properties); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/object-define-properties.js +var object_define_properties_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var DESCRIPTORS = (descriptors_namespaceFn()); +var V8_PROTOTYPE_DEFINE_BUG = (v8_prototype_define_bug_namespaceFn()); +var definePropertyModule = (object_define_property_namespaceFn()); +var anObject = (an_object_namespaceFn()); +var toIndexedObject = (to_indexed_object_namespaceFn()); +var objectKeys = (object_keys_namespaceFn()); + +// `Object.defineProperties` method +// https://tc39.es/ecma262/#sec-object.defineproperties +// eslint-disable-next-line es/no-object-defineproperties -- safe +exports.f = DESCRIPTORS && !V8_PROTOTYPE_DEFINE_BUG ? Object.defineProperties : function defineProperties(O, Properties) { + anObject(O); + var props = toIndexedObject(Properties); + var keys = objectKeys(Properties); + var length = keys.length; + var index = 0; + var key; + while (length > index) definePropertyModule.f(O, key = keys[index++], props[key]); + return O; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/object-define-property.js +var object_define_property_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var DESCRIPTORS = (descriptors_namespaceFn()); +var IE8_DOM_DEFINE = (ie8_dom_define_namespaceFn()); +var V8_PROTOTYPE_DEFINE_BUG = (v8_prototype_define_bug_namespaceFn()); +var anObject = (an_object_namespaceFn()); +var toPropertyKey = (to_property_key_namespaceFn()); + +var $TypeError = TypeError; +// eslint-disable-next-line es/no-object-defineproperty -- safe +var $defineProperty = Object.defineProperty; +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; +var ENUMERABLE = 'enumerable'; +var CONFIGURABLE = 'configurable'; +var WRITABLE = 'writable'; + +// `Object.defineProperty` method +// https://tc39.es/ecma262/#sec-object.defineproperty +exports.f = DESCRIPTORS ? V8_PROTOTYPE_DEFINE_BUG ? function defineProperty(O, P, Attributes) { + anObject(O); + P = toPropertyKey(P); + anObject(Attributes); + if (typeof O === 'function' && P === 'prototype' && 'value' in Attributes && WRITABLE in Attributes && !Attributes[WRITABLE]) { + var current = $getOwnPropertyDescriptor(O, P); + if (current && current[WRITABLE]) { + O[P] = Attributes.value; + Attributes = { + configurable: CONFIGURABLE in Attributes ? Attributes[CONFIGURABLE] : current[CONFIGURABLE], + enumerable: ENUMERABLE in Attributes ? Attributes[ENUMERABLE] : current[ENUMERABLE], + writable: false + }; + } + } return $defineProperty(O, P, Attributes); +} : $defineProperty : function defineProperty(O, P, Attributes) { + anObject(O); + P = toPropertyKey(P); + anObject(Attributes); + if (IE8_DOM_DEFINE) try { + return $defineProperty(O, P, Attributes); + } catch (error) { /* empty */ } + if ('get' in Attributes || 'set' in Attributes) throw new $TypeError('Accessors not supported'); + if ('value' in Attributes) O[P] = Attributes.value; + return O; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/object-get-own-property-descriptor.js +var object_get_own_property_descriptor_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var DESCRIPTORS = (descriptors_namespaceFn()); +var call = (function_call_namespaceFn()); +var propertyIsEnumerableModule = (object_property_is_enumerable_namespaceFn()); +var createPropertyDescriptor = (create_property_descriptor_namespaceFn()); +var toIndexedObject = (to_indexed_object_namespaceFn()); +var toPropertyKey = (to_property_key_namespaceFn()); +var hasOwn = (has_own_property_namespaceFn()); +var IE8_DOM_DEFINE = (ie8_dom_define_namespaceFn()); + +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; + +// `Object.getOwnPropertyDescriptor` method +// https://tc39.es/ecma262/#sec-object.getownpropertydescriptor +exports.f = DESCRIPTORS ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) { + O = toIndexedObject(O); + P = toPropertyKey(P); + if (IE8_DOM_DEFINE) try { + return $getOwnPropertyDescriptor(O, P); + } catch (error) { /* empty */ } + if (hasOwn(O, P)) return createPropertyDescriptor(!call(propertyIsEnumerableModule.f, O, P), O[P]); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/object-get-own-property-names.js +var object_get_own_property_names_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var internalObjectKeys = (object_keys_internal_namespaceFn()); +var enumBugKeys = (enum_bug_keys_namespaceFn()); + +var hiddenKeys = enumBugKeys.concat('length', 'prototype'); + +// `Object.getOwnPropertyNames` method +// https://tc39.es/ecma262/#sec-object.getownpropertynames +// eslint-disable-next-line es/no-object-getownpropertynames -- safe +exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) { + return internalObjectKeys(O, hiddenKeys); +}; + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/object-get-own-property-symbols.js +var object_get_own_property_symbols_namespaceFn = () => { + return __webpack_require__(717); +}; + +// MODULE: ./node_modules/core-js/internals/object-get-prototype-of.js +var object_get_prototype_of_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var hasOwn = (has_own_property_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); +var toObject = (to_object_namespaceFn()); +var sharedKey = (shared_key_namespaceFn()); +var CORRECT_PROTOTYPE_GETTER = (correct_prototype_getter_namespaceFn()); + +var IE_PROTO = sharedKey('IE_PROTO'); +var $Object = Object; +var ObjectPrototype = $Object.prototype; + +// `Object.getPrototypeOf` method +// https://tc39.es/ecma262/#sec-object.getprototypeof +// eslint-disable-next-line es/no-object-getprototypeof -- safe +module.exports = CORRECT_PROTOTYPE_GETTER ? $Object.getPrototypeOf : function (O) { + var object = toObject(O); + if (hasOwn(object, IE_PROTO)) return object[IE_PROTO]; + var constructor = object.constructor; + if (isCallable(constructor) && object instanceof constructor) { + return constructor.prototype; + } return object instanceof $Object ? ObjectPrototype : null; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/object-is-prototype-of.js +var object_is_prototype_of_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); + +module.exports = uncurryThis({}.isPrototypeOf); + +}); + +// MODULE: ./node_modules/core-js/internals/object-keys-internal.js +var object_keys_internal_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); +var hasOwn = (has_own_property_namespaceFn()); +var toIndexedObject = (to_indexed_object_namespaceFn()); +var indexOf = (array_includes_namespaceFn().indexOf); +var hiddenKeys = (hidden_keys_namespaceFn()); + +var push = uncurryThis([].push); + +module.exports = function (object, names) { + var O = toIndexedObject(object); + var i = 0; + var result = []; + var key; + for (key in O) !hasOwn(hiddenKeys, key) && hasOwn(O, key) && push(result, key); + // Don't enum bug & hidden keys + while (names.length > i) if (hasOwn(O, key = names[i++])) { + ~indexOf(result, key) || push(result, key); + } + return result; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/object-keys.js +var object_keys_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var internalObjectKeys = (object_keys_internal_namespaceFn()); +var enumBugKeys = (enum_bug_keys_namespaceFn()); + +// `Object.keys` method +// https://tc39.es/ecma262/#sec-object.keys +// eslint-disable-next-line es/no-object-keys -- safe +module.exports = Object.keys || function keys(O) { + return internalObjectKeys(O, enumBugKeys); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/object-property-is-enumerable.js +var object_property_is_enumerable_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $propertyIsEnumerable = {}.propertyIsEnumerable; +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; + +// Nashorn ~ JDK8 bug +var NASHORN_BUG = getOwnPropertyDescriptor && !$propertyIsEnumerable.call({ 1: 2 }, 1); + +// `Object.prototype.propertyIsEnumerable` method implementation +// https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable +exports.f = NASHORN_BUG ? function propertyIsEnumerable(V) { + var descriptor = getOwnPropertyDescriptor(this, V); + return !!descriptor && descriptor.enumerable; +} : $propertyIsEnumerable; + +}); + +// MODULE: ./node_modules/core-js/internals/object-set-prototype-of.js +var object_set_prototype_of_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +/* eslint-disable no-proto -- safe */ +var uncurryThisAccessor = (function_uncurry_this_accessor_namespaceFn()); +var isObject = (is_object_namespaceFn()); +var requireObjectCoercible = (require_object_coercible_namespaceFn()); +var aPossiblePrototype = (a_possible_prototype_namespaceFn()); + +// `Object.setPrototypeOf` method +// https://tc39.es/ecma262/#sec-object.setprototypeof +// Works with __proto__ only. Old v8 can't work with null proto objects. +// eslint-disable-next-line es/no-object-setprototypeof -- safe +module.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () { + var CORRECT_SETTER = false; + var test = {}; + var setter; + try { + setter = uncurryThisAccessor(Object.prototype, '__proto__', 'set'); + setter(test, []); + CORRECT_SETTER = test instanceof Array; + } catch (error) { /* empty */ } + return function setPrototypeOf(O, proto) { + requireObjectCoercible(O); + aPossiblePrototype(proto); + if (!isObject(O)) return O; + if (CORRECT_SETTER) setter(O, proto); + else O.__proto__ = proto; + return O; + }; +}() : undefined); + +}); + +// MODULE: ./node_modules/core-js/internals/ordinary-to-primitive.js +var ordinary_to_primitive_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var call = (function_call_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); +var isObject = (is_object_namespaceFn()); + +var $TypeError = TypeError; + +// `OrdinaryToPrimitive` abstract operation +// https://tc39.es/ecma262/#sec-ordinarytoprimitive +module.exports = function (input, pref) { + var fn, val; + if (pref === 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val; + if (isCallable(fn = input.valueOf) && !isObject(val = call(fn, input))) return val; + if (pref !== 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val; + throw new $TypeError("Can't convert object to primitive value"); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/own-keys.js +var own_keys_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var getBuiltIn = (get_built_in_namespaceFn()); +var uncurryThis = (function_uncurry_this_namespaceFn()); +var getOwnPropertyNamesModule = (object_get_own_property_names_namespaceFn()); +var getOwnPropertySymbolsModule = (object_get_own_property_symbols_namespaceFn()); +var anObject = (an_object_namespaceFn()); + +var concat = uncurryThis([].concat); + +// all object keys, includes non-enumerable and symbols +module.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) { + var keys = getOwnPropertyNamesModule.f(anObject(it)); + var getOwnPropertySymbols = getOwnPropertySymbolsModule.f; + return getOwnPropertySymbols ? concat(keys, getOwnPropertySymbols(it)) : keys; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/parse-json-string.js +var parse_json_string_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); +var hasOwn = (has_own_property_namespaceFn()); + +var $SyntaxError = SyntaxError; +var $parseInt = parseInt; +var fromCharCode = String.fromCharCode; +var at = uncurryThis(''.charAt); +var slice = uncurryThis(''.slice); +var exec = uncurryThis(/./.exec); + +var codePoints = { + '\\"': '"', + '\\\\': '\\', + '\\/': '/', + '\\b': '\b', + '\\f': '\f', + '\\n': '\n', + '\\r': '\r', + '\\t': '\t' +}; + +var IS_4_HEX_DIGITS = /^[\da-f]{4}$/i; +// eslint-disable-next-line regexp/no-control-character -- safe +var IS_C0_CONTROL_CODE = /^[\u0000-\u001F]$/; + +module.exports = function (source, i) { + var unterminated = true; + var value = ''; + while (i < source.length) { + var chr = at(source, i); + if (chr === '\\') { + var twoChars = slice(source, i, i + 2); + if (hasOwn(codePoints, twoChars)) { + value += codePoints[twoChars]; + i += 2; + } else if (twoChars === '\\u') { + i += 2; + var fourHexDigits = slice(source, i, i + 4); + if (!exec(IS_4_HEX_DIGITS, fourHexDigits)) throw new $SyntaxError('Bad Unicode escape at: ' + i); + value += fromCharCode($parseInt(fourHexDigits, 16)); + i += 4; + } else throw new $SyntaxError('Unknown escape sequence: "' + twoChars + '"'); + } else if (chr === '"') { + unterminated = false; + i++; + break; + } else { + if (exec(IS_C0_CONTROL_CODE, chr)) throw new $SyntaxError('Bad control character in string literal at: ' + i); + value += chr; + i++; + } + } + if (unterminated) throw new $SyntaxError('Unterminated string at: ' + i); + return { value: value, end: i }; +}; + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/perform.js +var perform_namespaceFn = () => { + return __webpack_require__(103); +}; + +// MODULE: ./node_modules/core-js/internals/promise-resolve.js +var promise_resolve_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var anObject = (an_object_namespaceFn()); +var isObject = (is_object_namespaceFn()); +var newPromiseCapability = (new_promise_capability_namespaceFn()); + +module.exports = function (C, x) { + anObject(C); + if (isObject(x) && x.constructor === C) return x; + var promiseCapability = newPromiseCapability.f(C); + var resolve = promiseCapability.resolve; + resolve(x); + return promiseCapability.promise; +}; + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/require-object-coercible.js +var require_object_coercible_namespaceFn = () => { + return __webpack_require__(750); +}; + +// MODULE: ./node_modules/core-js/internals/set-clone.js +var set_clone_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var SetHelpers = (set_helpers_namespaceFn()); +var iterate = (set_iterate_namespaceFn()); + +var Set = SetHelpers.Set; +var add = SetHelpers.add; + +module.exports = function (set) { + var result = new Set(); + iterate(set, function (it) { + add(result, it); + }); + return result; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/set-difference.js +var set_difference_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var aSet = (a_set_namespaceFn()); +var SetHelpers = (set_helpers_namespaceFn()); +var clone = (set_clone_namespaceFn()); +var size = (set_size_namespaceFn()); +var getSetRecord = (get_set_record_namespaceFn()); +var iterateSet = (set_iterate_namespaceFn()); +var iterateSimple = (iterate_simple_namespaceFn()); + +var has = SetHelpers.has; +var remove = SetHelpers.remove; + +// `Set.prototype.difference` method +// https://tc39.es/ecma262/#sec-set.prototype.difference +module.exports = function difference(other) { + var O = aSet(this); + var otherRec = getSetRecord(other); + var result = clone(O); + if (size(result) <= otherRec.size) iterateSet(result, function (e) { + if (otherRec.includes(e)) remove(result, e); + }); + else iterateSimple(otherRec.getIterator(), function (e) { + if (has(result, e)) remove(result, e); + }); + return result; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/set-helpers.js +var set_helpers_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); + +// eslint-disable-next-line es/no-set -- safe +var SetPrototype = Set.prototype; + +module.exports = { + // eslint-disable-next-line es/no-set -- safe + Set: Set, + add: uncurryThis(SetPrototype.add), + has: uncurryThis(SetPrototype.has), + remove: uncurryThis(SetPrototype['delete']), + proto: SetPrototype +}; + +}); + +// MODULE: ./node_modules/core-js/internals/set-intersection.js +var set_intersection_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var aSet = (a_set_namespaceFn()); +var SetHelpers = (set_helpers_namespaceFn()); +var size = (set_size_namespaceFn()); +var getSetRecord = (get_set_record_namespaceFn()); +var iterateSet = (set_iterate_namespaceFn()); +var iterateSimple = (iterate_simple_namespaceFn()); + +var Set = SetHelpers.Set; +var add = SetHelpers.add; +var has = SetHelpers.has; + +// `Set.prototype.intersection` method +// https://tc39.es/ecma262/#sec-set.prototype.intersection +module.exports = function intersection(other) { + var O = aSet(this); + var otherRec = getSetRecord(other); + var result = new Set(); + + if (size(O) > otherRec.size) { + iterateSimple(otherRec.getIterator(), function (e) { + if (has(O, e)) add(result, e); + }); + } else { + iterateSet(O, function (e) { + if (otherRec.includes(e)) add(result, e); + }); + } + + return result; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/set-is-disjoint-from.js +var set_is_disjoint_from_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var aSet = (a_set_namespaceFn()); +var has = (set_helpers_namespaceFn().has); +var size = (set_size_namespaceFn()); +var getSetRecord = (get_set_record_namespaceFn()); +var iterateSet = (set_iterate_namespaceFn()); +var iterateSimple = (iterate_simple_namespaceFn()); +var iteratorClose = (iterator_close_namespaceFn()); + +// `Set.prototype.isDisjointFrom` method +// https://tc39.es/ecma262/#sec-set.prototype.isdisjointfrom +module.exports = function isDisjointFrom(other) { + var O = aSet(this); + var otherRec = getSetRecord(other); + if (size(O) <= otherRec.size) return iterateSet(O, function (e) { + if (otherRec.includes(e)) return false; + }, true) !== false; + var iterator = otherRec.getIterator(); + return iterateSimple(iterator, function (e) { + if (has(O, e)) return iteratorClose(iterator.iterator, 'normal', false); + }) !== false; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/set-is-subset-of.js +var set_is_subset_of_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var aSet = (a_set_namespaceFn()); +var size = (set_size_namespaceFn()); +var iterate = (set_iterate_namespaceFn()); +var getSetRecord = (get_set_record_namespaceFn()); + +// `Set.prototype.isSubsetOf` method +// https://tc39.es/ecma262/#sec-set.prototype.issubsetof +module.exports = function isSubsetOf(other) { + var O = aSet(this); + var otherRec = getSetRecord(other); + if (size(O) > otherRec.size) return false; + return iterate(O, function (e) { + if (!otherRec.includes(e)) return false; + }, true) !== false; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/set-is-superset-of.js +var set_is_superset_of_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var aSet = (a_set_namespaceFn()); +var has = (set_helpers_namespaceFn().has); +var size = (set_size_namespaceFn()); +var getSetRecord = (get_set_record_namespaceFn()); +var iterateSimple = (iterate_simple_namespaceFn()); +var iteratorClose = (iterator_close_namespaceFn()); + +// `Set.prototype.isSupersetOf` method +// https://tc39.es/ecma262/#sec-set.prototype.issupersetof +module.exports = function isSupersetOf(other) { + var O = aSet(this); + var otherRec = getSetRecord(other); + if (size(O) < otherRec.size) return false; + var iterator = otherRec.getIterator(); + return iterateSimple(iterator, function (e) { + if (!has(O, e)) return iteratorClose(iterator.iterator, 'normal', false); + }) !== false; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/set-iterate.js +var set_iterate_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); +var iterateSimple = (iterate_simple_namespaceFn()); +var SetHelpers = (set_helpers_namespaceFn()); + +var Set = SetHelpers.Set; +var SetPrototype = SetHelpers.proto; +var forEach = uncurryThis(SetPrototype.forEach); +var keys = uncurryThis(SetPrototype.keys); +var next = keys(new Set()).next; + +module.exports = function (set, fn, interruptible) { + return interruptible ? iterateSimple({ iterator: keys(set), next: next }, fn) : forEach(set, fn); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/set-method-accept-set-like.js +var set_method_accept_set_like_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var getBuiltIn = (get_built_in_namespaceFn()); + +var createSetLike = function (size) { + return { + size: size, + has: function () { + return false; + }, + keys: function () { + return { + next: function () { + return { done: true }; + } + }; + } + }; +}; + +var createSetLikeWithInfinitySize = function (size) { + return { + size: size, + has: function () { + return true; + }, + keys: function () { + throw new Error('e'); + } + }; +}; + +module.exports = function (name, callback) { + var Set = getBuiltIn('Set'); + try { + new Set()[name](createSetLike(0)); + try { + // late spec change, early WebKit ~ Safari 17 implementation does not pass it + // https://github.com/tc39/proposal-set-methods/pull/88 + // also covered engines with + // https://bugs.webkit.org/show_bug.cgi?id=272679 + new Set()[name](createSetLike(-1)); + return false; + } catch (error2) { + if (!callback) return true; + // early V8 implementation bug + // https://issues.chromium.org/issues/351332634 + try { + new Set()[name](createSetLikeWithInfinitySize(-Infinity)); + return false; + } catch (error) { + var set = new Set([1, 2]); + return callback(set[name](createSetLikeWithInfinitySize(Infinity))); + } + } + } catch (error) { + return false; + } +}; + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/set-method-get-keys-before-cloning-detection.js +var set_method_get_keys_before_cloning_detection_namespaceFn = () => { + return __webpack_require__(835); +}; + +// MODULE: ./node_modules/core-js/internals/set-size.js +var set_size_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThisAccessor = (function_uncurry_this_accessor_namespaceFn()); +var SetHelpers = (set_helpers_namespaceFn()); + +module.exports = uncurryThisAccessor(SetHelpers.proto, 'size', 'get') || function (set) { + return set.size; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/set-symmetric-difference.js +var set_symmetric_difference_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var aSet = (a_set_namespaceFn()); +var SetHelpers = (set_helpers_namespaceFn()); +var clone = (set_clone_namespaceFn()); +var getSetRecord = (get_set_record_namespaceFn()); +var iterateSimple = (iterate_simple_namespaceFn()); + +var add = SetHelpers.add; +var has = SetHelpers.has; +var remove = SetHelpers.remove; + +// `Set.prototype.symmetricDifference` method +// https://tc39.es/ecma262/#sec-set.prototype.symmetricdifference +module.exports = function symmetricDifference(other) { + var O = aSet(this); + var keysIter = getSetRecord(other).getIterator(); + var result = clone(O); + iterateSimple(keysIter, function (e) { + if (has(O, e)) remove(result, e); + else add(result, e); + }); + return result; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/set-union.js +var set_union_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var aSet = (a_set_namespaceFn()); +var add = (set_helpers_namespaceFn().add); +var clone = (set_clone_namespaceFn()); +var getSetRecord = (get_set_record_namespaceFn()); +var iterateSimple = (iterate_simple_namespaceFn()); + +// `Set.prototype.union` method +// https://tc39.es/ecma262/#sec-set.prototype.union +module.exports = function union(other) { + var O = aSet(this); + var keysIter = getSetRecord(other).getIterator(); + var result = clone(O); + iterateSimple(keysIter, function (it) { + add(result, it); + }); + return result; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/shared-key.js +var shared_key_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var shared = (shared_namespaceFn()); +var uid = (uid_namespaceFn()); + +var keys = shared('keys'); + +module.exports = function (key) { + return keys[key] || (keys[key] = uid(key)); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/shared-store.js +var shared_store_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var IS_PURE = (is_pure_namespaceFn()); +var globalThis = (global_this_namespaceFn()); +var defineGlobalProperty = (define_global_property_namespaceFn()); + +var SHARED = '__core-js_shared__'; +var store = module.exports = globalThis[SHARED] || defineGlobalProperty(SHARED, {}); + +(store.versions || (store.versions = [])).push({ + version: '3.50.0', + mode: IS_PURE ? 'pure' : 'global', + copyright: '© 2013–2025 Denis Pushkarev (zloirock.ru), 2025–2026 CoreJS Company (core-js.io). All rights reserved.', + license: 'https://github.com/zloirock/core-js/blob/v3.50.0/LICENSE', + source: 'https://github.com/zloirock/core-js' +}); + +}); + +// MODULE: ./node_modules/core-js/internals/shared.js +var shared_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var store = (shared_store_namespaceFn()); +// eslint-disable-next-line es/no-object-create -- safe +var create = Object.create || Object; + +module.exports = function (key, value) { + return store[key] || (store[key] = value || create(null)); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/symbol-constructor-detection.js +var symbol_constructor_detection_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +/* eslint-disable es/no-symbol -- required for testing */ +var V8_VERSION = (environment_v8_version_namespaceFn()); +var fails = (fails_namespaceFn()); +var globalThis = (global_this_namespaceFn()); + +var $String = globalThis.String; + +// eslint-disable-next-line es/no-object-getownpropertysymbols -- required for testing +module.exports = !!Object.getOwnPropertySymbols && !fails(function () { + var symbol = Symbol('symbol detection'); + // Chrome 38 Symbol has incorrect toString conversion + // `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances + // nb: Do not call `String` directly to avoid this being optimized out to `symbol+''` which will, + // of course, fail. + return !$String(symbol) || !(Object(symbol) instanceof Symbol) || + // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances + !Symbol.sham && V8_VERSION && V8_VERSION < 41; +}); + +}); + +// MODULE: ./node_modules/core-js/internals/this-number-value.js +var this_number_value_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); + +// `thisNumberValue` abstract operation +// https://tc39.es/ecma262/#sec-thisnumbervalue +module.exports = uncurryThis(1.1.valueOf); + +}); + +// MODULE: ./node_modules/core-js/internals/to-absolute-index.js +var to_absolute_index_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var toIntegerOrInfinity = (to_integer_or_infinity_namespaceFn()); + +var max = Math.max; +var min = Math.min; + +// Helper for a popular repeating case of the spec: +// Let integer be ? ToInteger(index). +// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length). +module.exports = function (index, length) { + var integer = toIntegerOrInfinity(index); + return integer < 0 ? max(integer + length, 0) : min(integer, length); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/to-big-int.js +var to_big_int_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var toPrimitive = (to_primitive_namespaceFn()); + +var $TypeError = TypeError; + +// `ToBigInt` abstract operation +// https://tc39.es/ecma262/#sec-tobigint +module.exports = function (argument) { + var prim = toPrimitive(argument, 'number'); + if (typeof prim == 'number') throw new $TypeError("Can't convert number to bigint"); + // eslint-disable-next-line es/no-bigint -- safe + return BigInt(prim); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/to-indexed-object.js +var to_indexed_object_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +// toObject with fallback for non-array-like ES3 strings +var IndexedObject = (indexed_object_namespaceFn()); +var requireObjectCoercible = (require_object_coercible_namespaceFn()); + +module.exports = function (it) { + return IndexedObject(requireObjectCoercible(it)); +}; + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/to-integer-or-infinity.js +var to_integer_or_infinity_namespaceFn = () => { + return __webpack_require__(291); +}; + +// EXTERNAL MODULE: ./node_modules/core-js/internals/to-length.js +var to_length_namespaceFn = () => { + return __webpack_require__(14); +}; + +// EXTERNAL MODULE: ./node_modules/core-js/internals/to-object.js +var to_object_namespaceFn = () => { + return __webpack_require__(981); +}; + +// EXTERNAL MODULE: ./node_modules/core-js/internals/to-positive-integer.js +var to_positive_integer_namespaceFn = () => { + return __webpack_require__(590); +}; + +// MODULE: ./node_modules/core-js/internals/to-primitive.js +var to_primitive_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var call = (function_call_namespaceFn()); +var isObject = (is_object_namespaceFn()); +var isSymbol = (is_symbol_namespaceFn()); +var getMethod = (get_method_namespaceFn()); +var ordinaryToPrimitive = (ordinary_to_primitive_namespaceFn()); +var wellKnownSymbol = (well_known_symbol_namespaceFn()); + +var $TypeError = TypeError; +var TO_PRIMITIVE = wellKnownSymbol('toPrimitive'); + +// `ToPrimitive` abstract operation +// https://tc39.es/ecma262/#sec-toprimitive +module.exports = function (input, pref) { + if (!isObject(input) || isSymbol(input)) return input; + var exoticToPrim = getMethod(input, TO_PRIMITIVE); + var result; + if (exoticToPrim) { + if (pref === undefined) pref = 'default'; + result = call(exoticToPrim, input, pref); + if (!isObject(result) || isSymbol(result)) return result; + throw new $TypeError("Can't convert object to primitive value"); + } + if (pref === undefined) pref = 'number'; + return ordinaryToPrimitive(input, pref); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/to-property-key.js +var to_property_key_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var toPrimitive = (to_primitive_namespaceFn()); +var isSymbol = (is_symbol_namespaceFn()); + +// `ToPropertyKey` abstract operation +// https://tc39.es/ecma262/#sec-topropertykey +module.exports = function (argument) { + var key = toPrimitive(argument, 'string'); + return isSymbol(key) ? key : key + ''; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/to-string-tag-support.js +var to_string_tag_support_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var wellKnownSymbol = (well_known_symbol_namespaceFn()); + +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); +var test = {}; +// eslint-disable-next-line unicorn/no-immediate-mutation -- ES3 syntax limitation +test[TO_STRING_TAG] = 'z'; + +module.exports = String(test) === '[object z]'; + +}); + +// MODULE: ./node_modules/core-js/internals/to-string.js +var to_string_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var classof = (classof_namespaceFn()); + +var $String = String; + +module.exports = function (argument) { + if (classof(argument) === 'Symbol') throw new TypeError('Cannot convert a Symbol value to a string'); + return $String(argument); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/try-to-string.js +var try_to_string_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $String = String; + +module.exports = function (argument) { + try { + return $String(argument); + } catch (error) { + return 'Object'; + } +}; + +}); + +// MODULE: ./node_modules/core-js/internals/uid.js +var uid_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); + +var id = 0; +var postfix = Math.random(); +var toString = uncurryThis(1.1.toString); + +module.exports = function (key) { + return 'Symbol(' + (key === undefined ? '' : key) + ')_' + toString(++id + postfix, 36); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/uint8-from-base64.js +var uint8_from_base64_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var globalThis = (global_this_namespaceFn()); +var uncurryThis = (function_uncurry_this_namespaceFn()); +var anObjectOrUndefined = (an_object_or_undefined_namespaceFn()); +var aString = (a_string_namespaceFn()); +var hasOwn = (has_own_property_namespaceFn()); +var base64Map = (base64_map_namespaceFn()); +var getAlphabetOption = (get_alphabet_option_namespaceFn()); +var notDetached = (array_buffer_not_detached_namespaceFn()); + +var base64Alphabet = base64Map.c2i; +var base64UrlAlphabet = base64Map.c2iUrl; + +var SyntaxError = globalThis.SyntaxError; +var TypeError = globalThis.TypeError; +var $Array = globalThis.Array; +var at = uncurryThis(''.charAt); +var floor = Math.floor; + +var skipAsciiWhitespace = function (string, index) { + var length = string.length; + for (;index < length; index++) { + var chr = at(string, index); + if (chr !== ' ' && chr !== '\t' && chr !== '\n' && chr !== '\f' && chr !== '\r') break; + } return index; +}; + +var decodeBase64Chunk = function (chunk, alphabet, throwOnExtraBits) { + var chunkLength = chunk.length; + + if (chunkLength < 4) { + chunk += chunkLength === 2 ? 'AA' : 'A'; + } + + var triplet = (alphabet[at(chunk, 0)] << 18) + + (alphabet[at(chunk, 1)] << 12) + + (alphabet[at(chunk, 2)] << 6) + + alphabet[at(chunk, 3)]; + + var chunkBytes = [ + (triplet >> 16) & 255, + (triplet >> 8) & 255, + triplet & 255 + ]; + + if (chunkLength === 2) { + if (throwOnExtraBits && chunkBytes[1] !== 0) { + throw new SyntaxError('Extra bits'); + } + return [chunkBytes[0]]; + } + + if (chunkLength === 3) { + if (throwOnExtraBits && chunkBytes[2] !== 0) { + throw new SyntaxError('Extra bits'); + } + return [chunkBytes[0], chunkBytes[1]]; + } + + return chunkBytes; +}; + +var writeBytes = function (bytes, elements, written) { + var elementsLength = elements.length; + for (var index = 0; index < elementsLength; index++) { + bytes[written + index] = elements[index]; + } + return written + elementsLength; +}; + +/* eslint-disable max-statements, max-depth -- TODO */ +module.exports = function (string, options, into, maxLength) { + aString(string); + anObjectOrUndefined(options); + var alphabet = getAlphabetOption(options) === 'base64' ? base64Alphabet : base64UrlAlphabet; + var lastChunkHandling = options ? options.lastChunkHandling : undefined; + + if (lastChunkHandling === undefined) lastChunkHandling = 'loose'; + + if (lastChunkHandling !== 'loose' && lastChunkHandling !== 'strict' && lastChunkHandling !== 'stop-before-partial') { + throw new TypeError('Incorrect `lastChunkHandling` option'); + } + + if (into) notDetached(into.buffer); + + var stringLength = string.length; + var bytes = into || $Array(floor(stringLength * 3 / 4)); + var written = 0; + var read = 0; + var chunk = ''; + var index = 0; + + if (maxLength) while (true) { + index = skipAsciiWhitespace(string, index); + if (index === stringLength) { + if (chunk.length > 0) { + if (lastChunkHandling === 'stop-before-partial') { + break; + } + if (lastChunkHandling === 'loose') { + if (chunk.length === 1) { + throw new SyntaxError('Malformed padding: exactly one additional character'); + } + written = writeBytes(bytes, decodeBase64Chunk(chunk, alphabet, false), written); + } else { + throw new SyntaxError('Missing padding'); + } + } + read = stringLength; + break; + } + var chr = at(string, index); + ++index; + if (chr === '=') { + if (chunk.length < 2) { + throw new SyntaxError('Padding is too early'); + } + index = skipAsciiWhitespace(string, index); + if (chunk.length === 2) { + if (index === stringLength) { + if (lastChunkHandling === 'stop-before-partial') { + break; + } + throw new SyntaxError('Malformed padding: only one ='); + } + if (at(string, index) === '=') { + ++index; + index = skipAsciiWhitespace(string, index); + } + } + if (index < stringLength) { + throw new SyntaxError('Unexpected character after padding'); + } + written = writeBytes(bytes, decodeBase64Chunk(chunk, alphabet, lastChunkHandling === 'strict'), written); + read = stringLength; + break; + } + if (!hasOwn(alphabet, chr)) { + throw new SyntaxError('Unexpected character'); + } + var remainingBytes = maxLength - written; + if (remainingBytes === 1 && chunk.length === 2 || remainingBytes === 2 && chunk.length === 3) { + // special case: we can fit exactly the number of bytes currently represented by chunk, so we were just checking for `=` + break; + } + + chunk += chr; + if (chunk.length === 4) { + written = writeBytes(bytes, decodeBase64Chunk(chunk, alphabet, false), written); + chunk = ''; + read = index; + if (written === maxLength) { + break; + } + } + } + if (!into) bytes.length = written; + return { bytes: bytes, read: read, written: written }; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/uint8-from-hex.js +var uint8_from_hex_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var globalThis = (global_this_namespaceFn()); +var uncurryThis = (function_uncurry_this_namespaceFn()); + +var Uint8Array = globalThis.Uint8Array; +var SyntaxError = globalThis.SyntaxError; +var min = Math.min; +var stringMatch = uncurryThis(''.match); + +module.exports = function (string, into) { + var stringLength = string.length; + if (stringLength % 2 !== 0) throw new SyntaxError('String should be an even number of characters'); + var maxLength = into ? min(into.length, stringLength / 2) : stringLength / 2; + var bytes = into || new Uint8Array(maxLength); + var segments = stringMatch(string, /[\S\s]{2}/g); + var written = 0; + for (; written < maxLength; written++) { + var result = +('0x' + segments[written] + '0'); + // eslint-disable-next-line no-self-compare -- NaN check + if (result !== result) { + throw new SyntaxError('String should only contain hex characters'); + } + bytes[written] = result >> 4; + } + return { bytes: bytes, read: written << 1 }; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/url-constructor-detection.js +var url_constructor_detection_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var fails = (fails_namespaceFn()); +var wellKnownSymbol = (well_known_symbol_namespaceFn()); +var DESCRIPTORS = (descriptors_namespaceFn()); +var IS_PURE = (is_pure_namespaceFn()); + +var ITERATOR = wellKnownSymbol('iterator'); + +module.exports = !fails(function () { + // eslint-disable-next-line unicorn/relative-url-style -- required for testing + var url = new URL('b?a=1&b=2&c=3', 'https://a'); + var params = url.searchParams; + var params2 = new URLSearchParams('a=1&a=2&b=3'); + var result = ''; + url.pathname = 'c%20d'; + params.forEach(function (value, key) { + params['delete']('b'); + result += key + value; + }); + params2['delete']('a', 2); + // `undefined` case is a Chromium 117 bug + // https://bugs.chromium.org/p/v8/issues/detail?id=14222 + params2['delete']('b', undefined); + return (IS_PURE && (!url.toJSON || !params2.has('a', 1) || params2.has('a', 2) || !params2.has('a', undefined) || params2.has('b'))) + || (!params.size && (IS_PURE || !DESCRIPTORS)) + || !params.sort + || url.href !== 'https://a/c%20d?a=1&c=3' + || params.get('c') !== '3' + || String(new URLSearchParams('?a=1')) !== 'a=1' + || !params[ITERATOR] + // throws in Edge + || new URL('https://a@b').username !== 'a' + || new URLSearchParams(new URLSearchParams('a=b')).get('a') !== 'b' + // not punycoded in Edge + || new URL('https://тест').host !== 'xn--e1aybc' + // not escaped in Chrome 62- + || new URL('https://a#б').hash !== '#%D0%B1' + // fails in Chrome 66- + || result !== 'a1c3' + // throws in Safari + || new URL('https://x', undefined).host !== 'x'; +}); + +}); + +// MODULE: ./node_modules/core-js/internals/use-symbol-as-uid.js +var use_symbol_as_uid_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +/* eslint-disable es/no-symbol -- required for testing */ +var NATIVE_SYMBOL = (symbol_constructor_detection_namespaceFn()); + +module.exports = NATIVE_SYMBOL && + !Symbol.sham && + typeof Symbol.iterator == 'symbol'; + +}); + +// MODULE: ./node_modules/core-js/internals/v8-prototype-define-bug.js +var v8_prototype_define_bug_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var DESCRIPTORS = (descriptors_namespaceFn()); +var fails = (fails_namespaceFn()); + +// V8 ~ Chrome 36- +// https://bugs.chromium.org/p/v8/issues/detail?id=3334 +module.exports = DESCRIPTORS && fails(function () { + // eslint-disable-next-line es/no-object-defineproperty -- required for testing + return Object.defineProperty(function () { /* empty */ }, 'prototype', { + value: 42, + writable: false + }).prototype !== 42; +}); + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/validate-arguments-length.js +var validate_arguments_length_namespaceFn = () => { + return __webpack_require__(812); +}; + +// MODULE: ./node_modules/core-js/internals/weak-map-basic-detection.js +var weak_map_basic_detection_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var globalThis = (global_this_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); + +var WeakMap = globalThis.WeakMap; + +module.exports = isCallable(WeakMap) && /native code/.test(String(WeakMap)); + +}); + +// MODULE: ./node_modules/core-js/internals/weak-map-helpers.js +var weak_map_helpers_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); + +// eslint-disable-next-line es/no-weak-map -- safe +var WeakMapPrototype = WeakMap.prototype; + +module.exports = { + // eslint-disable-next-line es/no-weak-map -- safe + WeakMap: WeakMap, + set: uncurryThis(WeakMapPrototype.set), + get: uncurryThis(WeakMapPrototype.get), + has: uncurryThis(WeakMapPrototype.has), + remove: uncurryThis(WeakMapPrototype['delete']) +}; + +}); + +// MODULE: ./node_modules/core-js/internals/well-known-symbol.js +var well_known_symbol_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var globalThis = (global_this_namespaceFn()); +var shared = (shared_namespaceFn()); +var hasOwn = (has_own_property_namespaceFn()); +var uid = (uid_namespaceFn()); +var NATIVE_SYMBOL = (symbol_constructor_detection_namespaceFn()); +var USE_SYMBOL_AS_UID = (use_symbol_as_uid_namespaceFn()); + +var Symbol = globalThis.Symbol; +var WellKnownSymbolsStore = shared('wks'); +var createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol['for'] || Symbol : Symbol && Symbol.withoutSetter || uid; + +module.exports = function (name) { + if (!hasOwn(WellKnownSymbolsStore, name)) { + WellKnownSymbolsStore[name] = NATIVE_SYMBOL && hasOwn(Symbol, name) + ? Symbol[name] + : createWellKnownSymbol('Symbol.' + name); + } return WellKnownSymbolsStore[name]; +}; + +}); + +// MODULE: ./node_modules/core-js/modules/es.array.includes.js +var es_array_includes_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var $includes = (array_includes_namespaceFn().includes); +var fails = (fails_namespaceFn()); +var addToUnscopables = (add_to_unscopables_namespaceFn()); + +// FF99+ bug +var BROKEN_ON_SPARSE = fails(function () { + // eslint-disable-next-line es/no-array-prototype-includes -- detection + return !Array(1).includes(); +}); + +// Safari 26.4- bug +var BROKEN_ON_SPARSE_WITH_FROM_INDEX = fails(function () { + // eslint-disable-next-line no-sparse-arrays, es/no-array-prototype-includes -- detection + return [, 1].includes(undefined, 1); +}); + +// `Array.prototype.includes` method +// https://tc39.es/ecma262/#sec-array.prototype.includes +$({ target: 'Array', proto: true, forced: BROKEN_ON_SPARSE || BROKEN_ON_SPARSE_WITH_FROM_INDEX }, { + includes: function includes(el /* , fromIndex = 0 */) { + return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined); + } +}); + +// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables +addToUnscopables('includes'); + +}); + +// MODULE: ./node_modules/core-js/modules/es.array.push.js +var es_array_push_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var toObject = (to_object_namespaceFn()); +var lengthOfArrayLike = (length_of_array_like_namespaceFn()); +var setArrayLength = (array_set_length_namespaceFn()); +var doesNotExceedSafeInteger = (does_not_exceed_safe_integer_namespaceFn()); +var fails = (fails_namespaceFn()); + +var INCORRECT_TO_LENGTH = fails(function () { + return [].push.call({ length: 0x100000000 }, 1) !== 4294967297; +}); + +// V8 <= 121 and Safari <= 15.4; FF < 23 throws InternalError +// https://bugs.chromium.org/p/v8/issues/detail?id=12681 +var properErrorOnNonWritableLength = function () { + try { + // eslint-disable-next-line es/no-object-defineproperty -- safe + Object.defineProperty([], 'length', { writable: false }).push(); + } catch (error) { + return error instanceof TypeError; + } +}; + +var FORCED = INCORRECT_TO_LENGTH || !properErrorOnNonWritableLength(); + +// `Array.prototype.push` method +// https://tc39.es/ecma262/#sec-array.prototype.push +$({ target: 'Array', proto: true, arity: 1, forced: FORCED }, { + // eslint-disable-next-line no-unused-vars -- required for `.length` + push: function push(item) { + var O = toObject(this); + var len = lengthOfArrayLike(O); + var argCount = arguments.length; + doesNotExceedSafeInteger(len + argCount); + for (var i = 0; i < argCount; i++) { + O[len] = arguments[i]; + len++; + } + setArrayLength(O, len); + return len; + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.iterator.constructor.js +var es_iterator_constructor_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var globalThis = (global_this_namespaceFn()); +var anInstance = (an_instance_namespaceFn()); +var anObject = (an_object_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); +var getPrototypeOf = (object_get_prototype_of_namespaceFn()); +var defineBuiltInAccessor = (define_built_in_accessor_namespaceFn()); +var createProperty = (create_property_namespaceFn()); +var fails = (fails_namespaceFn()); +var hasOwn = (has_own_property_namespaceFn()); +var wellKnownSymbol = (well_known_symbol_namespaceFn()); +var IteratorPrototype = (iterators_core_namespaceFn().IteratorPrototype); +var DESCRIPTORS = (descriptors_namespaceFn()); +var IS_PURE = (is_pure_namespaceFn()); + +var CONSTRUCTOR = 'constructor'; +var ITERATOR = 'Iterator'; +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); + +var $TypeError = TypeError; +var NativeIterator = globalThis[ITERATOR]; + +// FF56- have non-standard global helper `Iterator` +var FORCED = IS_PURE + || !isCallable(NativeIterator) + || NativeIterator.prototype !== IteratorPrototype + // FF44- non-standard `Iterator` passes previous tests + || !fails(function () { NativeIterator({}); }); + +var IteratorConstructor = function Iterator() { + anInstance(this, IteratorPrototype); + if (getPrototypeOf(this) === IteratorPrototype) throw new $TypeError('Abstract class Iterator not directly constructable'); +}; + +var defineIteratorPrototypeAccessor = function (key, value) { + if (DESCRIPTORS) { + defineBuiltInAccessor(IteratorPrototype, key, { + configurable: true, + get: function () { + return value; + }, + set: function (replacement) { + anObject(this); + if (this === IteratorPrototype) throw new $TypeError("You can't redefine this property"); + if (hasOwn(this, key)) this[key] = replacement; + else createProperty(this, key, replacement); + } + }); + } else IteratorPrototype[key] = value; +}; + +if (!hasOwn(IteratorPrototype, TO_STRING_TAG)) defineIteratorPrototypeAccessor(TO_STRING_TAG, ITERATOR); + +if (FORCED || !hasOwn(IteratorPrototype, CONSTRUCTOR) || IteratorPrototype[CONSTRUCTOR] === Object) { + defineIteratorPrototypeAccessor(CONSTRUCTOR, IteratorConstructor); +} + +IteratorConstructor.prototype = IteratorPrototype; + +// `Iterator` constructor +// https://tc39.es/ecma262/#sec-iterator +$({ global: true, constructor: true, forced: FORCED }, { + Iterator: IteratorConstructor +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.iterator.drop.js +var es_iterator_drop_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var call = (function_call_namespaceFn()); +var anObject = (an_object_namespaceFn()); +var getIteratorDirect = (get_iterator_direct_namespaceFn()); +var notANaN = (not_a_nan_namespaceFn()); +var toPositiveInteger = (to_positive_integer_namespaceFn()); +var iteratorClose = (iterator_close_namespaceFn()); +var createIteratorProxy = (iterator_create_proxy_namespaceFn()); +var iteratorHelperThrowsOnInvalidIterator = (iterator_helper_throws_on_invalid_iterator_namespaceFn()); +var iteratorHelperWithoutClosingOnEarlyError = (iterator_helper_without_closing_on_early_error_namespaceFn()); +var IS_PURE = (is_pure_namespaceFn()); + +var $RangeError = RangeError; +var $Infinity = Infinity; + +var DROP_WITHOUT_THROWING_ON_INVALID_ITERATOR = !IS_PURE && !iteratorHelperThrowsOnInvalidIterator('drop', 0); +var dropWithoutClosingOnEarlyError = !IS_PURE && !DROP_WITHOUT_THROWING_ON_INVALID_ITERATOR + && iteratorHelperWithoutClosingOnEarlyError('drop', RangeError); + +var FORCED = IS_PURE || DROP_WITHOUT_THROWING_ON_INVALID_ITERATOR || dropWithoutClosingOnEarlyError || !function () { + try { + // eslint-disable-next-line es/no-iterator, es/no-iterator-prototype-drop -- detection + Iterator.prototype.drop.call({ + next: function () { return { done: true }; } + }, 0x20000000000000); + } catch (error) { + return error instanceof $RangeError; + } +}(); + +var IteratorProxy = createIteratorProxy(function () { + var iterator = this.iterator; + var next = this.next; + var result, done; + while (this.remaining) { + this.remaining--; + result = anObject(call(next, iterator)); + done = this.done = !!result.done; + if (done) return; + } + result = anObject(call(next, iterator)); + done = this.done = !!result.done; + if (!done) return result.value; +}); + +// `Iterator.prototype.drop` method +// https://tc39.es/ecma262/#sec-iterator.prototype.drop +$({ target: 'Iterator', proto: true, real: true, forced: FORCED }, { + drop: function drop(limit) { + anObject(this); + var remaining; + try { + remaining = toPositiveInteger(notANaN(+limit)); + if (remaining > 0x1FFFFFFFFFFFFF && remaining !== $Infinity) { + throw new $RangeError('The argument should be a safe integer'); + } + } catch (error) { + iteratorClose(this, 'throw', error); + } + + if (dropWithoutClosingOnEarlyError) return call(dropWithoutClosingOnEarlyError, this, remaining); + + return new IteratorProxy(getIteratorDirect(this), { + remaining: remaining + }); + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.iterator.every.js +var es_iterator_every_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var call = (function_call_namespaceFn()); +var iterate = (iterate_namespaceFn()); +var aCallable = (a_callable_namespaceFn()); +var anObject = (an_object_namespaceFn()); +var getIteratorDirect = (get_iterator_direct_namespaceFn()); +var iteratorClose = (iterator_close_namespaceFn()); +var iteratorHelperWithoutClosingOnEarlyError = (iterator_helper_without_closing_on_early_error_namespaceFn()); + +var everyWithoutClosingOnEarlyError = iteratorHelperWithoutClosingOnEarlyError('every', TypeError); + +// `Iterator.prototype.every` method +// https://tc39.es/ecma262/#sec-iterator.prototype.every +$({ target: 'Iterator', proto: true, real: true, forced: everyWithoutClosingOnEarlyError }, { + every: function every(predicate) { + anObject(this); + try { + aCallable(predicate); + } catch (error) { + iteratorClose(this, 'throw', error); + } + + if (everyWithoutClosingOnEarlyError) return call(everyWithoutClosingOnEarlyError, this, predicate); + + var record = getIteratorDirect(this); + var counter = 0; + return !iterate(record, function (value, stop) { + if (!predicate(value, counter++)) return stop(); + }, { IS_RECORD: true, INTERRUPTED: true }).stopped; + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.iterator.filter.js +var es_iterator_filter_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var call = (function_call_namespaceFn()); +var aCallable = (a_callable_namespaceFn()); +var anObject = (an_object_namespaceFn()); +var getIteratorDirect = (get_iterator_direct_namespaceFn()); +var createIteratorProxy = (iterator_create_proxy_namespaceFn()); +var callWithSafeIterationClosing = (call_with_safe_iteration_closing_namespaceFn()); +var IS_PURE = (is_pure_namespaceFn()); +var iteratorClose = (iterator_close_namespaceFn()); +var iteratorHelperThrowsOnInvalidIterator = (iterator_helper_throws_on_invalid_iterator_namespaceFn()); +var iteratorHelperWithoutClosingOnEarlyError = (iterator_helper_without_closing_on_early_error_namespaceFn()); + +var FILTER_WITHOUT_THROWING_ON_INVALID_ITERATOR = !IS_PURE && !iteratorHelperThrowsOnInvalidIterator('filter', function () { /* empty */ }); +var filterWithoutClosingOnEarlyError = !IS_PURE && !FILTER_WITHOUT_THROWING_ON_INVALID_ITERATOR + && iteratorHelperWithoutClosingOnEarlyError('filter', TypeError); + +var FORCED = IS_PURE || FILTER_WITHOUT_THROWING_ON_INVALID_ITERATOR || filterWithoutClosingOnEarlyError; + +var IteratorProxy = createIteratorProxy(function () { + var iterator = this.iterator; + var predicate = this.predicate; + var next = this.next; + var result, done, value; + while (true) { + result = anObject(call(next, iterator)); + done = this.done = !!result.done; + if (done) return; + value = result.value; + if (callWithSafeIterationClosing(iterator, predicate, [value, this.counter++], true)) return value; + } +}); + +// `Iterator.prototype.filter` method +// https://tc39.es/ecma262/#sec-iterator.prototype.filter +$({ target: 'Iterator', proto: true, real: true, forced: FORCED }, { + filter: function filter(predicate) { + anObject(this); + try { + aCallable(predicate); + } catch (error) { + iteratorClose(this, 'throw', error); + } + + if (filterWithoutClosingOnEarlyError) return call(filterWithoutClosingOnEarlyError, this, predicate); + + return new IteratorProxy(getIteratorDirect(this), { + predicate: predicate + }); + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.iterator.find.js +var es_iterator_find_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var call = (function_call_namespaceFn()); +var iterate = (iterate_namespaceFn()); +var aCallable = (a_callable_namespaceFn()); +var anObject = (an_object_namespaceFn()); +var getIteratorDirect = (get_iterator_direct_namespaceFn()); +var iteratorClose = (iterator_close_namespaceFn()); +var iteratorHelperWithoutClosingOnEarlyError = (iterator_helper_without_closing_on_early_error_namespaceFn()); + +var findWithoutClosingOnEarlyError = iteratorHelperWithoutClosingOnEarlyError('find', TypeError); + +// `Iterator.prototype.find` method +// https://tc39.es/ecma262/#sec-iterator.prototype.find +$({ target: 'Iterator', proto: true, real: true, forced: findWithoutClosingOnEarlyError }, { + find: function find(predicate) { + anObject(this); + try { + aCallable(predicate); + } catch (error) { + iteratorClose(this, 'throw', error); + } + + if (findWithoutClosingOnEarlyError) return call(findWithoutClosingOnEarlyError, this, predicate); + + var record = getIteratorDirect(this); + var counter = 0; + return iterate(record, function (value, stop) { + if (predicate(value, counter++)) return stop(value); + }, { IS_RECORD: true, INTERRUPTED: true }).result; + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.iterator.flat-map.js +var es_iterator_flat_map_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var call = (function_call_namespaceFn()); +var aCallable = (a_callable_namespaceFn()); +var anObject = (an_object_namespaceFn()); +var getIteratorDirect = (get_iterator_direct_namespaceFn()); +var getIteratorFlattenable = (get_iterator_flattenable_namespaceFn()); +var createIteratorProxy = (iterator_create_proxy_namespaceFn()); +var iteratorClose = (iterator_close_namespaceFn()); +var fails = (fails_namespaceFn()); +var IS_PURE = (is_pure_namespaceFn()); +var iteratorHelperThrowsOnInvalidIterator = (iterator_helper_throws_on_invalid_iterator_namespaceFn()); +var iteratorHelperWithoutClosingOnEarlyError = (iterator_helper_without_closing_on_early_error_namespaceFn()); + +// Should not throw an error for an iterator without `return` method. Fixed in Safari 26.2 +// https://bugs.webkit.org/show_bug.cgi?id=297532 +var THROWS_ON_ITERATOR_WITHOUT_RETURN = !IS_PURE && fails(function () { + // eslint-disable-next-line es/no-array-prototype-values, es/no-iterator-prototype-flatmap, es/no-iterator-prototype-find -- testing + return [1].values() + .flatMap(function () { return [1]; }) + .find(function () { return true; }) !== 1; +}); + +var FLAT_MAP_WITHOUT_THROWING_ON_INVALID_ITERATOR = !IS_PURE && !THROWS_ON_ITERATOR_WITHOUT_RETURN + && !iteratorHelperThrowsOnInvalidIterator('flatMap', function () { /* empty */ }); + +var flatMapWithoutClosingOnEarlyError = !IS_PURE && !THROWS_ON_ITERATOR_WITHOUT_RETURN && !FLAT_MAP_WITHOUT_THROWING_ON_INVALID_ITERATOR + && iteratorHelperWithoutClosingOnEarlyError('flatMap', TypeError); + +var FORCED = IS_PURE || THROWS_ON_ITERATOR_WITHOUT_RETURN || FLAT_MAP_WITHOUT_THROWING_ON_INVALID_ITERATOR + || flatMapWithoutClosingOnEarlyError; + +var IteratorProxy = createIteratorProxy(function () { + var iterator = this.iterator; + var mapper = this.mapper; + var result, inner; + + while (true) { + if (inner = this.inner) try { + result = anObject(call(inner.next, inner.iterator)); + if (!result.done) return result.value; + this.inner = null; + } catch (error) { iteratorClose(iterator, 'throw', error); } + + result = anObject(call(this.next, iterator)); + + if (this.done = !!result.done) return; + + try { + this.inner = getIteratorFlattenable(mapper(result.value, this.counter++), false); + } catch (error) { iteratorClose(iterator, 'throw', error); } + } +}); + +// `Iterator.prototype.flatMap` method +// https://tc39.es/ecma262/#sec-iterator.prototype.flatmap +$({ target: 'Iterator', proto: true, real: true, forced: FORCED }, { + flatMap: function flatMap(mapper) { + anObject(this); + try { + aCallable(mapper); + } catch (error) { + iteratorClose(this, 'throw', error); + } + + if (flatMapWithoutClosingOnEarlyError) return call(flatMapWithoutClosingOnEarlyError, this, mapper); + + return new IteratorProxy(getIteratorDirect(this), { + mapper: mapper, + inner: null + }); + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.iterator.for-each.js +var es_iterator_for_each_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var call = (function_call_namespaceFn()); +var iterate = (iterate_namespaceFn()); +var aCallable = (a_callable_namespaceFn()); +var anObject = (an_object_namespaceFn()); +var getIteratorDirect = (get_iterator_direct_namespaceFn()); +var iteratorClose = (iterator_close_namespaceFn()); +var iteratorHelperWithoutClosingOnEarlyError = (iterator_helper_without_closing_on_early_error_namespaceFn()); + +var forEachWithoutClosingOnEarlyError = iteratorHelperWithoutClosingOnEarlyError('forEach', TypeError); + +// `Iterator.prototype.forEach` method +// https://tc39.es/ecma262/#sec-iterator.prototype.foreach +$({ target: 'Iterator', proto: true, real: true, forced: forEachWithoutClosingOnEarlyError }, { + forEach: function forEach(fn) { + anObject(this); + try { + aCallable(fn); + } catch (error) { + iteratorClose(this, 'throw', error); + } + + if (forEachWithoutClosingOnEarlyError) return call(forEachWithoutClosingOnEarlyError, this, fn); + + var record = getIteratorDirect(this); + var counter = 0; + iterate(record, function (value) { + fn(value, counter++); + }, { IS_RECORD: true }); + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.iterator.map.js +var es_iterator_map_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var call = (function_call_namespaceFn()); +var aCallable = (a_callable_namespaceFn()); +var anObject = (an_object_namespaceFn()); +var getIteratorDirect = (get_iterator_direct_namespaceFn()); +var createIteratorProxy = (iterator_create_proxy_namespaceFn()); +var callWithSafeIterationClosing = (call_with_safe_iteration_closing_namespaceFn()); +var iteratorClose = (iterator_close_namespaceFn()); +var iteratorHelperThrowsOnInvalidIterator = (iterator_helper_throws_on_invalid_iterator_namespaceFn()); +var iteratorHelperWithoutClosingOnEarlyError = (iterator_helper_without_closing_on_early_error_namespaceFn()); +var IS_PURE = (is_pure_namespaceFn()); + +var MAP_WITHOUT_THROWING_ON_INVALID_ITERATOR = !IS_PURE && !iteratorHelperThrowsOnInvalidIterator('map', function () { /* empty */ }); +var mapWithoutClosingOnEarlyError = !IS_PURE && !MAP_WITHOUT_THROWING_ON_INVALID_ITERATOR + && iteratorHelperWithoutClosingOnEarlyError('map', TypeError); + +var FORCED = IS_PURE || MAP_WITHOUT_THROWING_ON_INVALID_ITERATOR || mapWithoutClosingOnEarlyError; + +var IteratorProxy = createIteratorProxy(function () { + var iterator = this.iterator; + var result = anObject(call(this.next, iterator)); + var done = this.done = !!result.done; + if (!done) return callWithSafeIterationClosing(iterator, this.mapper, [result.value, this.counter++], true); +}); + +// `Iterator.prototype.map` method +// https://tc39.es/ecma262/#sec-iterator.prototype.map +$({ target: 'Iterator', proto: true, real: true, forced: FORCED }, { + map: function map(mapper) { + anObject(this); + try { + aCallable(mapper); + } catch (error) { + iteratorClose(this, 'throw', error); + } + + if (mapWithoutClosingOnEarlyError) return call(mapWithoutClosingOnEarlyError, this, mapper); + + return new IteratorProxy(getIteratorDirect(this), { + mapper: mapper + }); + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.iterator.some.js +var es_iterator_some_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var call = (function_call_namespaceFn()); +var iterate = (iterate_namespaceFn()); +var aCallable = (a_callable_namespaceFn()); +var anObject = (an_object_namespaceFn()); +var getIteratorDirect = (get_iterator_direct_namespaceFn()); +var iteratorClose = (iterator_close_namespaceFn()); +var iteratorHelperWithoutClosingOnEarlyError = (iterator_helper_without_closing_on_early_error_namespaceFn()); + +var someWithoutClosingOnEarlyError = iteratorHelperWithoutClosingOnEarlyError('some', TypeError); + +// `Iterator.prototype.some` method +// https://tc39.es/ecma262/#sec-iterator.prototype.some +$({ target: 'Iterator', proto: true, real: true, forced: someWithoutClosingOnEarlyError }, { + some: function some(predicate) { + anObject(this); + try { + aCallable(predicate); + } catch (error) { + iteratorClose(this, 'throw', error); + } + + if (someWithoutClosingOnEarlyError) return call(someWithoutClosingOnEarlyError, this, predicate); + + var record = getIteratorDirect(this); + var counter = 0; + return iterate(record, function (value, stop) { + if (predicate(value, counter++)) return stop(); + }, { IS_RECORD: true, INTERRUPTED: true }).stopped; + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.iterator.take.js +var es_iterator_take_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var call = (function_call_namespaceFn()); +var anObject = (an_object_namespaceFn()); +var getIteratorDirect = (get_iterator_direct_namespaceFn()); +var notANaN = (not_a_nan_namespaceFn()); +var toPositiveInteger = (to_positive_integer_namespaceFn()); +var createIteratorProxy = (iterator_create_proxy_namespaceFn()); +var iteratorClose = (iterator_close_namespaceFn()); +var iteratorHelperThrowsOnInvalidIterator = (iterator_helper_throws_on_invalid_iterator_namespaceFn()); +var iteratorHelperWithoutClosingOnEarlyError = (iterator_helper_without_closing_on_early_error_namespaceFn()); +var IS_PURE = (is_pure_namespaceFn()); + +var $RangeError = RangeError; +var $Infinity = Infinity; + +var TAKE_WITHOUT_THROWING_ON_INVALID_ITERATOR = !IS_PURE && !iteratorHelperThrowsOnInvalidIterator('take', 1); +var takeWithoutClosingOnEarlyError = !IS_PURE && !TAKE_WITHOUT_THROWING_ON_INVALID_ITERATOR + && iteratorHelperWithoutClosingOnEarlyError('take', RangeError); + +var FORCED = IS_PURE || TAKE_WITHOUT_THROWING_ON_INVALID_ITERATOR || takeWithoutClosingOnEarlyError || !function () { + try { + // eslint-disable-next-line es/no-iterator, es/no-iterator-prototype-take -- detection + Iterator.prototype.take.call({ + next: function () { return { done: true }; } + }, 0x20000000000000); + } catch (error) { + return error instanceof $RangeError; + } +}(); + +var IteratorProxy = createIteratorProxy(function () { + var iterator = this.iterator; + if (!this.remaining--) { + this.done = true; + return iteratorClose(iterator, 'normal', undefined); + } + var result = anObject(call(this.next, iterator)); + var done = this.done = !!result.done; + if (!done) return result.value; +}); + +// `Iterator.prototype.take` method +// https://tc39.es/ecma262/#sec-iterator.prototype.take +$({ target: 'Iterator', proto: true, real: true, forced: FORCED }, { + take: function take(limit) { + anObject(this); + var remaining; + try { + remaining = toPositiveInteger(notANaN(+limit)); + if (remaining > 0x1FFFFFFFFFFFFF && remaining !== $Infinity) { + throw new $RangeError('The argument should be a safe integer'); + } + } catch (error) { + iteratorClose(this, 'throw', error); + } + + if (takeWithoutClosingOnEarlyError) return call(takeWithoutClosingOnEarlyError, this, remaining); + + return new IteratorProxy(getIteratorDirect(this), { + remaining: remaining + }); + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.iterator.to-array.js +var es_iterator_to_array_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var anObject = (an_object_namespaceFn()); +var createProperty = (create_property_namespaceFn()); +var iterate = (iterate_namespaceFn()); +var getIteratorDirect = (get_iterator_direct_namespaceFn()); + +// `Iterator.prototype.toArray` method +// https://tc39.es/ecma262/#sec-iterator.prototype.toarray +$({ target: 'Iterator', proto: true, real: true }, { + toArray: function toArray() { + var result = []; + var index = 0; + iterate(getIteratorDirect(anObject(this)), function (element) { + createProperty(result, index++, element); + }, { IS_RECORD: true }); + return result; + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.json.parse.js +var es_json_parse_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var DESCRIPTORS = (descriptors_namespaceFn()); +var globalThis = (global_this_namespaceFn()); +var getBuiltIn = (get_built_in_namespaceFn()); +var uncurryThis = (function_uncurry_this_namespaceFn()); +var call = (function_call_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); +var isObject = (is_object_namespaceFn()); +var isArray = (is_array_namespaceFn()); +var hasOwn = (has_own_property_namespaceFn()); +var toString = (to_string_namespaceFn()); +var lengthOfArrayLike = (length_of_array_like_namespaceFn()); +var createProperty = (create_property_namespaceFn()); +var fails = (fails_namespaceFn()); +var parseJSONString = (parse_json_string_namespaceFn()); +var NATIVE_SYMBOL = (symbol_constructor_detection_namespaceFn()); + +var JSON = globalThis.JSON; +var Number = globalThis.Number; +var SyntaxError = globalThis.SyntaxError; +var nativeParse = JSON && JSON.parse; +var enumerableOwnProperties = getBuiltIn('Object', 'keys'); +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; +var at = uncurryThis(''.charAt); +var slice = uncurryThis(''.slice); +var exec = uncurryThis(/./.exec); +var push = uncurryThis([].push); + +var IS_DIGIT = /^\d$/; +var IS_NON_ZERO_DIGIT = /^[1-9]$/; +var IS_NUMBER_START = /^[\d-]$/; +var IS_WHITESPACE = /^[\t\n\r ]$/; + +var PRIMITIVE = 0; +var OBJECT = 1; + +var $parse = function (source, reviver) { + source = toString(source); + var context = new Context(source, 0); + var root = context.parse(); + var value = root.value; + var endIndex = context.skip(IS_WHITESPACE, root.end); + if (endIndex < source.length) { + throw new SyntaxError('Unexpected extra character: "' + at(source, endIndex) + '" after the parsed data at: ' + endIndex); + } + return isCallable(reviver) ? internalize({ '': value }, '', reviver, root) : value; +}; + +var internalize = function (holder, name, reviver, node) { + var val = holder[name]; + var unmodified = node && val === node.value; + var context = unmodified && typeof node.source == 'string' ? { source: node.source } : {}; + var elementRecordsLen, keys, len, i, P; + if (isObject(val)) { + var nodeIsArray = isArray(val); + var nodes = unmodified ? node.nodes : nodeIsArray ? [] : {}; + if (nodeIsArray) { + elementRecordsLen = nodes.length; + len = lengthOfArrayLike(val); + for (i = 0; i < len; i++) { + internalizeProperty(val, i, internalize(val, '' + i, reviver, i < elementRecordsLen ? nodes[i] : undefined)); + } + } else { + keys = enumerableOwnProperties(val); + len = lengthOfArrayLike(keys); + for (i = 0; i < len; i++) { + P = keys[i]; + internalizeProperty(val, P, internalize(val, P, reviver, hasOwn(nodes, P) ? nodes[P] : undefined)); + } + } + } + return call(reviver, holder, name, val, context); +}; + +var internalizeProperty = function (object, key, value) { + if (DESCRIPTORS) { + var descriptor = getOwnPropertyDescriptor(object, key); + if (descriptor && !descriptor.configurable) return; + } + if (value === undefined) delete object[key]; + else createProperty(object, key, value); +}; + +var Node = function (value, end, source, nodes) { + this.value = value; + this.end = end; + this.source = source; + this.nodes = nodes; +}; + +var Context = function (source, index) { + this.source = source; + this.index = index; +}; + +// https://www.json.org/json-en.html +Context.prototype = { + fork: function (nextIndex) { + return new Context(this.source, nextIndex); + }, + parse: function () { + var source = this.source; + var i = this.skip(IS_WHITESPACE, this.index); + var fork = this.fork(i); + var chr = at(source, i); + if (exec(IS_NUMBER_START, chr)) return fork.number(); + switch (chr) { + case '{': + return fork.object(); + case '[': + return fork.array(); + case '"': + return fork.string(); + case 't': + return fork.keyword(true); + case 'f': + return fork.keyword(false); + case 'n': + return fork.keyword(null); + } throw new SyntaxError('Unexpected character: "' + chr + '" at: ' + i); + }, + node: function (type, value, start, end, nodes) { + return new Node(value, end, type ? null : slice(this.source, start, end), nodes); + }, + object: function () { + var source = this.source; + var i = this.index + 1; + var expectKeypair = false; + var object = {}; + var nodes = {}; + var closed = false; + while (i < source.length) { + i = this.until(['"', '}'], i); + if (at(source, i) === '}' && !expectKeypair) { + i++; + closed = true; + break; + } + // Parsing the key + var result = this.fork(i).string(); + var key = result.value; + i = result.end; + i = this.until([':'], i) + 1; + // Parsing value + i = this.skip(IS_WHITESPACE, i); + result = this.fork(i).parse(); + createProperty(nodes, key, result); + createProperty(object, key, result.value); + i = this.until([',', '}'], result.end); + var chr = at(source, i); + if (chr === ',') { + expectKeypair = true; + i++; + } else if (chr === '}') { + i++; + closed = true; + break; + } + } + if (!closed) throw new SyntaxError('Unterminated object at: ' + i); + return this.node(OBJECT, object, this.index, i, nodes); + }, + array: function () { + var source = this.source; + var i = this.index + 1; + var expectElement = false; + var array = []; + var nodes = []; + var closed = false; + while (i < source.length) { + i = this.skip(IS_WHITESPACE, i); + if (at(source, i) === ']' && !expectElement) { + i++; + closed = true; + break; + } + var result = this.fork(i).parse(); + push(nodes, result); + push(array, result.value); + i = this.until([',', ']'], result.end); + if (at(source, i) === ',') { + expectElement = true; + i++; + } else if (at(source, i) === ']') { + i++; + closed = true; + break; + } + } + if (!closed) throw new SyntaxError('Unterminated array at: ' + i); + return this.node(OBJECT, array, this.index, i, nodes); + }, + string: function () { + var index = this.index; + var parsed = parseJSONString(this.source, this.index + 1); + return this.node(PRIMITIVE, parsed.value, index, parsed.end); + }, + number: function () { + var source = this.source; + var startIndex = this.index; + var i = startIndex; + if (at(source, i) === '-') i++; + if (at(source, i) === '0') i++; + else if (exec(IS_NON_ZERO_DIGIT, at(source, i))) i = this.skip(IS_DIGIT, i + 1); + else throw new SyntaxError('Failed to parse number at: ' + i); + if (at(source, i) === '.') { + var fractionStartIndex = i + 1; + i = this.skip(IS_DIGIT, fractionStartIndex); + if (fractionStartIndex === i) throw new SyntaxError("Failed to parse number's fraction at: " + i); + } + if (at(source, i) === 'e' || at(source, i) === 'E') { + i++; + if (at(source, i) === '+' || at(source, i) === '-') i++; + var exponentStartIndex = i; + i = this.skip(IS_DIGIT, i); + if (exponentStartIndex === i) throw new SyntaxError("Failed to parse number's exponent value at: " + i); + } + return this.node(PRIMITIVE, Number(slice(source, startIndex, i)), startIndex, i); + }, + keyword: function (value) { + var keyword = '' + value; + var index = this.index; + var endIndex = index + keyword.length; + if (slice(this.source, index, endIndex) !== keyword) throw new SyntaxError('Failed to parse value at: ' + index); + return this.node(PRIMITIVE, value, index, endIndex); + }, + skip: function (regex, i) { + var source = this.source; + for (; i < source.length; i++) if (!exec(regex, at(source, i))) break; + return i; + }, + until: function (array, i) { + i = this.skip(IS_WHITESPACE, i); + var chr = at(this.source, i); + for (var j = 0; j < array.length; j++) if (array[j] === chr) return i; + throw new SyntaxError('Unexpected character: "' + chr + '" at: ' + i); + } +}; + +var NO_SOURCE_SUPPORT = fails(function () { + var unsafeInt = '9007199254740993'; + var source; + nativeParse(unsafeInt, function (key, value, context) { + source = context.source; + }); + return source !== unsafeInt; +}); + +var PROPER_BASE_PARSE = NATIVE_SYMBOL && !fails(function () { + // Safari 9 bug + return 1 / nativeParse('-0 \t') !== -Infinity; +}); + +// `JSON.parse` method +// https://tc39.es/ecma262/#sec-json.parse +// https://github.com/tc39/proposal-json-parse-with-source +$({ target: 'JSON', stat: true, forced: NO_SOURCE_SUPPORT }, { + parse: function parse(text, reviver) { + return PROPER_BASE_PARSE && !isCallable(reviver) ? nativeParse(text) : $parse(text, reviver); + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.json.stringify.js +var es_json_stringify_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var getBuiltIn = (get_built_in_namespaceFn()); +var call = (function_call_namespaceFn()); +var uncurryThis = (function_uncurry_this_namespaceFn()); +var fails = (fails_namespaceFn()); +var isArray = (is_array_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); +var isObject = (is_object_namespaceFn()); +var create = (object_create_namespaceFn()); +var isRawJSON = (is_raw_json_namespaceFn()); +var isSymbol = (is_symbol_namespaceFn()); +var classof = (classof_raw_namespaceFn()); +var thisNumberValue = (this_number_value_namespaceFn()); +var includes = (array_includes_namespaceFn().includes); +var hasOwn = (has_own_property_namespaceFn()); +var toString = (to_string_namespaceFn()); +var parseJSONString = (parse_json_string_namespaceFn()); +var uid = (uid_namespaceFn()); +var NATIVE_SYMBOL = (symbol_constructor_detection_namespaceFn()); +var NATIVE_RAW_JSON = (native_raw_json_namespaceFn()); + +var $String = String; +var $TypeError = TypeError; +var $stringify = getBuiltIn('JSON', 'stringify'); +var $BigInt = getBuiltIn('BigInt'); +var stringValueOf = uncurryThis(''.valueOf); +var booleanValueOf = uncurryThis(true.valueOf); +var bigIntValueOf = $BigInt && uncurryThis($BigInt.prototype.valueOf); +var exec = uncurryThis(/./.exec); +var charAt = uncurryThis(''.charAt); +var charCodeAt = uncurryThis(''.charCodeAt); +var replace = uncurryThis(''.replace); +var slice = uncurryThis(''.slice); +var push = uncurryThis([].push); +var pop = uncurryThis([].pop); +var numberToString = uncurryThis(1.1.toString); + +var surrogates = /[\uD800-\uDFFF]/g; +var leadingSurrogates = /^[\uD800-\uDBFF]$/; +var trailingSurrogates = /^[\uDC00-\uDFFF]$/; +var digits = /^\d+$/; + +// a placeholder of a raw JSON value +var RAW_MARK = uid(); +// a prefix of keys of a reordered object, see `createOrderedObject` +var KEY_MARK = uid(); +// the last key of a reordered object, marks the end of its serialization +var END_MARK = uid(); +var RAW_MARK_LENGTH = RAW_MARK.length; +var KEY_MARK_LENGTH = KEY_MARK.length; + +var WRONG_SYMBOLS_CONVERSION = !NATIVE_SYMBOL || fails(function () { + var symbol = getBuiltIn('Symbol')('stringify detection'); + // MS Edge converts symbol values to JSON as {} + return $stringify([symbol]) !== '[null]' + // WebKit converts symbol values to JSON as null + || $stringify({ a: symbol }) !== '{}' + // V8 throws on boxed symbols + || $stringify(Object(symbol)) !== '{}'; +}); + +// https://github.com/tc39/proposal-well-formed-stringify +var ILL_FORMED_UNICODE = fails(function () { + return $stringify('\uDF06\uD834') !== '"\\udf06\\ud834"' + || $stringify('\uDEAD') !== '"\\udead"'; +}); + +var isRawJSONValue = NATIVE_RAW_JSON ? getBuiltIn('JSON', 'isRawJSON') : isRawJSON; + +var stringifyWithProperSymbolsConversion = WRONG_SYMBOLS_CONVERSION ? function (it, replacer, space) { + return $stringify(it, function (key, value) { + var replaced = call(replacer, this, key, value); + if (!isSymbol(replaced)) return replaced; + }, space); +} : $stringify; + +var fixIllFormedJSON = function (match, offset, string) { + var prev = charAt(string, offset - 1); + var next = charAt(string, offset + 1); + if ( + (exec(leadingSurrogates, match) && !exec(trailingSurrogates, next)) || + (exec(trailingSurrogates, match) && !exec(leadingSurrogates, prev)) + ) { + return '\\u' + numberToString(charCodeAt(match, 0), 16); + } return match; +}; + +// `PropertyList` of `JSON.stringify` +// https://tc39.es/ecma262/#sec-json.stringify +var getPropertyList = function (replacer) { + if (!isArray(replacer)) return; + var rawLength = replacer.length; + var propertyList = []; + // a null prototype object is used as a set of already added keys to keep the deduplication linear + var addedKeys = create(null); + for (var i = 0; i < rawLength; i++) { + var element = replacer[i]; + var key; + if (typeof element == 'string') key = element; + else if (typeof element == 'number' || classof(element) === 'Number' || classof(element) === 'String') key = toString(element); + else continue; + if (!hasOwn(addedKeys, key)) { + addedKeys[key] = true; + push(propertyList, key); + } + } + return propertyList; +}; + +// values with such an internal slot are unwrapped by `SerializeJSONProperty` instead of being serialized as objects +var hasInternalSlot = function (valueOf, it) { + try { + valueOf(it); + return true; + } catch (error) { + return false; + } +}; + +// the slot check is expensive, so it's performed only for the kind reported by the value itself - +// a value lying about its kind via `Symbol.toStringTag` is serialized as an ordinary object +var isBoxedPrimitive = function (it) { + var kind = classof(it); + return (kind === 'Number' && hasInternalSlot(thisNumberValue, it)) + || (kind === 'String' && hasInternalSlot(stringValueOf, it)) + || (kind === 'Boolean' && hasInternalSlot(booleanValueOf, it)) + || (!!bigIntValueOf && kind === 'BigInt' && hasInternalSlot(bigIntValueOf, it)); +}; + +// only objects serialized by `SerializeJSONObject` are affected by the property list +var isSerializedAsObject = function (it) { + if (!isObject(it) || isCallable(it) || isArray(it)) return false; + try { + return !isBoxedPrimitive(it); + // `classof` reads `Symbol.toStringTag`, so a proxy could throw - it has no internal slots anyway + } catch (error) { + return true; + } +}; + +// the engine unwraps it in the same order as it would read the original property, +// so the property is read lazily and `toJSON` is called once and with the original key +var createElementHolder = function (holder, key) { + return { + toJSON: function () { + var element = holder[key]; + if (isObject(element) || typeof element == 'bigint') { + var elementToJSON = element.toJSON; + if (isCallable(elementToJSON)) element = call(elementToJSON, element, key); + } return element; + } + }; +}; + +// own keys of objects are sorted - integer-like keys are moved to the beginning, +// so such keys should be marked and restored in the serialized string +var getKeyPrefix = function (propertyList) { + for (var i = 0, length = propertyList.length; i < length; i++) { + if (exec(digits, propertyList[i])) return KEY_MARK; + } return ''; +}; + +// `SerializeJSONObject` iterates the property list, so the value is replaced with an object with keys in this order +var createOrderedObject = function (value, propertyList, keyPrefix) { + // keys are not marked if the property list has no integer-like keys, so `Object.prototype` + // with a setter, a non-writable property or `__proto__` should not intercept the assignment + var ordered = create(null); + for (var i = 0, length = propertyList.length; i < length; i++) { + var key = propertyList[i]; + ordered[keyPrefix + key] = createElementHolder(value, key); + } + ordered[END_MARK] = null; + return ordered; +}; + +// `JSON.stringify` method +// https://tc39.es/ecma262/#sec-json.stringify +// https://github.com/tc39/proposal-json-parse-with-source +if ($stringify) $({ target: 'JSON', stat: true, arity: 3, forced: WRONG_SYMBOLS_CONVERSION || ILL_FORMED_UNICODE || !NATIVE_RAW_JSON }, { + stringify: function stringify(text, replacer, space) { + var replacerFunction = isCallable(replacer) ? replacer : undefined; + var propertyList = replacerFunction ? undefined : getPropertyList(replacer); + var keyPrefix = propertyList && getKeyPrefix(propertyList); + var rawStrings = []; + var openObjects = []; + var parentOrdered = []; + var currentOrdered; + var marked = false; + var root = true; + + var json = stringifyWithProperSymbolsConversion(text, function (key, value) { + // some old implementations (like WebKit) could pass numbers as keys + key = $String(key); + + if (propertyList) { + if (key === END_MARK) { + pop(openObjects); + currentOrdered = pop(parentOrdered); + return; + } + if (root) root = false; + // the innermost reordered object already contains only keys of the property list and arrays are not + // affected by it, the rest of objects (like objects with a fake `Symbol.toStringTag`) are filtered here + else if (this !== currentOrdered && !isArray(this) && !includes(propertyList, key)) return; + } else if (replacerFunction) value = call(replacerFunction, this, key, value); + + if (isRawJSONValue(value)) { + if (NATIVE_RAW_JSON) return value; + marked = true; + return RAW_MARK + (push(rawStrings, value.rawJSON) - 1); + } + + if (propertyList && isSerializedAsObject(value)) { + // reordered objects are new each time, so cycles should be detected before the engine does it + if (includes(openObjects, value)) throw new $TypeError('Converting circular structure to JSON'); + var ordered = createOrderedObject(value, propertyList, keyPrefix); + push(openObjects, value); + push(parentOrdered, currentOrdered); + currentOrdered = ordered; + if (keyPrefix) marked = true; + return ordered; + } + + return value; + }, space); + + if (typeof json != 'string') return json; + + if (ILL_FORMED_UNICODE) json = replace(json, surrogates, fixIllFormedJSON); + + if (!marked) return json; + + var result = ''; + var length = json.length; + + for (var i = 0; i < length; i++) { + var chr = charAt(json, i); + if (chr === '"') { + var end = parseJSONString(json, ++i).end - 1; + var string = slice(json, i, end); + if (slice(string, 0, RAW_MARK_LENGTH) === RAW_MARK) result += rawStrings[slice(string, RAW_MARK_LENGTH)]; + else if (slice(string, 0, KEY_MARK_LENGTH) === KEY_MARK) result += '"' + slice(string, KEY_MARK_LENGTH) + '"'; + else result += '"' + string + '"'; + i = end; + } else result += chr; + } + + return result; + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.map.get-or-insert-computed.js +var es_map_get_or_insert_computed_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var aCallable = (a_callable_namespaceFn()); +var MapHelpers = (map_helpers_namespaceFn()); +var IS_PURE = (is_pure_namespaceFn()); + +var get = MapHelpers.get; +var has = MapHelpers.has; +var set = MapHelpers.set; + +// `Map.prototype.getOrInsertComputed` method +// https://tc39.es/ecma262/#sec-map.prototype.getorinsertcomputed +$({ target: 'Map', proto: true, real: true, forced: IS_PURE }, { + getOrInsertComputed: function getOrInsertComputed(key, callbackfn) { + var hasKey = has(this, key); + aCallable(callbackfn); + if (hasKey) return get(this, key); + // CanonicalizeKeyedCollectionKey + if (key === 0 && 1 / key === -Infinity) key = 0; + var value = callbackfn(key); + set(this, key, value); + return value; + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.map.get-or-insert.js +var es_map_get_or_insert_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var MapHelpers = (map_helpers_namespaceFn()); +var IS_PURE = (is_pure_namespaceFn()); + +var get = MapHelpers.get; +var has = MapHelpers.has; +var set = MapHelpers.set; + +// `Map.prototype.getOrInsert` method +// https://tc39.es/ecma262/#sec-map.prototype.getorinsert +$({ target: 'Map', proto: true, real: true, forced: IS_PURE }, { + getOrInsert: function getOrInsert(key, value) { + if (has(this, key)) return get(this, key); + set(this, key, value); + return value; + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.math.sum-precise.js +var es_math_sum_precise_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +// based on Shewchuk's algorithm for exactly floating point addition +// adapted from https://github.com/tc39/proposal-math-sum/blob/3513d58323a1ae25560e8700aa5294500c6c9287/polyfill/polyfill.mjs +var $ = (export_namespaceFn()); +var uncurryThis = (function_uncurry_this_namespaceFn()); +var iterate = (iterate_namespaceFn()); + +var $RangeError = RangeError; +var $TypeError = TypeError; +var $Infinity = Infinity; +var $NaN = NaN; +var abs = Math.abs; +var pow = Math.pow; +var push = uncurryThis([].push); + +var POW_2_1023 = pow(2, 1023); +var MAX_SAFE_INTEGER = pow(2, 53) - 1; // 2 ** 53 - 1 === 9007199254740991 +var MAX_DOUBLE = Number.MAX_VALUE; // 2 ** 1024 - 2 ** (1023 - 52) === 1.79769313486231570815e+308 +var MAX_ULP = pow(2, 971); // 2 ** (1023 - 52) === 1.99584030953471981166e+292 + +var NOT_A_NUMBER = {}; +var MINUS_INFINITY = {}; +var PLUS_INFINITY = {}; +var MINUS_ZERO = {}; +var FINITE = {}; + +// prerequisite: abs(x) >= abs(y) +var twosum = function (x, y) { + var hi = x + y; + var lo = y - (hi - x); + return { hi: hi, lo: lo }; +}; + +// `Math.sumPrecise` method +// https://tc39.es/ecma262/#sec-math.sumprecise +$({ target: 'Math', stat: true }, { + // eslint-disable-next-line max-statements -- ok + sumPrecise: function sumPrecise(items) { + var numbers = []; + var count = 0; + var state = MINUS_ZERO; + + iterate(items, function (n) { + if (++count > MAX_SAFE_INTEGER) throw new $RangeError('Maximum allowed index exceeded'); + if (typeof n != 'number') throw new $TypeError('Value is not a number'); + if (state !== NOT_A_NUMBER) { + // eslint-disable-next-line no-self-compare -- NaN check + if (n !== n) state = NOT_A_NUMBER; + else if (n === $Infinity) state = state === MINUS_INFINITY ? NOT_A_NUMBER : PLUS_INFINITY; + else if (n === -$Infinity) state = state === PLUS_INFINITY ? NOT_A_NUMBER : MINUS_INFINITY; + else if ((n !== 0 || (1 / n) === $Infinity) && (state === MINUS_ZERO || state === FINITE)) { + state = FINITE; + push(numbers, n); + } + } + }); + + switch (state) { + case NOT_A_NUMBER: return $NaN; + case MINUS_INFINITY: return -$Infinity; + case PLUS_INFINITY: return $Infinity; + case MINUS_ZERO: return -0; + } + + var partials = []; + var overflow = 0; // conceptually 2 ** 1024 times this value; the final partial is biased by this amount + var x, y, sum, hi, lo, tmp; + + for (var i = 0; i < numbers.length; i++) { + x = numbers[i]; + var actuallyUsedPartials = 0; + for (var j = 0; j < partials.length; j++) { + y = partials[j]; + if (abs(x) < abs(y)) { + tmp = x; + x = y; + y = tmp; + } + sum = twosum(x, y); + hi = sum.hi; + lo = sum.lo; + if (abs(hi) === $Infinity) { + var sign = hi === $Infinity ? 1 : -1; + overflow += sign; + + x = (x - (sign * POW_2_1023)) - (sign * POW_2_1023); + if (abs(x) < abs(y)) { + tmp = x; + x = y; + y = tmp; + } + sum = twosum(x, y); + hi = sum.hi; + lo = sum.lo; + } + if (lo !== 0) partials[actuallyUsedPartials++] = lo; + x = hi; + } + partials.length = actuallyUsedPartials; + if (x !== 0) push(partials, x); + } + + // compute the exact sum of partials, stopping once we lose precision + var n = partials.length - 1; + hi = 0; + lo = 0; + + if (overflow !== 0) { + var next = n >= 0 ? partials[n] : 0; + n--; + if (abs(overflow) > 1 || (overflow > 0 && next > 0) || (overflow < 0 && next < 0)) { + return overflow > 0 ? $Infinity : -$Infinity; + } + // here we actually have to do the arithmetic + // drop a factor of 2 so we can do it without overflow + // assert(abs(overflow) === 1) + sum = twosum(overflow * POW_2_1023, next / 2); + hi = sum.hi; + lo = sum.lo; + lo *= 2; + if (abs(2 * hi) === $Infinity) { + // rounding to the maximum value + if (hi > 0) { + return (hi === POW_2_1023 && lo === -(MAX_ULP / 2) && n >= 0 && partials[n] < 0) ? MAX_DOUBLE : $Infinity; + } return (hi === -POW_2_1023 && lo === (MAX_ULP / 2) && n >= 0 && partials[n] > 0) ? -MAX_DOUBLE : -$Infinity; + } + + if (lo !== 0) { + partials[++n] = lo; + lo = 0; + } + + hi *= 2; + } + + while (n >= 0) { + sum = twosum(hi, partials[n--]); + hi = sum.hi; + lo = sum.lo; + if (lo !== 0) break; + } + + if (n >= 0 && ((lo < 0 && partials[n] < 0) || (lo > 0 && partials[n] > 0))) { + y = lo * 2; + x = hi + y; + if (y === x - hi) hi = x; + } + + return hi; + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.promise.try.js +var es_promise_try_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var globalThis = (global_this_namespaceFn()); +var apply = (function_apply_namespaceFn()); +var slice = (array_slice_namespaceFn()); +var promiseResolve = (promise_resolve_namespaceFn()); +var newPromiseCapabilityModule = (new_promise_capability_namespaceFn()); +var aCallable = (a_callable_namespaceFn()); +var perform = (perform_namespaceFn()); +var fails = (fails_namespaceFn()); + +var Promise = globalThis.Promise; + +var ACCEPT_ARGUMENTS = false; +var FORCED = !Promise || !Promise['try'] || fails(function () { + var p = Promise.resolve(); + return Promise['try'](function (argument) { + // avoiding the use of polyfills of the previous iteration of this proposal + // that does not accept arguments of the callback + ACCEPT_ARGUMENTS = argument === 8; + return p; + // it should use `PromiseResolve` + // https://github.com/tc39/ecma262/pull/3883 + }, 8) !== p; +}) || !ACCEPT_ARGUMENTS; + +// `Promise.try` method +// https://tc39.es/ecma262/#sec-promise.try +$({ target: 'Promise', stat: true, forced: FORCED }, { + 'try': function (callbackfn /* , ...args */) { + var args = arguments.length > 1 ? slice(arguments, 1) : []; + var result = perform(function () { + return apply(aCallable(callbackfn), undefined, args); + }); + if (!result.error) return promiseResolve(this, result.value); + var promiseCapability = newPromiseCapabilityModule.f(this); + var reject = promiseCapability.reject; + reject(result.value); + return promiseCapability.promise; + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.set.difference.v2.js +var es_set_difference_v2_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var difference = (set_difference_namespaceFn()); +var fails = (fails_namespaceFn()); +var setMethodAcceptSetLike = (set_method_accept_set_like_namespaceFn()); + +var SET_LIKE_INCORRECT_BEHAVIOR = !setMethodAcceptSetLike('difference', function (result) { + return result.size === 0; +}); + +var FORCED = SET_LIKE_INCORRECT_BEHAVIOR || fails(function () { + // https://bugs.webkit.org/show_bug.cgi?id=288595 + var setLike = { + size: 1, + has: function () { return true; }, + keys: function () { + var index = 0; + return { + next: function () { + var done = index++ > 1; + if (baseSet.has(1)) baseSet.clear(); + return { done: done, value: 2 }; + } + }; + } + }; + // eslint-disable-next-line es/no-set -- testing + var baseSet = new Set([1, 2, 3, 4]); + // eslint-disable-next-line es/no-set-prototype-difference -- testing + return baseSet.difference(setLike).size !== 3; +}); + +// `Set.prototype.difference` method +// https://tc39.es/ecma262/#sec-set.prototype.difference +$({ target: 'Set', proto: true, real: true, forced: FORCED }, { + difference: difference +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.set.intersection.v2.js +var es_set_intersection_v2_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var fails = (fails_namespaceFn()); +var intersection = (set_intersection_namespaceFn()); +var setMethodAcceptSetLike = (set_method_accept_set_like_namespaceFn()); + +var INCORRECT = !setMethodAcceptSetLike('intersection', function (result) { + return result.size === 2 && result.has(1) && result.has(2); +}) || fails(function () { + // eslint-disable-next-line es/no-array-from, es/no-set, es/no-set-prototype-intersection -- testing + return String(Array.from(new Set([1, 2, 3]).intersection(new Set([3, 2])))) !== '3,2'; +}); + +// `Set.prototype.intersection` method +// https://tc39.es/ecma262/#sec-set.prototype.intersection +$({ target: 'Set', proto: true, real: true, forced: INCORRECT }, { + intersection: intersection +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.set.is-disjoint-from.v2.js +var es_set_is_disjoint_from_v2_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var isDisjointFrom = (set_is_disjoint_from_namespaceFn()); +var setMethodAcceptSetLike = (set_method_accept_set_like_namespaceFn()); + +var INCORRECT = !setMethodAcceptSetLike('isDisjointFrom', function (result) { + return !result; +}); + +// `Set.prototype.isDisjointFrom` method +// https://tc39.es/ecma262/#sec-set.prototype.isdisjointfrom +$({ target: 'Set', proto: true, real: true, forced: INCORRECT }, { + isDisjointFrom: isDisjointFrom +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.set.is-subset-of.v2.js +var es_set_is_subset_of_v2_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var isSubsetOf = (set_is_subset_of_namespaceFn()); +var setMethodAcceptSetLike = (set_method_accept_set_like_namespaceFn()); + +var INCORRECT = !setMethodAcceptSetLike('isSubsetOf', function (result) { + return result; +}); + +// `Set.prototype.isSubsetOf` method +// https://tc39.es/ecma262/#sec-set.prototype.issubsetof +$({ target: 'Set', proto: true, real: true, forced: INCORRECT }, { + isSubsetOf: isSubsetOf +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.set.is-superset-of.v2.js +var es_set_is_superset_of_v2_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var isSupersetOf = (set_is_superset_of_namespaceFn()); +var setMethodAcceptSetLike = (set_method_accept_set_like_namespaceFn()); + +var INCORRECT = !setMethodAcceptSetLike('isSupersetOf', function (result) { + return !result; +}); + +// `Set.prototype.isSupersetOf` method +// https://tc39.es/ecma262/#sec-set.prototype.issupersetof +$({ target: 'Set', proto: true, real: true, forced: INCORRECT }, { + isSupersetOf: isSupersetOf +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.set.symmetric-difference.v2.js +var es_set_symmetric_difference_v2_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var symmetricDifference = (set_symmetric_difference_namespaceFn()); +var setMethodGetKeysBeforeCloning = (set_method_get_keys_before_cloning_detection_namespaceFn()); +var setMethodAcceptSetLike = (set_method_accept_set_like_namespaceFn()); + +var FORCED = !setMethodAcceptSetLike('symmetricDifference') || !setMethodGetKeysBeforeCloning('symmetricDifference'); + +// `Set.prototype.symmetricDifference` method +// https://tc39.es/ecma262/#sec-set.prototype.symmetricdifference +$({ target: 'Set', proto: true, real: true, forced: FORCED }, { + symmetricDifference: symmetricDifference +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.set.union.v2.js +var es_set_union_v2_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var union = (set_union_namespaceFn()); +var setMethodGetKeysBeforeCloning = (set_method_get_keys_before_cloning_detection_namespaceFn()); +var setMethodAcceptSetLike = (set_method_accept_set_like_namespaceFn()); + +var FORCED = !setMethodAcceptSetLike('union') || !setMethodGetKeysBeforeCloning('union'); + +// `Set.prototype.union` method +// https://tc39.es/ecma262/#sec-set.prototype.union +$({ target: 'Set', proto: true, real: true, forced: FORCED }, { + union: union +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.typed-array.with.js +var es_typed_array_with_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var ArrayBufferViewCore = (array_buffer_view_core_namespaceFn()); +var isBigIntArray = (is_big_int_array_namespaceFn()); +var lengthOfArrayLike = (length_of_array_like_namespaceFn()); +var toIntegerOrInfinity = (to_integer_or_infinity_namespaceFn()); +var toBigInt = (to_big_int_namespaceFn()); + +var aTypedArray = ArrayBufferViewCore.aTypedArray; +var getTypedArrayConstructor = ArrayBufferViewCore.getTypedArrayConstructor; +var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod; + +var $RangeError = RangeError; + +var PROPER_ORDER = function () { + try { + // eslint-disable-next-line no-throw-literal, es/no-typed-arrays, es/no-array-prototype-with -- required for testing + new Int8Array(1)['with'](2, { valueOf: function () { throw 8; } }); + } catch (error) { + // some early implementations, like WebKit, does not follow the final semantic + // https://github.com/tc39/proposal-change-array-by-copy/pull/86 + return error === 8; + } +}(); + +// Bug in WebKit. It should truncate a negative fractional index to zero, but instead throws an error +var THROW_ON_NEGATIVE_FRACTIONAL_INDEX = PROPER_ORDER && function () { + try { + // eslint-disable-next-line es/no-typed-arrays, es/no-array-prototype-with -- required for testing + new Int8Array(1)['with'](-0.5, 1); + } catch (error) { + return true; + } +}(); + +// `%TypedArray%.prototype.with` method +// https://tc39.es/ecma262/#sec-%typedarray%.prototype.with +exportTypedArrayMethod('with', { 'with': function (index, value) { + var O = aTypedArray(this); + var len = lengthOfArrayLike(O); + var relativeIndex = toIntegerOrInfinity(index); + var actualIndex = relativeIndex < 0 ? len + relativeIndex : relativeIndex; + var numericValue = isBigIntArray(O) ? toBigInt(value) : +value; + if (actualIndex >= len || actualIndex < 0) throw new $RangeError('Incorrect index'); + var A = new (getTypedArrayConstructor(O))(len); + var k = 0; + for (; k < len; k++) A[k] = k === actualIndex ? numericValue : O[k]; + return A; +} }['with'], !PROPER_ORDER || THROW_ON_NEGATIVE_FRACTIONAL_INDEX); + +}); + +// MODULE: ./node_modules/core-js/modules/es.uint8-array.from-base64.js +var es_uint8_array_from_base64_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var globalThis = (global_this_namespaceFn()); +var arrayFromConstructorAndList = (array_from_constructor_and_list_namespaceFn()); +var $fromBase64 = (uint8_from_base64_namespaceFn()); + +var Uint8Array = globalThis.Uint8Array; + +var INCORRECT_BEHAVIOR_OR_DOESNT_EXISTS = !Uint8Array || !Uint8Array.fromBase64 || !function () { + // Webkit not throw an error on odd length string + try { + Uint8Array.fromBase64('a'); + return; + } catch (error) { /* empty */ } + try { + Uint8Array.fromBase64('', null); + } catch (error) { + return true; + } +}(); + +// `Uint8Array.fromBase64` method +// https://tc39.es/ecma262/#sec-uint8array.frombase64 +if (Uint8Array) $({ target: 'Uint8Array', stat: true, forced: INCORRECT_BEHAVIOR_OR_DOESNT_EXISTS }, { + fromBase64: function fromBase64(string /* , options */) { + var result = $fromBase64(string, arguments.length > 1 ? arguments[1] : undefined, null, 0x1FFFFFFFFFFFFF); + return arrayFromConstructorAndList(Uint8Array, result.bytes); + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.uint8-array.set-from-base64.js +var es_uint8_array_set_from_base64_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var globalThis = (global_this_namespaceFn()); +var $fromBase64 = (uint8_from_base64_namespaceFn()); +var anUint8Array = (an_uint8_array_namespaceFn()); + +var Uint8Array = globalThis.Uint8Array; + +var INCORRECT_BEHAVIOR_OR_DOESNT_EXISTS = !Uint8Array || !Uint8Array.prototype.setFromBase64 || !function () { + var target = new Uint8Array([255, 255, 255, 255, 255]); + try { + target.setFromBase64('', null); + return; + } catch (error) { /* empty */ } + // Webkit not throw an error on odd length string + try { + target.setFromBase64('a'); + return; + } catch (error) { /* empty */ } + try { + target.setFromBase64('MjYyZg==='); + } catch (error) { + return target[0] === 50 && target[1] === 54 && target[2] === 50 && target[3] === 255 && target[4] === 255; + } +}(); + +// `Uint8Array.prototype.setFromBase64` method +// https://tc39.es/ecma262/#sec-uint8array.prototype.setfrombase64 +if (Uint8Array) $({ target: 'Uint8Array', proto: true, forced: INCORRECT_BEHAVIOR_OR_DOESNT_EXISTS }, { + setFromBase64: function setFromBase64(string /* , options */) { + anUint8Array(this); + + var result = $fromBase64(string, arguments.length > 1 ? arguments[1] : undefined, this, this.length); + + return { read: result.read, written: result.written }; + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.uint8-array.set-from-hex.js +var es_uint8_array_set_from_hex_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var globalThis = (global_this_namespaceFn()); +var aString = (a_string_namespaceFn()); +var anUint8Array = (an_uint8_array_namespaceFn()); +var notDetached = (array_buffer_not_detached_namespaceFn()); +var $fromHex = (uint8_from_hex_namespaceFn()); + +// Should not throw an error on length-tracking views over ResizableArrayBuffer +// https://issues.chromium.org/issues/454630441 +function throwsOnLengthTrackingView() { + try { + // eslint-disable-next-line es/no-resizable-and-growable-arraybuffers -- required for testing + var rab = new ArrayBuffer(16, { maxByteLength: 1024 }); + // eslint-disable-next-line es/no-uint8array-prototype-setfromhex, es/no-typed-arrays -- required for testing + new Uint8Array(rab).setFromHex('cafed00d'); + } catch (error) { + return true; + } +} + +// `Uint8Array.prototype.setFromHex` method +// https://tc39.es/ecma262/#sec-uint8array.prototype.setfromhex +if (globalThis.Uint8Array) $({ target: 'Uint8Array', proto: true, forced: throwsOnLengthTrackingView() }, { + setFromHex: function setFromHex(string) { + anUint8Array(this); + aString(string); + notDetached(this.buffer); + var read = $fromHex(string, this).read; + return { read: read, written: read / 2 }; + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.uint8-array.to-base64.js +var es_uint8_array_to_base64_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +/* eslint-disable no-useless-assignment -- false positive for [index++] syntax */ +var $ = (export_namespaceFn()); +var globalThis = (global_this_namespaceFn()); +var uncurryThis = (function_uncurry_this_namespaceFn()); +var anObjectOrUndefined = (an_object_or_undefined_namespaceFn()); +var anUint8Array = (an_uint8_array_namespaceFn()); +var notDetached = (array_buffer_not_detached_namespaceFn()); +var base64Map = (base64_map_namespaceFn()); +var getAlphabetOption = (get_alphabet_option_namespaceFn()); + +var base64Alphabet = base64Map.i2c; +var base64UrlAlphabet = base64Map.i2cUrl; +var $floor = Math.floor; +var $ceil = Math.ceil; + +var charAt = uncurryThis(''.charAt); + +var Uint8Array = globalThis.Uint8Array; +var $Array = globalThis.Array; +var join = uncurryThis([].join); + +var INCORRECT_BEHAVIOR_OR_DOESNT_EXISTS = !Uint8Array || !Uint8Array.prototype.toBase64 || !function () { + try { + var target = new Uint8Array(); + target.toBase64(null); + } catch (error) { + return true; + } +}(); + +// `Uint8Array.prototype.toBase64` method +// https://tc39.es/ecma262/#sec-uint8array.prototype.tobase64 +if (Uint8Array) $({ target: 'Uint8Array', proto: true, forced: INCORRECT_BEHAVIOR_OR_DOESNT_EXISTS }, { + toBase64: function toBase64(/* options */) { + var array = anUint8Array(this); + var options = arguments.length ? anObjectOrUndefined(arguments[0]) : undefined; + var alphabet = getAlphabetOption(options) === 'base64' ? base64Alphabet : base64UrlAlphabet; + var omitPadding = !!options && !!options.omitPadding; + notDetached(this.buffer); + + var i = 0; + var length = array.length; + var result = $Array(omitPadding ? $floor(length / 3) * 4 + (length % 3 ? length % 3 + 1 : 0) : $ceil(length / 3) * 4); + var written = 0; + var triplet; + + var at = function (shift) { + return charAt(alphabet, (triplet >> (6 * shift)) & 63); + }; + + for (; i + 2 < length; i += 3) { + triplet = (array[i] << 16) + (array[i + 1] << 8) + array[i + 2]; + result[written++] = at(3); + result[written++] = at(2); + result[written++] = at(1); + result[written++] = at(0); + } + if (i + 2 === length) { + triplet = (array[i] << 16) + (array[i + 1] << 8); + result[written++] = at(3); + result[written++] = at(2); + result[written++] = at(1); + if (!omitPadding) result[written++] = '='; + } else if (i + 1 === length) { + triplet = array[i] << 16; + result[written++] = at(3); + result[written++] = at(2); + if (!omitPadding) { + result[written++] = '='; + result[written++] = '='; + } + } + + return join(result, ''); + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.uint8-array.to-hex.js +var es_uint8_array_to_hex_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var globalThis = (global_this_namespaceFn()); +var uncurryThis = (function_uncurry_this_namespaceFn()); +var anUint8Array = (an_uint8_array_namespaceFn()); +var notDetached = (array_buffer_not_detached_namespaceFn()); + +var numberToString = uncurryThis(1.1.toString); +var join = uncurryThis([].join); +var $Array = Array; + +var Uint8Array = globalThis.Uint8Array; + +var INCORRECT_BEHAVIOR_OR_DOESNT_EXISTS = !Uint8Array || !Uint8Array.prototype.toHex || !(function () { + try { + var target = new Uint8Array([255, 255, 255, 255, 255, 255, 255, 255]); + return target.toHex() === 'ffffffffffffffff'; + } catch (error) { + return false; + } +})(); + +// `Uint8Array.prototype.toHex` method +// https://tc39.es/ecma262/#sec-uint8array.prototype.tohex +if (Uint8Array) $({ target: 'Uint8Array', proto: true, forced: INCORRECT_BEHAVIOR_OR_DOESNT_EXISTS }, { + toHex: function toHex() { + anUint8Array(this); + notDetached(this.buffer); + var result = $Array(this.length); + for (var i = 0, length = this.length; i < length; i++) { + var hex = numberToString(this[i], 16); + result[i] = hex.length === 1 ? '0' + hex : hex; + } + return join(result, ''); + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.weak-map.get-or-insert-computed.js +var es_weak_map_get_or_insert_computed_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var aCallable = (a_callable_namespaceFn()); +var aWeakMap = (a_weak_map_namespaceFn()); +var aWeakKey = (a_weak_key_namespaceFn()); +var WeakMapHelpers = (weak_map_helpers_namespaceFn()); +var IS_PURE = (is_pure_namespaceFn()); + +var get = WeakMapHelpers.get; +var has = WeakMapHelpers.has; +var set = WeakMapHelpers.set; + +var FORCED = IS_PURE || !function () { + try { + // eslint-disable-next-line es/no-weak-map, no-throw-literal -- testing + if (WeakMap.prototype.getOrInsertComputed) new WeakMap().getOrInsertComputed(1, function () { throw 1; }); + } catch (error) { + // FF144 Nightly - Beta 3 bug + // https://bugzilla.mozilla.org/show_bug.cgi?id=1988369 + return error instanceof TypeError; + } +}(); + +// `WeakMap.prototype.getOrInsertComputed` method +// https://tc39.es/ecma262/#sec-weakmap.prototype.getorinsertcomputed +$({ target: 'WeakMap', proto: true, real: true, forced: FORCED }, { + getOrInsertComputed: function getOrInsertComputed(key, callbackfn) { + if (!IS_PURE) aWeakMap(this); + aWeakKey(key); + aCallable(callbackfn); + if (has(this, key)) return get(this, key); + var value = callbackfn(key); + set(this, key, value); + return value; + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.weak-map.get-or-insert.js +var es_weak_map_get_or_insert_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var WeakMapHelpers = (weak_map_helpers_namespaceFn()); +var IS_PURE = (is_pure_namespaceFn()); + +var get = WeakMapHelpers.get; +var has = WeakMapHelpers.has; +var set = WeakMapHelpers.set; + +// `WeakMap.prototype.getOrInsert` method +// https://tc39.es/ecma262/#sec-weakmap.prototype.getorinsert +$({ target: 'WeakMap', proto: true, real: true, forced: IS_PURE }, { + getOrInsert: function getOrInsert(key, value) { + if (has(this, key)) return get(this, key); + set(this, key, value); + return value; + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/web.dom-exception.stack.js +var web_dom_exception_stack_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var globalThis = (global_this_namespaceFn()); +var getBuiltIn = (get_built_in_namespaceFn()); +var createPropertyDescriptor = (create_property_descriptor_namespaceFn()); +var defineProperty = (object_define_property_namespaceFn().f); +var hasOwn = (has_own_property_namespaceFn()); +var anInstance = (an_instance_namespaceFn()); +var inheritIfRequired = (inherit_if_required_namespaceFn()); +var normalizeStringArgument = (normalize_string_argument_namespaceFn()); +var DOMExceptionConstants = (dom_exception_constants_namespaceFn()); +var clearErrorStack = (error_stack_clear_namespaceFn()); +var DESCRIPTORS = (descriptors_namespaceFn()); +var IS_PURE = (is_pure_namespaceFn()); + +var DOM_EXCEPTION = 'DOMException'; +var Error = getBuiltIn('Error'); +var NativeDOMException = getBuiltIn(DOM_EXCEPTION); + +var $DOMException = function DOMException() { + anInstance(this, DOMExceptionPrototype); + var argumentsLength = arguments.length; + var message = normalizeStringArgument(argumentsLength < 1 ? undefined : arguments[0]); + var name = normalizeStringArgument(argumentsLength < 2 ? undefined : arguments[1], 'Error'); + var that = new NativeDOMException(message, name); + var error = new Error(message); + error.name = DOM_EXCEPTION; + defineProperty(that, 'stack', createPropertyDescriptor(1, clearErrorStack(error.stack, 1))); + inheritIfRequired(that, this, $DOMException); + return that; +}; + +var DOMExceptionPrototype = $DOMException.prototype = NativeDOMException.prototype; + +var ERROR_HAS_STACK = 'stack' in new Error(DOM_EXCEPTION); +var DOM_EXCEPTION_HAS_STACK = 'stack' in new NativeDOMException(1, 2); + +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var descriptor = NativeDOMException && DESCRIPTORS && Object.getOwnPropertyDescriptor(globalThis, DOM_EXCEPTION); + +// Bun ~ 0.1.1 DOMException have incorrect descriptor and we can't redefine it +// https://github.com/Jarred-Sumner/bun/issues/399 +var BUGGY_DESCRIPTOR = !!descriptor && !(descriptor.writable && descriptor.configurable); + +var FORCED_CONSTRUCTOR = ERROR_HAS_STACK && !BUGGY_DESCRIPTOR && !DOM_EXCEPTION_HAS_STACK; + +// `DOMException` constructor patch for `.stack` where it's required +// https://webidl.spec.whatwg.org/#es-DOMException-specialness +$({ global: true, constructor: true, forced: IS_PURE || FORCED_CONSTRUCTOR }, { // TODO: fix export logic + DOMException: FORCED_CONSTRUCTOR ? $DOMException : NativeDOMException +}); + +var PolyfilledDOMException = getBuiltIn(DOM_EXCEPTION); +var PolyfilledDOMExceptionPrototype = PolyfilledDOMException.prototype; + +if (PolyfilledDOMExceptionPrototype.constructor !== PolyfilledDOMException) { + if (!IS_PURE) { + defineProperty(PolyfilledDOMExceptionPrototype, 'constructor', createPropertyDescriptor(1, PolyfilledDOMException)); + } + + for (var key in DOMExceptionConstants) if (hasOwn(DOMExceptionConstants, key)) { + var constant = DOMExceptionConstants[key]; + var constantName = constant.s; + if (!hasOwn(PolyfilledDOMException, constantName)) { + defineProperty(PolyfilledDOMException, constantName, createPropertyDescriptor(6, constant.c)); + } + } +} + +}); + +// MODULE: ./node_modules/core-js/modules/web.url.parse.js +var web_url_parse_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var getBuiltIn = (get_built_in_namespaceFn()); +var validateArgumentsLength = (validate_arguments_length_namespaceFn()); +var toString = (to_string_namespaceFn()); +var USE_NATIVE_URL = (url_constructor_detection_namespaceFn()); + +var URL = getBuiltIn('URL'); + +// `URL.parse` method +// https://url.spec.whatwg.org/#dom-url-parse +$({ target: 'URL', stat: true, forced: !USE_NATIVE_URL }, { + parse: function parse(url) { + var length = validateArgumentsLength(arguments.length, 1); + var urlString = toString(url); + var base = length < 2 || arguments[1] === undefined ? undefined : toString(arguments[1]); + try { + return new URL(urlString, base); + } catch (error) { + return null; + } + } +}); + +}); + +;// ./node_modules/core-js/modules/es.array.includes.js +es_array_includes_namespaceFn(); + +;// ./node_modules/core-js/modules/es.array.push.js +es_array_push_namespaceFn(); + +;// ./node_modules/core-js/modules/es.iterator.constructor.js +es_iterator_constructor_namespaceFn(); + +;// ./node_modules/core-js/modules/es.iterator.filter.js +es_iterator_filter_namespaceFn(); + +;// ./node_modules/core-js/modules/es.map.get-or-insert.js +es_map_get_or_insert_namespaceFn(); + +;// ./node_modules/core-js/modules/es.map.get-or-insert-computed.js +es_map_get_or_insert_computed_namespaceFn(); + +;// ./node_modules/core-js/modules/es.set.difference.v2.js +es_set_difference_v2_namespaceFn(); + +;// ./node_modules/core-js/modules/es.set.intersection.v2.js +es_set_intersection_v2_namespaceFn(); + +;// ./node_modules/core-js/modules/es.set.is-disjoint-from.v2.js +es_set_is_disjoint_from_v2_namespaceFn(); + +;// ./node_modules/core-js/modules/es.set.is-subset-of.v2.js +es_set_is_subset_of_v2_namespaceFn(); + +;// ./node_modules/core-js/modules/es.set.is-superset-of.v2.js +es_set_is_superset_of_v2_namespaceFn(); + +;// ./node_modules/core-js/modules/es.set.symmetric-difference.v2.js +es_set_symmetric_difference_v2_namespaceFn(); + +;// ./node_modules/core-js/modules/es.set.union.v2.js +es_set_union_v2_namespaceFn(); + +;// ./node_modules/core-js/modules/es.typed-array.with.js +es_typed_array_with_namespaceFn(); + +;// ./node_modules/core-js/modules/es.uint8-array.set-from-base64.js +es_uint8_array_set_from_base64_namespaceFn(); + +;// ./node_modules/core-js/modules/es.uint8-array.set-from-hex.js +es_uint8_array_set_from_hex_namespaceFn(); + +;// ./node_modules/core-js/modules/es.uint8-array.to-base64.js +es_uint8_array_to_base64_namespaceFn(); + +;// ./node_modules/core-js/modules/es.uint8-array.to-hex.js +es_uint8_array_to_hex_namespaceFn(); + +;// ./node_modules/core-js/modules/web.url.parse.js +web_url_parse_namespaceFn(); + +;// ./src/shared/util.js + + + + + + + + + + + + + + + + + + + +const isNodeJS = typeof process === "object" && process + "" === "[object process]" && !process.versions.nw && !(process.versions.electron && process.type && process.type !== "browser"); +const BBOX_INIT = [Infinity, Infinity, -Infinity, -Infinity]; +const F32_BBOX_INIT = new Float32Array(BBOX_INIT); +const FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0]; +const LINE_FACTOR = 1.35; +const LINE_DESCENT_FACTOR = 0.35; +const BASELINE_FACTOR = (/* unused pure expression or super */ null && (LINE_DESCENT_FACTOR / LINE_FACTOR)); +const SVG_NS = "http://www.w3.org/2000/svg"; +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 AnnotationPrefix = "pdfjs_internal_id_"; +const AnnotationEditorPrefix = "pdfjs_internal_editor_"; +const AnnotationEditorType = { + DISABLE: -1, + NONE: 0, + FREETEXT: 3, + HIGHLIGHT: 9, + STAMP: 13, + INK: 15, + POPUP: 16, + SIGNATURE: 101, + COMMENT: 102 +}; +const AnnotationEditorParamsType = { + RESIZE: 1, + CREATE: 2, + FREETEXT_SIZE: 11, + FREETEXT_COLOR: 12, + FREETEXT_OPACITY: 13, + INK_COLOR: 21, + INK_THICKNESS: 22, + INK_OPACITY: 23, + INK_COLOR_AND_OPACITY: 24, + HIGHLIGHT_COLOR: 31, + HIGHLIGHT_THICKNESS: 32, + HIGHLIGHT_FREE: 33, + HIGHLIGHT_SHOW_ALL: 34, + DRAW_STEP: 41 +}; +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 MeshFigureType = (/* unused pure expression or super */ null && ({ + TRIANGLES: 1, + LATTICE: 2, + PATCH: 3 +})); +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, + RICHMEDIA: 27 +}; +const AnnotationReplyType = (/* unused pure expression or super */ null && ({ + GROUP: "Group", + REPLY: "R" +})); +const AnnotationRenditionOperation = (/* unused pure expression or super */ null && ({ + PLAY_OR_RESUME: 0, + STOP: 1, + PAUSE: 2, + RESUME: 3, + PLAY: 4 +})); +const AnnotationFlag = (/* unused pure expression or super */ null && ({ + INVISIBLE: 0x01, + HIDDEN: 0x02, + PRINT: 0x04, + NOZOOM: 0x08, + NOROTATE: 0x10, + NOVIEW: 0x20, + READONLY: 0x40, + LOCKED: 0x80, + TOGGLENOVIEW: 0x100, + LOCKEDCONTENTS: 0x200 +})); +const AnnotationFieldFlag = (/* unused pure expression or super */ null && ({ + 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 = (/* unused pure expression or super */ null && ({ + 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 = (/* unused pure expression or super */ null && ({ + WC: "WillClose", + WS: "WillSave", + DS: "DidSave", + WP: "WillPrint", + DP: "DidPrint" +})); +const PageActionEventType = (/* unused pure expression or super */ null && ({ + 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, + rawFillPath: 94 +}; +const DrawOPS = { + moveTo: 0, + lineTo: 1, + curveTo: 2, + quadraticCurveTo: 3, + closePath: 4 +}; +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.info(`Info: ${msg}`); + } +} +function warn(msg) { + if (verbosity >= VerbosityLevel.WARNINGS) { + console.warn(`Warning: ${msg}`); + } +} +function unreachable(msg) { + throw new Error(msg); +} +function util_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; + } + if (options && typeof url === "string") { + if (options.addDefaultProtocol && url.startsWith("www.")) { + const dots = url.match(/\./g); + if (dots?.length >= 2) { + url = `http://${url}`; + } + } + if (options.tryConvertEncoding) { + try { + url = stringToUTF8String(url); + } catch {} + } + } + const absoluteUrl = baseUrl ? URL.parse(url, baseUrl) : URL.parse(url); + return _isValidProtocol(absoluteUrl) ? absoluteUrl : null; +} +function updateUrlHash(url, hash, allowRel = false) { + const res = URL.parse(url); + if (res) { + res.hash = hash; + return res.href; + } + if (allowRel && createValidAbsoluteUrl(url, "http://example.com")) { + return url.split("#", 1)[0] + `${hash ? `#${hash}` : ""}`; + } + return ""; +} +function stripPath(str) { + return str.substring(str.lastIndexOf("/") + 1); +} +function util_shadow(obj, prop, value, nonSerializable = false) { + Object.defineProperty(obj, prop, { + value, + enumerable: !nonSerializable, + configurable: true, + writable: false + }); + return value; +} +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 BaseException { + constructor(msg, code) { + super(msg, "PasswordException"); + this.code = code; + } +} +class UnknownErrorException extends BaseException { + constructor(msg, details) { + super(msg, "UnknownErrorException"); + this.details = details; + } +} +class InvalidPDFException extends BaseException { + constructor(msg) { + super(msg, "InvalidPDFException"); + } +} +class ResponseException extends BaseException { + constructor(msg, status, missing) { + super(msg, "ResponseException"); + this.status = status; + this.missing = missing; + } +} +class FormatError extends BaseException { + constructor(msg) { + super(msg, "FormatError"); + } +} +class AbortException extends BaseException { + constructor(msg) { + super(msg, "AbortException"); + } +} +function bytesToString(bytes) { + if (typeof bytes !== "object" || bytes?.length === undefined) { + unreachable("Invalid argument for bytesToString"); + } + 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(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; +} +class FeatureTest { + static get isLittleEndian() { + const buffer8 = new Uint8Array(4); + buffer8[0] = 1; + const view32 = new Uint32Array(buffer8.buffer, 0, 1); + return util_shadow(this, "isLittleEndian", view32[0] === 1); + } + static get isOffscreenCanvasSupported() { + return util_shadow(this, "isOffscreenCanvasSupported", typeof OffscreenCanvas !== "undefined"); + } + static get isImageDecoderSupported() { + return util_shadow(this, "isImageDecoderSupported", typeof ImageDecoder !== "undefined"); + } + static get isFloat16ArraySupported() { + return util_shadow(this, "isFloat16ArraySupported", typeof Float16Array !== "undefined"); + } + static get isSanitizerSupported() { + return util_shadow(this, "isSanitizerSupported", typeof Sanitizer !== "undefined"); + } + static get platform() { + const { + platform, + userAgent + } = navigator; + return util_shadow(this, "platform", { + isAndroid: userAgent.includes("Android"), + isLinux: platform.includes("Linux"), + isMac: platform.includes("Mac"), + isWindows: platform.includes("Win"), + isFirefox: userAgent.includes("Firefox") + }); + } + static get isCanvasFilterSupported() { + let ctx; + if (this.isOffscreenCanvasSupported) { + ctx = new OffscreenCanvas(1, 1).getContext("2d"); + } else if (typeof document !== "undefined") { + ctx = document.createElement("canvas").getContext("2d"); + } + return util_shadow(this, "isCanvasFilterSupported", ctx?.filter !== undefined); + } + static get isAlphaColorInputSupported() { + if (typeof document === "undefined") { + return util_shadow(this, "isAlphaColorInputSupported", false); + } + const input = document.createElement("input"); + input.type = "color"; + input.setAttribute("alpha", ""); + input.value = "#ff000080"; + return util_shadow(this, "isAlphaColorInputSupported", input.value !== "#ff0000"); + } + static get isBackdropFilterSupported() { + return util_shadow(this, "isBackdropFilterSupported", typeof CSS !== "undefined" && CSS.supports("backdrop-filter", "blur(1px)")); + } +} +class Util { + static get hexNums() { + return util_shadow(this, "hexNums", Array.from({ + length: 256 + }, (_, n) => n.toString(16).padStart(2, "0"))); + } + static makeHexColor(r, g, b) { + return `#${this.hexNums[r]}${this.hexNums[g]}${this.hexNums[b]}`; + } + static transform(m1, m2) { + return [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 multiplyByDOMMatrix(m, md) { + return [m[0] * md.a + m[2] * md.b, m[1] * md.a + m[3] * md.b, m[0] * md.c + m[2] * md.d, m[1] * md.c + m[3] * md.d, m[0] * md.e + m[2] * md.f + m[4], m[1] * md.e + m[3] * md.f + m[5]]; + } + static applyTransform(p, m, pos = 0) { + const p0 = p[pos]; + const p1 = p[pos + 1]; + p[pos] = p0 * m[0] + p1 * m[2] + m[4]; + p[pos + 1] = p0 * m[1] + p1 * m[3] + m[5]; + } + static applyTransformToBezier(p, transform, pos = 0) { + const m0 = transform[0]; + const m1 = transform[1]; + const m2 = transform[2]; + const m3 = transform[3]; + const m4 = transform[4]; + const m5 = transform[5]; + for (let i = 0; i < 6; i += 2) { + const pI = p[pos + i]; + const pI1 = p[pos + i + 1]; + p[pos + i] = pI * m0 + pI1 * m2 + m4; + p[pos + i + 1] = pI * m1 + pI1 * m3 + m5; + } + } + static applyInverseTransform(p, m) { + const p0 = p[0]; + const p1 = p[1]; + const d = m[0] * m[3] - m[1] * m[2]; + p[0] = (p0 * m[3] - p1 * m[2] + m[2] * m[5] - m[4] * m[3]) / d; + p[1] = (-p0 * m[1] + p1 * m[0] + m[4] * m[1] - m[5] * m[0]) / d; + } + static axialAlignedBoundingBox(rect, transform, output) { + const m0 = transform[0]; + const m1 = transform[1]; + const m2 = transform[2]; + const m3 = transform[3]; + const m4 = transform[4]; + const m5 = transform[5]; + const r0 = rect[0]; + const r1 = rect[1]; + const r2 = rect[2]; + const r3 = rect[3]; + let a0 = m0 * r0 + m4; + let a2 = a0; + let a1 = m0 * r2 + m4; + let a3 = a1; + let b0 = m3 * r1 + m5; + let b2 = b0; + let b1 = m3 * r3 + m5; + let b3 = b1; + if (m1 !== 0 || m2 !== 0) { + const m1r0 = m1 * r0; + const m1r2 = m1 * r2; + const m2r1 = m2 * r1; + const m2r3 = m2 * r3; + a0 += m2r1; + a3 += m2r1; + a1 += m2r3; + a2 += m2r3; + b0 += m1r0; + b3 += m1r0; + b1 += m1r2; + b2 += m1r2; + } + output[0] = Math.min(output[0], a0, a1, a2, a3); + output[1] = Math.min(output[1], b0, b1, b2, b3); + output[2] = Math.max(output[2], a0, a1, a2, a3); + output[3] = Math.max(output[3], b0, b1, b2, b3); + } + static inverseTransform(m) { + const d = m[0] * m[3] - m[1] * m[2]; + return [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 singularValueDecompose2dScale(matrix, output) { + const m0 = matrix[0]; + const m1 = matrix[1]; + const m2 = matrix[2]; + const m3 = matrix[3]; + const a = m0 ** 2 + m1 ** 2; + const b = m0 * m2 + m1 * m3; + const c = m2 ** 2 + m3 ** 2; + const first = (a + c) / 2; + const second = Math.sqrt(first ** 2 - (a * c - b ** 2)); + output[0] = Math.sqrt(first + second || 1); + output[1] = Math.sqrt(first - second || 1); + } + static normalizeRect(rect) { + const r = rect.slice(0); + if (rect[0] > rect[2]) { + r[0] = rect[2]; + r[2] = rect[0]; + } + if (rect[1] > rect[3]) { + r[1] = rect[3]; + r[3] = rect[1]; + } + return 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])); + return yLow > yHigh ? null : [xLow, yLow, xHigh, yHigh]; + } + static pointBoundingBox(x, y, minMax) { + 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 rectBoundingBox(x0, y0, x1, y1, minMax) { + minMax[0] = Math.min(minMax[0], x0, x1); + minMax[1] = Math.min(minMax[1], y0, y1); + minMax[2] = Math.max(minMax[2], x0, x1); + minMax[3] = Math.max(minMax[3], y0, y1); + } + static #getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, t, minMax) { + if (t <= 0 || t >= 1) { + return; + } + 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 #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.#getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, (-b - sqrtDelta) / a2, minMax); + } + static bezierBoundingBox(x0, y0, x1, y1, x2, y2, x3, y3, 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); + 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); + } +} +function stringToUTF8String(str) { + return decodeURIComponent(escape(str)); +} +function utf8StringToString(str) { + return unescape(encodeURIComponent(str)); +} +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; +} +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.randomUUID === "function") { + return crypto.randomUUID(); + } + const buf = new Uint8Array(32); + crypto.getRandomValues(buf); + return bytesToString(buf); +} +function _isValidExplicitDest(validRef, validName, dest) { + if (!Array.isArray(dest) || dest.length < 2) { + return false; + } + const [page, zoom, ...args] = dest; + if (!validRef(page) && !Number.isInteger(page)) { + return false; + } + if (!validName(zoom)) { + return false; + } + const argsLen = args.length; + let allowNull = true; + switch (zoom.name) { + case "XYZ": + if (argsLen < 2 || argsLen > 3) { + return false; + } + break; + case "Fit": + case "FitB": + return argsLen === 0; + case "FitH": + case "FitBH": + case "FitV": + case "FitBV": + if (argsLen > 1) { + return false; + } + break; + case "FitR": + if (argsLen !== 4) { + return false; + } + allowNull = false; + break; + default: + return false; + } + for (const arg of args) { + if (typeof arg === "number" || allowNull && arg === null) { + continue; + } + return false; + } + return true; +} +const makeArr = () => []; +const makeMap = () => new Map(); +const makeObj = () => Object.create(null); +const makeSet = () => new Set(); +if (typeof Blob.prototype.bytes !== "function") { + Blob.prototype.bytes = async function () { + return new Uint8Array(await this.arrayBuffer()); + }; +} +if (typeof Response.prototype.bytes !== "function") { + Response.prototype.bytes = async function () { + return new Uint8Array(await this.arrayBuffer()); + }; +} +if (typeof Iterator.prototype.join !== "function") { + Iterator.prototype.join = function (separator) { + return [...this].join(separator); + }; +} + +;// ./node_modules/core-js/modules/es.iterator.map.js +es_iterator_map_namespaceFn(); + +;// ./src/shared/math_clamp.js +function MathClamp(v, min, max) { + return Math.min(Math.max(v, min), max); +} + +;// ./src/display/page_viewport.js + +class PageViewport { + constructor({ + viewBox, + userUnit, + scale, + rotation, + offsetX = 0, + offsetY = 0, + dontFlip = false + }) { + this.viewBox = viewBox; + this.userUnit = userUnit; + this.scale = scale; + this.rotation = rotation; + this.offsetX = offsetX; + this.offsetY = offsetY; + scale *= userUnit; + const centerX = (viewBox[2] + viewBox[0]) / 2; + const centerY = (viewBox[3] + viewBox[1]) / 2; + let rotateA, rotateB, rotateC, rotateD; + rotation %= 360; + if (rotation < 0) { + rotation += 360; + } + switch (rotation) { + case 180: + rotateA = -1; + rotateB = 0; + rotateC = 0; + rotateD = 1; + break; + case 90: + rotateA = 0; + rotateB = 1; + rotateC = 1; + rotateD = 0; + break; + case 270: + rotateA = 0; + rotateB = -1; + rotateC = -1; + rotateD = 0; + break; + case 0: + rotateA = 1; + rotateB = 0; + rotateC = 0; + rotateD = -1; + break; + default: + throw new Error("PageViewport: Invalid rotation, must be a multiple of 90 degrees."); + } + if (dontFlip) { + rotateC = -rotateC; + rotateD = -rotateD; + } + let offsetCanvasX, offsetCanvasY; + let width, height; + if (rotateA === 0) { + offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX; + offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY; + width = (viewBox[3] - viewBox[1]) * scale; + height = (viewBox[2] - viewBox[0]) * scale; + } else { + offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX; + offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY; + width = (viewBox[2] - viewBox[0]) * scale; + height = (viewBox[3] - viewBox[1]) * scale; + } + this.transform = [rotateA * scale, rotateB * scale, rotateC * scale, rotateD * scale, offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY, offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY]; + this.width = width; + this.height = height; + } + get rawDims() { + const dims = this.viewBox; + return util_shadow(this, "rawDims", { + pageWidth: dims[2] - dims[0], + pageHeight: dims[3] - dims[1], + pageX: dims[0], + pageY: dims[1] + }); + } + clone({ + scale = this.scale, + rotation = this.rotation, + offsetX = this.offsetX, + offsetY = this.offsetY, + dontFlip = false + } = {}) { + return new PageViewport({ + viewBox: this.viewBox.slice(), + userUnit: this.userUnit, + scale, + rotation, + offsetX, + offsetY, + dontFlip + }); + } + convertToViewportPoint(x, y) { + const p = [x, y]; + Util.applyTransform(p, this.transform); + return p; + } + convertToPdfPoint(x, y) { + const p = [x, y]; + Util.applyInverseTransform(p, this.transform); + return p; + } +} + +;// ./src/display/xfa_text.js + +class XfaText { + static textContent(xfa) { + const items = []; + const output = { + items, + styles: Object.create(null) + }; + function walk(node) { + if (!node) { + return; + } + let str = null; + const name = node.name; + if (name === "#text") { + str = node.value; + } else if (!XfaText.shouldBuildText(name)) { + return; + } else if (node?.attributes?.textContent) { + str = node.attributes.textContent; + } else if (node.value) { + str = node.value; + } + if (str !== null) { + items.push({ + str + }); + } + if (!node.children) { + return; + } + for (const child of node.children) { + walk(child); + } + } + walk(xfa); + return output; + } + static shouldBuildText(name) { + return !(name === "textarea" || name === "input" || name === "option" || name === "select"); + } +} + +;// ./src/display/xfa_layer.js + + + + + + + + + + + +const disallowedRichTextStyleRegExp = /url\(|image-set\(/i; +const disallowedEventHandlerAttrRegExp = /^on/i; +class XfaLayer { + static get _allowedHtmlElements() { + return util_shadow(this, "_allowedHtmlElements", new Set(["a", "b", "br", "button", "div", "i", "img", "input", "label", "li", "ol", "option", "p", "select", "span", "sub", "sup", "textarea", "ul"])); + } + static get _allowedSvgElements() { + return util_shadow(this, "_allowedSvgElements", new Set(["ellipse", "line", "path", "rect", "svg"])); + } + static get _allowedRichTextElements() { + return util_shadow(this, "_allowedRichTextElements", new Set(["a", "b", "br", "div", "i", "li", "ol", "p", "span", "sub", "sup", "ul"])); + } + static get _allowedRichTextAttributes() { + return util_shadow(this, "_allowedRichTextAttributes", new Set(["class", "dir", "style"])); + } + static get _allowedRichTextStyles() { + return util_shadow(this, "_allowedRichTextStyles", new Set(["color", "font", "fontFamily", "fontSize", "fontStretch", "fontStyle", "fontWeight", "kerningMode", "letterSpacing", "lineHeight", "margin", "marginBottom", "marginLeft", "marginRight", "marginTop", "orphans", "paddingLeft", "paddingRight", "breakAfter", "breakBefore", "breakInside", "tabInterval", "tabStop", "textAlign", "textDecoration", "textIndent", "transform", "verticalAlign", "widows"])); + } + static setupStorage(html, id, element, storage, intent) { + const storedData = storage.getValue(id, { + value: null + }); + switch (element.name) { + case "textarea": + if (storedData.value !== null) { + html.textContent = storedData.value; + } + if (intent === "print") { + break; + } + html.addEventListener("input", event => { + storage.setValue(id, { + value: event.target.value + }); + }); + break; + case "input": + if (element.attributes.type === "radio" || element.attributes.type === "checkbox") { + if (storedData.value === element.attributes.xfaOn) { + html.setAttribute("checked", true); + } else if (storedData.value === element.attributes.xfaOff) { + html.removeAttribute("checked"); + } + if (intent === "print") { + break; + } + html.addEventListener("change", event => { + storage.setValue(id, { + value: event.target.checked ? event.target.getAttribute("xfaOn") : event.target.getAttribute("xfaOff") + }); + }); + } else { + if (storedData.value !== null) { + html.setAttribute("value", storedData.value); + } + if (intent === "print") { + break; + } + html.addEventListener("input", event => { + storage.setValue(id, { + value: event.target.value + }); + }); + } + break; + case "select": + if (storedData.value !== null) { + html.setAttribute("value", storedData.value); + for (const option of element.children) { + if (option.attributes.value === storedData.value) { + option.attributes.selected = true; + } else if (Object.hasOwn(option.attributes, "selected")) { + delete option.attributes.selected; + } + } + } + html.addEventListener("input", event => { + const options = event.target.options; + const value = options.selectedIndex === -1 ? "" : options[options.selectedIndex].value; + storage.setValue(id, { + value + }); + }); + break; + } + } + static setAttributes({ + html, + element, + storage = null, + intent, + linkService + }) { + const { + attributes + } = element; + const isHTMLAnchorElement = html instanceof HTMLAnchorElement; + if (attributes.type === "radio") { + attributes.name = `${attributes.name}-${intent}`; + } + for (const [key, value] of Object.entries(attributes)) { + if (value === null || value === undefined || disallowedEventHandlerAttrRegExp.test(key)) { + continue; + } + if (intent === "richText" && !this._allowedRichTextAttributes.has(key)) { + continue; + } + switch (key) { + case "class": + if (value.length) { + html.setAttribute(key, value.join(" ")); + } + break; + case "dataId": + break; + case "id": + html.setAttribute("data-element-id", value); + break; + case "style": + if (intent === "richText") { + const allowedStyles = this._allowedRichTextStyles; + for (const [styleName, styleValue] of Object.entries(value)) { + if (allowedStyles.has(styleName) && !disallowedRichTextStyleRegExp.test(styleValue)) { + html.style[styleName] = styleValue; + } + } + } else { + Object.assign(html.style, value); + } + break; + case "textContent": + html.textContent = value; + break; + default: + if (!isHTMLAnchorElement || key !== "href" && key !== "newWindow") { + html.setAttribute(key, value); + } + } + } + if (isHTMLAnchorElement) { + linkService?.addLinkAttributes(html, attributes.href, attributes.newWindow); + } + if (storage && attributes.dataId) { + this.setupStorage(html, attributes.dataId, element, storage); + } + } + static #createElement(name, xmlns, intent) { + if (intent === "richText") { + return !xmlns && this._allowedRichTextElements.has(name) ? document.createElement(name) : null; + } + if (xmlns) { + return xmlns === SVG_NS && this._allowedSvgElements.has(name) ? document.createElementNS(SVG_NS, name) : null; + } + return this._allowedHtmlElements.has(name) ? document.createElement(name) : null; + } + static render(parameters) { + const storage = parameters.annotationStorage; + const linkService = parameters.linkService; + const root = parameters.xfaHtml; + const intent = parameters.intent || "display"; + const rootHtml = this.#createElement(root.name, root.attributes?.xmlns, intent) ?? document.createElement("div"); + if (root.attributes) { + this.setAttributes({ + html: rootHtml, + element: root, + intent, + linkService + }); + } + const isNotForRichText = intent !== "richText"; + const rootDiv = parameters.div; + rootDiv.append(rootHtml); + if (parameters.viewport) { + const transform = `matrix(${parameters.viewport.transform.join(",")})`; + rootDiv.style.transform = transform; + } + if (isNotForRichText) { + rootDiv.setAttribute("class", "xfaLayer xfaFont"); + } + const textDivs = []; + if (root.children.length === 0) { + if (root.value) { + const node = document.createTextNode(root.value); + rootHtml.append(node); + if (isNotForRichText && XfaText.shouldBuildText(root.name)) { + textDivs.push(node); + } + } + return { + textDivs + }; + } + const stack = [[root, -1, rootHtml]]; + while (stack.length > 0) { + const [parent, i, html] = stack.at(-1); + if (i + 1 === parent.children.length) { + stack.pop(); + continue; + } + const child = parent.children[++stack.at(-1)[1]]; + if (child === null) { + continue; + } + const { + name + } = child; + if (name === "#text") { + const node = document.createTextNode(child.value); + textDivs.push(node); + html.append(node); + continue; + } + const childHtml = this.#createElement(name, child.attributes?.xmlns, intent); + if (!childHtml) { + continue; + } + html.append(childHtml); + if (child.attributes) { + this.setAttributes({ + html: childHtml, + element: child, + storage, + intent, + linkService + }); + } + if (child.children?.length > 0) { + stack.push([child, -1, childHtml]); + } else if (child.value) { + const node = document.createTextNode(child.value); + if (isNotForRichText && XfaText.shouldBuildText(name)) { + textDivs.push(node); + } + childHtml.append(node); + } + } + for (const el of rootDiv.querySelectorAll(".xfaNonInteractive input, .xfaNonInteractive textarea")) { + el.setAttribute("readOnly", true); + } + return { + textDivs + }; + } + static update(parameters) { + const transform = `matrix(${parameters.viewport.transform.join(",")})`; + parameters.div.style.transform = transform; + parameters.div.hidden = false; + } + static getPageViewport(xfaPage, { + scale = 1, + rotation = 0 + }) { + const { + width, + height + } = xfaPage.attributes.style; + return new PageViewport({ + viewBox: [0, 0, parseInt(width, 10), parseInt(height, 10)], + userUnit: 1, + scale, + rotation + }); + } +} + +;// ./src/display/display_utils.js + + + + + + + + + + + + + + + + + + + + + + + +class PixelsPerInch { + static CSS = 96.0; + static PDF = 72.0; + static PDF_TO_CSS_UNITS = this.CSS / this.PDF; +} +async function fetchData(url, type = "text") { + if (isValidFetchUrl(url, document.baseURI)) { + const response = await fetch(url); + if (!response.ok) { + throw new Error(response.statusText); + } + switch (type) { + case "blob": + return response.blob(); + case "bytes": + return response.bytes(); + case "json": + return response.json(); + } + return response.text(); + } + return new Promise((resolve, reject) => { + const request = new XMLHttpRequest(); + request.open("GET", url, true); + request.responseType = type === "bytes" ? "arraybuffer" : type; + request.onreadystatechange = () => { + if (request.readyState !== XMLHttpRequest.DONE) { + return; + } + if (request.status === 200 || request.status === 0) { + switch (type) { + case "bytes": + resolve(new Uint8Array(request.response)); + return; + case "blob": + case "json": + resolve(request.response); + return; + } + resolve(request.responseText); + return; + } + reject(new Error(request.statusText)); + }; + request.send(null); + }); +} +class RenderingCancelledException extends BaseException { + constructor(msg, extraDelay = 0) { + super(msg, "RenderingCancelledException"); + this.extraDelay = extraDelay; + } +} +function isDataScheme(url) { + const ii = url.length; + let i = 0; + while (i < ii && url[i].trim() === "") { + i++; + } + return url.substring(i, i + 5).toLowerCase() === "data:"; +} +function isPdfFile(filename) { + return typeof filename === "string" && /\.pdf$/i.test(filename); +} +function getFilenameFromUrl(url) { + [url] = url.split(/[#?]/, 1); + return stripPath(url); +} +function getPdfFilenameFromUrl(url, defaultFilename = "document.pdf") { + if (typeof url !== "string") { + return defaultFilename; + } + if (isDataScheme(url)) { + warn('getPdfFilenameFromUrl: ignore "data:"-URL for performance reasons.'); + return defaultFilename; + } + const getURL = urlString => { + try { + return new URL(urlString); + } catch {} + try { + return new URL(decodeURIComponent(urlString)); + } catch {} + try { + return new URL(urlString, "https://foo.bar"); + } catch {} + try { + return new URL(decodeURIComponent(urlString), "https://foo.bar"); + } catch {} + return null; + }; + const newURL = getURL(url); + if (!newURL) { + return defaultFilename; + } + const decode = name => { + try { + let decoded = decodeURIComponent(name); + if (decoded.includes("/")) { + decoded = stripPath(decoded); + if (decoded.length === 4 && pdfRegex.test(decoded)) { + return name; + } + } + return decoded; + } catch { + return name; + } + }; + const pdfRegex = /\.pdf$/i; + const filename = stripPath(newURL.pathname); + if (pdfRegex.test(filename)) { + return decode(filename); + } + if (newURL.searchParams.size > 0) { + const getLast = iterator => [...iterator].findLast(v => pdfRegex.test(v)); + const name = getLast(newURL.searchParams.values()) ?? getLast(newURL.searchParams.keys()); + if (name) { + return decode(name); + } + } + if (newURL.hash) { + const { + hash + } = newURL; + let extensionStart = -1; + for (const { + index + } of hash.matchAll(/\.pdf\b/gi)) { + extensionStart = index; + } + if (extensionStart > 0) { + let filenameStart = extensionStart; + while (filenameStart > 0 && !"/?#=".includes(hash[filenameStart - 1])) { + filenameStart--; + } + if (filenameStart < extensionStart) { + return decode(hash.slice(filenameStart, extensionStart + 4)); + } + } + } + return defaultFilename; +} +class StatTimer { + #started = new Map(); + times = []; + time(name) { + if (this.#started.has(name)) { + warn(`Timer is already running for ${name}`); + } + this.#started.set(name, Date.now()); + } + timeEnd(name) { + if (!this.#started.has(name)) { + warn(`Timer has not been started for ${name}`); + } + this.times.push({ + name, + start: this.#started.get(name), + end: Date.now() + }); + this.#started.delete(name); + } + toString() { + const longest = Math.max(...this.times.map(t => t.name.length)); + return this.times.map(t => `${t.name.padEnd(longest)} ${t.end - t.start}ms\n`).join(""); + } +} +function isValidFetchUrl(url, baseUrl) { + const res = baseUrl ? URL.parse(url, baseUrl) : URL.parse(url); + return /https?:/.test(res?.protocol ?? ""); +} +function noContextMenu(e) { + e.preventDefault(); +} +function stopEvent(e) { + e.preventDefault(); + e.stopPropagation(); +} +function deprecated(details) { + console.log("Deprecated API usage: " + details); +} +class PDFDateString { + static #regex; + static toDateObject(input) { + if (input instanceof Date) { + return input; + } + if (!input || typeof input !== "string") { + return null; + } + this.#regex ||= new RegExp("^D:" + "(\\d{4})" + "(\\d{2})?" + "(\\d{2})?" + "(\\d{2})?" + "(\\d{2})?" + "(\\d{2})?" + "([Z|+\\-])?" + "(\\d{2})?" + "'?" + "(\\d{2})?" + "'?"); + const matches = this.#regex.exec(input); + if (!matches) { + return null; + } + const year = parseInt(matches[1], 10); + let month = parseInt(matches[2], 10); + month = month >= 1 && month <= 12 ? month - 1 : 0; + let day = parseInt(matches[3], 10); + day = day >= 1 && day <= 31 ? day : 1; + let hour = parseInt(matches[4], 10); + hour = hour >= 0 && hour <= 23 ? hour : 0; + let minute = parseInt(matches[5], 10); + minute = minute >= 0 && minute <= 59 ? minute : 0; + let second = parseInt(matches[6], 10); + second = second >= 0 && second <= 59 ? second : 0; + const universalTimeRelation = matches[7] || "Z"; + let offsetHour = parseInt(matches[8], 10); + offsetHour = offsetHour >= 0 && offsetHour <= 23 ? offsetHour : 0; + let offsetMinute = parseInt(matches[9], 10) || 0; + offsetMinute = offsetMinute >= 0 && offsetMinute <= 59 ? offsetMinute : 0; + if (universalTimeRelation === "-") { + hour += offsetHour; + minute += offsetMinute; + } else if (universalTimeRelation === "+") { + hour -= offsetHour; + minute -= offsetMinute; + } + return new Date(Date.UTC(year, month, day, hour, minute, second)); + } +} +function getRGBA(color) { + if (color.startsWith("#")) { + const hex = color.slice(1); + return [parseInt(hex.slice(0, 2), 16), parseInt(hex.slice(2, 4), 16), parseInt(hex.slice(4, 6), 16), hex.length >= 8 ? parseInt(hex.slice(6, 8), 16) / 255 : 1]; + } + if (color.startsWith("rgb(")) { + const [r, g, b] = color.slice(4, -1).split(",").map(x => parseInt(x, 10)); + return [r, g, b, 1]; + } + if (color.startsWith("rgba(")) { + const parts = color.slice(5, -1).split(","); + return [parseInt(parts[0], 10), parseInt(parts[1], 10), parseInt(parts[2], 10), parseFloat(parts[3])]; + } + const m = color.match(/^color\(srgb\s+([\d.]+)\s+([\d.]+)\s+([\d.]+)(?:\s*\/\s*([\d.]+|none))?\)$/); + if (m) { + return [Math.round(parseFloat(m[1]) * 255), Math.round(parseFloat(m[2]) * 255), Math.round(parseFloat(m[3]) * 255), m[4] !== undefined && m[4] !== "none" ? parseFloat(m[4]) : 1]; + } + return null; +} +function getRGB(color) { + const rgba = getRGBA(color); + if (!rgba) { + warn(`Not a valid color format: "${color}"`); + return [0, 0, 0]; + } + return rgba.slice(0, 3); +} +function getColorValues(colors) { + const span = document.createElement("span"); + span.style.visibility = "hidden"; + span.style.colorScheme = "only light"; + document.body.append(span); + for (const name of colors.keys()) { + span.style.color = name; + const computedColor = window.getComputedStyle(span).color; + colors.set(name, getRGB(computedColor)); + } + span.remove(); +} +function getCurrentTransform(ctx) { + const { + a, + b, + c, + d, + e, + f + } = ctx.getTransform(); + return [a, b, c, d, e, f]; +} +function getCurrentTransformInverse(ctx) { + const { + a, + b, + c, + d, + e, + f + } = ctx.getTransform().invertSelf(); + return [a, b, c, d, e, f]; +} +function setLayerDimensions(div, viewport, mustFlip = false, mustRotate = true) { + if (viewport instanceof PageViewport) { + const { + pageWidth, + pageHeight + } = viewport.rawDims; + const { + style + } = div; + const widthStr = `round(down, var(--total-scale-factor) * ${pageWidth}px, var(--scale-round-x))`, + heightStr = `round(down, var(--total-scale-factor) * ${pageHeight}px, var(--scale-round-y))`; + if (!mustFlip || viewport.rotation % 180 === 0) { + style.width = widthStr; + style.height = heightStr; + } else { + style.width = heightStr; + style.height = widthStr; + } + } + if (mustRotate) { + div.setAttribute("data-main-rotation", viewport.rotation); + } +} +class OutputScale { + constructor() { + const { + pixelRatio + } = OutputScale; + this.sx = pixelRatio; + this.sy = pixelRatio; + } + get scaled() { + return this.sx !== 1 || this.sy !== 1; + } + get symmetric() { + return this.sx === this.sy; + } + limitCanvas(width, height, maxPixels, maxDim, capAreaFactor = -1) { + let maxAreaScale = Infinity, + maxWidthScale = Infinity, + maxHeightScale = Infinity; + maxPixels = OutputScale.capPixels(maxPixels, capAreaFactor); + if (maxPixels > 0) { + maxAreaScale = Math.sqrt(maxPixels / (width * height)); + } + if (maxDim !== -1) { + maxWidthScale = maxDim / width; + maxHeightScale = maxDim / height; + } + const maxScale = Math.min(maxAreaScale, maxWidthScale, maxHeightScale); + if (this.sx > maxScale || this.sy > maxScale) { + this.sx = maxScale; + this.sy = maxScale; + return true; + } + return false; + } + static get pixelRatio() { + return globalThis.devicePixelRatio || 1; + } + static capPixels(maxPixels, capAreaFactor) { + if (capAreaFactor >= 0) { + const winPixels = Math.ceil(window.screen.availWidth * window.screen.availHeight * this.pixelRatio ** 2 * (1 + capAreaFactor / 100)); + return maxPixels > 0 ? Math.min(maxPixels, winPixels) : winPixels; + } + return maxPixels; + } +} +const SupportedImageMimeTypes = new Set(["image/apng", "image/avif", "image/bmp", "image/gif", "image/jpeg", "image/png", "image/svg+xml", "image/webp", "image/x-icon"]); +class ColorScheme { + static get isDarkMode() { + return util_shadow(this, "isDarkMode", !!window?.matchMedia?.("(prefers-color-scheme: dark)").matches); + } +} +class CSSConstants { + static get commentForegroundColor() { + const element = document.createElement("span"); + element.classList.add("comment", "sidebar"); + const { + style + } = element; + style.width = style.height = "0"; + style.display = "none"; + style.color = "var(--comment-fg-color)"; + document.body.append(element); + const { + color + } = window.getComputedStyle(element); + element.remove(); + return util_shadow(this, "commentForegroundColor", getRGB(color)); + } +} +function applyOpacity(color, opacity) { + opacity = MathClamp(opacity ?? 1, 0, 1); + const white = 255 * (1 - opacity); + return color.map(c => Math.round(c * opacity + white)); +} +function RGBToHSL(rgb, output) { + const r = rgb[0] / 255; + const g = rgb[1] / 255; + const b = rgb[2] / 255; + const max = Math.max(r, g, b); + const min = Math.min(r, g, b); + const l = (max + min) / 2; + if (max === min) { + output[0] = output[1] = 0; + } else { + const d = max - min; + output[1] = l < 0.5 ? d / (max + min) : d / (2 - max - min); + switch (max) { + case r: + output[0] = ((g - b) / d + (g < b ? 6 : 0)) * 60; + break; + case g: + output[0] = ((b - r) / d + 2) * 60; + break; + case b: + output[0] = ((r - g) / d + 4) * 60; + break; + } + } + output[2] = l; +} +function HSLToRGB(hsl, output) { + const h = hsl[0]; + const s = hsl[1]; + const l = hsl[2]; + const c = (1 - Math.abs(2 * l - 1)) * s; + const x = c * (1 - Math.abs(h / 60 % 2 - 1)); + const m = l - c / 2; + switch (Math.floor(h / 60)) { + case 0: + output[0] = c + m; + output[1] = x + m; + output[2] = m; + break; + case 1: + output[0] = x + m; + output[1] = c + m; + output[2] = m; + break; + case 2: + output[0] = m; + output[1] = c + m; + output[2] = x + m; + break; + case 3: + output[0] = m; + output[1] = x + m; + output[2] = c + m; + break; + case 4: + output[0] = x + m; + output[1] = m; + output[2] = c + m; + break; + case 5: + case 6: + output[0] = c + m; + output[1] = m; + output[2] = x + m; + break; + } +} +function computeLuminance(x) { + return x <= 0.03928 ? x / 12.92 : ((x + 0.055) / 1.055) ** 2.4; +} +function contrastRatio(hsl1, hsl2, output) { + HSLToRGB(hsl1, output); + output.map(computeLuminance); + const lum1 = 0.2126 * output[0] + 0.7152 * output[1] + 0.0722 * output[2]; + HSLToRGB(hsl2, output); + output.map(computeLuminance); + const lum2 = 0.2126 * output[0] + 0.7152 * output[1] + 0.0722 * output[2]; + return lum1 > lum2 ? (lum1 + 0.05) / (lum2 + 0.05) : (lum2 + 0.05) / (lum1 + 0.05); +} +const contrastCache = new Map(); +function findContrastColor(baseColor, fixedColor) { + const key = baseColor[0] + baseColor[1] * 0x100 + baseColor[2] * 0x10000 + fixedColor[0] * 0x1000000 + fixedColor[1] * 0x100000000 + fixedColor[2] * 0x10000000000; + let cachedValue = contrastCache.get(key); + if (cachedValue) { + return cachedValue; + } + const array = new Float32Array(9); + const output = array.subarray(0, 3); + const baseHSL = array.subarray(3, 6); + RGBToHSL(baseColor, baseHSL); + const fixedHSL = array.subarray(6, 9); + RGBToHSL(fixedColor, fixedHSL); + const isFixedColorDark = fixedHSL[2] < 0.5; + const minContrast = isFixedColorDark ? 12 : 4.5; + baseHSL[2] = isFixedColorDark ? Math.sqrt(baseHSL[2]) : 1 - Math.sqrt(1 - baseHSL[2]); + if (contrastRatio(baseHSL, fixedHSL, output) < minContrast) { + let start, end; + if (isFixedColorDark) { + start = baseHSL[2]; + end = 1; + } else { + start = 0; + end = baseHSL[2]; + } + const PRECISION = 0.005; + while (end - start > PRECISION) { + const mid = baseHSL[2] = (start + end) / 2; + if (isFixedColorDark === contrastRatio(baseHSL, fixedHSL, output) < minContrast) { + start = mid; + } else { + end = mid; + } + } + baseHSL[2] = isFixedColorDark ? end : start; + } + HSLToRGB(baseHSL, output); + cachedValue = Util.makeHexColor(Math.round(output[0] * 255), Math.round(output[1] * 255), Math.round(output[2] * 255)); + contrastCache.set(key, cachedValue); + return cachedValue; +} +function renderRichText({ + html, + dir, + className +}, container) { + const fragment = document.createDocumentFragment(); + if (typeof html === "string") { + const p = document.createElement("p"); + p.dir = dir || "auto"; + const lines = html.split(/\r\n?|\n/); + for (let i = 0, ii = lines.length; i < ii; ++i) { + const line = lines[i]; + p.append(document.createTextNode(line)); + if (i < ii - 1) { + p.append(document.createElement("br")); + } + } + fragment.append(p); + } else { + XfaLayer.render({ + xfaHtml: html, + div: fragment, + intent: "richText" + }); + } + fragment.firstElementChild.classList.add("richText", className); + container.append(fragment); +} +function makePathFromDrawOPS(data) { + const path = new Path2D(); + if (!data) { + return path; + } + for (let i = 0, ii = data.length; i < ii;) { + switch (data[i++]) { + case DrawOPS.moveTo: + path.moveTo(data[i++], data[i++]); + break; + case DrawOPS.lineTo: + path.lineTo(data[i++], data[i++]); + break; + case DrawOPS.curveTo: + path.bezierCurveTo(data[i++], data[i++], data[i++], data[i++], data[i++], data[i++]); + break; + case DrawOPS.quadraticCurveTo: + path.quadraticCurveTo(data[i++], data[i++], data[i++], data[i++]); + break; + case DrawOPS.closePath: + path.closePath(); + break; + default: + warn(`Unrecognized drawing path operator: ${data[i - 1]}`); + break; + } + } + return path; +} + +;// ./node_modules/core-js/modules/es.iterator.take.js +es_iterator_take_namespaceFn(); + +;// ./node_modules/core-js/modules/es.weak-map.get-or-insert.js +es_weak_map_get_or_insert_namespaceFn(); + +;// ./node_modules/core-js/modules/es.weak-map.get-or-insert-computed.js +es_weak_map_get_or_insert_computed_namespaceFn(); + +;// ./node_modules/core-js/modules/web.dom-exception.stack.js +web_dom_exception_stack_namespaceFn(); + +;// ./node_modules/core-js/modules/es.iterator.some.js +es_iterator_some_namespaceFn(); + +;// ./node_modules/core-js/modules/es.json.stringify.js +es_json_stringify_namespaceFn(); + +;// ./node_modules/core-js/modules/es.iterator.drop.js +es_iterator_drop_namespaceFn(); + +;// ./node_modules/core-js/modules/es.iterator.every.js +es_iterator_every_namespaceFn(); + +;// ./node_modules/core-js/modules/es.iterator.find.js +es_iterator_find_namespaceFn(); + +;// ./node_modules/core-js/modules/es.json.parse.js +es_json_parse_namespaceFn(); + +;// ./src/display/editor/toolbar.js + +class EditorToolbar { + #toolbar = null; + #colorPicker = null; + #editor; + #buttons = null; + #altText = null; + #comment = null; + #commentButtonDivider = null; + #signatureDescriptionButton = null; + static #l10nRemove = null; + constructor(editor) { + this.#editor = editor; + EditorToolbar.#l10nRemove ||= Object.freeze({ + freetext: "pdfjs-editor-remove-freetext-button", + highlight: "pdfjs-editor-remove-highlight-button", + ink: "pdfjs-editor-remove-ink-button", + stamp: "pdfjs-editor-remove-stamp-button", + signature: "pdfjs-editor-remove-signature-button" + }); + } + render() { + const editToolbar = this.#toolbar = document.createElement("div"); + editToolbar.classList.add("editToolbar", "hidden"); + editToolbar.setAttribute("role", "toolbar"); + const signal = this.#editor._uiManager._signal; + if (signal instanceof AbortSignal && !signal.aborted) { + editToolbar.addEventListener("contextmenu", noContextMenu, { + signal + }); + editToolbar.addEventListener("pointerdown", EditorToolbar.#pointerDown, { + signal + }); + } + const buttons = this.#buttons = document.createElement("div"); + buttons.className = "buttons"; + editToolbar.append(buttons); + const position = this.#editor.toolbarPosition; + if (position) { + const { + style + } = editToolbar; + const x = this.#editor._uiManager.direction === "ltr" ? 1 - position[0] : position[0]; + style.insetInlineEnd = `${100 * x}%`; + style.top = `calc(${100 * position[1]}% + var(--editor-toolbar-vert-offset))`; + } + return editToolbar; + } + get div() { + return this.#toolbar; + } + static #pointerDown(e) { + e.stopPropagation(); + } + #focusIn(e) { + this.#editor._focusEventsAllowed = false; + stopEvent(e); + } + #focusOut(e) { + this.#editor._focusEventsAllowed = true; + stopEvent(e); + } + #addListenersToElement(element) { + const signal = this.#editor._uiManager._signal; + if (!(signal instanceof AbortSignal) || signal.aborted) { + return false; + } + element.addEventListener("focusin", this.#focusIn.bind(this), { + capture: true, + signal + }); + element.addEventListener("focusout", this.#focusOut.bind(this), { + capture: true, + signal + }); + element.addEventListener("contextmenu", noContextMenu, { + signal + }); + return true; + } + hide() { + this.#toolbar.classList.add("hidden"); + this.#colorPicker?.hideDropdown(); + } + show() { + this.#toolbar.classList.remove("hidden"); + this.#altText?.shown(); + this.#comment?.shown(); + } + addDeleteButton() { + const { + editorType, + _uiManager + } = this.#editor; + const button = document.createElement("button"); + button.classList.add("basic", "deleteButton"); + button.tabIndex = 0; + button.setAttribute("data-l10n-id", EditorToolbar.#l10nRemove[editorType]); + if (this.#addListenersToElement(button)) { + button.addEventListener("click", e => { + _uiManager.delete(); + }, { + signal: _uiManager._signal + }); + } + this.#buttons.append(button); + } + get #divider() { + const divider = document.createElement("div"); + divider.className = "divider"; + return divider; + } + async addAltText(altText) { + const button = await altText.render(); + this.#addListenersToElement(button); + this.#buttons.append(button, this.#divider); + this.#altText = altText; + } + addComment(comment, beforeElement = null) { + if (this.#comment) { + return; + } + const button = comment.renderForToolbar(); + if (!button) { + return; + } + this.#addListenersToElement(button); + const divider = this.#commentButtonDivider = this.#divider; + if (!beforeElement) { + this.#buttons.append(button, divider); + } else { + this.#buttons.insertBefore(button, beforeElement); + this.#buttons.insertBefore(divider, beforeElement); + } + this.#comment = comment; + comment.toolbar = this; + } + addColorPicker(colorPicker) { + if (this.#colorPicker) { + return; + } + this.#colorPicker = colorPicker; + const button = colorPicker.renderButton(); + this.#addListenersToElement(button); + this.#buttons.append(button, this.#divider); + } + async addEditSignatureButton(signatureManager) { + const button = this.#signatureDescriptionButton = await signatureManager.renderEditButton(this.#editor); + if (!button) { + return; + } + this.#addListenersToElement(button); + this.#buttons.append(button, this.#divider); + } + removeButton(name) { + switch (name) { + case "comment": + this.#comment?.removeToolbarCommentButton(); + this.#comment = null; + this.#commentButtonDivider?.remove(); + this.#commentButtonDivider = null; + break; + } + } + async addButton(name, tool) { + switch (name) { + case "colorPicker": + if (tool) { + this.addColorPicker(tool); + } + break; + case "altText": + if (tool) { + await this.addAltText(tool); + } + break; + case "editSignature": + if (tool) { + await this.addEditSignatureButton(tool); + } + break; + case "delete": + this.addDeleteButton(); + break; + case "comment": + if (tool) { + this.addComment(tool); + } + break; + } + } + async addButtonBefore(name, tool, beforeSelector) { + if (!tool && name === "comment") { + return; + } + const beforeElement = this.#buttons.querySelector(beforeSelector); + if (!beforeElement) { + return; + } + if (name === "comment") { + this.addComment(tool, beforeElement); + } + } + updateEditSignatureButton(description) { + if (this.#signatureDescriptionButton) { + this.#signatureDescriptionButton.title = description; + } + } + remove() { + this.#toolbar.remove(); + this.#colorPicker?.destroy(); + this.#colorPicker = null; + } +} +class FloatingToolbar { + #buttons = null; + #toolbar = null; + #uiManager; + constructor(uiManager) { + this.#uiManager = uiManager; + } + #render() { + const editToolbar = this.#toolbar = document.createElement("div"); + editToolbar.className = "editToolbar"; + editToolbar.setAttribute("role", "toolbar"); + editToolbar.dir = this.#uiManager.direction; + const signal = this.#uiManager._signal; + if (signal instanceof AbortSignal && !signal.aborted) { + editToolbar.addEventListener("contextmenu", noContextMenu, { + signal + }); + } + const buttons = this.#buttons = document.createElement("div"); + buttons.className = "buttons"; + editToolbar.append(buttons); + if (this.#uiManager.hasCommentManager()) { + this.#makeButton("commentButton", `pdfjs-comment-floating-button`, "pdfjs-comment-floating-button-label", () => { + this.#uiManager.commentSelection("floating_button"); + }); + } + this.#makeButton("highlightButton", `pdfjs-highlight-floating-button1`, "pdfjs-highlight-floating-button-label", () => { + this.#uiManager.highlightSelection("floating_button"); + }); + return editToolbar; + } + #getLastPoint(boxes, isLTR) { + let lastY = 0; + let lastX = 0; + for (const box of boxes) { + const y = box.y + box.height; + if (y < lastY) { + continue; + } + const x = box.x + (isLTR ? box.width : 0); + if (y > lastY) { + lastX = x; + lastY = y; + continue; + } + if (isLTR) { + if (x > lastX) { + lastX = x; + } + } else if (x < lastX) { + lastX = x; + } + } + return [isLTR ? 1 - lastX : lastX, lastY]; + } + show(parent, boxes, isLTR) { + const [x, y] = this.#getLastPoint(boxes, isLTR); + const { + style + } = this.#toolbar ||= this.#render(); + parent.append(this.#toolbar); + style.insetInlineEnd = `${100 * x}%`; + style.top = `calc(${100 * y}% + var(--editor-toolbar-vert-offset))`; + } + hide() { + this.#toolbar.remove(); + } + #makeButton(buttonClass, l10nId, labelL10nId, clickHandler) { + const button = document.createElement("button"); + button.classList.add("basic", buttonClass); + button.tabIndex = 0; + button.setAttribute("data-l10n-id", l10nId); + const span = document.createElement("span"); + button.append(span); + span.className = "visuallyHidden"; + span.setAttribute("data-l10n-id", labelL10nId); + const signal = this.#uiManager._signal; + if (signal instanceof AbortSignal && !signal.aborted) { + button.addEventListener("contextmenu", noContextMenu, { + signal + }); + button.addEventListener("click", clickHandler, { + signal + }); + } + this.#buttons.append(button); + } +} + +;// ./src/shared/internal_evt.js +const INTERNAL_EVT = "fed9040f-f139-41a7-bcf0-3bcfcca89c08"; +const internalOpt = Object.freeze({ + internal: INTERNAL_EVT +}); + +;// ./src/display/editor/tools.js + + + + + + + + + + + + + + + + + + + + + + + +function bindEvents(obj, element, names) { + for (const name of names) { + element.addEventListener(name, obj[name].bind(obj)); + } +} +class CurrentPointers { + static #pointerId = NaN; + static #pointerIds = null; + static #moveTimestamp = NaN; + static #pointerType = null; + static initializeAndAddPointerId(pointerId) { + (CurrentPointers.#pointerIds ||= new Set()).add(pointerId); + } + static setPointer(pointerType, pointerId) { + CurrentPointers.#pointerId ||= pointerId; + CurrentPointers.#pointerType ??= pointerType; + } + static setTimeStamp(timeStamp) { + CurrentPointers.#moveTimestamp = timeStamp; + } + static isSamePointerId(pointerId) { + return CurrentPointers.#pointerId === pointerId; + } + static isSamePointerIdOrRemove(pointerId) { + if (CurrentPointers.#pointerId === pointerId) { + return true; + } + CurrentPointers.#pointerIds?.delete(pointerId); + return false; + } + static isSamePointerType(pointerType) { + return CurrentPointers.#pointerType === pointerType; + } + static isInitializedAndDifferentPointerType(pointerType) { + return CurrentPointers.#pointerType !== null && !CurrentPointers.isSamePointerType(pointerType); + } + static isSameTimeStamp(timeStamp) { + return CurrentPointers.#moveTimestamp === timeStamp; + } + static isUsingMultiplePointers() { + return CurrentPointers.#pointerIds?.size >= 1; + } + static clearPointerType() { + CurrentPointers.#pointerType = null; + } + static clearPointerIds() { + CurrentPointers.#pointerId = NaN; + CurrentPointers.#pointerIds = null; + } + static clearTimeStamp() { + CurrentPointers.#moveTimestamp = NaN; + } +} +class IdManager { + #id = 0; + get id() { + return `${AnnotationEditorPrefix}${this.#id++}`; + } +} +class ImageManager { + #baseId = getUuid(); + #id = 0; + #cache = null; + static get _isSVGFittingCanvas() { + const svg = `data:image/svg+xml;charset=UTF-8,`; + const canvas = new OffscreenCanvas(1, 3); + const ctx = canvas.getContext("2d", { + willReadFrequently: true + }); + const image = new Image(); + image.src = svg; + const promise = image.decode().then(() => { + ctx.drawImage(image, 0, 0, 1, 1, 0, 0, 1, 3); + return new Uint32Array(ctx.getImageData(0, 0, 1, 1).data.buffer)[0] === 0; + }); + return util_shadow(this, "_isSVGFittingCanvas", promise); + } + async #get(key, rawData) { + this.#cache ||= new Map(); + let data = this.#cache.get(key); + if (data === null) { + return null; + } + if (data?.bitmap) { + data.refCounter += 1; + return data; + } + try { + data ||= { + bitmap: null, + id: `image_${this.#baseId}_${this.#id++}`, + refCounter: 0, + isSvg: false + }; + let image; + if (typeof rawData === "string") { + data.url = rawData; + image = await fetchData(rawData, "blob"); + } else if (rawData instanceof File) { + image = data.file = rawData; + } else if (rawData instanceof Blob) { + image = rawData; + } + if (image.type === "image/svg+xml") { + const mustRemoveAspectRatioPromise = ImageManager._isSVGFittingCanvas; + const fileReader = new FileReader(); + const imageElement = new Image(); + const imagePromise = new Promise((resolve, reject) => { + imageElement.onload = () => { + data.bitmap = imageElement; + data.isSvg = true; + resolve(); + }; + fileReader.onload = async () => { + const url = data.svgUrl = fileReader.result; + imageElement.src = (await mustRemoveAspectRatioPromise) ? `${url}#svgView(preserveAspectRatio(none))` : url; + }; + imageElement.onerror = fileReader.onerror = reject; + }); + fileReader.readAsDataURL(image); + await imagePromise; + } else { + data.bitmap = await createImageBitmap(image); + } + data.refCounter = 1; + } catch (e) { + warn(e); + data = null; + } + this.#cache.set(key, data); + if (data) { + this.#cache.set(data.id, data); + } + return data; + } + async getFromFile(file) { + const { + lastModified, + name, + size, + type + } = file; + return this.#get(`${lastModified}_${name}_${size}_${type}`, file); + } + async getFromUrl(url) { + return this.#get(url, url); + } + async getFromBlob(id, blobPromise) { + const blob = await blobPromise; + return this.#get(id, blob); + } + async getFromId(id) { + this.#cache ||= new Map(); + const data = this.#cache.get(id); + if (!data) { + return null; + } + if (data.bitmap) { + data.refCounter += 1; + return data; + } + if (data.file) { + return this.getFromFile(data.file); + } + if (data.blobPromise) { + const { + blobPromise + } = data; + delete data.blobPromise; + return this.getFromBlob(data.id, blobPromise); + } + return this.getFromUrl(data.url); + } + getFromCanvas(id, canvas) { + this.#cache ||= new Map(); + let data = this.#cache.get(id); + if (data?.bitmap) { + data.refCounter += 1; + return data; + } + const offscreen = new OffscreenCanvas(canvas.width, canvas.height); + const ctx = offscreen.getContext("2d"); + ctx.drawImage(canvas, 0, 0); + data = { + bitmap: offscreen.transferToImageBitmap(), + id: `image_${this.#baseId}_${this.#id++}`, + refCounter: 1, + isSvg: false + }; + this.#cache.set(id, data); + this.#cache.set(data.id, data); + return data; + } + getSvgUrl(id) { + const data = this.#cache.get(id); + return !data?.isSvg ? null : data.svgUrl; + } + deleteId(id) { + this.#cache ||= new Map(); + const data = this.#cache.get(id); + if (!data) { + return; + } + data.refCounter -= 1; + if (data.refCounter !== 0) { + return; + } + const { + bitmap + } = data; + if (!data.url && !data.file) { + const canvas = new OffscreenCanvas(bitmap.width, bitmap.height); + const ctx = canvas.getContext("bitmaprenderer"); + ctx.transferFromImageBitmap(bitmap); + data.blobPromise = canvas.convertToBlob(); + } + bitmap.close?.(); + data.bitmap = null; + } + isValidId(id) { + return id.startsWith(`image_${this.#baseId}_`); + } +} +class CommandManager { + #commands = []; + #locked = false; + #maxSize; + #position = -1; + constructor(maxSize = 128) { + this.#maxSize = maxSize; + } + add({ + cmd, + undo, + post, + mustExec, + type = NaN, + overwriteIfSameType = false, + keepUndo = false + }) { + if (mustExec) { + cmd(); + } + if (this.#locked) { + return; + } + const save = { + cmd, + undo, + post, + type + }; + if (this.#position === -1) { + if (this.#commands.length > 0) { + this.#commands.length = 0; + } + this.#position = 0; + this.#commands.push(save); + return; + } + if (overwriteIfSameType && this.#commands[this.#position].type === type) { + if (keepUndo) { + save.undo = this.#commands[this.#position].undo; + } + this.#commands[this.#position] = save; + return; + } + const next = this.#position + 1; + if (next === this.#maxSize) { + this.#commands.splice(0, 1); + } else { + this.#position = next; + if (next < this.#commands.length) { + this.#commands.splice(next); + } + } + this.#commands.push(save); + } + undo() { + if (this.#position === -1) { + return; + } + this.#locked = true; + const { + undo, + post + } = this.#commands[this.#position]; + undo(); + post?.(); + this.#locked = false; + this.#position -= 1; + } + redo() { + if (this.#position < this.#commands.length - 1) { + this.#position += 1; + this.#locked = true; + const { + cmd, + post + } = this.#commands[this.#position]; + cmd(); + post?.(); + this.#locked = false; + } + } + hasSomethingToUndo() { + return this.#position !== -1; + } + hasSomethingToRedo() { + return this.#position < this.#commands.length - 1; + } + cleanType(type) { + if (this.#position === -1) { + return; + } + for (let i = this.#position; i >= 0; i--) { + if (this.#commands[i].type !== type) { + this.#commands.splice(i + 1, this.#position - i); + this.#position = i; + return; + } + } + this.#commands.length = 0; + this.#position = -1; + } + destroy() { + this.#commands = null; + } +} +class KeyboardManager { + static ALT = 0x1; + static CTRL = 0x2; + static META = 0x4; + static SHIFT = 0x8; + constructor(callbacks) { + this.callbacks = new Map(); + const { + isMac + } = FeatureTest.platform; + for (const [keys, callback, options = {}] of callbacks) { + const hasMacOverride = keys.some(k => k.startsWith("mac+")); + for (const key of keys) { + let shortcut = key; + if (hasMacOverride) { + const isMacKey = key.startsWith("mac+"); + if (isMac !== isMacKey) { + continue; + } + if (isMacKey) { + shortcut = key.slice(4); + } + } + const [keyName, modifiers] = KeyboardManager.#parseShortcut(shortcut); + if (keyName === null) { + continue; + } + this.callbacks.getOrInsertComputed(keyName, makeArr).push({ + callback, + options, + modifiers + }); + } + } + } + static #parseShortcut(value) { + let keyPart = null; + let modifiers = 0; + for (let part of value.split("+")) { + part = part.trim(); + if (!part) { + continue; + } + const upper = part.toUpperCase(); + const modifier = KeyboardManager[upper]; + if (modifier) { + modifiers |= modifier; + continue; + } + if (keyPart !== null) { + warn(`KeyboardManager: multiple keys in shortcut "${value}"`); + break; + } + keyPart = upper === "SPACE" ? " " : part; + } + if (keyPart === null) { + warn(`KeyboardManager: no key found in shortcut "${value}"`); + } + return [keyPart, modifiers]; + } + static #codeToKey(code) { + const match = /^(?:Key([A-Z])|(?:Digit|Numpad)(\d))$/.exec(code); + return !match ? null : match[1]?.toLowerCase() ?? match[2]; + } + exec(self, event) { + let shortcuts = this.callbacks.get(event.key); + if (!shortcuts) { + if (/^[a-z]$/i.test(event.key)) { + return; + } + const fallback = KeyboardManager.#codeToKey(event.code); + if (fallback === null || fallback === event.key) { + return; + } + shortcuts = this.callbacks.get(fallback); + if (!shortcuts) { + return; + } + } + const eventModifiers = (event.altKey ? KeyboardManager.ALT : 0) | (event.ctrlKey ? KeyboardManager.CTRL : 0) | (event.metaKey ? KeyboardManager.META : 0) | (event.shiftKey ? KeyboardManager.SHIFT : 0); + const info = shortcuts.find(shortcut => shortcut.modifiers === eventModifiers); + if (!info) { + return; + } + const { + callback, + options: { + bubbles = false, + args = [], + checker = null + } + } = info; + if (checker && !checker(self, event)) { + return; + } + callback.bind(self, ...args, event)(); + if (!bubbles) { + stopEvent(event); + } + } +} +class ColorManager { + static _colorsMapping = new Map([["CanvasText", [0, 0, 0]], ["Canvas", [255, 255, 255]]]); + get _colors() { + const colors = new Map([["CanvasText", null], ["Canvas", null]]); + getColorValues(colors); + return util_shadow(this, "_colors", colors); + } + convert(color) { + const rgb = getRGB(color); + if (!window.matchMedia("(forced-colors: active)").matches) { + return rgb; + } + for (const [name, RGB] of this._colors) { + if (RGB.every((x, i) => x === rgb[i])) { + return ColorManager._colorsMapping.get(name); + } + } + return rgb; + } + getHexCode(name) { + const rgb = this._colors.get(name); + return !rgb ? name : Util.makeHexColor(...rgb); + } +} +class AnnotationEditorUIManager { + #abortController = new AbortController(); + #activeEditor = null; + #allEditableAnnotations = null; + #allEditors = new Map(); + #allLayers = new Map(); + #savedAllLayers = null; + #savedEditorsByPage = null; + #altTextManager = null; + #annotationStorage = null; + #changedExistingAnnotations = null; + #commandManager = new CommandManager(); + #commentManager = null; + #copyPasteAC = null; + #currentDrawingSession = null; + #currentPageIndex = 0; + #deletedAnnotationsElementIds = new Set(); + #draggingEditors = null; + #editorTypes = null; + #editorsToRescale = new Set(); + _editorUndoBar = null; + #enableHighlightFloatingButton = false; + #enableUpdatedAddImage = false; + #enableNewAltTextWhenAddingImage = false; + #filterFactory = null; + #focusMainContainerTimeoutId = null; + #focusManagerAC = null; + #highlightColors = null; + #highlightWhenShiftUp = false; + #floatingToolbar = null; + #idManager = new IdManager(); + #isEnabled = false; + #isPointerDown = false; + #isWaiting = false; + #keyboardManagerAC = null; + #lastActiveElement = null; + #mainHighlightColorPicker = null; + #missingCanvases = null; + #mlManager = null; + #mode = AnnotationEditorType.NONE; + #selectedEditors = new Set(); + #selectedTextNode = null; + #signatureManager = null; + #pageColors = null; + #showAllStates = null; + #pdfDocument = null; + #previousStates = { + isEditing: false, + isEmpty: true, + hasSomethingToUndo: false, + hasSomethingToRedo: false, + hasSelectedEditor: false, + hasSelectedText: false + }; + #translation = [0, 0]; + #translationTimeoutId = null; + #container = null; + #viewer = null; + #viewerAlert = null; + #updateModeCapability = null; + static TRANSLATE_SMALL = 1; + static TRANSLATE_BIG = 10; + static get _keyboardManager() { + const proto = AnnotationEditorUIManager.prototype; + const arrowChecker = self => self.#container.contains(document.activeElement) && document.activeElement.tagName !== "BUTTON" && self.hasSomethingToControl(); + const textInputChecker = (_self, { + target: el + }) => { + if (el instanceof HTMLInputElement) { + const { + type + } = el; + return type !== "text" && type !== "number"; + } + return true; + }; + const small = this.TRANSLATE_SMALL; + const big = this.TRANSLATE_BIG; + return util_shadow(this, "_keyboardManager", new KeyboardManager([[["ctrl+a", "mac+meta+a"], proto.selectAll, { + checker: textInputChecker + }], [["ctrl+z", "mac+meta+z"], proto.undo, { + checker: textInputChecker + }], [["ctrl+y", "ctrl+shift+z", "mac+meta+shift+z", "ctrl+shift+Z", "mac+meta+shift+Z"], proto.redo, { + checker: textInputChecker + }], [["Backspace", "alt+Backspace", "ctrl+Backspace", "shift+Backspace", "mac+Backspace", "mac+alt+Backspace", "mac+ctrl+Backspace", "Delete", "ctrl+Delete", "shift+Delete", "mac+Delete"], proto.delete, { + checker: textInputChecker + }], [["Enter"], proto.addNewEditorFromKeyboard, { + checker: (self, { + target: el + }) => !(el instanceof HTMLButtonElement) && self.#container.contains(el) && !self.isEnterHandled + }], [["Space"], proto.addNewEditorFromKeyboard, { + checker: (self, { + target: el + }) => !(el instanceof HTMLButtonElement) && self.#container.contains(document.activeElement) + }], [["Escape"], proto.unselectAll], [["ArrowLeft"], proto.translateSelectedEditors, { + args: [-small, 0], + checker: arrowChecker + }], [["ctrl+ArrowLeft", "mac+shift+ArrowLeft"], proto.translateSelectedEditors, { + args: [-big, 0], + checker: arrowChecker + }], [["ArrowRight"], proto.translateSelectedEditors, { + args: [small, 0], + checker: arrowChecker + }], [["ctrl+ArrowRight", "mac+shift+ArrowRight"], proto.translateSelectedEditors, { + args: [big, 0], + checker: arrowChecker + }], [["ArrowUp"], proto.translateSelectedEditors, { + args: [0, -small], + checker: arrowChecker + }], [["ctrl+ArrowUp", "mac+shift+ArrowUp"], proto.translateSelectedEditors, { + args: [0, -big], + checker: arrowChecker + }], [["ArrowDown"], proto.translateSelectedEditors, { + args: [0, small], + checker: arrowChecker + }], [["ctrl+ArrowDown", "mac+shift+ArrowDown"], proto.translateSelectedEditors, { + args: [0, big], + checker: arrowChecker + }]])); + } + constructor(container, viewer, viewerAlert, altTextManager, commentManager, signatureManager, eventBus, pdfDocument, pageColors, highlightColors, enableHighlightFloatingButton, enableUpdatedAddImage, enableNewAltTextWhenAddingImage, mlManager, editorUndoBar, supportsPinchToZoom) { + const signal = this._signal = this.#abortController.signal; + this.#container = container; + this.#viewer = viewer; + this.#viewerAlert = viewerAlert; + this.#altTextManager = altTextManager; + this.#commentManager = commentManager; + this.#signatureManager = signatureManager; + this.#pdfDocument = pdfDocument; + this._eventBus = eventBus; + const evtOpts = { + signal, + ...internalOpt + }; + eventBus.on("editingaction", this.onEditingAction.bind(this), evtOpts); + eventBus.on("pagechanging", this.onPageChanging.bind(this), evtOpts); + eventBus.on("scalechanging", this.onScaleChanging.bind(this), evtOpts); + eventBus.on("rotationchanging", this.onRotationChanging.bind(this), evtOpts); + eventBus.on("setpreference", this.onSetPreference.bind(this), evtOpts); + eventBus.on("switchannotationeditorparams", evt => this.updateParams(evt.type, evt.value), evtOpts); + window.addEventListener("pointerdown", () => { + this.#isPointerDown = true; + }, { + capture: true, + signal + }); + window.addEventListener("pointerup", () => { + this.#isPointerDown = false; + }, { + capture: true, + signal + }); + window.addEventListener("beforeunload", this.endCurrentEditing.bind(this), { + capture: true, + signal + }); + this.#addSelectionListener(); + this.#addDragAndDropListeners(); + this.#addKeyboardManager(); + this.#annotationStorage = pdfDocument.annotationStorage; + this.#filterFactory = pdfDocument.filterFactory; + this.#pageColors = pageColors; + this.#highlightColors = highlightColors || null; + this.#enableHighlightFloatingButton = enableHighlightFloatingButton; + this.#enableUpdatedAddImage = enableUpdatedAddImage; + this.#enableNewAltTextWhenAddingImage = enableNewAltTextWhenAddingImage; + this.#mlManager = mlManager || null; + this.viewParameters = { + realScale: PixelsPerInch.PDF_TO_CSS_UNITS, + rotation: 0 + }; + this.isShiftKeyDown = false; + this._editorUndoBar = editorUndoBar || null; + this._supportsPinchToZoom = supportsPinchToZoom !== false; + commentManager?.setSidebarUiManager(this); + } + destroy() { + this.#updateModeCapability?.resolve(); + this.#updateModeCapability = null; + this.#abortController?.abort(); + this.#abortController = null; + this._signal = null; + for (const layer of this.#allLayers.values()) { + layer.destroy(); + } + this.#allLayers.clear(); + this.#allEditors.clear(); + this.#editorsToRescale.clear(); + this.#missingCanvases?.clear(); + this.#activeEditor = null; + this.#selectedEditors.clear(); + this.#commandManager.destroy(); + this.#altTextManager?.destroy(); + this.#commentManager?.destroy(); + this.#signatureManager?.destroy(); + this.#floatingToolbar?.hide(); + this.#floatingToolbar = null; + this.#mainHighlightColorPicker?.destroy(); + this.#mainHighlightColorPicker = null; + this.#allEditableAnnotations = null; + if (this.#focusMainContainerTimeoutId) { + clearTimeout(this.#focusMainContainerTimeoutId); + this.#focusMainContainerTimeoutId = null; + } + if (this.#translationTimeoutId) { + clearTimeout(this.#translationTimeoutId); + this.#translationTimeoutId = null; + } + this._editorUndoBar?.destroy(); + this.#pdfDocument = null; + } + combinedSignal(ac) { + return AbortSignal.any([this._signal, ac.signal]); + } + get mlManager() { + return this.#mlManager; + } + get useNewAltTextFlow() { + return this.#enableUpdatedAddImage; + } + get useNewAltTextWhenAddingImage() { + return this.#enableNewAltTextWhenAddingImage; + } + get hcmFilter() { + return util_shadow(this, "hcmFilter", this.#pageColors ? this.#filterFactory.addHCMFilter(this.#pageColors.foreground, this.#pageColors.background) : "none"); + } + get direction() { + return util_shadow(this, "direction", getComputedStyle(this.#container).direction); + } + get _highlightColors() { + return util_shadow(this, "_highlightColors", this.#highlightColors ? new Map(this.#highlightColors.split(",").map(pair => { + pair = pair.split("=").map(x => x.trim()); + pair[1] = pair[1].toUpperCase(); + return pair; + })) : null); + } + get highlightColors() { + const { + _highlightColors + } = this; + if (!_highlightColors) { + return util_shadow(this, "highlightColors", null); + } + const map = new Map(); + const hasHCM = !!this.#pageColors; + for (const [name, color] of _highlightColors) { + const isNameForHCM = name.endsWith("_HCM"); + if (hasHCM && isNameForHCM) { + map.set(name.replace("_HCM", ""), color); + continue; + } + if (!hasHCM && !isNameForHCM) { + map.set(name, color); + } + } + return util_shadow(this, "highlightColors", map); + } + get highlightColorNames() { + return util_shadow(this, "highlightColorNames", this.highlightColors ? new Map(Array.from(this.highlightColors, e => e.reverse())) : null); + } + getNonHCMColor(color) { + if (!this._highlightColors) { + return color; + } + const colorName = this.highlightColorNames.get(color); + return this._highlightColors.get(colorName) || color; + } + getNonHCMColorName(color) { + return this.highlightColorNames.get(color) || color; + } + setCurrentDrawingSession(layer) { + if (layer) { + this.unselectAll(); + this.disableUserSelect(true); + } else { + this.disableUserSelect(false); + } + this.#currentDrawingSession = layer; + } + setMainHighlightColorPicker(colorPicker) { + this.#mainHighlightColorPicker = colorPicker; + } + editAltText(editor, firstTime = false) { + this.#altTextManager?.editAltText(this, editor, firstTime); + } + hasCommentManager() { + return !!this.#commentManager; + } + editComment(editor, posX, posY, options) { + this.#commentManager?.showDialog(this, editor, posX, posY, options); + } + selectComment(pageIndex, uid) { + const layer = this.#allLayers.get(pageIndex); + const editor = layer?.getEditorByUID(uid); + editor?.toggleComment(true, true); + } + updateComment(editor) { + this.#commentManager?.updateComment(editor.getData()); + } + updatePopupColor(editor) { + this.#commentManager?.updatePopupColor(editor); + } + removeComment(editor) { + this.#commentManager?.removeComments([editor.uid]); + } + deleteComment(editor, savedData) { + const undo = () => { + editor.comment = savedData; + }; + const cmd = () => { + this._editorUndoBar?.show(undo, "comment"); + this.toggleComment(null); + editor.comment = null; + }; + this.addCommands({ + cmd, + undo, + mustExec: true + }); + } + toggleComment(editor, isSelected, visibility = undefined) { + this.#commentManager?.toggleCommentPopup(editor, isSelected, visibility); + } + makeCommentColor(color, opacity) { + return color && this.#commentManager?.makeCommentColor(color, opacity) || null; + } + getCommentDialogElement() { + return this.#commentManager?.dialogElement || null; + } + async waitForEditorsRendered(pageNumber) { + if (this.#allLayers.has(pageNumber - 1)) { + return; + } + const { + resolve, + promise + } = Promise.withResolvers(); + const onEditorsRendered = evt => { + if (evt.pageNumber === pageNumber) { + this._eventBus.off("editorsrendered", onEditorsRendered); + resolve(); + } + }; + this._eventBus.on("editorsrendered", onEditorsRendered, internalOpt); + await promise; + } + getSignature(editor) { + this.#signatureManager?.getSignature({ + uiManager: this, + editor + }); + } + get signatureManager() { + return this.#signatureManager; + } + switchToMode(mode, callback) { + this._eventBus.on("annotationeditormodechanged", callback, { + once: true, + signal: this._signal, + ...internalOpt + }); + this._eventBus.dispatch("showannotationeditorui", { + source: this, + mode + }); + } + setPreference(name, value) { + this._eventBus.dispatch("setpreference", { + source: this, + name, + value + }); + } + onSetPreference({ + name, + value + }) { + switch (name) { + case "enableNewAltTextWhenAddingImage": + this.#enableNewAltTextWhenAddingImage = value; + break; + } + } + onPageChanging({ + pageNumber + }) { + this.#currentPageIndex = pageNumber - 1; + } + deletePage(id) { + for (const editor of this.getEditors(id)) { + editor.remove(); + } + this.#allLayers.delete(id); + if (this.#currentPageIndex === id) { + this.#currentPageIndex = 0; + } + } + focusMainContainer() { + this.#container.focus(); + } + findParent(x, y) { + for (const layer of this.#allLayers.values()) { + const { + x: layerX, + y: layerY, + width, + height + } = layer.div.getBoundingClientRect(); + if (x >= layerX && x <= layerX + width && y >= layerY && y <= layerY + height) { + return layer; + } + } + return null; + } + disableUserSelect(value = false) { + this.#viewer.classList.toggle("noUserSelect", value); + } + addShouldRescale(editor) { + this.#editorsToRescale.add(editor); + } + removeShouldRescale(editor) { + this.#editorsToRescale.delete(editor); + } + onScaleChanging({ + scale + }) { + this.commitOrRemove(); + this.viewParameters.realScale = scale * PixelsPerInch.PDF_TO_CSS_UNITS; + for (const editor of this.#editorsToRescale) { + editor.onScaleChanging(); + } + this.#currentDrawingSession?.onScaleChanging(); + } + onRotationChanging({ + pagesRotation + }) { + this.commitOrRemove(); + this.viewParameters.rotation = pagesRotation; + } + #getAnchorElementForSelection({ + anchorNode + }) { + return anchorNode.nodeType === Node.TEXT_NODE ? anchorNode.parentElement : anchorNode; + } + #getLayerForTextLayer(textLayer) { + const { + currentLayer + } = this; + if (currentLayer.hasTextLayer(textLayer)) { + return currentLayer; + } + for (const layer of this.#allLayers.values()) { + if (layer.hasTextLayer(textLayer)) { + return layer; + } + } + return null; + } + highlightSelection(methodOfCreation = "", comment = false) { + const selection = document.getSelection(); + if (!selection || selection.isCollapsed) { + return; + } + const { + anchorNode, + anchorOffset, + focusNode, + focusOffset + } = selection; + const text = selection.toString(); + const anchorElement = this.#getAnchorElementForSelection(selection); + const textLayer = anchorElement.closest(".textLayer"); + const boxes = this.getSelectionBoxes(textLayer); + if (!boxes) { + return; + } + selection.empty(); + const layer = this.#getLayerForTextLayer(textLayer); + const isNoneMode = this.#mode === AnnotationEditorType.NONE; + const callback = () => { + const editor = layer?.createAndAddNewEditor({ + x: 0, + y: 0 + }, false, { + methodOfCreation, + boxes, + anchorNode, + anchorOffset, + focusNode, + focusOffset, + text + }); + if (isNoneMode) { + this.showAllEditors("highlight", true, true); + } + if (comment) { + editor?.editComment(); + } + }; + if (isNoneMode) { + this.switchToMode(AnnotationEditorType.HIGHLIGHT, callback); + return; + } + callback(); + } + commentSelection(methodOfCreation = "") { + this.highlightSelection(methodOfCreation, true); + } + endCurrentEditing() { + this.commitOrRemove(); + this.currentLayer?.endDrawingSession(false); + } + #displayFloatingToolbar() { + const selection = document.getSelection(); + if (!selection || selection.isCollapsed) { + return; + } + const anchorElement = this.#getAnchorElementForSelection(selection); + const textLayer = anchorElement.closest(".textLayer"); + const boxes = this.getSelectionBoxes(textLayer); + if (!boxes) { + return; + } + this.#floatingToolbar ||= new FloatingToolbar(this); + this.#floatingToolbar.show(textLayer, boxes, this.direction === "ltr"); + } + getAndRemoveDataFromAnnotationStorage(annotationId) { + if (!this.#annotationStorage) { + return null; + } + const key = `${AnnotationEditorPrefix}${annotationId}`; + const storedValue = this.#annotationStorage.getRawValue(key); + if (storedValue) { + this.#annotationStorage.remove(key); + } + return storedValue; + } + addToAnnotationStorage(editor) { + if (!editor.isEmpty() && this.#annotationStorage && !this.#annotationStorage.has(editor.id)) { + this.#annotationStorage.setValue(editor.id, editor); + } + } + a11yAlert(messageId, args = null) { + const viewerAlert = this.#viewerAlert; + if (!viewerAlert) { + return; + } + viewerAlert.setAttribute("data-l10n-id", messageId); + if (args) { + viewerAlert.setAttribute("data-l10n-args", JSON.stringify(args)); + } else { + viewerAlert.removeAttribute("data-l10n-args"); + } + } + #selectionChange() { + const selection = document.getSelection(); + if (!selection || selection.isCollapsed) { + if (this.#selectedTextNode) { + this.#floatingToolbar?.hide(); + this.#selectedTextNode = null; + this.#dispatchUpdateStates({ + hasSelectedText: false + }); + } + return; + } + const { + anchorNode + } = selection; + if (anchorNode === this.#selectedTextNode) { + return; + } + const anchorElement = this.#getAnchorElementForSelection(selection); + const textLayer = anchorElement.closest(".textLayer"); + if (!textLayer) { + if (this.#selectedTextNode) { + this.#floatingToolbar?.hide(); + this.#selectedTextNode = null; + this.#dispatchUpdateStates({ + hasSelectedText: false + }); + } + return; + } + this.#floatingToolbar?.hide(); + this.#selectedTextNode = anchorNode; + this.#dispatchUpdateStates({ + hasSelectedText: true + }); + if (this.#mode !== AnnotationEditorType.HIGHLIGHT && this.#mode !== AnnotationEditorType.NONE) { + return; + } + if (this.#mode === AnnotationEditorType.HIGHLIGHT) { + this.showAllEditors("highlight", true, true); + } + this.#highlightWhenShiftUp = this.isShiftKeyDown; + if (!this.isShiftKeyDown) { + const activeLayer = this.#mode === AnnotationEditorType.HIGHLIGHT ? this.#getLayerForTextLayer(textLayer) : null; + activeLayer?.toggleDrawing(); + if (this.#isPointerDown) { + const ac = new AbortController(); + const signal = this.combinedSignal(ac); + const pointerup = e => { + if (e.type === "pointerup" && e.button !== 0) { + return; + } + ac.abort(); + activeLayer?.toggleDrawing(true); + if (e.type === "pointerup") { + this.#onSelectEnd("main_toolbar"); + } + }; + window.addEventListener("pointerup", pointerup, { + signal + }); + window.addEventListener("blur", pointerup, { + signal + }); + } else { + activeLayer?.toggleDrawing(true); + this.#onSelectEnd("main_toolbar"); + } + } + } + #onSelectEnd(methodOfCreation = "") { + if (this.#mode === AnnotationEditorType.HIGHLIGHT) { + this.highlightSelection(methodOfCreation); + } else if (this.#enableHighlightFloatingButton) { + this.#displayFloatingToolbar(); + } + } + #addSelectionListener() { + document.addEventListener("selectionchange", this.#selectionChange.bind(this), { + signal: this._signal + }); + } + #addFocusManager() { + if (this.#focusManagerAC) { + return; + } + this.#focusManagerAC = new AbortController(); + const signal = this.combinedSignal(this.#focusManagerAC); + window.addEventListener("focus", this.focus.bind(this), { + signal + }); + window.addEventListener("blur", this.blur.bind(this), { + signal + }); + } + #removeFocusManager() { + this.#focusManagerAC?.abort(); + this.#focusManagerAC = null; + } + blur() { + this.isShiftKeyDown = false; + if (this.#highlightWhenShiftUp) { + this.#highlightWhenShiftUp = false; + this.#onSelectEnd("main_toolbar"); + } + if (!this.hasSelection) { + return; + } + const { + activeElement + } = document; + for (const editor of this.#selectedEditors) { + if (editor.div.contains(activeElement)) { + this.#lastActiveElement = [editor, activeElement]; + editor._focusEventsAllowed = false; + break; + } + } + } + focus() { + if (!this.#lastActiveElement) { + return; + } + const [lastEditor, lastActiveElement] = this.#lastActiveElement; + this.#lastActiveElement = null; + lastActiveElement.addEventListener("focusin", () => { + lastEditor._focusEventsAllowed = true; + }, { + once: true, + signal: this._signal + }); + lastActiveElement.focus(); + } + #addKeyboardManager() { + if (this.#keyboardManagerAC) { + return; + } + this.#keyboardManagerAC = new AbortController(); + const signal = this.combinedSignal(this.#keyboardManagerAC); + window.addEventListener("keydown", this.keydown.bind(this), { + signal + }); + window.addEventListener("keyup", this.keyup.bind(this), { + signal + }); + } + #removeKeyboardManager() { + this.#keyboardManagerAC?.abort(); + this.#keyboardManagerAC = null; + } + #addCopyPasteListeners() { + if (this.#copyPasteAC) { + return; + } + this.#copyPasteAC = new AbortController(); + const signal = this.combinedSignal(this.#copyPasteAC); + document.addEventListener("copy", this.copy.bind(this), { + signal + }); + document.addEventListener("cut", this.cut.bind(this), { + signal + }); + document.addEventListener("paste", this.paste.bind(this), { + signal + }); + } + #removeCopyPasteListeners() { + this.#copyPasteAC?.abort(); + this.#copyPasteAC = null; + } + #addDragAndDropListeners() { + const signal = this._signal; + document.addEventListener("dragover", this.dragOver.bind(this), { + signal + }); + document.addEventListener("drop", this.drop.bind(this), { + signal + }); + } + addEditListeners() { + this.#addKeyboardManager(); + this.setEditingState(true); + } + removeEditListeners() { + this.#removeKeyboardManager(); + this.setEditingState(false); + } + dragOver(event) { + for (const { + type + } of event.dataTransfer.items) { + for (const editorType of this.#editorTypes) { + if (editorType.isHandlingMimeForPasting(type)) { + event.dataTransfer.dropEffect = "copy"; + event.preventDefault(); + return; + } + } + } + } + drop(event) { + for (const item of event.dataTransfer.items) { + for (const editorType of this.#editorTypes) { + if (editorType.isHandlingMimeForPasting(item.type)) { + editorType.paste(item, this.currentLayer); + event.preventDefault(); + return; + } + } + } + } + copy(event) { + event.preventDefault(); + this.#activeEditor?.commitOrRemove(); + if (!this.hasSelection) { + return; + } + const editors = []; + for (const editor of this.#selectedEditors) { + const serialized = editor.serialize(true); + if (serialized) { + editors.push(serialized); + } + } + if (editors.length === 0) { + return; + } + event.clipboardData.setData("application/pdfjs", JSON.stringify(editors)); + } + cut(event) { + this.copy(event); + this.delete(); + } + async paste(event) { + event.preventDefault(); + const { + clipboardData + } = event; + for (const item of clipboardData.items) { + for (const editorType of this.#editorTypes) { + if (editorType.isHandlingMimeForPasting(item.type)) { + editorType.paste(item, this.currentLayer); + return; + } + } + } + let data = clipboardData.getData("application/pdfjs"); + if (!data) { + return; + } + try { + data = JSON.parse(data); + } catch (ex) { + warn(`paste: "${ex.message}".`); + return; + } + if (!Array.isArray(data)) { + return; + } + this.unselectAll(); + const layer = this.currentLayer; + try { + const newEditors = []; + for (const editor of data) { + const deserializedEditor = await layer.deserialize(editor); + if (!deserializedEditor) { + return; + } + newEditors.push(deserializedEditor); + } + const cmd = () => { + for (const editor of newEditors) { + this.#addEditorToLayer(editor); + } + this.#selectEditors(newEditors); + }; + const undo = () => { + for (const editor of newEditors) { + editor.remove(); + } + }; + this.addCommands({ + cmd, + undo, + mustExec: true + }); + } catch (ex) { + warn(`paste: "${ex.message}".`); + } + } + keydown(event) { + if (!this.isShiftKeyDown && event.key === "Shift") { + this.isShiftKeyDown = true; + } + if (this.#mode !== AnnotationEditorType.NONE && !this.isEditorHandlingKeyboard) { + AnnotationEditorUIManager._keyboardManager.exec(this, event); + } + } + keyup(event) { + if (this.isShiftKeyDown && event.key === "Shift") { + this.isShiftKeyDown = false; + if (this.#highlightWhenShiftUp) { + this.#highlightWhenShiftUp = false; + this.#onSelectEnd("main_toolbar"); + } + } + } + onEditingAction({ + name + }) { + switch (name) { + case "undo": + case "redo": + case "delete": + case "selectAll": + this[name](); + break; + case "highlightSelection": + this.highlightSelection("context_menu"); + break; + case "commentSelection": + this.commentSelection("context_menu"); + break; + } + } + updatePageIndex(oldPageIndex, newPageIndex) { + for (const editor of this.#savedEditorsByPage.get(oldPageIndex) || []) { + editor.pageIndex = newPageIndex; + } + const layer = this.#savedAllLayers.get(oldPageIndex); + if (layer) { + layer.pageIndex = newPageIndex; + this.#allLayers.set(newPageIndex, layer); + if (this.#isEnabled) { + layer.enable(); + } else { + layer.disable(); + } + } + } + startUpdatePages() { + this.#savedAllLayers = new Map(this.#allLayers); + this.#allLayers.clear(); + const savedEditorsByPage = this.#savedEditorsByPage = new Map(); + const saveEditor = editor => { + savedEditorsByPage.getOrInsertComputed(editor.pageIndex, makeArr).push(editor); + }; + for (const editor of this.#allEditors.values()) { + saveEditor(editor); + } + for (const [id, editor] of this.#annotationStorage) { + if (id.startsWith(AnnotationEditorPrefix) && !this.#allEditors.has(id) && Number.isInteger(editor?.pageIndex)) { + saveEditor(editor); + } + } + } + endUpdatePages() { + this.#savedAllLayers = null; + this.#savedEditorsByPage = null; + } + clonePage(pageIndex, newPageIndex) { + for (const editor of this.getEditors(pageIndex)) { + const serialized = editor.serialize(editor.mode !== AnnotationEditorType.HIGHLIGHT); + if (!serialized) { + continue; + } + serialized.pageIndex = newPageIndex; + serialized.id = this.getId(); + serialized.isClone = true; + delete serialized.popupRef; + this.#annotationStorage.setValue(serialized.id, serialized); + } + } + findClonesForPage(layer) { + const promises = []; + const { + pageIndex + } = layer; + for (const [id, editor] of this.#annotationStorage) { + if (editor.pageIndex === pageIndex && editor.isClone) { + this.#annotationStorage.remove(id); + promises.push(layer.deserialize(editor).then(deserializedEditor => { + if (deserializedEditor) { + deserializedEditor.isClone = true; + layer.addOrRebuild(deserializedEditor); + } + })); + } + } + return Promise.all(promises); + } + #dispatchUpdateStates(details) { + const hasChanged = Object.entries(details).some(([key, value]) => this.#previousStates[key] !== value); + if (hasChanged) { + this._eventBus.dispatch("editingstateschanged", { + source: this, + details: Object.assign(this.#previousStates, details) + }); + if (this.#mode === AnnotationEditorType.HIGHLIGHT && details.hasSelectedEditor === false) { + this.#dispatchUpdateUI([[AnnotationEditorParamsType.HIGHLIGHT_FREE, true]]); + } + } + } + #dispatchUpdateUI(details) { + this._eventBus.dispatch("annotationeditorparamschanged", { + source: this, + details + }); + } + setEditingState(isEditing) { + if (isEditing) { + this.#addFocusManager(); + this.#addCopyPasteListeners(); + this.#dispatchUpdateStates({ + isEditing: this.#mode !== AnnotationEditorType.NONE, + isEmpty: this.#isEmpty(), + hasSomethingToUndo: this.#commandManager.hasSomethingToUndo(), + hasSomethingToRedo: this.#commandManager.hasSomethingToRedo(), + hasSelectedEditor: false + }); + } else { + this.#removeFocusManager(); + this.#removeCopyPasteListeners(); + this.#dispatchUpdateStates({ + isEditing: false + }); + this.disableUserSelect(false); + } + } + registerEditorTypes(types) { + if (this.#editorTypes) { + return; + } + this.#editorTypes = types; + for (const editorType of this.#editorTypes) { + this.#dispatchUpdateUI(editorType.defaultPropertiesToUpdate); + } + } + getId() { + return this.#idManager.id; + } + get currentLayer() { + return this.#allLayers.get(this.#currentPageIndex); + } + getLayer(pageIndex) { + return this.#allLayers.get(pageIndex); + } + get currentPageIndex() { + return this.#currentPageIndex; + } + addLayer(layer) { + this.#allLayers.set(layer.pageIndex, layer); + if (this.#isEnabled) { + layer.enable(); + } else { + layer.disable(); + } + } + removeLayer(layer) { + this.#allLayers.delete(layer.pageIndex); + } + async updateMode(mode, editId = null, isFromUser = false, isFromKeyboard = false, mustEnterInEditMode = false, editComment = false) { + if (this.#mode === mode) { + return; + } + if (this.#updateModeCapability) { + await this.#updateModeCapability.promise; + if (!this.#updateModeCapability) { + return; + } + } + this.#updateModeCapability = Promise.withResolvers(); + this.#currentDrawingSession?.commitOrRemove(); + if (this.#mode === AnnotationEditorType.POPUP) { + this.#commentManager?.hideSidebar(); + } + this.#commentManager?.destroyPopup(); + this.#mode = mode; + if (mode === AnnotationEditorType.NONE) { + this.setEditingState(false); + this.#disableAll(); + for (const editor of this.#allEditors.values()) { + editor.hideStandaloneCommentButton(); + } + this._editorUndoBar?.hide(); + this.toggleComment(null); + this.#updateModeCapability.resolve(); + return; + } + for (const editor of this.#allEditors.values()) { + editor.addStandaloneCommentButton(); + } + if (mode === AnnotationEditorType.SIGNATURE) { + await this.#signatureManager?.loadSignatures(); + } + if (isFromUser) { + CurrentPointers.clearPointerType(); + } + this.setEditingState(true); + await this.#enableAll(); + this.unselectAll(); + for (const layer of this.#allLayers.values()) { + layer.updateMode(mode); + } + if (mode === AnnotationEditorType.POPUP) { + this.#allEditableAnnotations ||= await this.#pdfDocument.getAnnotationsByType(new Set(this.#editorTypes.map(editorClass => editorClass._editorType))); + const elementIds = new Set(); + const allComments = []; + for (const editor of this.#allEditors.values()) { + const { + annotationElementId, + hasComment, + deleted + } = editor; + if (annotationElementId) { + elementIds.add(annotationElementId); + } + if (hasComment && !deleted) { + allComments.push(editor.getData()); + } + } + for (const annotation of this.#allEditableAnnotations) { + const { + id, + popupRef, + contentsObj + } = annotation; + if (popupRef && contentsObj?.str && !elementIds.has(id) && !this.#deletedAnnotationsElementIds.has(id)) { + allComments.push(annotation); + } + } + this.#commentManager?.showSidebar(allComments); + } + if (!editId) { + if (isFromKeyboard) { + this.addNewEditorFromKeyboard(); + } + this.#updateModeCapability.resolve(); + return; + } + for (const editor of this.#allEditors.values()) { + if (editor.uid === editId) { + this.setSelected(editor); + if (editComment) { + editor.editComment(); + } else if (mustEnterInEditMode) { + editor.enterInEditMode(); + } else { + editor.focus(); + } + } else { + editor.unselect(); + } + } + this.#updateModeCapability.resolve(); + } + addNewEditorFromKeyboard() { + if (this.currentLayer.canCreateNewEmptyEditor()) { + this.currentLayer.addNewEditor(); + } + } + updateToolbar(options) { + if (options.mode === this.#mode) { + return; + } + this._eventBus.dispatch("switchannotationeditormode", { + source: this, + ...options + }); + } + updateParams(type, value) { + if (!this.#editorTypes) { + return; + } + switch (type) { + case AnnotationEditorParamsType.CREATE: + this.currentLayer.addNewEditor(value); + return; + case AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL: + this._eventBus.dispatch("reporttelemetry", { + source: this, + details: { + type: "editing", + data: { + type: "highlight", + action: "toggle_visibility" + } + } + }); + (this.#showAllStates ||= new Map()).set(type, value); + this.showAllEditors("highlight", value); + break; + } + if (this.hasSelection) { + for (const editor of this.#selectedEditors) { + editor.updateParams(type, value); + } + } else { + for (const editorType of this.#editorTypes) { + editorType.updateDefaultParams(type, value); + } + } + } + showAllEditors(type, visible, updateButton = false) { + for (const editor of this.#allEditors.values()) { + if (editor.editorType === type) { + editor.show(visible); + } + } + const state = this.#showAllStates?.get(AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL) ?? true; + if (state !== visible) { + this.#dispatchUpdateUI([[AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL, visible]]); + } + } + enableWaiting(mustWait = false) { + if (this.#isWaiting === mustWait) { + return; + } + this.#isWaiting = mustWait; + for (const layer of this.#allLayers.values()) { + if (mustWait) { + layer.disableClick(); + } else { + layer.enableClick(); + } + layer.div.classList.toggle("waiting", mustWait); + } + } + async #enableAll() { + if (!this.#isEnabled) { + this.#isEnabled = true; + const promises = []; + for (const layer of this.#allLayers.values()) { + promises.push(layer.enable()); + } + await Promise.all(promises); + for (const editor of this.#allEditors.values()) { + editor.enable(); + } + } + } + #disableAll() { + this.unselectAll(); + if (this.#isEnabled) { + this.#isEnabled = false; + for (const layer of this.#allLayers.values()) { + layer.disable(); + } + for (const editor of this.#allEditors.values()) { + editor.disable(); + } + } + } + *getEditors(pageIndex) { + for (const editor of this.#allEditors.values()) { + if (editor.pageIndex === pageIndex) { + yield editor; + } + } + } + getEditor(id) { + return this.#allEditors.get(id); + } + addEditor(editor) { + this.#allEditors.set(editor.id, editor); + } + removeEditor(editor) { + if (editor.div.contains(document.activeElement)) { + if (this.#focusMainContainerTimeoutId) { + clearTimeout(this.#focusMainContainerTimeoutId); + } + this.#focusMainContainerTimeoutId = setTimeout(() => { + this.focusMainContainer(); + this.#focusMainContainerTimeoutId = null; + }, 0); + } + this.#allEditors.delete(editor.id); + if (editor.annotationElementId) { + this.#missingCanvases?.delete(editor.annotationElementId); + } + this.unselect(editor); + if (!editor.annotationElementId || !this.#deletedAnnotationsElementIds.has(editor.annotationElementId)) { + this.#annotationStorage?.remove(editor.id); + } + } + addDeletedAnnotationElement(editor) { + this.#deletedAnnotationsElementIds.add(editor.annotationElementId); + this.addChangedExistingAnnotation(editor); + editor.deleted = true; + } + isDeletedAnnotationElement(annotationElementId) { + return this.#deletedAnnotationsElementIds.has(annotationElementId); + } + removeDeletedAnnotationElement(editor) { + this.#deletedAnnotationsElementIds.delete(editor.annotationElementId); + this.removeChangedExistingAnnotation(editor); + editor.deleted = false; + } + #addEditorToLayer(editor) { + const layer = this.#allLayers.get(editor.pageIndex); + if (layer) { + layer.addOrRebuild(editor); + } else { + this.addEditor(editor); + this.addToAnnotationStorage(editor); + } + } + setActiveEditor(editor) { + if (this.#activeEditor === editor) { + return; + } + this.#activeEditor = editor; + if (editor) { + this.#dispatchUpdateUI(editor.propertiesToUpdate); + } + } + get #lastSelectedEditor() { + let ed = null; + for (ed of this.#selectedEditors) {} + return ed; + } + updateUI(editor) { + if (this.#lastSelectedEditor === editor) { + this.#dispatchUpdateUI(editor.propertiesToUpdate); + } + } + updateUIForDefaultProperties(editorType) { + this.#dispatchUpdateUI(editorType.defaultPropertiesToUpdate); + } + toggleSelected(editor) { + if (this.#selectedEditors.has(editor)) { + this.#selectedEditors.delete(editor); + editor.unselect(); + this.#dispatchUpdateStates({ + hasSelectedEditor: this.hasSelection + }); + return; + } + this.#selectedEditors.add(editor); + editor.select(); + this.#dispatchUpdateUI(editor.propertiesToUpdate); + this.#dispatchUpdateStates({ + hasSelectedEditor: true + }); + } + setSelected(editor) { + this.updateToolbar({ + mode: editor.mode, + editId: editor.uid + }); + this.#currentDrawingSession?.commitOrRemove(); + for (const ed of this.#selectedEditors) { + if (ed !== editor) { + ed.unselect(); + } + } + this.#commentManager?.destroyPopup(); + this.#selectedEditors.clear(); + this.#selectedEditors.add(editor); + editor.select(); + this.#dispatchUpdateUI(editor.propertiesToUpdate); + this.#dispatchUpdateStates({ + hasSelectedEditor: true + }); + } + get firstSelectedEditor() { + return this.#selectedEditors.values().next().value; + } + unselect(editor) { + editor.unselect(); + this.#selectedEditors.delete(editor); + this.#dispatchUpdateStates({ + hasSelectedEditor: this.hasSelection + }); + } + get hasSelection() { + return this.#selectedEditors.size !== 0; + } + get isEnterHandled() { + return this.#selectedEditors.size === 1 && this.firstSelectedEditor.isEnterHandled; + } + undo() { + this.#commandManager.undo(); + this.#dispatchUpdateStates({ + hasSomethingToUndo: this.#commandManager.hasSomethingToUndo(), + hasSomethingToRedo: true, + isEmpty: this.#isEmpty() + }); + this._editorUndoBar?.hide(); + } + redo() { + this.#commandManager.redo(); + this.#dispatchUpdateStates({ + hasSomethingToUndo: true, + hasSomethingToRedo: this.#commandManager.hasSomethingToRedo(), + isEmpty: this.#isEmpty() + }); + } + addCommands(params) { + this.#commandManager.add(params); + this.#dispatchUpdateStates({ + hasSomethingToUndo: true, + hasSomethingToRedo: false, + isEmpty: this.#isEmpty() + }); + } + cleanUndoStack(type) { + this.#commandManager.cleanType(type); + } + #isEmpty() { + if (this.#allEditors.size === 0) { + return true; + } + if (this.#allEditors.size === 1) { + for (const editor of this.#allEditors.values()) { + return editor.isEmpty(); + } + } + return false; + } + delete() { + this.commitOrRemove(); + const drawingEditor = this.currentLayer?.endDrawingSession(true); + if (!this.hasSelection && !drawingEditor) { + return; + } + const editors = drawingEditor ? [drawingEditor] : [...this.#selectedEditors]; + const cmd = () => { + this._editorUndoBar?.show(undo, editors.length === 1 ? editors[0].editorType : editors.length); + for (const editor of editors) { + editor.remove(); + } + }; + const undo = () => { + for (const editor of editors) { + this.#addEditorToLayer(editor); + } + }; + this.addCommands({ + cmd, + undo, + mustExec: true + }); + } + commitOrRemove() { + this.#activeEditor?.commitOrRemove(); + } + hasSomethingToControl() { + return this.#activeEditor || this.hasSelection; + } + #selectEditors(editors) { + for (const editor of this.#selectedEditors) { + editor.unselect(); + } + this.#selectedEditors.clear(); + for (const editor of editors) { + if (editor.isEmpty()) { + continue; + } + this.#selectedEditors.add(editor); + editor.select(); + } + this.#dispatchUpdateStates({ + hasSelectedEditor: this.hasSelection + }); + } + selectAll() { + for (const editor of this.#selectedEditors) { + editor.commit(); + } + this.#selectEditors(this.#allEditors.values()); + } + unselectAll() { + if (this.#activeEditor) { + this.#activeEditor.commitOrRemove(); + if (this.#mode !== AnnotationEditorType.NONE) { + return; + } + } + if (this.#currentDrawingSession?.commitOrRemove()) { + return; + } + this.#commentManager?.destroyPopup(); + if (!this.hasSelection) { + return; + } + for (const editor of this.#selectedEditors) { + editor.unselect(); + } + this.#selectedEditors.clear(); + this.#dispatchUpdateStates({ + hasSelectedEditor: false + }); + } + translateSelectedEditors(x, y, noCommit = false) { + if (!noCommit) { + this.commitOrRemove(); + } + if (!this.hasSelection) { + return; + } + this.#translation[0] += x; + this.#translation[1] += y; + const [totalX, totalY] = this.#translation; + const editors = [...this.#selectedEditors]; + const TIME_TO_WAIT = 1000; + if (this.#translationTimeoutId) { + clearTimeout(this.#translationTimeoutId); + } + this.#translationTimeoutId = setTimeout(() => { + this.#translationTimeoutId = null; + this.#translation[0] = this.#translation[1] = 0; + this.addCommands({ + cmd: () => { + for (const editor of editors) { + if (this.#allEditors.has(editor.id)) { + editor.translateInPage(totalX, totalY); + editor.translationDone(); + } + } + }, + undo: () => { + for (const editor of editors) { + if (this.#allEditors.has(editor.id)) { + editor.translateInPage(-totalX, -totalY); + editor.translationDone(); + } + } + }, + mustExec: false + }); + }, TIME_TO_WAIT); + for (const editor of editors) { + editor.translateInPage(x, y); + editor.translationDone(); + } + } + setUpDragSession() { + if (!this.hasSelection) { + return; + } + this.disableUserSelect(true); + this.#draggingEditors = new Map(); + for (const editor of this.#selectedEditors) { + this.#draggingEditors.set(editor, { + savedX: editor.x, + savedY: editor.y, + savedPageIndex: editor.pageIndex, + newX: 0, + newY: 0, + newPageIndex: -1 + }); + } + } + endDragSession() { + if (!this.#draggingEditors) { + return false; + } + this.disableUserSelect(false); + const map = this.#draggingEditors; + this.#draggingEditors = null; + let mustBeAddedInUndoStack = false; + for (const [{ + x, + y, + pageIndex + }, value] of map) { + value.newX = x; + value.newY = y; + value.newPageIndex = pageIndex; + mustBeAddedInUndoStack ||= x !== value.savedX || y !== value.savedY || pageIndex !== value.savedPageIndex; + } + if (!mustBeAddedInUndoStack) { + return false; + } + const move = (editor, x, y, pageIndex) => { + if (this.#allEditors.has(editor.id)) { + const parent = this.#allLayers.get(pageIndex); + if (parent) { + editor._setParentAndPosition(parent, x, y); + } else { + editor.pageIndex = pageIndex; + editor.x = x; + editor.y = y; + } + } + }; + this.addCommands({ + cmd: () => { + for (const [editor, { + newX, + newY, + newPageIndex + }] of map) { + move(editor, newX, newY, newPageIndex); + } + }, + undo: () => { + for (const [editor, { + savedX, + savedY, + savedPageIndex + }] of map) { + move(editor, savedX, savedY, savedPageIndex); + } + }, + mustExec: true + }); + return true; + } + dragSelectedEditors(tx, ty) { + if (!this.#draggingEditors) { + return; + } + for (const editor of this.#draggingEditors.keys()) { + editor.drag(tx, ty); + } + } + rebuild(editor) { + if (editor.parent === null) { + const parent = this.getLayer(editor.pageIndex); + if (parent) { + parent.changeParent(editor); + parent.addOrRebuild(editor); + } else { + this.addEditor(editor); + this.addToAnnotationStorage(editor); + editor.rebuild(); + } + } else { + editor.parent.addOrRebuild(editor); + } + } + get isEditorHandlingKeyboard() { + return this.getActive()?.shouldGetKeyboardEvents() || this.#selectedEditors.size === 1 && this.firstSelectedEditor.shouldGetKeyboardEvents(); + } + isActive(editor) { + return this.#activeEditor === editor; + } + getActive() { + return this.#activeEditor; + } + getMode() { + return this.#mode; + } + isEditingMode() { + return this.#mode !== AnnotationEditorType.NONE; + } + get imageManager() { + return util_shadow(this, "imageManager", new ImageManager()); + } + getSelectionBoxes(textLayer) { + if (!textLayer) { + return null; + } + const selection = document.getSelection(); + for (let i = 0, ii = selection.rangeCount; i < ii; i++) { + if (!textLayer.contains(selection.getRangeAt(i).commonAncestorContainer)) { + return null; + } + } + const { + x: layerX, + y: layerY, + width: parentWidth, + height: parentHeight + } = textLayer.getBoundingClientRect(); + let rotator; + switch (textLayer.getAttribute("data-main-rotation")) { + case "90": + rotator = (x, y, w, h) => ({ + x: (y - layerY) / parentHeight, + y: 1 - (x + w - layerX) / parentWidth, + width: h / parentHeight, + height: w / parentWidth + }); + break; + case "180": + rotator = (x, y, w, h) => ({ + x: 1 - (x + w - layerX) / parentWidth, + y: 1 - (y + h - layerY) / parentHeight, + width: w / parentWidth, + height: h / parentHeight + }); + break; + case "270": + rotator = (x, y, w, h) => ({ + x: 1 - (y + h - layerY) / parentHeight, + y: (x - layerX) / parentWidth, + width: h / parentHeight, + height: w / parentWidth + }); + break; + default: + rotator = (x, y, w, h) => ({ + x: (x - layerX) / parentWidth, + y: (y - layerY) / parentHeight, + width: w / parentWidth, + height: h / parentHeight + }); + break; + } + const boxes = []; + for (let i = 0, ii = selection.rangeCount; i < ii; i++) { + const range = selection.getRangeAt(i); + if (range.collapsed) { + continue; + } + for (const { + x, + y, + width, + height + } of range.getClientRects()) { + if (width === 0 || height === 0) { + continue; + } + boxes.push(rotator(x, y, width, height)); + } + } + return boxes.length === 0 ? null : boxes; + } + addChangedExistingAnnotation({ + annotationElementId, + id + }) { + (this.#changedExistingAnnotations ||= new Map()).set(annotationElementId, id); + } + removeChangedExistingAnnotation({ + annotationElementId + }) { + this.#changedExistingAnnotations?.delete(annotationElementId); + } + renderAnnotationElement(annotation) { + const editorId = this.#changedExistingAnnotations?.get(annotation.data.id); + if (!editorId) { + return; + } + const editor = this.#annotationStorage.getRawValue(editorId); + if (!editor) { + return; + } + if (this.#mode === AnnotationEditorType.NONE && !editor.hasBeenModified) { + return; + } + editor.renderAnnotationElement(annotation); + } + setMissingCanvas(annotationId, annotationElementId, canvas) { + const editor = this.#missingCanvases?.get(annotationId); + if (!editor) { + return; + } + editor.setCanvas(annotationElementId, canvas); + this.#missingCanvases.delete(annotationId); + } + addMissingCanvas(annotationId, editor) { + (this.#missingCanvases ||= new Map()).set(annotationId, editor); + } +} + +;// ./src/display/editor/alt_text.js + +class AltText { + #altText = null; + #altTextDecorative = false; + #altTextButton = null; + #altTextButtonLabel = null; + #altTextTooltip = null; + #altTextTooltipTimeout = null; + #altTextWasFromKeyBoard = false; + #badge = null; + #editor = null; + #guessedText = null; + #textWithDisclaimer = null; + #useNewAltTextFlow = false; + static #l10nNewButton = null; + static _l10n = null; + constructor(editor) { + this.#editor = editor; + this.#useNewAltTextFlow = editor._uiManager.useNewAltTextFlow; + AltText.#l10nNewButton ||= Object.freeze({ + added: "pdfjs-editor-new-alt-text-added-button", + "added-label": "pdfjs-editor-new-alt-text-added-button-label", + missing: "pdfjs-editor-new-alt-text-missing-button", + "missing-label": "pdfjs-editor-new-alt-text-missing-button-label", + review: "pdfjs-editor-new-alt-text-to-review-button", + "review-label": "pdfjs-editor-new-alt-text-to-review-button-label" + }); + } + static initialize(l10n) { + AltText._l10n ??= l10n; + } + async render() { + const altText = this.#altTextButton = document.createElement("button"); + altText.className = "altText"; + altText.tabIndex = "0"; + const label = this.#altTextButtonLabel = document.createElement("span"); + altText.append(label); + if (this.#useNewAltTextFlow) { + altText.classList.add("new"); + altText.setAttribute("data-l10n-id", AltText.#l10nNewButton.missing); + label.setAttribute("data-l10n-id", AltText.#l10nNewButton["missing-label"]); + } else { + altText.setAttribute("data-l10n-id", "pdfjs-editor-alt-text-button"); + label.setAttribute("data-l10n-id", "pdfjs-editor-alt-text-button-label"); + } + const signal = this.#editor._uiManager._signal; + altText.addEventListener("contextmenu", noContextMenu, { + signal + }); + altText.addEventListener("pointerdown", event => event.stopPropagation(), { + signal + }); + const onClick = event => { + event.preventDefault(); + this.#editor._uiManager.editAltText(this.#editor); + if (this.#useNewAltTextFlow) { + this.#editor._reportTelemetry({ + action: "pdfjs.image.alt_text.image_status_label_clicked", + data: { + label: this.#label + } + }); + } + }; + altText.addEventListener("click", onClick, { + capture: true, + signal + }); + altText.addEventListener("keydown", event => { + if (event.target === altText && event.key === "Enter") { + this.#altTextWasFromKeyBoard = true; + onClick(event); + } + }, { + signal + }); + await this.#setState(); + return altText; + } + get #label() { + return this.#altText && "added" || this.#altText === null && this.guessedText && "review" || "missing"; + } + finish() { + if (!this.#altTextButton) { + return; + } + this.#altTextButton.focus({ + focusVisible: this.#altTextWasFromKeyBoard + }); + this.#altTextWasFromKeyBoard = false; + } + isEmpty() { + return this.#useNewAltTextFlow ? this.#altText === null : !this.#altText && !this.#altTextDecorative; + } + hasData() { + return this.#useNewAltTextFlow ? this.#altText !== null || !!this.#guessedText : this.isEmpty(); + } + get guessedText() { + return this.#guessedText; + } + async setGuessedText(guessedText) { + if (this.#altText !== null) { + return; + } + this.#guessedText = guessedText; + this.#textWithDisclaimer = await AltText._l10n.get("pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer", { + generatedAltText: guessedText + }); + this.#setState(); + } + toggleAltTextBadge(visibility = false) { + if (!this.#useNewAltTextFlow || this.#altText) { + this.#badge?.remove(); + this.#badge = null; + return; + } + if (!this.#badge) { + const badge = this.#badge = document.createElement("div"); + badge.className = "noAltTextBadge"; + this.#editor.div.append(badge); + } + this.#badge.classList.toggle("hidden", !visibility); + } + serialize(isForCopying) { + let altText = this.#altText; + if (!isForCopying && this.#guessedText === altText) { + altText = this.#textWithDisclaimer; + } + return { + altText, + decorative: this.#altTextDecorative, + guessedText: this.#guessedText, + textWithDisclaimer: this.#textWithDisclaimer + }; + } + get data() { + return { + altText: this.#altText, + decorative: this.#altTextDecorative + }; + } + set data({ + altText, + decorative, + guessedText, + textWithDisclaimer, + cancel = false + }) { + if (guessedText) { + this.#guessedText = guessedText; + this.#textWithDisclaimer = textWithDisclaimer; + } + if (this.#altText === altText && this.#altTextDecorative === decorative) { + return; + } + if (!cancel) { + this.#altText = altText; + this.#altTextDecorative = decorative; + } + this.#setState(); + } + toggle(enabled = false) { + if (!this.#altTextButton) { + return; + } + if (!enabled && this.#altTextTooltipTimeout) { + clearTimeout(this.#altTextTooltipTimeout); + this.#altTextTooltipTimeout = null; + } + this.#altTextButton.disabled = !enabled; + } + shown() { + this.#editor._reportTelemetry({ + action: "pdfjs.image.alt_text.image_status_label_displayed", + data: { + label: this.#label + } + }); + } + destroy() { + this.#altTextButton?.remove(); + this.#altTextButton = null; + this.#altTextButtonLabel = null; + this.#altTextTooltip = null; + this.#badge?.remove(); + this.#badge = null; + } + async #setState() { + const button = this.#altTextButton; + if (!button) { + return; + } + if (this.#useNewAltTextFlow) { + button.classList.toggle("done", !!this.#altText); + button.setAttribute("data-l10n-id", AltText.#l10nNewButton[this.#label]); + this.#altTextButtonLabel?.setAttribute("data-l10n-id", AltText.#l10nNewButton[`${this.#label}-label`]); + if (!this.#altText) { + this.#altTextTooltip?.remove(); + return; + } + } else { + if (!this.#altText && !this.#altTextDecorative) { + button.classList.remove("done"); + this.#altTextTooltip?.remove(); + return; + } + button.classList.add("done"); + button.setAttribute("data-l10n-id", "pdfjs-editor-alt-text-edit-button"); + } + let tooltip = this.#altTextTooltip; + if (!tooltip) { + this.#altTextTooltip = tooltip = document.createElement("span"); + tooltip.className = "tooltip"; + tooltip.setAttribute("role", "tooltip"); + tooltip.id = `alt-text-tooltip-${this.#editor.id}`; + const DELAY_TO_SHOW_TOOLTIP = 100; + const signal = this.#editor._uiManager._signal; + signal.addEventListener("abort", () => { + clearTimeout(this.#altTextTooltipTimeout); + this.#altTextTooltipTimeout = null; + }, { + once: true + }); + button.addEventListener("mouseenter", () => { + this.#altTextTooltipTimeout = setTimeout(() => { + this.#altTextTooltipTimeout = null; + this.#altTextTooltip.classList.add("show"); + this.#editor._reportTelemetry({ + action: "alt_text_tooltip" + }); + }, DELAY_TO_SHOW_TOOLTIP); + }, { + signal + }); + button.addEventListener("mouseleave", () => { + if (this.#altTextTooltipTimeout) { + clearTimeout(this.#altTextTooltipTimeout); + this.#altTextTooltipTimeout = null; + } + this.#altTextTooltip?.classList.remove("show"); + }, { + signal + }); + } + if (this.#altTextDecorative) { + tooltip.setAttribute("data-l10n-id", "pdfjs-editor-alt-text-decorative-tooltip"); + } else { + tooltip.removeAttribute("data-l10n-id"); + tooltip.textContent = this.#altText; + } + if (!tooltip.parentNode) { + button.append(tooltip); + } + const element = this.#editor.getElementForAltText(); + element?.setAttribute("aria-describedby", tooltip.id); + } +} + +;// ./src/display/editor/comment.js + +class Comment { + #commentStandaloneButton = null; + #commentToolbarButton = null; + #commentWasFromKeyBoard = false; + #editor = null; + #initialText = null; + #richText = null; + #text = null; + #date = null; + #deleted = false; + #popupPosition = null; + constructor(editor) { + this.#editor = editor; + } + renderForToolbar() { + const button = this.#commentToolbarButton = document.createElement("button"); + button.className = "comment"; + return this.#render(button, false); + } + renderForStandalone() { + const button = this.#commentStandaloneButton = document.createElement("button"); + button.className = "annotationCommentButton"; + const position = this.#editor.commentButtonPosition; + if (position) { + const { + style + } = button; + style.insetInlineEnd = `calc(${100 * (this.#editor._uiManager.direction === "ltr" ? 1 - position[0] : position[0])}% - var(--comment-button-dim))`; + style.top = `calc(${100 * position[1]}% - var(--comment-button-dim))`; + const color = this.#editor.commentButtonColor; + if (color) { + style.backgroundColor = color; + } + } + return this.#render(button, true); + } + focusButton() { + setTimeout(() => { + (this.#commentStandaloneButton ?? this.#commentToolbarButton)?.focus(); + }, 0); + } + onUpdatedColor() { + if (!this.#commentStandaloneButton) { + return; + } + const color = this.#editor.commentButtonColor; + if (color) { + this.#commentStandaloneButton.style.backgroundColor = color; + } + this.#editor._uiManager.updatePopupColor(this.#editor); + } + get commentButtonWidth() { + return (this.#commentStandaloneButton?.getBoundingClientRect().width ?? 0) / this.#editor.parent.boundingClientRect.width; + } + get commentPopupPositionInLayer() { + if (this.#popupPosition) { + return this.#popupPosition; + } + if (!this.#commentStandaloneButton) { + return null; + } + const { + x, + y, + height + } = this.#commentStandaloneButton.getBoundingClientRect(); + const { + x: parentX, + y: parentY, + width: parentWidth, + height: parentHeight + } = this.#editor.parent.boundingClientRect; + return [(x - parentX) / parentWidth, (y + height - parentY) / parentHeight]; + } + set commentPopupPositionInLayer(pos) { + this.#popupPosition = pos; + } + hasDefaultPopupPosition() { + return this.#popupPosition === null; + } + removeStandaloneCommentButton() { + this.#commentStandaloneButton?.remove(); + this.#commentStandaloneButton = null; + } + removeToolbarCommentButton() { + this.#commentToolbarButton?.remove(); + this.#commentToolbarButton = null; + } + setCommentButtonStates({ + selected, + hasPopup + }) { + if (!this.#commentStandaloneButton) { + return; + } + this.#commentStandaloneButton.classList.toggle("selected", selected); + this.#commentStandaloneButton.ariaExpanded = hasPopup; + } + #render(comment, isStandalone) { + if (!this.#editor._uiManager.hasCommentManager()) { + return null; + } + comment.tabIndex = "0"; + comment.ariaHasPopup = "dialog"; + if (isStandalone) { + comment.ariaControls = "commentPopup"; + comment.setAttribute("data-l10n-id", "pdfjs-show-comment-button"); + } else { + comment.ariaControlsElements = [this.#editor._uiManager.getCommentDialogElement()]; + comment.setAttribute("data-l10n-id", "pdfjs-editor-add-comment-button"); + } + const signal = this.#editor._uiManager._signal; + if (!(signal instanceof AbortSignal) || signal.aborted) { + return comment; + } + comment.addEventListener("contextmenu", noContextMenu, { + signal + }); + if (isStandalone) { + comment.addEventListener("focusin", e => { + this.#editor._focusEventsAllowed = false; + stopEvent(e); + }, { + capture: true, + signal + }); + comment.addEventListener("focusout", e => { + this.#editor._focusEventsAllowed = true; + stopEvent(e); + }, { + capture: true, + signal + }); + } + comment.addEventListener("pointerdown", event => event.stopPropagation(), { + signal + }); + const onClick = event => { + event.preventDefault(); + if (comment === this.#commentToolbarButton) { + this.edit(); + } else { + this.#editor.toggleComment(true); + } + }; + comment.addEventListener("click", onClick, { + capture: true, + signal + }); + comment.addEventListener("keydown", event => { + if (event.target === comment && event.key === "Enter") { + this.#commentWasFromKeyBoard = true; + onClick(event); + } + }, { + signal + }); + comment.addEventListener("pointerenter", () => { + this.#editor.toggleComment(false, true); + }, { + signal + }); + comment.addEventListener("pointerleave", () => { + this.#editor.toggleComment(false, false); + }, { + signal + }); + return comment; + } + edit(options) { + const position = this.commentPopupPositionInLayer; + let posX, posY; + if (position) { + [posX, posY] = position; + } else { + [posX, posY] = this.#editor.commentButtonPosition; + const { + width, + height, + x, + y + } = this.#editor; + posX = x + posX * width; + posY = y + posY * height; + } + const parentDimensions = this.#editor.parent.boundingClientRect; + const { + x: parentX, + y: parentY, + width: parentWidth, + height: parentHeight + } = parentDimensions; + this.#editor._uiManager.editComment(this.#editor, parentX + posX * parentWidth, parentY + posY * parentHeight, { + ...options, + parentDimensions + }); + } + finish() { + if (!this.#commentToolbarButton) { + return; + } + this.#commentToolbarButton.focus({ + focusVisible: this.#commentWasFromKeyBoard + }); + this.#commentWasFromKeyBoard = false; + } + isDeleted() { + return this.#deleted || this.#text === ""; + } + isEmpty() { + return this.#text === null; + } + hasBeenEdited() { + return this.isDeleted() || this.#text !== this.#initialText; + } + serialize() { + return this.data; + } + get data() { + return { + text: this.#text, + richText: this.#richText, + date: this.#date, + deleted: this.isDeleted() + }; + } + set data(text) { + if (text !== this.#text) { + this.#richText = null; + } + if (text === null) { + this.#text = ""; + this.#deleted = true; + return; + } + this.#text = text; + this.#date = new Date(); + this.#deleted = false; + } + restoreData({ + text, + richText, + date + }) { + this.#text = text; + this.#richText = richText; + this.#date = date; + this.#deleted = false; + } + setInitialText(text, richText = null) { + this.#initialText = text; + this.data = text; + this.#date = null; + this.#richText = richText; + } + shown() {} + destroy() { + this.#commentToolbarButton?.remove(); + this.#commentToolbarButton = null; + this.#commentStandaloneButton?.remove(); + this.#commentStandaloneButton = null; + this.#text = ""; + this.#richText = null; + this.#date = null; + this.#editor = null; + this.#commentWasFromKeyBoard = false; + this.#deleted = false; + } +} + +;// ./src/display/touch_manager.js + + + + + + + + + +function preventDefault(evt) { + evt.preventDefault(); +} +const MIN_TOUCH_SPAN = 1e-4; +function stopTouchEvent(evt) { + if (evt.cancelable) { + stopEvent(evt); + return true; + } + evt.stopPropagation(); + return false; +} +class TouchManager { + #container; + #isPinching = false; + #isPinchingStopped = null; + #isPinchingDisabled; + #onPinchStart; + #onPinching; + #onPinchEnd; + #onPanning; + #ownsGesture = false; + #pointerDownAC = null; + #signal; + #touchIds = new Set(); + #touchInfo = null; + #touchManagerAC; + #touchMoveAC = null; + #unconfirmedPinch = 0; + constructor({ + container, + isPinchingDisabled = null, + isPinchingStopped = null, + onPinchStart = null, + onPinching = null, + onPinchEnd = null, + onPanning = null, + signal + }) { + this.#container = container; + this.#isPinchingStopped = isPinchingStopped; + this.#isPinchingDisabled = isPinchingDisabled; + this.#onPinchStart = onPinchStart; + this.#onPinching = onPinching; + this.#onPinchEnd = onPinchEnd; + this.#onPanning = onPanning; + this.#touchManagerAC = new AbortController(); + this.#signal = AbortSignal.any([signal, this.#touchManagerAC.signal]); + container.addEventListener("touchstart", this.#onTouchStart.bind(this), { + passive: false, + signal: this.#signal + }); + } + get MIN_TOUCH_DISTANCE_TO_PINCH() { + return 35 / OutputScale.pixelRatio; + } + get MIN_TOUCH_DISTANCE_TO_SCALE() { + return 4 / OutputScale.pixelRatio; + } + #onTouchStart(evt) { + if (this.#isPinchingDisabled?.()) { + return; + } + this.#pruneTouchIds(evt); + const touchIds = this.#touchIds; + for (const { + identifier + } of evt.changedTouches) { + touchIds.add(identifier); + } + if (touchIds.size === 1) { + this.#armPointerDown(); + return; + } + if (!this.#touchMoveAC) { + this.#touchMoveAC = new AbortController(); + const signal = AbortSignal.any([this.#signal, this.#touchMoveAC.signal]); + const container = this.#container; + const opt = { + signal, + capture: false, + passive: false + }; + container.addEventListener("touchmove", this.#onTouchMove.bind(this), opt); + const onTouchEnd = this.#onTouchEnd.bind(this); + container.addEventListener("touchend", onTouchEnd, opt); + container.addEventListener("touchcancel", onTouchEnd, opt); + opt.capture = true; + container.addEventListener("pointerdown", stopEvent, opt); + container.addEventListener("pointermove", stopEvent, opt); + container.addEventListener("pointercancel", preventDefault, opt); + container.addEventListener("pointerup", preventDefault, opt); + this.#onPinchStart?.(); + } + this.#ownsGesture = stopTouchEvent(evt); + this.#setTouchInfo(evt); + } + #armPointerDown() { + if (this.#pointerDownAC) { + return; + } + const pointerDownAC = this.#pointerDownAC = new AbortController(); + const signal = AbortSignal.any([this.#signal, pointerDownAC.signal]); + const container = this.#container; + const opts = { + capture: true, + signal, + passive: false + }; + const cancelPointerDown = e => { + if (e.pointerType === "touch") { + this.#pointerDownAC?.abort(); + this.#pointerDownAC = null; + } + }; + container.addEventListener("pointerdown", e => { + if (e.pointerType === "touch") { + stopEvent(e); + cancelPointerDown(e); + } + }, opts); + container.addEventListener("pointerup", cancelPointerDown, opts); + container.addEventListener("pointercancel", cancelPointerDown, opts); + } + #pruneTouchIds(evt) { + const previous = this.#touchIds; + if (previous.size === 0) { + return; + } + const touchIds = this.#touchIds = new Set(); + for (const { + identifier + } of evt.touches) { + if (previous.has(identifier)) { + touchIds.add(identifier); + } + } + } + #getTrackedTouches(evt) { + const touchIds = this.#touchIds; + const touches = []; + for (const touch of evt.touches) { + if (touchIds.has(touch.identifier)) { + touches.push(touch); + } + } + return touches; + } + #setTouchInfo(evt) { + const touches = this.#getTrackedTouches(evt); + if (touches.length !== 2 || this.#isPinchingStopped?.()) { + this.#touchInfo = null; + return; + } + const [touch0, touch1] = touches; + this.#touchInfo = { + touch0X: touch0.screenX, + touch0Y: touch0.screenY, + touch1X: touch1.screenX, + touch1Y: touch1.screenY, + panX: (touch0.clientX + touch1.clientX) / 2, + panY: (touch0.clientY + touch1.clientY) / 2, + screenPanX: (touch0.screenX + touch1.screenX) / 2, + screenPanY: (touch0.screenY + touch1.screenY) / 2 + }; + } + #onTouchMove(evt) { + if (!this.#touchInfo) { + return; + } + const touches = this.#getTrackedTouches(evt); + if (touches.length !== 2) { + return; + } + const wasOwned = this.#ownsGesture; + this.#ownsGesture = stopTouchEvent(evt); + if (!this.#ownsGesture) { + return; + } + if (!wasOwned) { + this.#setTouchInfo(evt); + return; + } + const [touch0, touch1] = touches; + const { + screenX: screen0X, + screenY: screen0Y + } = touch0; + const { + screenX: screen1X, + screenY: screen1Y + } = touch1; + const touchInfo = this.#touchInfo; + const { + touch0X: pTouch0X, + touch0Y: pTouch0Y, + touch1X: pTouch1X, + touch1Y: pTouch1Y, + panX: pPanX, + panY: pPanY + } = touchInfo; + const prevGapX = pTouch1X - pTouch0X; + const prevGapY = pTouch1Y - pTouch0Y; + const currGapX = screen1X - screen0X; + const currGapY = screen1Y - screen0Y; + const panX = (touch0.clientX + touch1.clientX) / 2; + const panY = (touch0.clientY + touch1.clientY) / 2; + touchInfo.panX = panX; + touchInfo.panY = panY; + const dx = panX - pPanX; + const dy = panY - pPanY; + const screenPanX = (screen0X + screen1X) / 2; + const screenPanY = (screen0Y + screen1Y) / 2; + const translation = Math.hypot(screenPanX - touchInfo.screenPanX, screenPanY - touchInfo.screenPanY); + touchInfo.screenPanX = screenPanX; + touchInfo.screenPanY = screenPanY; + const distance = Math.hypot(currGapX, currGapY); + const pDistance = Math.hypot(prevGapX, prevGapY); + const minDistance = this.#isPinching ? this.MIN_TOUCH_DISTANCE_TO_SCALE : this.MIN_TOUCH_DISTANCE_TO_PINCH + 2 * translation; + if (distance < MIN_TOUCH_SPAN || pDistance < MIN_TOUCH_SPAN || Math.abs(pDistance - distance) <= minDistance) { + if (dx || dy) { + this.#onPanning?.(dx, dy); + } + return; + } + touchInfo.touch0X = screen0X; + touchInfo.touch0Y = screen0Y; + touchInfo.touch1X = screen1X; + touchInfo.touch1Y = screen1Y; + const direction = Math.sign(distance - pDistance); + if (!this.#isPinching) { + this.#isPinching = true; + this.#unconfirmedPinch = direction; + if (dx || dy) { + this.#onPanning?.(dx, dy); + } + return; + } + if (this.#unconfirmedPinch) { + const unconfirmed = this.#unconfirmedPinch; + this.#unconfirmedPinch = 0; + if (direction !== unconfirmed && Math.abs(distance - pDistance) <= 2 * translation) { + this.#isPinching = false; + if (dx || dy) { + this.#onPanning?.(dx, dy); + } + return; + } + } + this.#onPinching?.([pPanX, pPanY], pDistance, distance, dx, dy); + } + #onTouchEnd(evt) { + this.#pruneTouchIds(evt); + if (this.#touchIds.size >= 2) { + this.#setTouchInfo(evt); + return; + } + const wasTracking = !!this.#touchInfo; + this.#endGesture(); + if (this.#touchIds.size === 1) { + this.#armPointerDown(); + } + if (wasTracking) { + stopTouchEvent(evt); + } + } + #endGesture() { + this.#touchInfo = null; + this.#isPinching = false; + this.#unconfirmedPinch = 0; + this.#ownsGesture = false; + if (this.#touchMoveAC) { + this.#touchMoveAC.abort(); + this.#touchMoveAC = null; + this.#onPinchEnd?.(); + } + } + destroy() { + this.#endGesture(); + this.#touchIds.clear(); + this.#touchManagerAC?.abort(); + this.#touchManagerAC = null; + this.#pointerDownAC?.abort(); + this.#pointerDownAC = null; + } +} + +;// ./src/display/editor/editor.js + + + + + + + + + + +class AnnotationEditor { + #accessibilityData = null; + #allResizerDivs = null; + #altText = null; + #comment = null; + #commentStandaloneButton = null; + #disabled = false; + #dragPointerId = null; + #dragPointerType = ""; + #resizersDiv = null; + #lastPointerCoords = null; + #savedDimensions = null; + #fakeAnnotation = null; + #focusAC = null; + #focusedResizerName = ""; + #hasBeenClicked = false; + #initialRect = null; + #isEditing = false; + #isInEditMode = false; + #isResizerEnabledForKeyboard = false; + #moveInDOMTimeout = null; + #prevDragX = 0; + #prevDragY = 0; + #telemetryTimeouts = null; + #touchManager = null; + isSelected = false; + _isCopy = false; + _editToolbar = null; + _initialOptions = Object.create(null); + _initialData = null; + _isVisible = true; + _uiManager = null; + _focusEventsAllowed = true; + static _l10n = null; + static _l10nAlert = null; + static _l10nResizer = null; + #isDraggable = false; + #zIndex = AnnotationEditor._zIndex++; + static _borderLineWidth = -1; + static _colorManager = new ColorManager(); + static _zIndex = 1; + static _telemetryTimeout = 1000; + static get _resizerKeyboardManager() { + const resize = AnnotationEditor.prototype._resizeWithKeyboard; + const small = AnnotationEditorUIManager.TRANSLATE_SMALL; + const big = AnnotationEditorUIManager.TRANSLATE_BIG; + return util_shadow(this, "_resizerKeyboardManager", new KeyboardManager([[["ArrowLeft"], resize, { + args: [-small, 0] + }], [["ctrl+ArrowLeft", "mac+shift+ArrowLeft"], resize, { + args: [-big, 0] + }], [["ArrowRight"], resize, { + args: [small, 0] + }], [["ctrl+ArrowRight", "mac+shift+ArrowRight"], resize, { + args: [big, 0] + }], [["ArrowUp"], resize, { + args: [0, -small] + }], [["ctrl+ArrowUp", "mac+shift+ArrowUp"], resize, { + args: [0, -big] + }], [["ArrowDown"], resize, { + args: [0, small] + }], [["ctrl+ArrowDown", "mac+shift+ArrowDown"], resize, { + args: [0, big] + }], [["Escape"], AnnotationEditor.prototype._stopResizingWithKeyboard]])); + } + constructor(parameters) { + this.parent = parameters.parent; + this.id = parameters.id; + this.width = this.height = null; + this.pageIndex = parameters.parent.pageIndex; + this.name = parameters.name; + this.div = null; + this._uiManager = parameters.uiManager; + this.annotationElementId = null; + this._willKeepAspectRatio = false; + this._initialOptions.isCentered = parameters.isCentered; + this._structTreeParentId = null; + this.annotationElementId = parameters.annotationElementId || null; + this.creationDate = parameters.creationDate || new Date(); + this.modificationDate = parameters.modificationDate || null; + this.canAddComment = true; + const { + rotation, + rawDims: { + pageWidth, + pageHeight, + pageX, + pageY + } + } = this.parent.viewport; + this.rotation = rotation; + this.pageRotation = (360 + rotation - this._uiManager.viewParameters.rotation) % 360; + this.pageDimensions = [pageWidth, pageHeight]; + this.pageTranslation = [pageX, pageY]; + const [width, height] = this.parentDimensions; + this.x = parameters.x / width; + this.y = parameters.y / height; + this.isAttachedToDOM = false; + this.deleted = false; + } + updatePageIndex(newPageIndex) { + this.pageIndex = newPageIndex; + } + get editorType() { + return Object.getPrototypeOf(this).constructor._type; + } + get mode() { + return Object.getPrototypeOf(this).constructor._editorType; + } + static get isDrawer() { + return false; + } + static get _defaultLineColor() { + return util_shadow(this, "_defaultLineColor", this._colorManager.getHexCode("CanvasText")); + } + static deleteAnnotationElement(editor) { + const fakeEditor = new FakeEditor({ + id: editor._uiManager.getId(), + parent: editor.parent, + uiManager: editor._uiManager + }); + fakeEditor.annotationElementId = editor.annotationElementId; + fakeEditor.deleted = true; + fakeEditor._uiManager.addToAnnotationStorage(fakeEditor); + } + static initialize(l10n, _uiManager) { + AnnotationEditor._l10n ??= l10n; + AnnotationEditor._l10nAlert ??= Object.freeze({ + highlight: "pdfjs-editor-highlight-added-alert", + freetext: "pdfjs-editor-freetext-added-alert", + ink: "pdfjs-editor-ink-added-alert", + stamp: "pdfjs-editor-stamp-added-alert", + signature: "pdfjs-editor-signature-added-alert" + }); + AnnotationEditor._l10nResizer ??= Object.freeze({ + topLeft: "pdfjs-editor-resizer-top-left", + topMiddle: "pdfjs-editor-resizer-top-middle", + topRight: "pdfjs-editor-resizer-top-right", + middleRight: "pdfjs-editor-resizer-middle-right", + bottomRight: "pdfjs-editor-resizer-bottom-right", + bottomMiddle: "pdfjs-editor-resizer-bottom-middle", + bottomLeft: "pdfjs-editor-resizer-bottom-left", + middleLeft: "pdfjs-editor-resizer-middle-left" + }); + if (AnnotationEditor._borderLineWidth !== -1) { + return; + } + const style = getComputedStyle(document.documentElement); + AnnotationEditor._borderLineWidth = parseFloat(style.getPropertyValue("--outline-width")) || 0; + } + static updateDefaultParams(_type, _value) {} + static get defaultPropertiesToUpdate() { + return []; + } + static isHandlingMimeForPasting(mime) { + return false; + } + static paste(item, parent) { + unreachable("Not implemented"); + } + get propertiesToUpdate() { + return []; + } + get _isDraggable() { + return this.#isDraggable; + } + set _isDraggable(value) { + this.#isDraggable = value; + this.div?.classList.toggle("draggable", value); + } + get uid() { + return this.annotationElementId || this.id; + } + get isEnterHandled() { + return true; + } + center() { + const [pageWidth, pageHeight] = this.pageDimensions; + switch (this.parentRotation) { + case 90: + this.x -= this.height * pageHeight / (pageWidth * 2); + this.y += this.width * pageWidth / (pageHeight * 2); + break; + case 180: + this.x += this.width / 2; + this.y += this.height / 2; + break; + case 270: + this.x += this.height * pageHeight / (pageWidth * 2); + this.y -= this.width * pageWidth / (pageHeight * 2); + break; + default: + this.x -= this.width / 2; + this.y -= this.height / 2; + break; + } + this.fixAndSetPosition(); + } + addCommands(params) { + this._uiManager.addCommands(params); + } + get currentLayer() { + return this._uiManager.currentLayer; + } + setInBackground() { + this.div.style.zIndex = 0; + } + setInForeground() { + this.div.style.zIndex = this.#zIndex; + } + setParent(parent) { + if (parent !== null) { + this.pageIndex = parent.pageIndex; + this.pageDimensions = parent.pageDimensions; + } else { + this.#stopResizing(); + this.#fakeAnnotation?.remove(); + this.#fakeAnnotation = null; + } + this.parent = parent; + } + focusin(event) { + if (!this._focusEventsAllowed) { + return; + } + if (!this.#hasBeenClicked) { + this.parent.setSelected(this); + } else { + this.#hasBeenClicked = false; + } + } + focusout(event) { + if (!this._focusEventsAllowed || !this.isAttachedToDOM) { + return; + } + const target = event.relatedTarget; + if (target?.closest(`#${this.id}`)) { + return; + } + event.preventDefault(); + if (!this.parent?.isMultipleSelection) { + this.commitOrRemove(); + } + } + commitOrRemove() { + if (this.isEmpty()) { + this.remove(); + } else { + this.commit(); + } + } + commit() { + if (!this.isInEditMode()) { + return; + } + this.addToAnnotationStorage(); + } + addToAnnotationStorage() { + this._uiManager.addToAnnotationStorage(this); + } + setAt(x, y, tx, ty) { + const [width, height] = this.parentDimensions; + [tx, ty] = this.screenToPageTranslation(tx, ty); + this.x = (x + tx) / width; + this.y = (y + ty) / height; + this.fixAndSetPosition(); + } + _moveAfterPaste(baseX, baseY) { + if (this.isClone) { + delete this.isClone; + return; + } + const [parentWidth, parentHeight] = this.parentDimensions; + this.setAt(baseX * parentWidth, baseY * parentHeight, this.width * parentWidth, this.height * parentHeight); + this._onTranslated(); + } + #translate([width, height], x, y) { + [x, y] = this.screenToPageTranslation(x, y); + this.x += x / width; + this.y += y / height; + this._onTranslating(this.x, this.y); + this.fixAndSetPosition(); + } + translate(x, y) { + this.#translate(this.parentDimensions, x, y); + } + translateInPage(x, y) { + this.#initialRect ||= [this.x, this.y, this.width, this.height]; + this.#translate(this.pageDimensions, x, y); + this.div.scrollIntoView({ + block: "nearest" + }); + } + translationDone() { + this._onTranslated(this.x, this.y); + } + drag(tx, ty) { + this.#initialRect ||= [this.x, this.y, this.width, this.height]; + const { + div, + parentDimensions: [parentWidth, parentHeight] + } = this; + this.x += tx / parentWidth; + this.y += ty / parentHeight; + if (this.parent && (this.x < 0 || this.x > 1 || this.y < 0 || this.y > 1)) { + const { + x, + y + } = this.div.getBoundingClientRect(); + if (this.parent.findNewParent(this, x, y)) { + this.x -= Math.floor(this.x); + this.y -= Math.floor(this.y); + } + } + let { + x, + y + } = this; + const [bx, by] = this.getBaseTranslation(); + x += bx; + y += by; + const { + style + } = div; + style.left = `${(100 * x).toFixed(2)}%`; + style.top = `${(100 * y).toFixed(2)}%`; + this._onTranslating(x, y); + } + _onTranslating(x, y) {} + _onTranslated(x, y) {} + get _hasBeenMoved() { + return !!this.#initialRect && (this.#initialRect[0] !== this.x || this.#initialRect[1] !== this.y); + } + get _hasBeenResized() { + return !!this.#initialRect && (this.#initialRect[2] !== this.width || this.#initialRect[3] !== this.height); + } + getBaseTranslation() { + const [parentWidth, parentHeight] = this.parentDimensions; + const { + _borderLineWidth + } = AnnotationEditor; + const x = _borderLineWidth / parentWidth; + const y = _borderLineWidth / parentHeight; + switch (this.rotation) { + case 90: + return [-x, y]; + case 180: + return [x, y]; + case 270: + return [x, -y]; + default: + return [-x, -y]; + } + } + get _mustFixPosition() { + return true; + } + fixAndSetPosition(rotation = this.rotation) { + const { + div: { + style + }, + pageDimensions: [pageWidth, pageHeight] + } = this; + let { + x, + y, + width, + height + } = this; + width *= pageWidth; + height *= pageHeight; + x *= pageWidth; + y *= pageHeight; + if (this._mustFixPosition) { + switch (rotation) { + case 0: + x = MathClamp(x, 0, pageWidth - width); + y = MathClamp(y, 0, pageHeight - height); + break; + case 90: + x = MathClamp(x, 0, pageWidth - height); + y = MathClamp(y, width, pageHeight); + break; + case 180: + x = MathClamp(x, width, pageWidth); + y = MathClamp(y, height, pageHeight); + break; + case 270: + x = MathClamp(x, height, pageWidth); + y = MathClamp(y, 0, pageHeight - width); + break; + } + } + this.x = x /= pageWidth; + this.y = y /= pageHeight; + const [bx, by] = this.getBaseTranslation(); + x += bx; + y += by; + style.left = `${(100 * x).toFixed(2)}%`; + style.top = `${(100 * y).toFixed(2)}%`; + this.moveInDOM(); + } + static #rotatePoint(x, y, angle) { + switch (angle) { + case 90: + return [y, -x]; + case 180: + return [-x, -y]; + case 270: + return [-y, x]; + default: + return [x, y]; + } + } + screenToPageTranslation(x, y) { + return AnnotationEditor.#rotatePoint(x, y, this.parentRotation); + } + pageTranslationToScreen(x, y) { + return AnnotationEditor.#rotatePoint(x, y, 360 - this.parentRotation); + } + #getRotationMatrix(rotation) { + switch (rotation) { + case 90: + { + const [pageWidth, pageHeight] = this.pageDimensions; + return [0, -pageWidth / pageHeight, pageHeight / pageWidth, 0]; + } + case 180: + return [-1, 0, 0, -1]; + case 270: + { + const [pageWidth, pageHeight] = this.pageDimensions; + return [0, pageWidth / pageHeight, -pageHeight / pageWidth, 0]; + } + default: + return [1, 0, 0, 1]; + } + } + get parentScale() { + return this._uiManager.viewParameters.realScale; + } + get parentRotation() { + return (this._uiManager.viewParameters.rotation + this.pageRotation) % 360; + } + get parentDimensions() { + const { + parentScale, + pageDimensions: [pageWidth, pageHeight] + } = this; + return [pageWidth * parentScale, pageHeight * parentScale]; + } + setDims() { + const { + div: { + style + }, + width, + height + } = this; + style.width = `${(100 * width).toFixed(2)}%`; + style.height = `${(100 * height).toFixed(2)}%`; + } + getInitialTranslation() { + return [0, 0]; + } + #createResizers() { + if (this.#resizersDiv) { + return; + } + this.#resizersDiv = document.createElement("div"); + this.#resizersDiv.classList.add("resizers"); + const classes = this._willKeepAspectRatio ? ["topLeft", "topRight", "bottomRight", "bottomLeft"] : ["topLeft", "topMiddle", "topRight", "middleRight", "bottomRight", "bottomMiddle", "bottomLeft", "middleLeft"]; + const signal = this._uiManager._signal; + for (const name of classes) { + const div = document.createElement("div"); + this.#resizersDiv.append(div); + div.classList.add("resizer", name); + div.setAttribute("data-resizer-name", name); + div.addEventListener("pointerdown", this.#resizerPointerdown.bind(this, name), { + signal + }); + div.addEventListener("contextmenu", noContextMenu, { + signal + }); + div.tabIndex = -1; + } + this.div.prepend(this.#resizersDiv); + } + #resizerPointerdown(name, event) { + event.preventDefault(); + const { + isMac + } = FeatureTest.platform; + if (event.button !== 0 || event.ctrlKey && isMac) { + return; + } + this.#altText?.toggle(false); + const savedDraggable = this._isDraggable; + this._isDraggable = false; + this.#lastPointerCoords = [event.screenX, event.screenY]; + const ac = new AbortController(); + const signal = this._uiManager.combinedSignal(ac); + this.parent.togglePointerEvents(false); + window.addEventListener("pointermove", this.#resizerPointermove.bind(this, name), { + passive: true, + capture: true, + signal + }); + window.addEventListener("touchmove", stopEvent, { + passive: false, + signal + }); + window.addEventListener("contextmenu", noContextMenu, { + signal + }); + this.#savedDimensions = { + savedX: this.x, + savedY: this.y, + savedWidth: this.width, + savedHeight: this.height + }; + const savedParentCursor = this.parent.div.style.cursor; + const savedCursor = this.div.style.cursor; + this.div.style.cursor = this.parent.div.style.cursor = window.getComputedStyle(event.target).cursor; + const pointerUpCallback = () => { + ac.abort(); + this.parent.togglePointerEvents(true); + this.#altText?.toggle(true); + this._isDraggable = savedDraggable; + this.parent.div.style.cursor = savedParentCursor; + this.div.style.cursor = savedCursor; + this.#addResizeToUndoStack(); + }; + window.addEventListener("pointerup", pointerUpCallback, { + signal + }); + window.addEventListener("blur", pointerUpCallback, { + signal + }); + } + #resize(x, y, width, height) { + this.width = width; + this.height = height; + this.x = x; + this.y = y; + this.setDims(); + this.fixAndSetPosition(); + this._onResized(); + } + _onResized() {} + #addResizeToUndoStack() { + if (!this.#savedDimensions) { + return; + } + const { + savedX, + savedY, + savedWidth, + savedHeight + } = this.#savedDimensions; + this.#savedDimensions = null; + const newX = this.x; + const newY = this.y; + const newWidth = this.width; + const newHeight = this.height; + if (newX === savedX && newY === savedY && newWidth === savedWidth && newHeight === savedHeight) { + return; + } + this.addCommands({ + cmd: this.#resize.bind(this, newX, newY, newWidth, newHeight), + undo: this.#resize.bind(this, savedX, savedY, savedWidth, savedHeight), + mustExec: true + }); + } + static _round(x) { + return Math.round(x * 10000) / 10000; + } + #resizerPointermove(name, event) { + const [parentWidth, parentHeight] = this.parentDimensions; + const savedX = this.x; + const savedY = this.y; + const savedWidth = this.width; + const savedHeight = this.height; + const minWidth = AnnotationEditor.MIN_SIZE / parentWidth; + const minHeight = AnnotationEditor.MIN_SIZE / parentHeight; + const rotationMatrix = this.#getRotationMatrix(this.rotation); + const transf = (x, y) => [rotationMatrix[0] * x + rotationMatrix[2] * y, rotationMatrix[1] * x + rotationMatrix[3] * y]; + const invRotationMatrix = this.#getRotationMatrix(360 - this.rotation); + const invTransf = (x, y) => [invRotationMatrix[0] * x + invRotationMatrix[2] * y, invRotationMatrix[1] * x + invRotationMatrix[3] * y]; + let getPoint; + let getOpposite; + let isDiagonal = false; + let isHorizontal = false; + switch (name) { + case "topLeft": + isDiagonal = true; + getPoint = (w, h) => [0, 0]; + getOpposite = (w, h) => [w, h]; + break; + case "topMiddle": + getPoint = (w, h) => [w / 2, 0]; + getOpposite = (w, h) => [w / 2, h]; + break; + case "topRight": + isDiagonal = true; + getPoint = (w, h) => [w, 0]; + getOpposite = (w, h) => [0, h]; + break; + case "middleRight": + isHorizontal = true; + getPoint = (w, h) => [w, h / 2]; + getOpposite = (w, h) => [0, h / 2]; + break; + case "bottomRight": + isDiagonal = true; + getPoint = (w, h) => [w, h]; + getOpposite = (w, h) => [0, 0]; + break; + case "bottomMiddle": + getPoint = (w, h) => [w / 2, h]; + getOpposite = (w, h) => [w / 2, 0]; + break; + case "bottomLeft": + isDiagonal = true; + getPoint = (w, h) => [0, h]; + getOpposite = (w, h) => [w, 0]; + break; + case "middleLeft": + isHorizontal = true; + getPoint = (w, h) => [0, h / 2]; + getOpposite = (w, h) => [w, h / 2]; + break; + } + const point = getPoint(savedWidth, savedHeight); + const oppositePoint = getOpposite(savedWidth, savedHeight); + let transfOppositePoint = transf(...oppositePoint); + const oppositeX = AnnotationEditor._round(savedX + transfOppositePoint[0]); + const oppositeY = AnnotationEditor._round(savedY + transfOppositePoint[1]); + let ratioX = 1; + let ratioY = 1; + let deltaX, deltaY; + if (!event.fromKeyboard) { + const { + screenX, + screenY + } = event; + const [lastScreenX, lastScreenY] = this.#lastPointerCoords; + [deltaX, deltaY] = this.screenToPageTranslation(screenX - lastScreenX, screenY - lastScreenY); + this.#lastPointerCoords[0] = screenX; + this.#lastPointerCoords[1] = screenY; + } else { + ({ + deltaX, + deltaY + } = event); + } + [deltaX, deltaY] = invTransf(deltaX / parentWidth, deltaY / parentHeight); + if (isDiagonal) { + const oldDiag = Math.hypot(savedWidth, savedHeight); + ratioX = ratioY = Math.max(Math.min(Math.hypot(oppositePoint[0] - point[0] - deltaX, oppositePoint[1] - point[1] - deltaY) / oldDiag, 1 / savedWidth, 1 / savedHeight), minWidth / savedWidth, minHeight / savedHeight); + } else if (isHorizontal) { + ratioX = MathClamp(Math.abs(oppositePoint[0] - point[0] - deltaX), minWidth, 1) / savedWidth; + } else { + ratioY = MathClamp(Math.abs(oppositePoint[1] - point[1] - deltaY), minHeight, 1) / savedHeight; + } + const newWidth = AnnotationEditor._round(savedWidth * ratioX); + const newHeight = AnnotationEditor._round(savedHeight * ratioY); + transfOppositePoint = transf(...getOpposite(newWidth, newHeight)); + const newX = oppositeX - transfOppositePoint[0]; + const newY = oppositeY - transfOppositePoint[1]; + this.#initialRect ||= [this.x, this.y, this.width, this.height]; + this.width = newWidth; + this.height = newHeight; + this.x = newX; + this.y = newY; + this.setDims(); + this.fixAndSetPosition(); + this._onResizing(); + } + _onResizing() {} + altTextFinish() { + this.#altText?.finish(); + } + get toolbarButtons() { + return null; + } + async addEditToolbar() { + if (this._editToolbar || this.#isInEditMode) { + return this._editToolbar; + } + this._editToolbar = new EditorToolbar(this); + this.div.append(this._editToolbar.render()); + const { + toolbarButtons + } = this; + if (toolbarButtons) { + for (const [name, tool] of toolbarButtons) { + await this._editToolbar.addButton(name, tool); + } + } + if (!this.hasComment) { + this._editToolbar.addButton("comment", this.addCommentButton()); + } + this._editToolbar.addButton("delete"); + return this._editToolbar; + } + addCommentButtonInToolbar() { + this._editToolbar?.addButtonBefore("comment", this.addCommentButton(), ".deleteButton"); + } + removeCommentButtonFromToolbar() { + this._editToolbar?.removeButton("comment"); + } + removeEditToolbar() { + this._editToolbar?.remove(); + this._editToolbar = null; + this.#altText?.destroy(); + } + addContainer(container) { + const editToolbarDiv = this._editToolbar?.div; + if (editToolbarDiv) { + editToolbarDiv.before(container); + } else { + this.div.append(container); + } + } + getClientDimensions() { + return this.div.getBoundingClientRect(); + } + createAltText() { + if (!this.#altText) { + AltText.initialize(AnnotationEditor._l10n); + this.#altText = new AltText(this); + if (this.#accessibilityData) { + this.#altText.data = this.#accessibilityData; + this.#accessibilityData = null; + } + } + return this.#altText; + } + get altTextData() { + return this.#altText?.data; + } + set altTextData(data) { + if (!this.#altText) { + return; + } + this.#altText.data = data; + } + get guessedAltText() { + return this.#altText?.guessedText; + } + async setGuessedAltText(text) { + await this.#altText?.setGuessedText(text); + } + serializeAltText(isForCopying) { + return this.#altText?.serialize(isForCopying); + } + hasAltText() { + return !!this.#altText && !this.#altText.isEmpty(); + } + hasAltTextData() { + return this.#altText?.hasData() ?? false; + } + focusCommentButton() { + this.#comment?.focusButton(); + } + addCommentButton() { + return this.canAddComment ? this.#comment ||= new Comment(this) : null; + } + addStandaloneCommentButton() { + if (!this._uiManager.hasCommentManager()) { + return; + } + if (this.#commentStandaloneButton) { + if (this._uiManager.isEditingMode()) { + this.#commentStandaloneButton.classList.remove("hidden"); + } + return; + } + if (!this.hasComment) { + return; + } + this.#commentStandaloneButton = this.#comment.renderForStandalone(); + this.div.append(this.#commentStandaloneButton); + } + removeStandaloneCommentButton() { + this.#comment.removeStandaloneCommentButton(); + this.#commentStandaloneButton = null; + } + hideStandaloneCommentButton() { + this.#commentStandaloneButton?.classList.add("hidden"); + } + get comment() { + if (!this.#comment) { + return null; + } + const { + data: { + richText, + text, + date, + deleted + } + } = this.#comment; + return { + text, + richText, + date, + deleted, + color: this.getNonHCMColor(), + opacity: this.opacity ?? 1 + }; + } + set comment(value) { + this.#comment ||= new Comment(this); + if (typeof value === "object" && value !== null) { + this.#comment.restoreData(value); + } else { + this.#comment.data = value; + } + if (this.hasComment) { + this.removeCommentButtonFromToolbar(); + this.addStandaloneCommentButton(); + this._uiManager.updateComment(this); + } else { + this.addCommentButtonInToolbar(); + this.removeStandaloneCommentButton(); + this._uiManager.removeComment(this); + } + } + setCommentData({ + comment, + popupRef, + richText + }) { + if (!popupRef) { + return; + } + this.#comment ||= new Comment(this); + this.#comment.setInitialText(comment, richText); + if (!this.annotationElementId) { + return; + } + const storedData = this._uiManager.getAndRemoveDataFromAnnotationStorage(this.annotationElementId); + if (storedData) { + this.updateFromAnnotationLayer(storedData); + } + } + get hasEditedComment() { + return this.#comment?.hasBeenEdited(); + } + get hasDeletedComment() { + return this.#comment?.isDeleted(); + } + get hasComment() { + return !!this.#comment && !this.#comment.isEmpty() && !this.#comment.isDeleted(); + } + async editComment(options) { + this.#comment ||= new Comment(this); + this.#comment.edit(options); + } + toggleComment(isSelected, visibility = undefined) { + if (this.hasComment) { + this._uiManager.toggleComment(this, isSelected, visibility); + } + } + setSelectedCommentButton(selected) { + this.#comment.setSelectedButton(selected); + } + addComment(serialized) { + if (this.hasEditedComment) { + const DEFAULT_POPUP_WIDTH = 180; + const DEFAULT_POPUP_HEIGHT = 100; + const [,,, trY] = serialized.rect; + const [pageWidth] = this.pageDimensions; + const [pageX] = this.pageTranslation; + const blX = pageX + pageWidth + 1; + const blY = trY - DEFAULT_POPUP_HEIGHT; + const trX = blX + DEFAULT_POPUP_WIDTH; + serialized.popup = { + contents: this.comment.text, + deleted: this.comment.deleted, + rect: [blX, blY, trX, trY] + }; + } + } + updateFromAnnotationLayer({ + popup: { + contents, + deleted + } + }) { + this.#comment.data = deleted ? null : contents; + } + get parentBoundingClientRect() { + return this.parent.boundingClientRect; + } + render() { + const div = this.div = document.createElement("div"); + div.setAttribute("data-editor-rotation", (360 - this.rotation) % 360); + div.className = this.name; + div.setAttribute("id", this.id); + div.tabIndex = this.#disabled ? -1 : 0; + div.setAttribute("role", "application"); + if (this.defaultL10nId) { + div.setAttribute("data-l10n-id", this.defaultL10nId); + } + if (!this._isVisible) { + div.classList.add("hidden"); + } + this.setInForeground(); + this.#addFocusListeners(); + const [parentWidth, parentHeight] = this.parentDimensions; + if (this.parentRotation % 180 !== 0) { + div.style.maxWidth = `${(100 * parentHeight / parentWidth).toFixed(2)}%`; + div.style.maxHeight = `${(100 * parentWidth / parentHeight).toFixed(2)}%`; + } + const [tx, ty] = this.getInitialTranslation(); + this.translate(tx, ty); + bindEvents(this, div, ["keydown", "pointerdown", "dblclick"]); + this.#addTouchManager(); + this.addStandaloneCommentButton(); + this._uiManager._editorUndoBar?.hide(); + return div; + } + #touchPinchStartCallback() { + this.#savedDimensions = { + savedX: this.x, + savedY: this.y, + savedWidth: this.width, + savedHeight: this.height + }; + this.#altText?.toggle(false); + this.parent.togglePointerEvents(false); + } + #touchPinchCallback(_origin, prevDistance, distance) { + const slowDownFactor = 0.7; + let factor = slowDownFactor * (distance / prevDistance) + 1 - slowDownFactor; + if (factor === 1) { + return; + } + const rotationMatrix = this.#getRotationMatrix(this.rotation); + const transf = (x, y) => [rotationMatrix[0] * x + rotationMatrix[2] * y, rotationMatrix[1] * x + rotationMatrix[3] * y]; + const [parentWidth, parentHeight] = this.parentDimensions; + const savedX = this.x; + const savedY = this.y; + const savedWidth = this.width; + const savedHeight = this.height; + const minWidth = AnnotationEditor.MIN_SIZE / parentWidth; + const minHeight = AnnotationEditor.MIN_SIZE / parentHeight; + factor = Math.max(Math.min(factor, 1 / savedWidth, 1 / savedHeight), minWidth / savedWidth, minHeight / savedHeight); + const newWidth = AnnotationEditor._round(savedWidth * factor); + const newHeight = AnnotationEditor._round(savedHeight * factor); + if (newWidth === savedWidth && newHeight === savedHeight) { + return; + } + this.#initialRect ||= [savedX, savedY, savedWidth, savedHeight]; + const transfCenterPoint = transf(savedWidth / 2, savedHeight / 2); + const centerX = AnnotationEditor._round(savedX + transfCenterPoint[0]); + const centerY = AnnotationEditor._round(savedY + transfCenterPoint[1]); + const newTransfCenterPoint = transf(newWidth / 2, newHeight / 2); + this.x = centerX - newTransfCenterPoint[0]; + this.y = centerY - newTransfCenterPoint[1]; + this.width = newWidth; + this.height = newHeight; + this.setDims(); + this.fixAndSetPosition(); + this._onResizing(); + } + #touchPinchEndCallback() { + this.#altText?.toggle(true); + this.parent.togglePointerEvents(true); + this.#addResizeToUndoStack(); + } + pointerdown(event) { + const { + isMac + } = FeatureTest.platform; + if (event.button !== 0 || event.ctrlKey && isMac) { + event.preventDefault(); + return; + } + this.#hasBeenClicked = true; + if (this._isDraggable) { + this.#setUpDragSession(event); + return; + } + this.#selectOnPointerEvent(event); + } + #selectOnPointerEvent(event) { + const { + isMac + } = FeatureTest.platform; + if (event.ctrlKey && !isMac || event.shiftKey || event.metaKey && isMac) { + this.parent.toggleSelected(this); + } else { + this.parent.setSelected(this); + } + } + #setUpDragSession(event) { + const { + isSelected + } = this; + this._uiManager.setUpDragSession(); + let hasDraggingStarted = false; + const ac = new AbortController(); + const signal = this._uiManager.combinedSignal(ac); + const opts = { + capture: true, + passive: false, + signal + }; + const cancelDrag = e => { + ac.abort(); + this.#dragPointerId = null; + this.#hasBeenClicked = false; + if (!this._uiManager.endDragSession()) { + this.#selectOnPointerEvent(e); + } + if (hasDraggingStarted) { + this._onStopDragging(); + } + }; + if (isSelected) { + this.#prevDragX = event.clientX; + this.#prevDragY = event.clientY; + this.#dragPointerId = event.pointerId; + this.#dragPointerType = event.pointerType; + window.addEventListener("pointermove", e => { + if (!hasDraggingStarted) { + hasDraggingStarted = true; + this._uiManager.toggleComment(this, true, false); + this._onStartDragging(); + } + const { + clientX: x, + clientY: y, + pointerId + } = e; + if (pointerId !== this.#dragPointerId) { + stopEvent(e); + return; + } + const [tx, ty] = this.screenToPageTranslation(x - this.#prevDragX, y - this.#prevDragY); + this.#prevDragX = x; + this.#prevDragY = y; + this._uiManager.dragSelectedEditors(tx, ty); + this.div.scrollIntoView({ + block: "nearest" + }); + }, opts); + window.addEventListener("touchmove", stopEvent, opts); + window.addEventListener("pointerdown", e => { + if (e.pointerType === this.#dragPointerType) { + if (this.#touchManager || e.isPrimary) { + cancelDrag(e); + } + } + stopEvent(e); + }, opts); + } + const pointerUpCallback = e => { + if (!this.#dragPointerId || this.#dragPointerId === e.pointerId) { + cancelDrag(e); + return; + } + stopEvent(e); + }; + window.addEventListener("pointerup", pointerUpCallback, { + signal + }); + window.addEventListener("blur", pointerUpCallback, { + signal + }); + } + _onStartDragging() {} + _onStopDragging() {} + moveInDOM() { + if (this.#moveInDOMTimeout) { + clearTimeout(this.#moveInDOMTimeout); + } + this.#moveInDOMTimeout = setTimeout(() => { + this.#moveInDOMTimeout = null; + this.parent?.moveEditorInDOM(this); + }, 0); + } + _setParentAndPosition(parent, x, y) { + parent.changeParent(this); + this.x = x; + this.y = y; + this.fixAndSetPosition(); + this._onTranslated(); + } + getRect(tx, ty, rotation = this.rotation) { + const scale = this.parentScale; + const [pageWidth, pageHeight] = this.pageDimensions; + const [pageX, pageY] = this.pageTranslation; + const shiftX = tx / scale; + const shiftY = ty / scale; + const x = this.x * pageWidth; + const y = this.y * pageHeight; + const width = this.width * pageWidth; + const height = this.height * pageHeight; + switch (rotation) { + case 0: + return [x + shiftX + pageX, pageHeight - y - shiftY - height + pageY, x + shiftX + width + pageX, pageHeight - y - shiftY + pageY]; + case 90: + return [x + shiftY + pageX, pageHeight - y + shiftX + pageY, x + shiftY + height + pageX, pageHeight - y + shiftX + width + pageY]; + case 180: + return [x - shiftX - width + pageX, pageHeight - y + shiftY + pageY, x - shiftX + pageX, pageHeight - y + shiftY + height + pageY]; + case 270: + return [x - shiftY - height + pageX, pageHeight - y - shiftX - width + pageY, x - shiftY + pageX, pageHeight - y - shiftX + pageY]; + default: + throw new Error("Invalid rotation"); + } + } + getRectInCurrentCoords(rect, pageHeight) { + const [x1, y1, x2, y2] = rect; + const width = x2 - x1; + const height = y2 - y1; + switch (this.rotation) { + case 0: + return [x1, pageHeight - y2, width, height]; + case 90: + return [x1, pageHeight - y1, height, width]; + case 180: + return [x2, pageHeight - y1, width, height]; + case 270: + return [x2, pageHeight - y2, height, width]; + default: + throw new Error("Invalid rotation"); + } + } + getPDFRect() { + return this.getRect(0, 0); + } + getNonHCMColor() { + return this.color && AnnotationEditor._colorManager.convert(this._uiManager.getNonHCMColor(this.color)); + } + onUpdatedColor() { + this.#comment?.onUpdatedColor(); + } + getData() { + const { + comment: { + text: str, + color, + date, + opacity, + deleted, + richText + }, + uid: id, + pageIndex, + creationDate, + modificationDate + } = this; + return { + id, + pageIndex, + rect: this.getPDFRect(), + richText, + contentsObj: { + str + }, + creationDate, + modificationDate: date || modificationDate, + popupRef: !deleted, + color, + opacity + }; + } + onceAdded(focus) {} + isEmpty() { + return false; + } + enableEditMode() { + if (this.isInEditMode()) { + return false; + } + this.parent.setEditingState(false); + this.#isInEditMode = true; + return true; + } + disableEditMode() { + if (!this.isInEditMode()) { + return false; + } + this.parent.setEditingState(true); + this.#isInEditMode = false; + return true; + } + isInEditMode() { + return this.#isInEditMode; + } + shouldGetKeyboardEvents() { + return this.#isResizerEnabledForKeyboard; + } + needsToBeRebuilt() { + return this.div && !this.isAttachedToDOM; + } + get isOnScreen() { + const { + top, + left, + bottom, + right + } = this.getClientDimensions(); + const { + innerHeight, + innerWidth + } = window; + return left < innerWidth && right > 0 && top < innerHeight && bottom > 0; + } + #addFocusListeners() { + if (this.#focusAC || !this.div) { + return; + } + this.#focusAC = new AbortController(); + const signal = this._uiManager.combinedSignal(this.#focusAC); + this.div.addEventListener("focusin", this.focusin.bind(this), { + signal + }); + this.div.addEventListener("focusout", this.focusout.bind(this), { + signal + }); + } + #addTouchManager() { + if (this.#touchManager || !this.div || !this.isResizable || !this._uiManager._supportsPinchToZoom) { + return; + } + this.#touchManager = new TouchManager({ + container: this.div, + isPinchingDisabled: () => !this.isSelected, + onPinchStart: this.#touchPinchStartCallback.bind(this), + onPinching: this.#touchPinchCallback.bind(this), + onPinchEnd: this.#touchPinchEndCallback.bind(this), + signal: this._uiManager._signal + }); + } + rebuild() { + this.#addFocusListeners(); + this.#addTouchManager(); + } + rotate(_angle) {} + resize() {} + serializeDeleted() { + return { + id: this.annotationElementId, + deleted: true, + pageIndex: this.pageIndex, + popupRef: this._initialData?.popupRef || "" + }; + } + serialize(isForCopying = false, context = null) { + return { + annotationType: this.mode, + pageIndex: this.pageIndex, + rect: this.getPDFRect(), + rotation: this.rotation, + structTreeParentId: this._structTreeParentId, + popupRef: this._initialData?.popupRef || "" + }; + } + static async deserialize(data, parent, uiManager) { + const editor = new this.prototype.constructor({ + parent, + id: uiManager.getId(), + uiManager, + annotationElementId: data.annotationElementId, + creationDate: data.creationDate, + modificationDate: data.modificationDate + }); + editor.rotation = data.rotation; + editor.#accessibilityData = data.accessibilityData; + editor._isCopy = data.isCopy || false; + const [pageWidth, pageHeight] = editor.pageDimensions; + const [x, y, width, height] = editor.getRectInCurrentCoords(data.rect, pageHeight); + editor.x = x / pageWidth; + editor.y = y / pageHeight; + editor.width = width / pageWidth; + editor.height = height / pageHeight; + return editor; + } + get hasBeenModified() { + return !!this.annotationElementId && (this.deleted || this.serialize() !== null); + } + remove() { + this.#focusAC?.abort(); + this.#focusAC = null; + if (!this.isEmpty()) { + this.commit(); + } + this.#touchManager?.destroy(); + this.#touchManager = null; + if (this.parent) { + this.parent.remove(this); + } else { + this._uiManager.removeEditor(this); + } + this.hideCommentPopup(); + if (this.#moveInDOMTimeout) { + clearTimeout(this.#moveInDOMTimeout); + this.#moveInDOMTimeout = null; + } + this.#stopResizing(); + this.removeEditToolbar(); + if (this.#telemetryTimeouts) { + for (const timeout of this.#telemetryTimeouts.values()) { + clearTimeout(timeout); + } + this.#telemetryTimeouts = null; + } + this.parent = null; + this.#fakeAnnotation?.remove(); + this.#fakeAnnotation = null; + } + get isResizable() { + return false; + } + makeResizable() { + if (this.isResizable) { + this.#createResizers(); + this.#resizersDiv.classList.remove("hidden"); + } + } + get toolbarPosition() { + return null; + } + get commentButtonPosition() { + return this._uiManager.direction === "ltr" ? [1, 0] : [0, 0]; + } + get commentButtonPositionInPage() { + const { + commentButtonPosition: [posX, posY] + } = this; + const [blX, blY, trX, trY] = this.getPDFRect(); + return [AnnotationEditor._round(blX + (trX - blX) * posX), AnnotationEditor._round(blY + (trY - blY) * (1 - posY))]; + } + get commentButtonColor() { + return this._uiManager.makeCommentColor(this.getNonHCMColor(), this.opacity); + } + get commentPopupPosition() { + return this.#comment.commentPopupPositionInLayer; + } + set commentPopupPosition(pos) { + this.#comment.commentPopupPositionInLayer = pos; + } + hasDefaultPopupPosition() { + return this.#comment.hasDefaultPopupPosition(); + } + get commentButtonWidth() { + return this.#comment.commentButtonWidth; + } + get elementBeforePopup() { + return this.div; + } + setCommentButtonStates(options) { + this.#comment?.setCommentButtonStates(options); + } + keydown(event) { + if (!this.isResizable || event.target !== this.div || event.key !== "Enter") { + return; + } + this._uiManager.setSelected(this); + this.#savedDimensions = { + savedX: this.x, + savedY: this.y, + savedWidth: this.width, + savedHeight: this.height + }; + const children = this.#resizersDiv.children; + if (!this.#allResizerDivs) { + this.#allResizerDivs = Array.from(children); + const boundResizerKeydown = this.#resizerKeydown.bind(this); + const boundResizerBlur = this.#resizerBlur.bind(this); + const signal = this._uiManager._signal; + for (const div of this.#allResizerDivs) { + const name = div.getAttribute("data-resizer-name"); + div.setAttribute("role", "spinbutton"); + div.addEventListener("keydown", boundResizerKeydown, { + signal + }); + div.addEventListener("blur", boundResizerBlur, { + signal + }); + div.addEventListener("focus", this.#resizerFocus.bind(this, name), { + signal + }); + div.setAttribute("data-l10n-id", AnnotationEditor._l10nResizer[name]); + } + } + const first = this.#allResizerDivs[0]; + let firstPosition = 0; + for (const div of children) { + if (div === first) { + break; + } + firstPosition++; + } + const nextFirstPosition = (360 - this.rotation + this.parentRotation) % 360 / 90 * (this.#allResizerDivs.length / 4); + if (nextFirstPosition !== firstPosition) { + if (nextFirstPosition < firstPosition) { + for (let i = 0; i < firstPosition - nextFirstPosition; i++) { + this.#resizersDiv.append(this.#resizersDiv.firstElementChild); + } + } else if (nextFirstPosition > firstPosition) { + for (let i = 0; i < nextFirstPosition - firstPosition; i++) { + this.#resizersDiv.firstElementChild.before(this.#resizersDiv.lastElementChild); + } + } + let i = 0; + for (const child of children) { + const div = this.#allResizerDivs[i++]; + const name = div.getAttribute("data-resizer-name"); + child.setAttribute("data-l10n-id", AnnotationEditor._l10nResizer[name]); + } + } + this.#setResizerTabIndex(0); + this.#isResizerEnabledForKeyboard = true; + this.#resizersDiv.firstElementChild.focus({ + focusVisible: true + }); + event.preventDefault(); + event.stopImmediatePropagation(); + } + #resizerKeydown(event) { + AnnotationEditor._resizerKeyboardManager.exec(this, event); + } + #resizerBlur(event) { + if (this.#isResizerEnabledForKeyboard && event.relatedTarget?.parentNode !== this.#resizersDiv) { + this.#stopResizing(); + } + } + #resizerFocus(name) { + this.#focusedResizerName = this.#isResizerEnabledForKeyboard ? name : ""; + } + #setResizerTabIndex(value) { + if (!this.#allResizerDivs) { + return; + } + for (const div of this.#allResizerDivs) { + div.tabIndex = value; + } + } + _resizeWithKeyboard(x, y) { + if (!this.#isResizerEnabledForKeyboard) { + return; + } + this.#resizerPointermove(this.#focusedResizerName, { + deltaX: x, + deltaY: y, + fromKeyboard: true + }); + } + #stopResizing() { + this.#isResizerEnabledForKeyboard = false; + this.#setResizerTabIndex(-1); + this.#addResizeToUndoStack(); + } + _stopResizingWithKeyboard() { + this.#stopResizing(); + this.div.focus(); + } + select() { + if (this.isSelected && this._editToolbar) { + this._editToolbar.show(); + return; + } + this.isSelected = true; + this.makeResizable(); + this.div?.classList.add("selectedEditor"); + if (!this._editToolbar) { + this.addEditToolbar().then(() => { + if (this.div?.classList.contains("selectedEditor")) { + this._editToolbar?.show(); + } + }); + return; + } + this._editToolbar?.show(); + this.#altText?.toggleAltTextBadge(false); + } + focus() { + if (this.div && !this.div.contains(document.activeElement)) { + setTimeout(() => this.div?.focus({ + preventScroll: true + }), 0); + } + } + unselect() { + if (!this.isSelected) { + return; + } + this.isSelected = false; + this.#resizersDiv?.classList.add("hidden"); + this.div?.classList.remove("selectedEditor"); + if (this.div?.contains(document.activeElement)) { + this._uiManager.currentLayer.div.focus({ + preventScroll: true + }); + } + this._editToolbar?.hide(); + this.#altText?.toggleAltTextBadge(true); + this.hideCommentPopup(); + } + hideCommentPopup() { + if (this.hasComment) { + this._uiManager.toggleComment(null); + } + } + updateParams(type, value) {} + disableEditing() {} + enableEditing() {} + get canChangeContent() { + return false; + } + enterInEditMode() { + if (!this.canChangeContent) { + return; + } + this.enableEditMode(); + this.div.focus(); + } + dblclick(event) { + if (event.target.nodeName === "BUTTON") { + return; + } + this.enterInEditMode(); + this.parent.updateToolbar({ + mode: this.constructor._editorType, + editId: this.uid + }); + } + getElementForAltText() { + return this.div; + } + get contentDiv() { + return this.div; + } + get isEditing() { + return this.#isEditing; + } + set isEditing(value) { + this.#isEditing = value; + if (!this.parent) { + return; + } + if (value) { + this.parent.setSelected(this); + this.parent.setActiveEditor(this); + } else { + this.parent.setActiveEditor(null); + } + } + static get MIN_SIZE() { + return 16; + } + static canCreateNewEmptyEditor() { + return true; + } + get telemetryInitialData() { + return { + action: "added" + }; + } + get telemetryFinalData() { + return null; + } + _reportTelemetry(data, mustWait = false) { + if (mustWait) { + this.#telemetryTimeouts ||= new Map(); + const { + action + } = data; + let timeout = this.#telemetryTimeouts.get(action); + if (timeout) { + clearTimeout(timeout); + } + timeout = setTimeout(() => { + this._reportTelemetry(data); + this.#telemetryTimeouts.delete(action); + if (this.#telemetryTimeouts.size === 0) { + this.#telemetryTimeouts = null; + } + }, AnnotationEditor._telemetryTimeout); + this.#telemetryTimeouts.set(action, timeout); + return; + } + data.type ||= this.editorType; + this._uiManager._eventBus.dispatch("reporttelemetry", { + source: this, + details: { + type: "editing", + data + } + }); + } + show(visible = this._isVisible) { + this.div.classList.toggle("hidden", !visible); + this._isVisible = visible; + } + enable() { + if (this.div) { + this.div.tabIndex = 0; + } + this.#disabled = false; + } + disable() { + if (this.div) { + this.div.tabIndex = -1; + } + this.#disabled = true; + } + updateFakeAnnotationElement(annotationLayer) { + if (!this.#fakeAnnotation && !this.deleted) { + this.#fakeAnnotation = annotationLayer.addFakeAnnotation(this); + return; + } + if (this.deleted) { + this.#fakeAnnotation.remove(); + this.#fakeAnnotation = null; + return; + } + if (this.hasEditedComment || this._hasBeenMoved || this._hasBeenResized) { + this.#fakeAnnotation.updateEdited({ + rect: this.getPDFRect(), + popup: this.comment + }); + } + } + renderAnnotationElement(annotation) { + if (this.deleted) { + annotation.hide(); + return null; + } + let content = annotation.container.querySelector(".annotationContent"); + if (!content) { + content = document.createElement("div"); + content.classList.add("annotationContent", this.editorType); + annotation.container.prepend(content); + } else if (content.nodeName === "CANVAS") { + const canvas = content; + content = document.createElement("div"); + content.classList.add("annotationContent", this.editorType); + canvas.before(content); + } + return content; + } + resetAnnotationElement(annotation) { + const { + firstElementChild + } = annotation.container; + if (firstElementChild?.nodeName === "DIV" && firstElementChild.classList.contains("annotationContent")) { + firstElementChild.remove(); + } + } +} +class FakeEditor extends AnnotationEditor { + constructor(params) { + super(params); + this.annotationElementId = params.annotationElementId; + this.deleted = true; + } + serialize() { + return this.serializeDeleted(); + } +} + +;// ./src/shared/murmurhash3.js + + + + + +const SEED = 0xc3d2e1f0; +const MASK_HIGH = 0xffff0000; +const MASK_LOW = 0xffff; +class MurmurHash3_64 { + constructor(seed) { + this.h1 = seed ? seed & 0xffffffff : SEED; + this.h2 = seed ? seed & 0xffffffff : SEED; + } + update(input) { + let data, length; + if (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 { + throw new Error("Invalid data format, must be a string or TypedArray."); + } + const blockCounts = length >> 2; + const tailLength = length - blockCounts * 4; + const dataUint32 = new Uint32Array(data.buffer, 0, blockCounts); + let k1 = 0, + k2 = 0; + let h1 = this.h1, + h2 = this.h2; + const C1 = 0xcc9e2d51, + C2 = 0x1b873593; + const C1_LOW = C1 & MASK_LOW, + C2_LOW = C2 & MASK_LOW; + for (let i = 0; i < blockCounts; i++) { + if (i & 1) { + k1 = dataUint32[i]; + k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW; + k1 = k1 << 15 | k1 >>> 17; + k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW; + h1 ^= k1; + h1 = h1 << 13 | h1 >>> 19; + h1 = h1 * 5 + 0xe6546b64; + } else { + k2 = dataUint32[i]; + k2 = k2 * C1 & MASK_HIGH | k2 * C1_LOW & MASK_LOW; + k2 = k2 << 15 | k2 >>> 17; + k2 = k2 * C2 & MASK_HIGH | k2 * C2_LOW & MASK_LOW; + h2 ^= k2; + h2 = h2 << 13 | h2 >>> 19; + h2 = h2 * 5 + 0xe6546b64; + } + } + k1 = 0; + switch (tailLength) { + case 3: + k1 ^= data[blockCounts * 4 + 2] << 16; + case 2: + k1 ^= data[blockCounts * 4 + 1] << 8; + case 1: + k1 ^= data[blockCounts * 4]; + k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW; + k1 = k1 << 15 | k1 >>> 17; + k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW; + if (blockCounts & 1) { + h1 ^= k1; + } else { + h2 ^= k1; + } + } + this.h1 = h1; + this.h2 = h2; + } + hexdigest() { + let h1 = this.h1, + h2 = this.h2; + h1 ^= h2 >>> 1; + h1 = h1 * 0xed558ccd & MASK_HIGH | h1 * 0x8ccd & MASK_LOW; + h2 = h2 * 0xff51afd7 & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xafd7ed55 & MASK_HIGH) >>> 16; + h1 ^= h2 >>> 1; + h1 = h1 * 0x1a85ec53 & MASK_HIGH | h1 * 0xec53 & MASK_LOW; + h2 = h2 * 0xc4ceb9fe & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xb9fe1a85 & MASK_HIGH) >>> 16; + h1 ^= h2 >>> 1; + return (h1 >>> 0).toString(16).padStart(8, "0") + (h2 >>> 0).toString(16).padStart(8, "0"); + } +} + +;// ./src/display/annotation_storage.js + + + + + + + + + + + + + + + + + + +const SerializableEmpty = Object.freeze({ + map: null, + hash: "", + transfer: undefined +}); +class AnnotationStorage { + #modified = false; + #modifiedIds = null; + #editorsMap = null; + #storage = new Map(); + onSetModified = null; + onResetModified = null; + onAnnotationEditor = null; + getValue(key, defaultValue) { + const value = this.#storage.get(key); + return value === undefined ? defaultValue : Object.assign(defaultValue, value); + } + getRawValue(key) { + return this.#storage.get(key); + } + remove(key) { + const storedValue = this.#storage.get(key); + if (storedValue === undefined) { + return; + } + if (storedValue instanceof AnnotationEditor) { + this.#editorsMap.delete(storedValue.annotationElementId); + } + this.#storage.delete(key); + if (this.#storage.size === 0) { + this.resetModified(); + } + if (this.#storage.values().some(v => v instanceof AnnotationEditor)) { + return; + } + this.onAnnotationEditor?.(null); + } + setValue(key, value) { + const obj = this.#storage.get(key); + let modified = false; + if (obj !== undefined) { + for (const [entry, val] of Object.entries(value)) { + if (obj[entry] !== val) { + modified = true; + obj[entry] = val; + } + } + } else { + modified = true; + this.#storage.set(key, value); + } + if (modified) { + this.#setModified(); + } + if (value instanceof AnnotationEditor) { + (this.#editorsMap ||= new Map()).set(value.annotationElementId, value); + this.onAnnotationEditor?.(value.constructor._type); + } + } + has(key) { + return this.#storage.has(key); + } + get size() { + return this.#storage.size; + } + #setModified() { + if (!this.#modified) { + this.#modified = true; + this.onSetModified?.(); + } + } + resetModified() { + if (this.#modified) { + this.#modified = false; + this.onResetModified?.(); + } + } + get print() { + return new PrintAnnotationStorage(this); + } + get serializable() { + if (this.#storage.size === 0) { + return SerializableEmpty; + } + const map = new Map(), + hash = new MurmurHash3_64(), + transfer = []; + const context = Object.create(null); + let hasBitmap = false; + for (const [key, val] of this.#storage) { + const serialized = val instanceof AnnotationEditor ? val.serialize(false, context) : val; + if (val.page) { + val.pageIndex = val.page._pageIndex; + delete val.page; + } + if (serialized) { + map.set(key, serialized); + hash.update(`${key}:${JSON.stringify(serialized)}`); + hasBitmap ||= !!serialized.bitmap; + } + } + if (hasBitmap) { + for (const value of map.values()) { + if (value.bitmap) { + transfer.push(value.bitmap); + } + } + } + return map.size > 0 ? { + map, + hash: hash.hexdigest(), + transfer + } : SerializableEmpty; + } + get editorStats() { + let stats = null; + const typeToEditor = new Map(); + let numberOfEditedComments = 0; + let numberOfDeletedComments = 0; + for (const value of this.#storage.values()) { + if (!(value instanceof AnnotationEditor)) { + if (value.popup) { + if (value.popup.deleted) { + numberOfDeletedComments += 1; + } else { + numberOfEditedComments += 1; + } + } + continue; + } + if (value.isCommentDeleted) { + numberOfDeletedComments += 1; + } else if (value.hasEditedComment) { + numberOfEditedComments += 1; + } + const editorStats = value.telemetryFinalData; + if (!editorStats) { + continue; + } + const { + type + } = editorStats; + typeToEditor.getOrInsertComputed(type, () => Object.getPrototypeOf(value).constructor); + stats ||= Object.create(null); + const map = stats[type] ||= new Map(); + for (const [key, val] of Object.entries(editorStats)) { + if (key === "type") { + continue; + } + const counters = map.getOrInsertComputed(key, makeMap); + counters.set(val, (counters.get(val) ?? 0) + 1); + } + } + if (numberOfDeletedComments > 0 || numberOfEditedComments > 0) { + stats ||= Object.create(null); + stats.comments = { + deleted: numberOfDeletedComments, + edited: numberOfEditedComments + }; + } + if (!stats) { + return null; + } + for (const [type, editor] of typeToEditor) { + stats[type] = editor.computeTelemetryFinalData(stats[type]); + } + return stats; + } + resetModifiedIds() { + this.#modifiedIds = null; + } + updateEditor(annotationId, data) { + const value = this.#editorsMap?.get(annotationId); + if (value) { + value.updateFromAnnotationLayer(data); + return true; + } + return false; + } + getEditor(annotationId) { + return this.#editorsMap?.get(annotationId) || null; + } + get modifiedIds() { + if (this.#modifiedIds) { + return this.#modifiedIds; + } + const ids = []; + if (this.#editorsMap) { + for (const value of this.#editorsMap.values()) { + if (!value.serialize()) { + continue; + } + ids.push(value.annotationElementId); + } + } + let hash = ""; + if (ids.length) { + const h = new MurmurHash3_64(); + h.update(ids.join(",")); + hash = h.hexdigest(); + } + return this.#modifiedIds = { + ids: new Set(ids), + hash + }; + } + [Symbol.iterator]() { + return this.#storage.entries(); + } +} +class PrintAnnotationStorage extends AnnotationStorage { + #serializable = SerializableEmpty; + constructor(parent) { + super(); + const { + serializable + } = parent; + if (serializable === SerializableEmpty) { + return; + } + const { + map, + hash, + transfer + } = serializable; + const clone = structuredClone(map, transfer ? { + transfer + } : null); + this.#serializable = { + map: clone, + hash, + transfer: [] + }; + } + get print() { + unreachable("Should not call PrintAnnotationStorage.print"); + } + get serializable() { + return this.#serializable; + } + get modifiedIds() { + return util_shadow(this, "modifiedIds", { + ids: new Set(), + hash: "" + }); + } +} + +;// ./node_modules/core-js/modules/es.iterator.for-each.js +es_iterator_for_each_namespaceFn(); + +;// ./src/display/canvas_dependency_tracker.js + + + + + + + + + + + + + + + + + + + + + +const FORCED_DEPENDENCY_LABEL = "__forcedDependency"; +const { + floor: canvas_dependency_tracker_floor, + ceil +} = Math; +function expandBBox(array, index, minX, minY, maxX, maxY) { + array[index * 4 + 0] = Math.min(array[index * 4 + 0], minX); + array[index * 4 + 1] = Math.min(array[index * 4 + 1], minY); + array[index * 4 + 2] = Math.max(array[index * 4 + 2], maxX); + array[index * 4 + 3] = Math.max(array[index * 4 + 3], maxY); +} +function scaleCharBBox(scaleX, scaleY, x, y, bbox) { + let temp; + if (scaleX) { + if (scaleX < 0) { + temp = bbox[0]; + bbox[0] = bbox[2]; + bbox[2] = temp; + } + bbox[0] *= scaleX; + bbox[2] *= scaleX; + if (scaleY < 0) { + temp = bbox[1]; + bbox[1] = bbox[3]; + bbox[3] = temp; + } + bbox[1] *= scaleY; + bbox[3] *= scaleY; + } else { + bbox.fill(0); + } + bbox[0] += x; + bbox[1] += y; + bbox[2] += x; + bbox[3] += y; +} +const EMPTY_BBOX = new Uint32Array(new Uint8Array([255, 255, 0, 0]).buffer)[0]; +class BBoxReader { + #bboxes; + #coords; + constructor(bboxes, coords) { + this.#bboxes = bboxes; + this.#coords = coords; + } + get length() { + return this.#bboxes.length; + } + isEmpty(i) { + return this.#bboxes[i] === EMPTY_BBOX; + } + minX(i) { + return this.#coords[i * 4 + 0] / 256; + } + minY(i) { + return this.#coords[i * 4 + 1] / 256; + } + maxX(i) { + return (this.#coords[i * 4 + 2] + 1) / 256; + } + maxY(i) { + return (this.#coords[i * 4 + 3] + 1) / 256; + } +} +const ensureDebugMetadata = (map, key) => map?.getOrInsertComputed(key, () => ({ + dependencies: new Set(), + isRenderingOperation: false +})); +class CanvasBBoxTracker { + #baseTransformStack = [[1, 0, 0, 1, 0, 0]]; + #clipBox = [-Infinity, -Infinity, Infinity, Infinity]; + #pendingBBox = new Float64Array(BBOX_INIT); + _pendingBBoxIdx = -1; + #canvasWidth; + #canvasHeight; + #bboxesCoords; + #bboxes; + _savesStack = []; + _markedContentStack = []; + constructor(canvas, operationsCount) { + this.#canvasWidth = canvas.width; + this.#canvasHeight = canvas.height; + this.#initializeBBoxes(operationsCount); + } + growOperationsCount(operationsCount) { + if (operationsCount >= this.#bboxes.length) { + this.#initializeBBoxes(operationsCount, this.#bboxes); + } + } + #initializeBBoxes(operationsCount, oldBBoxes) { + const buffer = new ArrayBuffer(operationsCount * 4); + this.#bboxesCoords = new Uint8ClampedArray(buffer); + this.#bboxes = new Uint32Array(buffer); + if (oldBBoxes && oldBBoxes.length > 0) { + this.#bboxes.set(oldBBoxes); + this.#bboxes.fill(EMPTY_BBOX, oldBBoxes.length); + } else { + this.#bboxes.fill(EMPTY_BBOX); + } + } + get clipBox() { + return this.#clipBox; + } + save(opIdx) { + this.#clipBox = { + __proto__: this.#clipBox + }; + this._savesStack.push(opIdx); + return this; + } + restore(opIdx, onSavePopped) { + const previous = Object.getPrototypeOf(this.#clipBox); + if (previous === null) { + return this; + } + this.#clipBox = previous; + const lastSave = this._savesStack.pop(); + if (lastSave !== undefined) { + onSavePopped?.(lastSave, opIdx); + this.#bboxes[opIdx] = this.#bboxes[lastSave]; + } + return this; + } + recordOpenMarker(idx) { + this._savesStack.push(idx); + return this; + } + getOpenMarker() { + return this._savesStack.length === 0 ? null : this._savesStack.at(-1); + } + recordCloseMarker(opIdx, onSavePopped) { + const lastSave = this._savesStack.pop(); + if (lastSave !== undefined) { + onSavePopped?.(lastSave, opIdx); + this.#bboxes[opIdx] = this.#bboxes[lastSave]; + } + return this; + } + beginMarkedContent(opIdx) { + this._markedContentStack.push(opIdx); + return this; + } + endMarkedContent(opIdx, onSavePopped) { + const lastSave = this._markedContentStack.pop(); + if (lastSave !== undefined) { + onSavePopped?.(lastSave, opIdx); + this.#bboxes[opIdx] = this.#bboxes[lastSave]; + } + return this; + } + pushBaseTransform(ctx) { + this.#baseTransformStack.push(Util.multiplyByDOMMatrix(this.#baseTransformStack.at(-1), ctx.getTransform())); + return this; + } + popBaseTransform() { + if (this.#baseTransformStack.length > 1) { + this.#baseTransformStack.pop(); + } + return this; + } + resetBBox(idx) { + if (this._pendingBBoxIdx !== idx) { + this._pendingBBoxIdx = idx; + this.#pendingBBox.set(BBOX_INIT, 0); + } + return this; + } + recordClipBox(idx, ctx, minX, maxX, minY, maxY) { + const transform = Util.multiplyByDOMMatrix(this.#baseTransformStack.at(-1), ctx.getTransform()); + const clipBox = BBOX_INIT.slice(); + Util.axialAlignedBoundingBox([minX, minY, maxX, maxY], transform, clipBox); + const intersection = Util.intersect(this.#clipBox, clipBox); + if (intersection) { + this.#clipBox[0] = intersection[0]; + this.#clipBox[1] = intersection[1]; + this.#clipBox[2] = intersection[2]; + this.#clipBox[3] = intersection[3]; + } else { + this.#clipBox[0] = this.#clipBox[1] = Infinity; + this.#clipBox[2] = this.#clipBox[3] = -Infinity; + } + return this; + } + recordBBox(idx, ctx, minX, maxX, minY, maxY) { + const clipBox = this.#clipBox; + if (clipBox[0] === Infinity) { + return this; + } + const transform = Util.multiplyByDOMMatrix(this.#baseTransformStack.at(-1), ctx.getTransform()); + if (clipBox[0] === -Infinity) { + Util.axialAlignedBoundingBox([minX, minY, maxX, maxY], transform, this.#pendingBBox); + return this; + } + const bbox = BBOX_INIT.slice(); + Util.axialAlignedBoundingBox([minX, minY, maxX, maxY], transform, bbox); + this.#pendingBBox[0] = MathClamp(bbox[0], clipBox[0], this.#pendingBBox[0]); + this.#pendingBBox[1] = MathClamp(bbox[1], clipBox[1], this.#pendingBBox[1]); + this.#pendingBBox[2] = MathClamp(bbox[2], this.#pendingBBox[2], clipBox[2]); + this.#pendingBBox[3] = MathClamp(bbox[3], this.#pendingBBox[3], clipBox[3]); + return this; + } + recordFullPageBBox(idx) { + this.#pendingBBox[0] = Math.max(0, this.#clipBox[0]); + this.#pendingBBox[1] = Math.max(0, this.#clipBox[1]); + this.#pendingBBox[2] = Math.min(this.#canvasWidth, this.#clipBox[2]); + this.#pendingBBox[3] = Math.min(this.#canvasHeight, this.#clipBox[3]); + return this; + } + recordOperation(idx, preserve = false, dependencyLists) { + if (this._pendingBBoxIdx !== idx) { + return this; + } + const minX = canvas_dependency_tracker_floor(this.#pendingBBox[0] * 256 / this.#canvasWidth); + const minY = canvas_dependency_tracker_floor(this.#pendingBBox[1] * 256 / this.#canvasHeight); + const maxX = ceil(this.#pendingBBox[2] * 256 / this.#canvasWidth); + const maxY = ceil(this.#pendingBBox[3] * 256 / this.#canvasHeight); + expandBBox(this.#bboxesCoords, idx, minX, minY, maxX, maxY); + if (dependencyLists) { + for (const dependencies of dependencyLists) { + for (const depIdx of dependencies) { + if (depIdx !== idx) { + expandBBox(this.#bboxesCoords, depIdx, minX, minY, maxX, maxY); + } + } + } + } + if (!preserve) { + this._pendingBBoxIdx = -1; + } + return this; + } + bboxToClipBoxDropOperation(idx) { + if (this._pendingBBoxIdx === idx) { + this._pendingBBoxIdx = -1; + this.#clipBox[0] = Math.max(this.#clipBox[0], this.#pendingBBox[0]); + this.#clipBox[1] = Math.max(this.#clipBox[1], this.#pendingBBox[1]); + this.#clipBox[2] = Math.min(this.#clipBox[2], this.#pendingBBox[2]); + this.#clipBox[3] = Math.min(this.#clipBox[3], this.#pendingBBox[3]); + } + return this; + } + take() { + return new BBoxReader(this.#bboxes, this.#bboxesCoords); + } + takeDebugMetadata() { + throw new Error("Unreachable"); + } + recordSimpleData(name, idx) { + return this; + } + recordIncrementalData(name, idx) { + return this; + } + resetIncrementalData(name, idx) { + return this; + } + recordNamedData(name, idx) { + return this; + } + recordSimpleDataFromNamed(name, depName, fallbackIdx) { + return this; + } + recordFutureForcedDependency(name, idx) { + return this; + } + inheritSimpleDataAsFutureForcedDependencies(names) { + return this; + } + inheritPendingDependenciesAsFutureForcedDependencies() { + return this; + } + recordCharacterBBox(idx, ctx, font, scale = 1, x = 0, y = 0, getMeasure) { + return this; + } + getSimpleIndex(dependencyName) { + return undefined; + } + recordDependencies(idx, dependencyNames) { + return this; + } + recordNamedDependency(idx, name) { + return this; + } + recordShowTextOperation(idx, preserve = false) { + return this; + } +} +class CanvasDependencyTracker { + #simple = { + __proto__: null + }; + #incremental = { + __proto__: null, + transform: [], + moveText: [], + sameLineText: [], + [FORCED_DEPENDENCY_LABEL]: [] + }; + #namedDependencies = new Map(); + #pendingDependencies = new Set(); + #fontBBoxTrustworthy = new Map(); + #debugMetadata; + #recordDebugMetadataDepenencyAfterRestore; + #bboxTracker; + constructor(bboxTracker, recordDebugMetadata = false) { + this.#bboxTracker = bboxTracker; + if (recordDebugMetadata) { + this.#debugMetadata = new Map(); + this.#recordDebugMetadataDepenencyAfterRestore = (lastSave, opIdx) => { + ensureDebugMetadata(this.#debugMetadata, opIdx).dependencies.add(lastSave); + }; + } + } + get clipBox() { + return this.#bboxTracker.clipBox; + } + growOperationsCount(operationsCount) { + this.#bboxTracker.growOperationsCount(operationsCount); + } + save(opIdx) { + this.#simple = { + __proto__: this.#simple + }; + this.#incremental = { + __proto__: this.#incremental, + transform: { + __proto__: this.#incremental.transform + }, + moveText: { + __proto__: this.#incremental.moveText + }, + sameLineText: { + __proto__: this.#incremental.sameLineText + }, + [FORCED_DEPENDENCY_LABEL]: { + __proto__: this.#incremental[FORCED_DEPENDENCY_LABEL] + } + }; + this.#bboxTracker.save(opIdx); + return this; + } + restore(opIdx) { + this.#bboxTracker.restore(opIdx, this.#recordDebugMetadataDepenencyAfterRestore); + const previous = Object.getPrototypeOf(this.#simple); + if (previous === null) { + return this; + } + this.#simple = previous; + this.#incremental = Object.getPrototypeOf(this.#incremental); + return this; + } + recordOpenMarker(opIdx) { + this.#bboxTracker.recordOpenMarker(opIdx, this.#recordDebugMetadataDepenencyAfterRestore); + return this; + } + getOpenMarker() { + return this.#bboxTracker.getOpenMarker(); + } + recordCloseMarker(opIdx) { + this.#bboxTracker.recordCloseMarker(opIdx, this.#recordDebugMetadataDepenencyAfterRestore); + return this; + } + beginMarkedContent(opIdx) { + this.#bboxTracker.beginMarkedContent(opIdx); + return this; + } + endMarkedContent(opIdx) { + this.#bboxTracker.endMarkedContent(opIdx, this.#recordDebugMetadataDepenencyAfterRestore); + return this; + } + pushBaseTransform(ctx) { + this.#bboxTracker.pushBaseTransform(ctx); + return this; + } + popBaseTransform() { + this.#bboxTracker.popBaseTransform(); + return this; + } + recordSimpleData(name, idx) { + this.#simple[name] = idx; + return this; + } + recordIncrementalData(name, idx) { + this.#incremental[name].push(idx); + return this; + } + resetIncrementalData(name, idx) { + this.#incremental[name].length = 0; + return this; + } + recordNamedData(name, idx) { + this.#namedDependencies.set(name, idx); + return this; + } + recordSimpleDataFromNamed(name, depName, fallbackIdx) { + this.#simple[name] = this.#namedDependencies.get(depName) ?? fallbackIdx; + } + recordFutureForcedDependency(name, idx) { + this.recordIncrementalData(FORCED_DEPENDENCY_LABEL, idx); + return this; + } + inheritSimpleDataAsFutureForcedDependencies(names) { + for (const name of names) { + if (name in this.#simple) { + this.recordFutureForcedDependency(name, this.#simple[name]); + } + } + return this; + } + inheritPendingDependenciesAsFutureForcedDependencies() { + for (const dep of this.#pendingDependencies) { + this.recordFutureForcedDependency(FORCED_DEPENDENCY_LABEL, dep); + } + return this; + } + resetBBox(idx) { + this.#bboxTracker.resetBBox(idx); + return this; + } + recordClipBox(idx, ctx, minX, maxX, minY, maxY) { + this.#bboxTracker.recordClipBox(idx, ctx, minX, maxX, minY, maxY); + return this; + } + recordBBox(idx, ctx, minX, maxX, minY, maxY) { + this.#bboxTracker.recordBBox(idx, ctx, minX, maxX, minY, maxY); + return this; + } + recordCharacterBBox(idx, ctx, font, scale = 1, x = 0, y = 0, getMeasure) { + const fontBBox = font.bbox; + let isBBoxTrustworthy; + let computedBBox; + if (fontBBox) { + isBBoxTrustworthy = fontBBox[2] !== fontBBox[0] && fontBBox[3] !== fontBBox[1] && this.#fontBBoxTrustworthy.get(font); + if (isBBoxTrustworthy !== false) { + computedBBox = [0, 0, 0, 0]; + Util.axialAlignedBoundingBox(fontBBox, font.fontMatrix, computedBBox); + if (scale !== 1 || x !== 0 || y !== 0) { + scaleCharBBox(scale, -scale, x, y, computedBBox); + } + if (isBBoxTrustworthy) { + return this.recordBBox(idx, ctx, computedBBox[0], computedBBox[2], computedBBox[1], computedBBox[3]); + } + } + } + if (!getMeasure) { + return this.recordFullPageBBox(idx); + } + const measure = getMeasure(); + if (fontBBox && computedBBox && isBBoxTrustworthy === undefined) { + isBBoxTrustworthy = computedBBox[0] <= x - measure.actualBoundingBoxLeft && computedBBox[2] >= x + measure.actualBoundingBoxRight && computedBBox[1] <= y - measure.actualBoundingBoxAscent && computedBBox[3] >= y + measure.actualBoundingBoxDescent; + this.#fontBBoxTrustworthy.set(font, isBBoxTrustworthy); + if (isBBoxTrustworthy) { + return this.recordBBox(idx, ctx, computedBBox[0], computedBBox[2], computedBBox[1], computedBBox[3]); + } + } + return this.recordBBox(idx, ctx, x - measure.actualBoundingBoxLeft, x + measure.actualBoundingBoxRight, y - measure.actualBoundingBoxAscent, y + measure.actualBoundingBoxDescent); + } + recordFullPageBBox(idx) { + this.#bboxTracker.recordFullPageBBox(idx); + return this; + } + getSimpleIndex(dependencyName) { + return this.#simple[dependencyName]; + } + recordDependencies(idx, dependencyNames) { + const pendingDependencies = this.#pendingDependencies; + const simple = this.#simple; + const incremental = this.#incremental; + for (const name of dependencyNames) { + if (name in this.#simple) { + pendingDependencies.add(simple[name]); + } else if (name in incremental) { + incremental[name].forEach(pendingDependencies.add, pendingDependencies); + } + } + return this; + } + recordNamedDependency(idx, name) { + if (this.#namedDependencies.has(name)) { + this.#pendingDependencies.add(this.#namedDependencies.get(name)); + } + return this; + } + recordOperation(idx, preserve = false) { + this.recordDependencies(idx, [FORCED_DEPENDENCY_LABEL]); + if (this.#debugMetadata) { + const metadata = ensureDebugMetadata(this.#debugMetadata, idx); + const { + dependencies + } = metadata; + this.#pendingDependencies.forEach(dependencies.add, dependencies); + this.#bboxTracker._savesStack.forEach(dependencies.add, dependencies); + this.#bboxTracker._markedContentStack.forEach(dependencies.add, dependencies); + dependencies.delete(idx); + metadata.isRenderingOperation = true; + } + const needsCleanup = !preserve && idx === this.#bboxTracker._pendingBBoxIdx; + this.#bboxTracker.recordOperation(idx, preserve, [this.#pendingDependencies, this.#bboxTracker._savesStack, this.#bboxTracker._markedContentStack]); + if (needsCleanup) { + this.#pendingDependencies.clear(); + } + return this; + } + recordShowTextOperation(idx, preserve = false) { + const deps = Array.from(this.#pendingDependencies); + this.recordOperation(idx, preserve); + this.recordIncrementalData("sameLineText", idx); + for (const dep of deps) { + this.recordIncrementalData("sameLineText", dep); + } + return this; + } + bboxToClipBoxDropOperation(idx, preserve = false) { + const needsCleanup = !preserve && idx === this.#bboxTracker._pendingBBoxIdx; + this.#bboxTracker.bboxToClipBoxDropOperation(idx); + if (needsCleanup) { + this.#pendingDependencies.clear(); + } + return this; + } + take() { + this.#fontBBoxTrustworthy.clear(); + return this.#bboxTracker.take(); + } + takeDebugMetadata() { + return this.#debugMetadata; + } +} +class CanvasNestedDependencyTracker { + #dependencyTracker; + #opIdx; + #ignoreBBoxes; + #nestingLevel = 0; + #savesLevel = 0; + constructor(dependencyTracker, opIdx, ignoreBBoxes) { + if (dependencyTracker instanceof CanvasNestedDependencyTracker && dependencyTracker.#ignoreBBoxes === !!ignoreBBoxes) { + return dependencyTracker; + } + this.#dependencyTracker = dependencyTracker; + this.#opIdx = opIdx; + this.#ignoreBBoxes = !!ignoreBBoxes; + } + get clipBox() { + return this.#dependencyTracker.clipBox; + } + growOperationsCount() { + throw new Error("Unreachable"); + } + save(opIdx) { + this.#savesLevel++; + this.#dependencyTracker.save(this.#opIdx); + return this; + } + restore(opIdx) { + if (this.#savesLevel > 0) { + this.#dependencyTracker.restore(this.#opIdx); + this.#savesLevel--; + } + return this; + } + recordOpenMarker(idx) { + this.#nestingLevel++; + return this; + } + getOpenMarker() { + return this.#nestingLevel > 0 ? this.#opIdx : this.#dependencyTracker.getOpenMarker(); + } + recordCloseMarker(idx) { + this.#nestingLevel--; + return this; + } + beginMarkedContent(opIdx) { + return this; + } + endMarkedContent(opIdx) { + return this; + } + pushBaseTransform(ctx) { + this.#dependencyTracker.pushBaseTransform(ctx); + return this; + } + popBaseTransform() { + this.#dependencyTracker.popBaseTransform(); + return this; + } + recordSimpleData(name, idx) { + this.#dependencyTracker.recordSimpleData(name, this.#opIdx); + return this; + } + recordIncrementalData(name, idx) { + this.#dependencyTracker.recordIncrementalData(name, this.#opIdx); + return this; + } + resetIncrementalData(name, idx) { + this.#dependencyTracker.resetIncrementalData(name, this.#opIdx); + return this; + } + recordNamedData(name, idx) { + return this; + } + recordSimpleDataFromNamed(name, depName, fallbackIdx) { + this.#dependencyTracker.recordSimpleDataFromNamed(name, depName, this.#opIdx); + return this; + } + recordFutureForcedDependency(name, idx) { + this.#dependencyTracker.recordFutureForcedDependency(name, this.#opIdx); + return this; + } + inheritSimpleDataAsFutureForcedDependencies(names) { + this.#dependencyTracker.inheritSimpleDataAsFutureForcedDependencies(names); + return this; + } + inheritPendingDependenciesAsFutureForcedDependencies() { + this.#dependencyTracker.inheritPendingDependenciesAsFutureForcedDependencies(); + return this; + } + resetBBox(idx) { + if (!this.#ignoreBBoxes) { + this.#dependencyTracker.resetBBox(this.#opIdx); + } + return this; + } + recordClipBox(idx, ctx, minX, maxX, minY, maxY) { + if (!this.#ignoreBBoxes) { + this.#dependencyTracker.recordClipBox(this.#opIdx, ctx, minX, maxX, minY, maxY); + } + return this; + } + recordBBox(idx, ctx, minX, maxX, minY, maxY) { + if (!this.#ignoreBBoxes) { + this.#dependencyTracker.recordBBox(this.#opIdx, ctx, minX, maxX, minY, maxY); + } + return this; + } + recordCharacterBBox(idx, ctx, font, scale, x, y, getMeasure) { + if (!this.#ignoreBBoxes) { + this.#dependencyTracker.recordCharacterBBox(this.#opIdx, ctx, font, scale, x, y, getMeasure); + } + return this; + } + recordFullPageBBox(idx) { + if (!this.#ignoreBBoxes) { + this.#dependencyTracker.recordFullPageBBox(this.#opIdx); + } + return this; + } + getSimpleIndex(dependencyName) { + return this.#dependencyTracker.getSimpleIndex(dependencyName); + } + recordDependencies(idx, dependencyNames) { + this.#dependencyTracker.recordDependencies(this.#opIdx, dependencyNames); + return this; + } + recordNamedDependency(idx, name) { + this.#dependencyTracker.recordNamedDependency(this.#opIdx, name); + return this; + } + recordOperation(idx) { + this.#dependencyTracker.recordOperation(this.#opIdx, true); + return this; + } + recordShowTextOperation(idx) { + this.#dependencyTracker.recordShowTextOperation(this.#opIdx, true); + return this; + } + bboxToClipBoxDropOperation(idx) { + if (!this.#ignoreBBoxes) { + this.#dependencyTracker.bboxToClipBoxDropOperation(this.#opIdx, true); + } + return this; + } + take() { + throw new Error("Unreachable"); + } + takeDebugMetadata() { + throw new Error("Unreachable"); + } +} +const Dependencies = { + stroke: ["path", "transform", "filter", "strokeColor", "strokeAlpha", "lineWidth", "lineCap", "lineJoin", "miterLimit", "dash"], + fill: ["path", "transform", "filter", "fillColor", "fillAlpha", "globalCompositeOperation", "SMask"], + imageXObject: ["transform", "SMask", "filter", "fillAlpha", "strokeAlpha", "globalCompositeOperation"], + rawFillPath: ["filter", "fillColor", "fillAlpha"], + showText: ["transform", "leading", "charSpacing", "wordSpacing", "hScale", "textRise", "moveText", "textMatrix", "font", "fontObj", "filter", "fillColor", "textRenderingMode", "SMask", "fillAlpha", "strokeAlpha", "globalCompositeOperation", "sameLineText"], + transform: ["transform"], + transformAndFill: ["transform", "filter", "fillColor"] +}; +class CanvasImagesTracker { + #canvasWidth; + #canvasHeight; + #capacity = 4; + #count = 0; + #coords = new CanvasImagesTracker.#CoordsArray(this.#capacity * 6); + static #CoordsArray = FeatureTest.isFloat16ArraySupported ? Float16Array : Float32Array; + constructor(canvas) { + this.#canvasWidth = canvas.width; + this.#canvasHeight = canvas.height; + } + record(ctx, width, height, clipBox) { + if (this.#count === this.#capacity) { + this.#capacity *= 2; + const newCoords = new CanvasImagesTracker.#CoordsArray(this.#capacity * 6); + newCoords.set(this.#coords); + this.#coords = newCoords; + } + const transform = getCurrentTransform(ctx); + let coords; + if (clipBox[0] !== Infinity) { + const bbox = BBOX_INIT.slice(); + Util.axialAlignedBoundingBox([0, -height, width, 0], transform, bbox); + const finalBBox = Util.intersect(clipBox, bbox); + if (!finalBBox) { + return; + } + const [minX, minY, maxX, maxY] = finalBBox; + if (minX !== bbox[0] || minY !== bbox[1] || maxX !== bbox[2] || maxY !== bbox[3]) { + const rotationAngle = Math.atan2(transform[1], transform[0]); + const sin = Math.abs(Math.sin(rotationAngle)); + const cos = Math.abs(Math.cos(rotationAngle)); + if (sin < 1e-6 || cos < 1e-6 || Math.abs(sin - cos) < 1e-6) { + coords = [minX, minY, minX, maxY, maxX, minY]; + } else { + const finalBBoxWidth = maxX - minX; + const finalBBoxHeight = maxY - minY; + const sin2 = sin * sin; + const cos2 = cos * cos; + const cosSin = cos * sin; + const denom = cos2 - sin2; + const a = (finalBBoxHeight * cos2 - finalBBoxWidth * cosSin) / denom; + const b = (finalBBoxHeight * cosSin - finalBBoxWidth * sin2) / denom; + coords = [minX + b, minY, minX, minY + a, maxX, maxY - a]; + } + } + } + if (!coords) { + coords = [0, -height, 0, 0, width, -height]; + Util.applyTransform(coords, transform, 0); + Util.applyTransform(coords, transform, 2); + Util.applyTransform(coords, transform, 4); + } + coords[0] /= this.#canvasWidth; + coords[1] /= this.#canvasHeight; + coords[2] /= this.#canvasWidth; + coords[3] /= this.#canvasHeight; + coords[4] /= this.#canvasWidth; + coords[5] /= this.#canvasHeight; + this.#coords.set(coords, this.#count * 6); + this.#count++; + } + take() { + return this.#coords.subarray(0, this.#count * 6); + } +} + +;// ./src/shared/css_utils.js +const CONTROL_CHAR_REGEXP = /\p{Cc}/u; +function isCSSString(str) { + const quote = str[0]; + if (str.length < 2 || quote !== `"` && quote !== `'` || str.at(-1) !== quote) { + return false; + } + const end = str.length - 1; + for (let i = 1; i < end; i++) { + const char = str[i]; + if (char === quote || CONTROL_CHAR_REGEXP.test(char)) { + return false; + } + if (char === "\\") { + if (++i >= end || CONTROL_CHAR_REGEXP.test(str[i])) { + return false; + } + } + } + return true; +} +function serializeFontFamily(fontFamily) { + if (isCSSString(fontFamily)) { + return fontFamily; + } + const escaped = fontFamily.replaceAll(/["\\\p{Cc}]/gu, char => char === `"` || char === "\\" ? `\\${char}` : `\\${char.codePointAt(0).toString(16)} `); + return `"${escaped}"`; +} + +;// ./src/display/font_loader.js + + + + + + + + + + + + + + + + + +class FontLoader { + #nativeFontFaces = new Set(); + #systemFonts = new Set(); + #styleSheet = null; + constructor({ + ownerDocument = globalThis.document, + styleElement = null + }) { + this._document = ownerDocument; + this.styleElement = null; + this.loadingRequests = []; + this.loadTestFontId = 0; + } + addNativeFontFace(nativeFontFace) { + this.#nativeFontFaces.add(nativeFontFace); + this._document.fonts.add(nativeFontFace); + } + removeNativeFontFace(nativeFontFace) { + this.#nativeFontFaces.delete(nativeFontFace); + this._document.fonts.delete(nativeFontFace); + } + insertRule(rule) { + const styleSheet = this.#getStyleSheet(); + styleSheet.insertRule(rule, styleSheet.cssRules.length); + } + #getStyleSheet() { + if (this.#styleSheet) { + return this.#styleSheet; + } + const StyleSheet = this._document.defaultView?.CSSStyleSheet || globalThis.CSSStyleSheet; + if (!this.styleElement && StyleSheet) { + const { + adoptedStyleSheets + } = this._document; + if (adoptedStyleSheets) { + const styleSheet = new StyleSheet(); + adoptedStyleSheets.push(styleSheet); + return this.#styleSheet = styleSheet; + } + } + if (!this.styleElement) { + this.styleElement = this._document.createElement("style"); + this._document.documentElement.getElementsByTagName("head")[0].append(this.styleElement); + } + return this.#styleSheet = this.styleElement.sheet; + } + clear() { + for (const nativeFontFace of this.#nativeFontFaces) { + this._document.fonts.delete(nativeFontFace); + } + this.#nativeFontFaces.clear(); + this.#systemFonts.clear(); + if (this.#styleSheet) { + const { + adoptedStyleSheets + } = this._document; + if (adoptedStyleSheets?.includes(this.#styleSheet)) { + this._document.adoptedStyleSheets = adoptedStyleSheets.filter(styleSheet => styleSheet !== this.#styleSheet); + } + this.#styleSheet = null; + } + this.styleElement?.remove(); + this.styleElement = null; + } + async loadSystemFont({ + systemFontInfo: info, + disableFontFace, + _inspectFont + }) { + if (!info || this.#systemFonts.has(info.loadedName)) { + return; + } + util_assert(!disableFontFace, "loadSystemFont shouldn't be called when `disableFontFace` is set."); + if (this.isFontLoadingAPISupported) { + const { + loadedName, + src, + style + } = info; + const fontFace = new FontFace(loadedName, src, style); + this.addNativeFontFace(fontFace); + try { + await fontFace.load(); + this.#systemFonts.add(loadedName); + _inspectFont?.(info); + } catch { + warn(`Cannot load system font: ${info.baseFontName}, installing it could help to improve PDF rendering.`); + this.removeNativeFontFace(fontFace); + } + return; + } + unreachable("Not implemented: loadSystemFont without the Font Loading API."); + } + async bind(font) { + if (font.attached || font.missingFile && !font.systemFontInfo) { + return; + } + font.attached = true; + if (font.systemFontInfo) { + await this.loadSystemFont(font); + return; + } + if (this.isFontLoadingAPISupported) { + const nativeFontFace = font.createNativeFontFace(); + if (nativeFontFace) { + this.addNativeFontFace(nativeFontFace); + try { + await nativeFontFace.loaded; + } catch (ex) { + warn(`Failed to load font '${nativeFontFace.family}': '${ex}'.`); + font.disableFontFace = true; + throw ex; + } + } + return; + } + const rule = font.createFontFaceRule(); + if (rule) { + this.insertRule(rule); + if (this.isSyncFontLoadingSupported) { + return; + } + await this.#testFontLoaded(font); + } + } + get isFontLoadingAPISupported() { + return util_shadow(this, "isFontLoadingAPISupported", !!this._document?.fonts); + } + get isSyncFontLoadingSupported() { + return util_shadow(this, "isSyncFontLoadingSupported", isNodeJS || FeatureTest.platform.isFirefox); + } + #testFontLoaded(font) { + function completeRequest() { + util_assert(!request.done, "completeRequest() cannot be called twice."); + request.done = true; + while (loadingRequests.length > 0 && loadingRequests[0].done) { + const otherRequest = loadingRequests.shift(); + setTimeout(otherRequest.resolve, 0); + } + } + const { + loadingRequests + } = this; + const { + promise, + resolve + } = Promise.withResolvers(); + const request = { + done: false, + resolve + }; + loadingRequests.push(request); + this._loadTestFont ??= atob("T1RUTwALAIAAAwAwQ0ZGIDHtZg4AAAOYAAAAgUZGVE1lkzZwAAAEHAAAABxHREVGABQA" + "FQAABDgAAAAeT1MvMlYNYwkAAAEgAAAAYGNtYXABDQLUAAACNAAAAUJoZWFk/xVFDQAA" + "ALwAAAA2aGhlYQdkA+oAAAD0AAAAJGhtdHgD6AAAAAAEWAAAAAZtYXhwAAJQAAAAARgA" + "AAAGbmFtZVjmdH4AAAGAAAAAsXBvc3T/hgAzAAADeAAAACAAAQAAAAEAALZRFsRfDzz1" + "AAsD6AAAAADOBOTLAAAAAM4KHDwAAAAAA+gDIQAAAAgAAgAAAAAAAAABAAADIQAAAFoD" + "6AAAAAAD6AABAAAAAAAAAAAAAAAAAAAAAQAAUAAAAgAAAAQD6AH0AAUAAAKKArwAAACM" + "AooCvAAAAeAAMQECAAACAAYJAAAAAAAAAAAAAQAAAAAAAAAAAAAAAFBmRWQAwAAuAC4D" + "IP84AFoDIQAAAAAAAQAAAAAAAAAAACAAIAABAAAADgCuAAEAAAAAAAAAAQAAAAEAAAAA" + "AAEAAQAAAAEAAAAAAAIAAQAAAAEAAAAAAAMAAQAAAAEAAAAAAAQAAQAAAAEAAAAAAAUA" + "AQAAAAEAAAAAAAYAAQAAAAMAAQQJAAAAAgABAAMAAQQJAAEAAgABAAMAAQQJAAIAAgAB" + "AAMAAQQJAAMAAgABAAMAAQQJAAQAAgABAAMAAQQJAAUAAgABAAMAAQQJAAYAAgABWABY" + "AAAAAAAAAwAAAAMAAAAcAAEAAAAAADwAAwABAAAAHAAEACAAAAAEAAQAAQAAAC7//wAA" + "AC7////TAAEAAAAAAAABBgAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAD/gwAyAAAAAQAAAAAAAAAAAAAAAAAA" + "AAABAAQEAAEBAQJYAAEBASH4DwD4GwHEAvgcA/gXBIwMAYuL+nz5tQXkD5j3CBLnEQAC" + "AQEBIVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYAAABAQAADwACAQEEE/t3" + "Dov6fAH6fAT+fPp8+nwHDosMCvm1Cvm1DAz6fBQAAAAAAAABAAAAAMmJbzEAAAAAzgTj" + "FQAAAADOBOQpAAEAAAAAAAAADAAUAAQAAAABAAAAAgABAAAAAAAAAAAD6AAAAAAAAA=="); + function int32(data, offset) { + return data.charCodeAt(offset) << 24 | data.charCodeAt(offset + 1) << 16 | data.charCodeAt(offset + 2) << 8 | data.charCodeAt(offset + 3) & 0xff; + } + function string32(value) { + return String.fromCharCode(value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff); + } + function spliceString(s, offset, remove, insert) { + const chunk1 = s.substring(0, offset); + const chunk2 = s.substring(offset + remove); + return chunk1 + insert + chunk2; + } + let i, ii; + const canvas = this._document.createElement("canvas"); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext("2d"); + let called = 0; + function isFontReady(name, callback) { + if (++called > 30) { + warn("Load test font never loaded."); + callback(); + return; + } + ctx.font = "30px " + name; + ctx.fillText(".", 0, 20); + const imageData = ctx.getImageData(0, 0, 1, 1); + if (imageData.data[3] > 0) { + callback(); + return; + } + setTimeout(isFontReady.bind(null, name, callback)); + } + const loadTestFontId = `lt${Date.now()}${this.loadTestFontId++}`; + let data = this._loadTestFont; + const COMMENT_OFFSET = 976; + data = spliceString(data, COMMENT_OFFSET, loadTestFontId.length, loadTestFontId); + const CFF_CHECKSUM_OFFSET = 16; + const XXXX_VALUE = 0x58585858; + let checksum = int32(data, CFF_CHECKSUM_OFFSET); + for (i = 0, ii = loadTestFontId.length - 3; i < ii; i += 4) { + checksum = checksum - XXXX_VALUE + int32(loadTestFontId, i) | 0; + } + if (i < loadTestFontId.length) { + checksum = checksum - XXXX_VALUE + int32(loadTestFontId + "XXX", i) | 0; + } + data = spliceString(data, CFF_CHECKSUM_OFFSET, 4, string32(checksum)); + const url = `url(data:font/opentype;base64,${btoa(data)});`; + const rule = `@font-face {font-family:"${loadTestFontId}";src:${url}}`; + this.insertRule(rule); + const div = this._document.createElement("div"); + div.style.visibility = "hidden"; + div.style.width = div.style.height = "10px"; + div.style.position = "absolute"; + div.style.top = div.style.left = "0px"; + for (const name of [font.loadedName, loadTestFontId]) { + const span = this._document.createElement("span"); + span.textContent = "Hi"; + span.style.fontFamily = name; + div.append(span); + } + this._document.body.append(div); + isFontReady(loadTestFontId, () => { + div.remove(); + completeRequest(); + }); + return promise; + } +} +class FontFaceObject { + #compiledPaths = new Map(); + #fontData; + constructor(translatedData, inspectFont = null, charProcOperatorList, extra) { + this.#fontData = translatedData; + this._inspectFont = inspectFont; + if (charProcOperatorList) { + this.charProcOperatorList = charProcOperatorList; + } + if (extra) { + Object.assign(this, extra); + } + } + createNativeFontFace() { + const { + data + } = this; + if (!data || this.disableFontFace) { + return null; + } + let nativeFontFace; + if (!this.cssFontInfo) { + nativeFontFace = new FontFace(this.loadedName, data, {}); + } else { + const css = { + weight: this.cssFontInfo.fontWeight + }; + if (this.cssFontInfo.italicAngle) { + css.style = `oblique ${this.cssFontInfo.italicAngle}deg`; + } + nativeFontFace = new FontFace(serializeFontFamily(this.cssFontInfo.fontFamily), data, css); + } + this._inspectFont?.(this); + return nativeFontFace; + } + createFontFaceRule() { + const { + data + } = this; + if (!data || this.disableFontFace) { + return null; + } + const url = `url(data:${this.mimetype};base64,${data.toBase64()});`; + let rule; + if (!this.cssFontInfo) { + rule = `@font-face {font-family:"${this.loadedName}";src:${url}}`; + } else { + let css = `font-weight: ${this.cssFontInfo.fontWeight};`; + if (this.cssFontInfo.italicAngle) { + css += `font-style: oblique ${this.cssFontInfo.italicAngle}deg;`; + } + const fontFamily = serializeFontFamily(this.cssFontInfo.fontFamily); + rule = `@font-face {font-family:${fontFamily};${css}src:${url}}`; + } + this._inspectFont?.(this, url); + return rule; + } + getPathGenerator(objs, character) { + let path = this.#compiledPaths.get(character); + if (path) { + return path; + } + const objId = `${this.loadedName}_path_${character}`; + let cmds; + try { + cmds = objs.get(objId); + } catch (ex) { + warn(`getPathGenerator - ignoring character: "${ex}".`); + } + path = makePathFromDrawOPS(cmds?.path); + if (!this.fontExtraProperties) { + objs.delete(objId); + } + this.#compiledPaths.set(character, path); + return path; + } + get black() { + return this.#fontData.black; + } + get bold() { + return this.#fontData.bold; + } + get disableFontFace() { + return this.#fontData.disableFontFace; + } + set disableFontFace(value) { + util_shadow(this, "disableFontFace", !!value); + } + get fontExtraProperties() { + return this.#fontData.fontExtraProperties; + } + get isInvalidPDFjsFont() { + return this.#fontData.isInvalidPDFjsFont; + } + get isType3Font() { + return this.#fontData.isType3Font; + } + get italic() { + return this.#fontData.italic; + } + get missingFile() { + return this.#fontData.missingFile; + } + get remeasure() { + return this.#fontData.remeasure; + } + get vertical() { + return this.#fontData.vertical; + } + get bbox() { + return this.#fontData.bbox; + } + get fontMatrix() { + return this.#fontData.fontMatrix; + } + get fallbackName() { + return this.#fontData.fallbackName; + } + get loadedName() { + return this.#fontData.loadedName; + } + get mimetype() { + return this.missingFile ? null : "font/opentype"; + } + get data() { + return this.#fontData.data; + } + clearData() { + this.#fontData.clearData(); + } + get cssFontInfo() { + return this.#fontData.cssFontInfo; + } + get systemFontInfo() { + return this.#fontData.systemFontInfo; + } +} + +;// ./src/shared/obj_bin_transform_utils.js + +class CSS_FONT_INFO { + static strings = ["fontFamily", "fontWeight", "italicAngle"]; +} +class SYSTEM_FONT_INFO { + static strings = ["css", "loadedName", "baseFontName", "src"]; +} +class FONT_INFO { + static bools = ["black", "bold", "disableFontFace", "fontExtraProperties", "isInvalidPDFjsFont", "isType3Font", "italic", "missingFile", "remeasure", "vertical"]; + static strings = ["fallbackName", "loadedName"]; + static OFFSET_BBOX = Math.ceil(this.bools.length * 2 / 8); + static OFFSET_FONT_MATRIX = this.OFFSET_BBOX + 1 + 2 * 4; + static OFFSET_STRINGS = this.OFFSET_FONT_MATRIX + 1 + 8 * 6; +} +class PATTERN_INFO { + static KIND = 0; + static HAS_BBOX = 1; + static HAS_BACKGROUND = 2; + static SHADING_TYPE = 3; + static N_COORD = 4; + static N_COLOR = 8; + static N_STOP = 12; + static N_FIGURES = 16; +} +class InfoUtils { + static get decoder() { + return util_shadow(this, "decoder", new TextDecoder()); + } + static get encoder() { + return util_shadow(this, "encoder", new TextEncoder()); + } +} + +;// ./src/display/obj_bin_transform_display.js + + + + + + + + +function readString(buffer, view, index, offset = 0) { + const { + decoder + } = InfoUtils; + for (let i = 0; i < index; i++) { + offset += view.getUint32(offset) + 4; + } + const length = view.getUint32(offset); + return decoder.decode(new Uint8Array(buffer, offset + 4, length)); +} +class CssFontInfo { + #buffer; + #view; + constructor(buffer) { + this.#buffer = buffer; + this.#view = new DataView(buffer); + } + #readString(index) { + util_assert(index < CSS_FONT_INFO.strings.length, "Invalid string index"); + return readString(this.#buffer, this.#view, index); + } + get fontFamily() { + return util_shadow(this, "fontFamily", this.#readString(0)); + } + get fontWeight() { + return util_shadow(this, "fontWeight", this.#readString(1)); + } + get italicAngle() { + return util_shadow(this, "italicAngle", this.#readString(2)); + } +} +class SystemFontInfo { + #buffer; + #view; + constructor(buffer) { + this.#buffer = buffer; + this.#view = new DataView(buffer); + } + #readString(index) { + util_assert(index < SYSTEM_FONT_INFO.strings.length, "Invalid string index"); + return readString(this.#buffer, this.#view, index, 4); + } + get css() { + return util_shadow(this, "css", this.#readString(0)); + } + get loadedName() { + return util_shadow(this, "loadedName", this.#readString(1)); + } + get baseFontName() { + return util_shadow(this, "baseFontName", this.#readString(2)); + } + get src() { + return util_shadow(this, "src", this.#readString(3)); + } + get style() { + let offset = 0; + offset += 4 + this.#view.getUint32(offset); + const style = readString(this.#buffer, this.#view, 0, offset), + weight = readString(this.#buffer, this.#view, 1, offset); + return util_shadow(this, "style", { + style, + weight + }); + } +} +class FontInfo { + #buffer; + #view; + constructor(buffer) { + this.#buffer = buffer; + this.#view = new DataView(buffer); + } + #readBoolean(index) { + util_assert(index < FONT_INFO.bools.length, "Invalid boolean index"); + const byteOffset = Math.floor(index / 4); + const bitOffset = index * 2 % 8; + const value = this.#view.getUint8(byteOffset) >> bitOffset & 0x03; + return value === 0x00 ? undefined : value === 0x02; + } + get black() { + return util_shadow(this, "black", this.#readBoolean(0)); + } + get bold() { + return util_shadow(this, "bold", this.#readBoolean(1)); + } + get disableFontFace() { + return util_shadow(this, "disableFontFace", this.#readBoolean(2)); + } + get fontExtraProperties() { + return util_shadow(this, "fontExtraProperties", this.#readBoolean(3)); + } + get isInvalidPDFjsFont() { + return util_shadow(this, "isInvalidPDFjsFont", this.#readBoolean(4)); + } + get isType3Font() { + return util_shadow(this, "isType3Font", this.#readBoolean(5)); + } + get italic() { + return util_shadow(this, "italic", this.#readBoolean(6)); + } + get missingFile() { + return util_shadow(this, "missingFile", this.#readBoolean(7)); + } + get remeasure() { + return util_shadow(this, "remeasure", this.#readBoolean(8)); + } + get vertical() { + return util_shadow(this, "vertical", this.#readBoolean(9)); + } + #readArray(offset, arrLen, lookupName, increment) { + const len = this.#view.getUint8(offset++); + if (len === 0) { + return undefined; + } + util_assert(len === arrLen, "Invalid array length."); + const arr = new Array(len); + for (let i = 0; i < len; i++) { + arr[i] = this.#view[lookupName](offset, true); + offset += increment; + } + return arr; + } + get bbox() { + return util_shadow(this, "bbox", this.#readArray(FONT_INFO.OFFSET_BBOX, 4, "getInt16", 2)); + } + get fontMatrix() { + return util_shadow(this, "fontMatrix", this.#readArray(FONT_INFO.OFFSET_FONT_MATRIX, 6, "getFloat64", 8)); + } + #readString(index) { + util_assert(index < FONT_INFO.strings.length, "Invalid string index"); + return readString(this.#buffer, this.#view, index, FONT_INFO.OFFSET_STRINGS + 4); + } + get fallbackName() { + return util_shadow(this, "fallbackName", this.#readString(0)); + } + get loadedName() { + return util_shadow(this, "loadedName", this.#readString(1)); + } + #getBufferOffset(index) { + let offset = FONT_INFO.OFFSET_STRINGS; + for (let i = 0; i <= index; i++) { + offset += 4 + this.#view.getUint32(offset); + } + const length = this.#view.getUint32(offset); + return { + offset, + length + }; + } + get data() { + const { + offset, + length + } = this.#getBufferOffset(2); + return !length ? undefined : new Uint8Array(this.#buffer, offset + 4, length); + } + clearData() { + const { + offset, + length + } = this.#getBufferOffset(2); + if (!length) { + return; + } + this.#view.setUint32(offset, 0); + this.#buffer = new Uint8Array(this.#buffer, 0, offset + 4).slice().buffer; + this.#view = new DataView(this.#buffer); + } + get cssFontInfo() { + const { + offset, + length + } = this.#getBufferOffset(1); + let info = null; + if (length) { + const data = new Uint8Array(this.#buffer, offset + 4, length).slice(); + info = new CssFontInfo(data.buffer); + } + return util_shadow(this, "cssFontInfo", info); + } + get systemFontInfo() { + const { + offset, + length + } = this.#getBufferOffset(0); + let info = null; + if (length) { + const data = new Uint8Array(this.#buffer, offset + 4, length).slice(); + info = new SystemFontInfo(data.buffer); + } + return util_shadow(this, "systemFontInfo", info); + } +} +class PatternInfo { + constructor(buffer) { + this.buffer = buffer; + this.view = new DataView(buffer); + this.data = new Uint8Array(buffer); + } + getIR() { + const dataView = this.view; + const kind = this.data[PATTERN_INFO.KIND]; + const hasBBox = !!this.data[PATTERN_INFO.HAS_BBOX]; + const hasBackground = !!this.data[PATTERN_INFO.HAS_BACKGROUND]; + const nCoord = dataView.getUint32(PATTERN_INFO.N_COORD, true); + const nColor = dataView.getUint32(PATTERN_INFO.N_COLOR, true); + const nStop = dataView.getUint32(PATTERN_INFO.N_STOP, true); + let offset = 20; + const coords = new Float32Array(this.buffer, offset, nCoord * 2); + offset += nCoord * 8; + const colors = new Uint8Array(this.buffer, offset, nColor * 4); + offset += nColor * 4; + const stops = []; + for (let i = 0; i < nStop; ++i) { + const p = dataView.getFloat32(offset, true); + offset += 4; + const rgb = dataView.getUint32(offset, true); + offset += 4; + stops.push([p, `#${rgb.toString(16).padStart(6, "0")}`]); + } + let bbox = null; + if (hasBBox) { + bbox = []; + for (let i = 0; i < 4; ++i) { + bbox.push(dataView.getFloat32(offset, true)); + offset += 4; + } + } + let background = null; + if (hasBackground) { + background = new Uint8Array(this.buffer, offset, 3); + offset += 3; + } + if (kind === 1) { + return ["RadialAxial", "axial", bbox, stops, [coords[0], coords[1]], [coords[2], coords[3]], null, null]; + } + if (kind === 2) { + return ["RadialAxial", "radial", bbox, stops, [coords[0], coords[1]], [coords[3], coords[4]], coords[2], coords[5]]; + } + if (kind === 3) { + const shadingType = this.data[PATTERN_INFO.SHADING_TYPE]; + let bounds = null; + if (coords.length > 0) { + bounds = BBOX_INIT.slice(); + for (let i = 0, ii = coords.length; i < ii; i += 2) { + Util.pointBoundingBox(coords[i], coords[i + 1], bounds); + } + } + return ["Mesh", shadingType, coords, colors, nCoord, bounds, bbox, background]; + } + throw new Error(`Unsupported pattern kind: ${kind}`); + } +} +class FontPathInfo { + #buffer; + constructor(buffer) { + this.#buffer = buffer; + } + get path() { + if (FeatureTest.isFloat16ArraySupported) { + return new Float16Array(this.#buffer); + } + return new Float32Array(this.#buffer); + } +} + +;// ./src/display/api_utils.js + + + + + + + + + + +function getUrlProp(val) { + if (val instanceof URL) { + return val; + } + if (typeof val === "string") { + if (isNodeJS) { + if (/^[a-z][a-z0-9\-+.]+:/i.test(val)) { + return new URL(val); + } + const url = process.getBuiltinModule("url"); + return new URL(url.pathToFileURL(val)); + } + const url = URL.parse(val, window.location); + if (url) { + return url; + } + } + throw new Error("Invalid PDF url data: " + "either string or URL-object is expected in the url property."); +} +function getDataProp(val) { + if (isNodeJS && typeof Buffer !== "undefined" && val instanceof Buffer) { + throw new Error("Please provide binary data as `Uint8Array`, rather than `Buffer`."); + } + if (val instanceof Uint8Array && val.byteLength === val.buffer.byteLength) { + return val; + } + if (typeof val === "string") { + return stringToBytes(val); + } + if (val instanceof ArrayBuffer || ArrayBuffer.isView(val) || typeof val === "object" && !isNaN(val?.length)) { + return new Uint8Array(val); + } + throw new Error("Invalid PDF binary data: either TypedArray, " + "string, or array-like object is expected in the data property."); +} +function getFactoryUrlProp(val) { + if (typeof val !== "string") { + return null; + } + if (val.endsWith("/")) { + return val; + } + throw new Error(`Invalid factory url: "${val}" must include trailing slash.`); +} +const isRefProxy = v => typeof v === "object" && Number.isInteger(v?.num) && v.num >= 0 && Number.isInteger(v?.gen) && v.gen >= 0; +const isNameProxy = v => typeof v === "object" && typeof v?.name === "string"; +const isValidExplicitDest = _isValidExplicitDest.bind(null, isRefProxy, isNameProxy); +class LoopbackPort { + #listeners = new Map(); + #deferred = Promise.resolve(); + postMessage(obj, transfer) { + const event = { + data: structuredClone(obj, transfer ? { + transfer + } : null) + }; + this.#deferred.then(() => { + for (const [listener] of this.#listeners) { + listener.call(this, event); + } + }); + } + addEventListener(name, listener, options = null) { + let rmAbort = null; + if (options?.signal instanceof AbortSignal) { + const { + signal + } = options; + if (signal.aborted) { + warn("LoopbackPort - cannot use an `aborted` signal."); + return; + } + const onAbort = () => this.removeEventListener(name, listener); + rmAbort = () => signal.removeEventListener("abort", onAbort); + signal.addEventListener("abort", onAbort); + } + this.#listeners.set(listener, rmAbort); + } + removeEventListener(name, listener) { + const rmAbort = this.#listeners.get(listener); + rmAbort?.(); + this.#listeners.delete(listener); + } + terminate() { + for (const [, rmAbort] of this.#listeners) { + rmAbort?.(); + } + this.#listeners.clear(); + } +} + +;// ./node_modules/core-js/modules/es.promise.try.js +es_promise_try_namespaceFn(); + +;// ./src/shared/message_handler.js + + + + +const CallbackKind = { + DATA: 1, + ERROR: 2 +}; +const StreamKind = { + CANCEL: 1, + CANCEL_COMPLETE: 2, + CLOSE: 3, + ENQUEUE: 4, + ERROR: 5, + PULL: 6, + PULL_COMPLETE: 7, + START_COMPLETE: 8 +}; +function onFn() {} +function wrapReason(ex) { + if (ex instanceof AbortException || ex instanceof InvalidPDFException || ex instanceof PasswordException || ex instanceof ResponseException || ex instanceof UnknownErrorException) { + return ex; + } + if (!(ex instanceof Error || typeof ex === "object" && ex !== null)) { + unreachable('wrapReason: Expected "reason" to be a (possibly cloned) Error.'); + } + switch (ex.name) { + case "AbortException": + return new AbortException(ex.message); + case "InvalidPDFException": + return new InvalidPDFException(ex.message); + case "PasswordException": + return new PasswordException(ex.message, ex.code); + case "ResponseException": + return new ResponseException(ex.message, ex.status, ex.missing); + case "UnknownErrorException": + return new UnknownErrorException(ex.message, ex.details); + } + return new UnknownErrorException(ex.message, ex.toString()); +} +class MessageHandler { + #actions = new Map(); + #callbackCapabilities = new Map(); + #callbackId = 1; + #comObj; + #messageAC = new AbortController(); + #sourceName; + #streamControllers = new Map(); + #streamId = 1; + #streamSinks = new Map(); + #targetName; + constructor(sourceName, targetName, comObj) { + this.#sourceName = sourceName; + this.#targetName = targetName; + this.#comObj = comObj; + comObj.addEventListener("message", this.#onMessage.bind(this), { + signal: this.#messageAC.signal + }); + } + #onMessage({ + data + }) { + if (data.targetName !== this.#sourceName) { + return; + } + if (data.stream) { + this.#processStreamMessage(data); + return; + } + if (data.callback) { + const { + callbackId, + callback + } = data; + const capability = this.#callbackCapabilities.get(callbackId); + if (!capability) { + throw new Error(`Cannot resolve callback ${callbackId}`); + } + this.#callbackCapabilities.delete(callbackId); + if (callback === CallbackKind.DATA) { + capability.resolve(data.data); + } else if (callback === CallbackKind.ERROR) { + capability.reject(wrapReason(data.reason)); + } else { + throw new Error("Unexpected callback case"); + } + return; + } + const action = this.#actions.get(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; + Promise.try(action, data.data).then(result => { + comObj.postMessage({ + sourceName, + targetName, + callback: CallbackKind.DATA, + callbackId: data.callbackId, + data: result + }); + }, 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); + } + on(actionName, handler) { + const ah = this.#actions; + if (ah.has(actionName)) { + throw new Error(`There is already a "${actionName}" handler.`); + } + ah.set(actionName, handler); + } + send(actionName, data, transfers) { + this.#comObj.postMessage({ + sourceName: this.#sourceName, + targetName: this.#targetName, + action: actionName, + data + }, transfers); + } + sendWithPromise(actionName, data, transfers) { + const callbackId = this.#callbackId++, + capability = Promise.withResolvers(); + this.#callbackCapabilities.set(callbackId, capability); + try { + this.#comObj.postMessage({ + sourceName: this.#sourceName, + targetName: this.#targetName, + action: actionName, + callbackId, + data + }, transfers); + } catch (ex) { + capability.reject(ex); + } + return capability.promise; + } + sendWithStream(actionName, data, queueingStrategy, transfers) { + const streamId = this.#streamId++, + sourceName = this.#sourceName, + targetName = this.#targetName, + comObj = this.#comObj; + return new ReadableStream({ + start: controller => { + const startCapability = Promise.withResolvers(); + this.#streamControllers.set(streamId, { + controller, + startCall: startCapability, + pullCall: null, + cancelCall: null, + isClosed: false + }); + comObj.postMessage({ + sourceName, + targetName, + action: actionName, + streamId, + data, + desiredSize: controller.desiredSize + }, transfers); + return startCapability.promise; + }, + pull: controller => { + const pullCapability = Promise.withResolvers(); + this.#streamControllers.get(streamId).pullCall = pullCapability; + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL, + streamId, + desiredSize: controller.desiredSize + }); + return pullCapability.promise; + }, + cancel: reason => { + util_assert(reason instanceof Error, "cancel must have a valid reason"); + const cancelCapability = Promise.withResolvers(); + this.#streamControllers.get(streamId).cancelCall = cancelCapability; + this.#streamControllers.get(streamId).isClosed = true; + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.CANCEL, + streamId, + reason: wrapReason(reason) + }); + return cancelCapability.promise; + } + }, queueingStrategy); + } + #createStreamSink(data) { + const streamId = data.streamId, + sourceName = this.#sourceName, + targetName = data.sourceName, + comObj = this.#comObj; + const streamSinks = this.#streamSinks, + action = this.#actions.get(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 + }); + streamSinks.delete(streamId); + }, + error(reason) { + util_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; + streamSinks.set(streamId, streamSink); + Promise.try(action, data.data, streamSink).then(() => { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.START_COMPLETE, + streamId, + success: true + }); + }, reason => { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.START_COMPLETE, + streamId, + reason: wrapReason(reason) + }); + }); + } + #processStreamMessage(data) { + const streamId = data.streamId, + sourceName = this.#sourceName, + targetName = data.sourceName, + comObj = this.#comObj; + const streamController = this.#streamControllers.get(streamId), + streamSink = this.#streamSinks.get(streamId); + switch (data.stream) { + case StreamKind.START_COMPLETE: + if (data.success) { + streamController.startCall.resolve(); + } else { + streamController.startCall.reject(wrapReason(data.reason)); + } + break; + case StreamKind.PULL_COMPLETE: + if (data.success) { + streamController.pullCall.resolve(); + } else { + streamController.pullCall.reject(wrapReason(data.reason)); + } + break; + case StreamKind.PULL: + if (!streamSink) { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL_COMPLETE, + streamId, + success: true + }); + break; + } + if (streamSink.desiredSize <= 0 && data.desiredSize > 0) { + streamSink.sinkCapability.resolve(); + } + streamSink.desiredSize = data.desiredSize; + Promise.try(streamSink.onPull || onFn).then(() => { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL_COMPLETE, + streamId, + success: true + }); + }, reason => { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL_COMPLETE, + streamId, + reason: wrapReason(reason) + }); + }); + break; + case StreamKind.ENQUEUE: + util_assert(streamController, "enqueue should have stream controller"); + if (streamController.isClosed) { + break; + } + streamController.controller.enqueue(data.chunk); + break; + case StreamKind.CLOSE: + util_assert(streamController, "close should have stream controller"); + if (streamController.isClosed) { + break; + } + streamController.isClosed = true; + streamController.controller.close(); + this.#deleteStreamController(streamController, streamId); + break; + case StreamKind.ERROR: + util_assert(streamController, "error should have stream controller"); + streamController.controller.error(wrapReason(data.reason)); + this.#deleteStreamController(streamController, streamId); + break; + case StreamKind.CANCEL_COMPLETE: + if (data.success) { + streamController.cancelCall.resolve(); + } else { + streamController.cancelCall.reject(wrapReason(data.reason)); + } + this.#deleteStreamController(streamController, streamId); + break; + case StreamKind.CANCEL: + if (!streamSink) { + break; + } + const dataReason = wrapReason(data.reason); + Promise.try(streamSink.onCancel || onFn, dataReason).then(() => { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.CANCEL_COMPLETE, + streamId, + success: true + }); + }, reason => { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.CANCEL_COMPLETE, + streamId, + reason: wrapReason(reason) + }); + }); + streamSink.sinkCapability.reject(dataReason); + streamSink.isCancelled = true; + this.#streamSinks.delete(streamId); + break; + default: + throw new Error("Unexpected stream case"); + } + } + async #deleteStreamController(streamController, streamId) { + await Promise.allSettled([streamController.startCall?.promise, streamController.pullCall?.promise, streamController.cancelCall?.promise]); + this.#streamControllers.delete(streamId); + } + destroy() { + this.#messageAC?.abort(); + this.#messageAC = null; + } +} + +;// ./src/display/binary_data_factory.js + + + + + + + +class BaseBinaryDataFactory { + #errorStr = Object.freeze({ + cMapUrl: "CMap", + standardFontDataUrl: "font", + wasmUrl: "wasm" + }); + constructor({ + cMapUrl = null, + standardFontDataUrl = null, + wasmUrl = null + }) { + this.cMapUrl = cMapUrl; + this.standardFontDataUrl = standardFontDataUrl; + this.wasmUrl = wasmUrl; + } + async fetch({ + kind, + filename + }) { + switch (kind) { + case "cMapUrl": + case "standardFontDataUrl": + case "wasmUrl": + break; + default: + unreachable(`Not implemented: ${kind}`); + } + const baseUrl = this[kind]; + if (!baseUrl) { + throw new Error(`Ensure that the \`${kind}\` API parameter is provided.`); + } + const url = `${baseUrl}${filename}`; + return this._fetch(url, kind).catch(reason => { + throw new Error(`Unable to load ${this.#errorStr[kind]} data at: ${url}`); + }); + } + async _fetch(url, kind) { + unreachable("Abstract method `_fetch` called."); + } +} +class DOMBinaryDataFactory extends BaseBinaryDataFactory { + async _fetch(url, kind) { + const type = kind === "cMapUrl" && !url.endsWith(".bcmap") ? "text" : "bytes"; + const data = await fetchData(url, type); + return data instanceof Uint8Array ? data : stringToBytes(data); + } +} + +;// ./src/display/canvas_factory.js + +class BaseCanvasFactory { + #enableHWA = false; + constructor({ + enableHWA = false + }) { + this.#enableHWA = enableHWA; + } + create(width, height) { + if (width <= 0 || height <= 0) { + throw new Error("Invalid canvas size"); + } + const canvas = this._createCanvas(width, height); + return { + canvas, + context: canvas.getContext("2d", { + willReadFrequently: !this.#enableHWA + }) + }; + } + reset({ + canvas + }, width, height) { + if (!canvas) { + throw new Error("Canvas is not specified"); + } + if (width <= 0 || height <= 0) { + throw new Error("Invalid canvas size"); + } + canvas.width = width; + canvas.height = height; + } + destroy(canvasAndContext) { + const { + canvas + } = canvasAndContext; + if (!canvas) { + throw new Error("Canvas is not specified"); + } + canvas.width = canvas.height = 0; + canvasAndContext.canvas = null; + canvasAndContext.context = null; + } + _createCanvas(width, height) { + unreachable("Abstract method `_createCanvas` called."); + } +} +class DOMCanvasFactory extends BaseCanvasFactory { + constructor({ + ownerDocument = globalThis.document, + enableHWA = false + }) { + super({ + enableHWA + }); + this._document = ownerDocument; + } + _createCanvas(width, height) { + const canvas = this._document.createElement("canvas"); + canvas.width = width; + canvas.height = height; + return canvas; + } +} + +;// ./src/display/filter_factory.js + + + + + + +class BaseFilterFactory { + addFilter(maps) { + return "none"; + } + addHCMFilter(fgColor, bgColor) { + return "none"; + } + addAlphaFilter(map) { + return "none"; + } + addLuminosityFilter(map) { + return "none"; + } + addKnockoutFilter(alpha = 0) { + return "none"; + } + addHighlightHCMFilter(filterName, fgColor, bgColor, newFgColor, newBgColor) { + return "none"; + } + addSelectionHCMFilter(fgColor, bgColor) { + return "none"; + } + addSelectionFilter() { + return "none"; + } + createSelectionStyle(pageColors = null) { + return null; + } + destroy(keepHCM = false) {} +} +class DOMFilterFactory extends BaseFilterFactory { + #baseUrl; + #_cache; + #_defs; + #docId; + #document; + #_hcmCache; + #id = 0; + constructor({ + docId, + ownerDocument = globalThis.document + }) { + super(); + this.#docId = docId; + this.#document = ownerDocument; + } + get #cache() { + return this.#_cache ||= new Map(); + } + get #hcmCache() { + return this.#_hcmCache ||= new Map(); + } + get #defs() { + if (!this.#_defs) { + const div = this.#document.createElement("div"); + const { + style + } = div; + style.colorScheme = "only light"; + style.visibility = "hidden"; + style.contain = "strict"; + style.width = style.height = 0; + style.position = "absolute"; + style.top = style.left = 0; + style.zIndex = -1; + const svg = this.#document.createElementNS(SVG_NS, "svg"); + svg.setAttribute("width", 0); + svg.setAttribute("height", 0); + this.#_defs = this.#document.createElementNS(SVG_NS, "defs"); + div.append(svg); + svg.append(this.#_defs); + this.#document.body.append(div); + } + return this.#_defs; + } + #createTables(maps) { + const toTable = map => map && Array.from(map, v => v / 255).join(","); + if (maps.length === 1) { + const table = toTable(maps[0]); + return [table, table, table]; + } + const [mapR, mapG, mapB] = maps; + return [toTable(mapR), toTable(mapG), toTable(mapB)]; + } + #createUrl(id) { + if (this.#baseUrl === undefined) { + this.#baseUrl = ""; + const url = this.#document.URL; + if (url !== this.#document.baseURI) { + if (isDataScheme(url)) { + warn('#createUrl: ignore "data:"-URL for performance reasons.'); + } else { + this.#baseUrl = updateUrlHash(url, ""); + } + } + } + return `url(${this.#baseUrl}#${id})`; + } + addFilter(maps) { + if (!maps) { + return "none"; + } + let value = this.#cache.get(maps); + if (value) { + return value; + } + const [tableR, tableG, tableB] = this.#createTables(maps); + const key = maps.length === 1 ? tableR : `${tableR}${tableG}${tableB}`; + value = this.#cache.get(key); + if (value) { + this.#cache.set(maps, value); + return value; + } + const id = `g_${this.#docId}_transfer_map_${this.#id++}`; + const url = this.#createUrl(id); + this.#cache.set(maps, url); + this.#cache.set(key, url); + const filter = this.#createFilter(id); + this.#addTransferMapConversion(tableR, tableG, tableB, filter); + return url; + } + addHCMFilter(fgColor, bgColor) { + const key = `${fgColor}-${bgColor}`; + const filterName = "base"; + let info = this.#hcmCache.get(filterName); + if (info?.key === key) { + return info.url; + } + if (info) { + info.filter?.remove(); + info.key = key; + info.url = "none"; + info.filter = null; + } else { + info = { + key, + url: "none", + filter: null + }; + this.#hcmCache.set(filterName, info); + } + if (!fgColor || !bgColor) { + return info.url; + } + const fgRGB = this.#getRGB(fgColor); + fgColor = Util.makeHexColor(...fgRGB); + const bgRGB = this.#getRGB(bgColor); + bgColor = Util.makeHexColor(...bgRGB); + this.#resetDefsColor(); + if (fgColor === "#000000" && bgColor === "#ffffff" || fgColor === bgColor) { + return info.url; + } + const map = Array.from({ + length: 256 + }, (_, i) => computeLuminance(i / 255)); + const table = map.join(","); + const id = `g_${this.#docId}_hcm_filter`; + const filter = info.filter = this.#createFilter(id); + this.#addTransferMapConversion(table, table, table, filter); + this.#addGrayConversion(filter); + const getSteps = (c, n) => { + const start = fgRGB[c] / 255; + const end = bgRGB[c] / 255; + const arr = new Array(n + 1); + for (let i = 0; i <= n; i++) { + arr[i] = start + i / n * (end - start); + } + return arr.join(","); + }; + this.#addTransferMapConversion(getSteps(0, 5), getSteps(1, 5), getSteps(2, 5), filter); + info.url = this.#createUrl(id); + return info.url; + } + addSelectionHCMFilter(fgColor, bgColor) { + return this.addHighlightHCMFilter("selection", fgColor, bgColor, "HighlightText", "Highlight"); + } + addSelectionFilter() { + return this.addHighlightHCMFilter("selection_default", "black", "white", "HighlightText", "Highlight"); + } + createSelectionStyle(pageColors = null) { + const filter = pageColors ? this.addSelectionHCMFilter(pageColors.foreground, pageColors.background) : this.addSelectionFilter(); + if (filter === "none" || !FeatureTest.platform.isFirefox) { + return null; + } + return { + "backdrop-filter": filter, + "background-color": "transparent" + }; + } + addAlphaFilter(map) { + let value = this.#cache.get(map); + if (value) { + return value; + } + const [tableA] = this.#createTables([map]); + const key = `alpha_${tableA}`; + value = this.#cache.get(key); + if (value) { + this.#cache.set(map, value); + return value; + } + const id = `g_${this.#docId}_alpha_map_${this.#id++}`; + const url = this.#createUrl(id); + this.#cache.set(map, url); + this.#cache.set(key, url); + const filter = this.#createFilter(id); + this.#addTransferMapAlphaConversion(tableA, filter); + return url; + } + addLuminosityFilter(map) { + let value = this.#cache.get(map || "luminosity"); + if (value) { + return value; + } + let tableA, key; + if (map) { + [tableA] = this.#createTables([map]); + key = `luminosity_${tableA}`; + } else { + key = "luminosity"; + } + value = this.#cache.get(key); + if (value) { + this.#cache.set(map, value); + return value; + } + const id = `g_${this.#docId}_luminosity_map_${this.#id++}`; + const url = this.#createUrl(id); + this.#cache.set(map, url); + this.#cache.set(key, url); + const filter = this.#createFilter(id); + this.#addLuminosityConversion(filter); + if (map) { + this.#addTransferMapAlphaConversion(tableA, filter); + } + return url; + } + addKnockoutFilter(alpha = 0) { + const slope = alpha > 0 ? Math.min(1 / alpha, 1e6) : 1e6; + const key = `knockout_${slope}`; + const value = this.#cache.get(key); + if (value) { + return value; + } + const id = `g_${this.#docId}_knockout_filter_${this.#id++}`; + const url = this.#createUrl(id); + this.#cache.set(key, url); + const filter = this.#createFilter(id); + const feComponentTransfer = this.#document.createElementNS(SVG_NS, "feComponentTransfer"); + filter.append(feComponentTransfer); + const feFuncA = this.#document.createElementNS(SVG_NS, "feFuncA"); + feFuncA.setAttribute("type", "linear"); + feFuncA.setAttribute("slope", `${slope}`); + feFuncA.setAttribute("intercept", "0"); + feComponentTransfer.append(feFuncA); + return url; + } + addHighlightHCMFilter(filterName, fgColor, bgColor, newFgColor, newBgColor) { + const key = `${fgColor}-${bgColor}-${newFgColor}-${newBgColor}`; + let info = this.#hcmCache.get(filterName); + if (info?.key === key) { + return info.url; + } + if (info) { + info.filter?.remove(); + info.key = key; + info.url = "none"; + info.filter = null; + } else { + info = { + key, + url: "none", + filter: null + }; + this.#hcmCache.set(filterName, info); + } + if (!fgColor || !bgColor) { + return info.url; + } + const [fgRGB, bgRGB] = [fgColor, bgColor].map(this.#getRGB.bind(this)); + let fgGray = Math.round(0.2126 * fgRGB[0] + 0.7152 * fgRGB[1] + 0.0722 * fgRGB[2]); + let bgGray = Math.round(0.2126 * bgRGB[0] + 0.7152 * bgRGB[1] + 0.0722 * bgRGB[2]); + let [newFgRGB, newBgRGB] = [newFgColor, newBgColor].map(this.#getOpaqueTextColor.bind(this)); + if (bgGray < fgGray) { + [fgGray, bgGray, newFgRGB, newBgRGB] = [bgGray, fgGray, newBgRGB, newFgRGB]; + } + this.#resetDefsColor(); + const getSteps = (fg, bg, n) => { + const arr = new Array(256); + const step = (bgGray - fgGray) / n; + const newStart = fg / 255; + const newStep = (bg - fg) / (255 * n); + let prev = 0; + for (let i = 0; i <= n; i++) { + const k = Math.round(fgGray + i * step); + const value = newStart + i * newStep; + for (let j = prev; j <= k; j++) { + arr[j] = value; + } + prev = k + 1; + } + for (let i = prev; i < 256; i++) { + arr[i] = arr[prev - 1]; + } + return arr.join(","); + }; + const id = `g_${this.#docId}_hcm_${filterName}_filter`; + const filter = info.filter = this.#createFilter(id); + this.#addGrayConversion(filter); + this.#addTransferMapConversion(getSteps(newFgRGB[0], newBgRGB[0], 5), getSteps(newFgRGB[1], newBgRGB[1], 5), getSteps(newFgRGB[2], newBgRGB[2], 5), filter); + info.url = this.#createUrl(id); + return info.url; + } + destroy(keepHCM = false) { + if (keepHCM && this.#_hcmCache?.size) { + return; + } + this.#_defs?.parentNode.parentNode.remove(); + this.#_defs = null; + this.#_cache?.clear(); + this.#_cache = null; + this.#_hcmCache?.clear(); + this.#_hcmCache = null; + this.#id = 0; + } + #addLuminosityConversion(filter) { + const feColorMatrix = this.#document.createElementNS(SVG_NS, "feColorMatrix"); + feColorMatrix.setAttribute("type", "matrix"); + feColorMatrix.setAttribute("values", "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.59 0.11 0 0"); + filter.append(feColorMatrix); + } + #addGrayConversion(filter) { + const feColorMatrix = this.#document.createElementNS(SVG_NS, "feColorMatrix"); + feColorMatrix.setAttribute("type", "matrix"); + feColorMatrix.setAttribute("values", "0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0 0 0 1 0"); + filter.append(feColorMatrix); + } + #createFilter(id) { + const filter = this.#document.createElementNS(SVG_NS, "filter"); + filter.setAttribute("color-interpolation-filters", "sRGB"); + filter.setAttribute("id", id); + this.#defs.append(filter); + return filter; + } + #appendFeFunc(feComponentTransfer, func, table) { + if (!table) { + return; + } + const feFunc = this.#document.createElementNS(SVG_NS, func); + feFunc.setAttribute("type", "discrete"); + feFunc.setAttribute("tableValues", table); + feComponentTransfer.append(feFunc); + } + #addTransferMapConversion(rTable, gTable, bTable, filter) { + const feComponentTransfer = this.#document.createElementNS(SVG_NS, "feComponentTransfer"); + filter.append(feComponentTransfer); + this.#appendFeFunc(feComponentTransfer, "feFuncR", rTable); + this.#appendFeFunc(feComponentTransfer, "feFuncG", gTable); + this.#appendFeFunc(feComponentTransfer, "feFuncB", bTable); + } + #addTransferMapAlphaConversion(aTable, filter) { + const feComponentTransfer = this.#document.createElementNS(SVG_NS, "feComponentTransfer"); + filter.append(feComponentTransfer); + this.#appendFeFunc(feComponentTransfer, "feFuncA", aTable); + } + #getRGB(color) { + this.#defs.style.color = "CanvasText"; + this.#defs.style.backgroundColor = color; + return getRGB(getComputedStyle(this.#defs).getPropertyValue("background-color")); + } + #getRGBA(color) { + this.#defs.style.color = "CanvasText"; + this.#defs.style.backgroundColor = color; + return getRGBA(getComputedStyle(this.#defs).getPropertyValue("background-color")); + } + #resetDefsColor() { + this.#defs.style.color = ""; + this.#defs.style.backgroundColor = ""; + } + #getOpaqueTextColor(color) { + const [r, g, b, alpha] = this.#getRGBA(color); + if (alpha === 1) { + return [r, g, b]; + } + const [canvasR, canvasG, canvasB] = this.#getRGB("Canvas"); + return [blend(r, canvasR, alpha), blend(g, canvasG, alpha), blend(b, canvasB, alpha)]; + } +} +function blend(fg, bg, alpha) { + return Math.round(alpha * fg + (1 - alpha) * bg); +} + +;// ./src/display/node_utils.js + + + + + + + + + +if (isNodeJS) { + let canvas; + try { + const require = process.getBuiltinModule("module").createRequire(import.meta.url); + try { + canvas = require("@napi-rs/canvas"); + } catch (ex) { + warn(`Cannot load "@napi-rs/canvas" package: "${ex}".`); + } + } catch (ex) { + warn(`Cannot access the \`require\` function: "${ex}".`); + } + if (!globalThis.DOMMatrix) { + if (canvas?.DOMMatrix) { + globalThis.DOMMatrix = canvas.DOMMatrix; + } else { + warn("Cannot polyfill `DOMMatrix`, rendering may be broken."); + } + } + if (!globalThis.Path2D) { + if (canvas?.Path2D) { + globalThis.Path2D = canvas.Path2D; + } else { + warn("Cannot polyfill `Path2D`, rendering may be broken."); + } + } + if (!globalThis.navigator?.language) { + globalThis.navigator = { + language: "en-US", + platform: "", + userAgent: "" + }; + } +} +async function node_utils_fetchData(url) { + const fs = process.getBuiltinModule("fs/promises"); + const data = await fs.readFile(url); + return new Uint8Array(data); +} +class NodeFilterFactory extends BaseFilterFactory {} +class NodeCanvasFactory extends BaseCanvasFactory { + _createCanvas(width, height) { + const require = process.getBuiltinModule("module").createRequire(import.meta.url); + const canvas = require("@napi-rs/canvas"); + return canvas.createCanvas(width, height); + } +} +class NodeBinaryDataFactory extends BaseBinaryDataFactory { + async _fetch(url, kind) { + return node_utils_fetchData(url); + } +} + +;// ./src/shared/image_utils.js +/* unused harmony import specifier */ var image_utils_ImageKind; +/* unused harmony import specifier */ var image_utils_FeatureTest; + + +function convertToRGBA(params) { + switch (params.kind) { + case image_utils_ImageKind.GRAYSCALE_1BPP: + return convertBlackAndWhiteToRGBA(params); + case image_utils_ImageKind.RGB_24BPP: + return convertRGBToRGBA(params); + } + return null; +} +function convertBlackAndWhiteToRGBA({ + src, + srcPos = 0, + dest, + width, + height, + nonBlackColor = 0xffffffff, + inverseDecode = false +}) { + const black = FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff; + const [zeroMapping, oneMapping] = inverseDecode ? [nonBlackColor, black] : [black, nonBlackColor]; + const widthInSource = width >> 3; + const widthRemainder = width & 7; + const xorMask = zeroMapping ^ oneMapping; + 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, destPos += 8) { + const elem = src[srcPos]; + dest[destPos] = zeroMapping ^ -(elem >> 7 & 1) & xorMask; + dest[destPos + 1] = zeroMapping ^ -(elem >> 6 & 1) & xorMask; + dest[destPos + 2] = zeroMapping ^ -(elem >> 5 & 1) & xorMask; + dest[destPos + 3] = zeroMapping ^ -(elem >> 4 & 1) & xorMask; + dest[destPos + 4] = zeroMapping ^ -(elem >> 3 & 1) & xorMask; + dest[destPos + 5] = zeroMapping ^ -(elem >> 2 & 1) & xorMask; + dest[destPos + 6] = zeroMapping ^ -(elem >> 1 & 1) & xorMask; + dest[destPos + 7] = zeroMapping ^ -(elem & 1) & xorMask; + } + if (widthRemainder === 0) { + continue; + } + const elem = srcPos < srcLength ? src[srcPos++] : 255; + for (let j = 0; j < widthRemainder; ++j, ++destPos) { + dest[destPos] = zeroMapping ^ -(elem >> 7 - j & 1) & xorMask; + } + } + return { + srcPos, + destPos + }; +} +function convertRGBToRGBA({ + src, + srcPos = 0, + dest, + destPos = 0, + width, + height +}) { + let i = 0; + const len = width * height * 3; + const len32 = len >> 2; + const src32 = new Uint32Array(src.buffer, srcPos, len32); + const alphaMask = FeatureTest.isLittleEndian ? 0xff000000 : 0xff; + if (FeatureTest.isLittleEndian) { + for (; i < len32 - 2; i += 3, destPos += 4) { + const s1 = src32[i], + s2 = src32[i + 1], + s3 = src32[i + 2]; + dest[destPos] = s1 | alphaMask; + dest[destPos + 1] = s1 >>> 24 | s2 << 8 | alphaMask; + dest[destPos + 2] = s2 >>> 16 | s3 << 16 | alphaMask; + dest[destPos + 3] = s3 >>> 8 | alphaMask; + } + for (let j = srcPos + i * 4, jj = srcPos + len; j < jj; j += 3) { + dest[destPos++] = src[j] | src[j + 1] << 8 | src[j + 2] << 16 | alphaMask; + } + } else { + for (; i < len32 - 2; i += 3, destPos += 4) { + const s1 = src32[i], + s2 = src32[i + 1], + s3 = src32[i + 2]; + dest[destPos] = s1 | alphaMask; + dest[destPos + 1] = s1 << 24 | s2 >>> 8 | alphaMask; + dest[destPos + 2] = s2 << 16 | s3 >>> 16 | alphaMask; + dest[destPos + 3] = s3 << 8 | alphaMask; + } + for (let j = srcPos + i * 4, jj = srcPos + len; j < jj; j += 3) { + dest[destPos++] = src[j] << 24 | src[j + 1] << 16 | src[j + 2] << 8 | alphaMask; + } + } + return { + srcPos: srcPos + len, + destPos + }; +} +function grayToRGBA(src, dest) { + if (image_utils_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/display/webgpu.js + +const MESH_WGSL = ` +struct Uniforms { + offsetX : f32, + offsetY : f32, + scaleX : f32, + scaleY : f32, + paddedWidth : f32, + paddedHeight : f32, + borderSize : f32, + _pad : f32, +}; + +@group(0) @binding(0) var u : Uniforms; + +struct VertexInput { + @location(0) position : vec2, + @location(1) color : vec4, +}; + +struct VertexOutput { + @builtin(position) position : vec4, + @location(0) color : vec3, +}; + +@vertex +fn vs_main(in : VertexInput) -> VertexOutput { + var out : VertexOutput; + let cx = (in.position.x + u.offsetX) * u.scaleX; + let cy = (in.position.y + u.offsetY) * u.scaleY; + out.position = vec4( + ((cx + u.borderSize) / u.paddedWidth) * 2.0 - 1.0, + 1.0 - ((cy + u.borderSize) / u.paddedHeight) * 2.0, + 0.0, + 1.0 + ); + out.color = in.color.rgb; + return out; +} + +@fragment +fn fs_main(in : VertexOutput) -> @location(0) vec4 { + return vec4(in.color, 1.0); +} +`; +class WebGPU { + #initPromise = null; + #device = null; + #meshPipeline = null; + #preferredFormat = null; + async #initGPU() { + if (!globalThis.navigator?.gpu) { + return false; + } + try { + const adapter = await navigator.gpu.requestAdapter(); + if (!adapter) { + return false; + } + this.#preferredFormat = navigator.gpu.getPreferredCanvasFormat(); + this.#device = await adapter.requestDevice(); + return true; + } catch { + return false; + } + } + init() { + return this.#initPromise ||= this.#initGPU(); + } + get isReady() { + return this.#device !== null; + } + loadMeshShader() { + if (!this.#device || this.#meshPipeline) { + return; + } + const shaderModule = this.#device.createShaderModule({ + code: MESH_WGSL + }); + this.#meshPipeline = this.#device.createRenderPipeline({ + layout: "auto", + vertex: { + module: shaderModule, + entryPoint: "vs_main", + buffers: [{ + arrayStride: 2 * 4, + attributes: [{ + shaderLocation: 0, + offset: 0, + format: "float32x2" + }] + }, { + arrayStride: 4, + attributes: [{ + shaderLocation: 1, + offset: 0, + format: "unorm8x4" + }] + }] + }, + fragment: { + module: shaderModule, + entryPoint: "fs_main", + targets: [{ + format: this.#preferredFormat + }] + }, + primitive: { + topology: "triangle-list" + } + }); + } + draw(posData, colData, vertexCount, context, backgroundColor, paddedWidth, paddedHeight, borderSize) { + this.loadMeshShader(); + const device = this.#device; + const { + offsetX, + offsetY, + scaleX, + scaleY + } = context; + const posBuffer = device.createBuffer({ + size: Math.max(posData.byteLength, 4), + usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST + }); + if (posData.byteLength > 0) { + device.queue.writeBuffer(posBuffer, 0, posData); + } + const colBuffer = device.createBuffer({ + size: Math.max(colData.byteLength, 4), + usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST + }); + if (colData.byteLength > 0) { + device.queue.writeBuffer(colBuffer, 0, colData); + } + const uniformBuffer = device.createBuffer({ + size: 8 * 4, + usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST + }); + device.queue.writeBuffer(uniformBuffer, 0, new Float32Array([offsetX, offsetY, scaleX, scaleY, paddedWidth, paddedHeight, borderSize, 0])); + const bindGroup = device.createBindGroup({ + layout: this.#meshPipeline.getBindGroupLayout(0), + entries: [{ + binding: 0, + resource: { + buffer: uniformBuffer + } + }] + }); + const offscreen = new OffscreenCanvas(paddedWidth, paddedHeight); + const gpuCtx = offscreen.getContext("webgpu"); + gpuCtx.configure({ + device, + format: this.#preferredFormat, + alphaMode: backgroundColor ? "opaque" : "premultiplied" + }); + const clearValue = backgroundColor ? { + r: backgroundColor[0] / 255, + g: backgroundColor[1] / 255, + b: backgroundColor[2] / 255, + a: 1 + } : { + r: 0, + g: 0, + b: 0, + a: 0 + }; + const commandEncoder = device.createCommandEncoder(); + const renderPass = commandEncoder.beginRenderPass({ + colorAttachments: [{ + view: gpuCtx.getCurrentTexture().createView(), + clearValue, + loadOp: "clear", + storeOp: "store" + }] + }); + if (vertexCount > 0) { + renderPass.setPipeline(this.#meshPipeline); + renderPass.setBindGroup(0, bindGroup); + renderPass.setVertexBuffer(0, posBuffer); + renderPass.setVertexBuffer(1, colBuffer); + renderPass.draw(vertexCount); + } + renderPass.end(); + device.queue.submit([commandEncoder.finish()]); + posBuffer.destroy(); + colBuffer.destroy(); + uniformBuffer.destroy(); + return offscreen.transferToImageBitmap(); + } +} +const _webGPU = new WebGPU(); +function initGPU() { + return _webGPU.init(); +} +function isGPUReady() { + return _webGPU.isReady; +} +function loadMeshShader() { + _webGPU.loadMeshShader(); +} +function drawMeshWithGPU(posData, colData, vertexCount, context, backgroundColor, paddedWidth, paddedHeight, borderSize) { + return _webGPU.draw(posData, colData, vertexCount, context, backgroundColor, paddedWidth, paddedHeight, borderSize); +} + +;// ./src/display/pattern_helper.js + + + + + + + + +const PathType = { + FILL: "Fill", + STROKE: "Stroke", + SHADING: "Shading" +}; +function applyBoundingBox(ctx, bbox) { + if (!bbox) { + return; + } + const width = bbox[2] - bbox[0]; + const height = bbox[3] - bbox[1]; + const region = new Path2D(); + region.rect(bbox[0], bbox[1], width, height); + ctx.clip(region); +} +class BaseShadingPattern { + matrix = null; + isModifyingCurrentTransform() { + return false; + } + getPattern() { + unreachable("Abstract method `getPattern` called."); + } +} +class RadialAxialShadingPattern extends BaseShadingPattern { + constructor(IR) { + super(); + this._type = IR[1]; + this._bbox = IR[2]; + this._colorStops = IR[3]; + this._p0 = IR[4]; + this._p1 = IR[5]; + this._r0 = IR[6]; + this._r1 = IR[7]; + } + isOriginBased() { + return this._p0[0] === 0 && this._p0[1] === 0 && (!this.isRadial() || this._p1[0] === 0 && this._p1[1] === 0); + } + isRadial() { + return this._type === "radial"; + } + areConic() { + if (!this.isRadial()) { + return false; + } + const dist = Math.hypot(this._p0[0] - this._p1[0], this._p0[1] - this._p1[1]); + return dist + this._r1 > this._r0 && dist + this._r0 > this._r1; + } + _createGradient(ctx, transform = null) { + let grad; + let firstPoint = this._p0; + let secondPoint = this._p1; + if (transform) { + firstPoint = firstPoint.slice(); + secondPoint = secondPoint.slice(); + Util.applyTransform(firstPoint, transform); + Util.applyTransform(secondPoint, transform); + } + if (this._type === "axial") { + grad = ctx.createLinearGradient(firstPoint[0], firstPoint[1], secondPoint[0], secondPoint[1]); + } else if (this._type === "radial") { + let r0 = this._r0; + let r1 = this._r1; + if (transform) { + const scale = new Float32Array(2); + Util.singularValueDecompose2dScale(transform, scale); + r0 *= scale[0]; + r1 *= scale[0]; + } + grad = ctx.createRadialGradient(firstPoint[0], firstPoint[1], r0, secondPoint[0], secondPoint[1], r1); + } + for (const colorStop of this._colorStops) { + grad.addColorStop(colorStop[0], colorStop[1]); + } + return grad; + } + _createReversedGradient(ctx, transform = null) { + let firstPoint = this._p1; + let secondPoint = this._p0; + if (transform) { + firstPoint = firstPoint.slice(); + secondPoint = secondPoint.slice(); + Util.applyTransform(firstPoint, transform); + Util.applyTransform(secondPoint, transform); + } + let r0 = this._r1; + let r1 = this._r0; + if (transform) { + const scale = new Float32Array(2); + Util.singularValueDecompose2dScale(transform, scale); + r0 *= scale[0]; + r1 *= scale[0]; + } + const grad = ctx.createRadialGradient(firstPoint[0], firstPoint[1], r0, secondPoint[0], secondPoint[1], r1); + const reversedStops = this._colorStops.map(([t, c]) => [1 - t, c]).reverse(); + for (const [t, c] of reversedStops) { + grad.addColorStop(t, c); + } + return grad; + } + _createRasterPattern(ctx, owner, inverse, bbox, transform, transferMaps) { + const width = Math.ceil(bbox[2] - bbox[0]) || 1; + const height = Math.ceil(bbox[3] - bbox[1]) || 1; + const tmpCanvas = owner.canvasFactory.create(width, height); + const tmpCtx = tmpCanvas.context; + tmpCtx.clearRect(0, 0, width, height); + tmpCtx.beginPath(); + tmpCtx.rect(0, 0, width, height); + tmpCtx.translate(-bbox[0], -bbox[1]); + inverse = Util.transform(inverse, [1, 0, 0, 1, bbox[0], bbox[1]]); + tmpCtx.transform(...transform); + applyBoundingBox(tmpCtx, this._bbox); + if (this.areConic()) { + tmpCtx.fillStyle = this._createReversedGradient(tmpCtx); + tmpCtx.fill(); + } + tmpCtx.fillStyle = this._createGradient(tmpCtx); + tmpCtx.fill(); + transferMaps?.applyToCanvas(tmpCtx); + const pattern = ctx.createPattern(tmpCanvas.canvas, "no-repeat"); + owner.canvasFactory.destroy(tmpCanvas); + pattern.setTransform(new DOMMatrix(inverse)); + return pattern; + } + getPattern(ctx, owner, inverse, pathType) { + const transferMaps = owner.current.transferMapsFallback; + if (pathType === PathType.STROKE || pathType === PathType.FILL) { + if (this.isOriginBased() && !transferMaps) { + let transf = Util.transform(inverse, owner.baseTransform); + if (this.matrix) { + transf = Util.transform(transf, this.matrix); + } + const precision = 1e-3; + const n1 = Math.hypot(transf[0], transf[1]); + const n2 = Math.hypot(transf[2], transf[3]); + const ps = (transf[0] * transf[2] + transf[1] * transf[3]) / (n1 * n2); + if (Math.abs(ps) < precision) { + if (this.isRadial()) { + if (Math.abs(n1 - n2) < precision) { + return this._createGradient(ctx, transf); + } + } else { + return this._createGradient(ctx, transf); + } + } + } + const ownerBBox = owner.current.getClippedPathBoundingBox(pathType, getCurrentTransform(ctx)) || [0, 0, 0, 0]; + const transform = this.matrix ? Util.transform(owner.baseTransform, this.matrix) : owner.baseTransform; + return this._createRasterPattern(ctx, owner, inverse, ownerBBox, transform, transferMaps); + } + if (transferMaps && inverse) { + return this._createRasterPattern(ctx, owner, inverse, owner.current.clipBox, getCurrentTransform(ctx), transferMaps); + } + if (this.areConic()) { + ctx.save(); + applyBoundingBox(ctx, this._bbox); + ctx.fillStyle = this._createReversedGradient(ctx); + ctx.fillRect(-1e10, -1e10, 2e10, 2e10); + ctx.restore(); + } + applyBoundingBox(ctx, this._bbox); + return this._createGradient(ctx); + } +} +function drawTriangle(data, context, p1, p2, p3, c1, c2, c3) { + const coords = context.coords, + colors = context.colors; + const bytes = data.data, + rowSize = data.width * 4; + let tmp; + if (coords[p1 * 2 + 1] > coords[p2 * 2 + 1]) { + tmp = p1; + p1 = p2; + p2 = tmp; + tmp = c1; + c1 = c2; + c2 = tmp; + } + if (coords[p2 * 2 + 1] > coords[p3 * 2 + 1]) { + tmp = p2; + p2 = p3; + p3 = tmp; + tmp = c2; + c2 = c3; + c3 = tmp; + } + if (coords[p1 * 2 + 1] > coords[p2 * 2 + 1]) { + tmp = p1; + p1 = p2; + p2 = tmp; + tmp = c1; + c1 = c2; + c2 = tmp; + } + const x1 = (coords[p1 * 2] + context.offsetX) * context.scaleX; + const y1 = (coords[p1 * 2 + 1] + context.offsetY) * context.scaleY; + const x2 = (coords[p2 * 2] + context.offsetX) * context.scaleX; + const y2 = (coords[p2 * 2 + 1] + context.offsetY) * context.scaleY; + const x3 = (coords[p3 * 2] + context.offsetX) * context.scaleX; + const y3 = (coords[p3 * 2 + 1] + context.offsetY) * context.scaleY; + if (y1 >= y3) { + return; + } + const c1r = colors[c1 * 4], + c1g = colors[c1 * 4 + 1], + c1b = colors[c1 * 4 + 2]; + const c2r = colors[c2 * 4], + c2g = colors[c2 * 4 + 1], + c2b = colors[c2 * 4 + 2]; + const c3r = colors[c3 * 4], + c3g = colors[c3 * 4 + 1], + c3b = colors[c3 * 4 + 2]; + const minY = Math.round(y1), + maxY = Math.round(y3); + let xa, car, cag, cab; + let xb, cbr, cbg, cbb; + for (let y = minY; y <= maxY; y++) { + if (y < y2) { + const k = y < y1 ? 0 : (y1 - y) / (y1 - y2); + xa = x1 - (x1 - x2) * k; + car = c1r - (c1r - c2r) * k; + cag = c1g - (c1g - c2g) * k; + cab = c1b - (c1b - c2b) * k; + } else { + let k; + if (y > y3) { + k = 1; + } else if (y2 === y3) { + k = 0; + } else { + k = (y2 - y) / (y2 - y3); + } + xa = x2 - (x2 - x3) * k; + car = c2r - (c2r - c3r) * k; + cag = c2g - (c2g - c3g) * k; + cab = c2b - (c2b - c3b) * k; + } + let k; + if (y < y1) { + k = 0; + } else if (y > y3) { + k = 1; + } else { + k = (y1 - y) / (y1 - y3); + } + xb = x1 - (x1 - x3) * k; + cbr = c1r - (c1r - c3r) * k; + cbg = c1g - (c1g - c3g) * k; + cbb = c1b - (c1b - c3b) * k; + const x1_ = Math.round(Math.min(xa, xb)); + const x2_ = Math.round(Math.max(xa, xb)); + let j = rowSize * y + x1_ * 4; + for (let x = x1_; x <= x2_; x++) { + k = (xa - x) / (xa - xb); + if (k < 0) { + k = 0; + } else if (k > 1) { + k = 1; + } + bytes[j++] = car - (car - cbr) * k | 0; + bytes[j++] = cag - (cag - cbg) * k | 0; + bytes[j++] = cab - (cab - cbb) * k | 0; + bytes[j++] = 255; + } + } +} +class MeshShadingPattern extends BaseShadingPattern { + constructor(IR) { + super(); + this._posData = IR[2]; + this._colData = IR[3]; + this._vertexCount = IR[4]; + this._bounds = IR[5]; + this._bbox = IR[6]; + this._background = IR[7]; + loadMeshShader(); + } + _createMeshCanvas(combinedScale, backgroundColor, canvasFactory, transferMaps = null) { + const EXPECTED_SCALE = 1.1; + const MAX_PATTERN_SIZE = 3000; + const BORDER_SIZE = 2; + const offsetX = Math.floor(this._bounds[0]); + const offsetY = Math.floor(this._bounds[1]); + const boundsWidth = Math.ceil(this._bounds[2]) - offsetX; + const boundsHeight = Math.ceil(this._bounds[3]) - offsetY; + const width = Math.min(Math.ceil(Math.abs(boundsWidth * combinedScale[0] * EXPECTED_SCALE)), MAX_PATTERN_SIZE) || 1; + const height = Math.min(Math.ceil(Math.abs(boundsHeight * combinedScale[1] * EXPECTED_SCALE)), MAX_PATTERN_SIZE) || 1; + const scaleX = boundsWidth ? boundsWidth / width : 1; + const scaleY = boundsHeight ? boundsHeight / height : 1; + const context = { + coords: this._posData, + colors: this._colData, + offsetX: -offsetX, + offsetY: -offsetY, + scaleX: 1 / scaleX, + scaleY: 1 / scaleY + }; + const paddedWidth = width + BORDER_SIZE * 2; + const paddedHeight = height + BORDER_SIZE * 2; + const tmpCanvas = canvasFactory.create(paddedWidth, paddedHeight); + if (isGPUReady() && this._vertexCount > 48) { + tmpCanvas.context.drawImage(drawMeshWithGPU(this._posData, this._colData, this._vertexCount, context, backgroundColor, paddedWidth, paddedHeight, BORDER_SIZE), 0, 0); + } else { + const data = tmpCanvas.context.createImageData(width, height); + if (backgroundColor) { + const bytes = data.data; + for (let i = 0, ii = bytes.length; i < ii; i += 4) { + bytes[i] = backgroundColor[0]; + bytes[i + 1] = backgroundColor[1]; + bytes[i + 2] = backgroundColor[2]; + bytes[i + 3] = 255; + } + } + for (let i = 0, ii = this._vertexCount; i < ii; i += 3) { + drawTriangle(data, context, i, i + 1, i + 2, i, i + 1, i + 2); + } + tmpCanvas.context.putImageData(data, BORDER_SIZE, BORDER_SIZE); + } + transferMaps?.applyToCanvas(tmpCanvas.context); + return { + canvas: tmpCanvas.canvas, + offsetX: offsetX - BORDER_SIZE * scaleX, + offsetY: offsetY - BORDER_SIZE * scaleY, + scaleX, + scaleY + }; + } + isModifyingCurrentTransform() { + return true; + } + getPattern(ctx, owner, inverse, pathType) { + applyBoundingBox(ctx, this._bbox); + const scale = new Float32Array(2); + if (pathType === PathType.SHADING) { + Util.singularValueDecompose2dScale(getCurrentTransform(ctx), scale); + } else if (this.matrix) { + Util.singularValueDecompose2dScale(this.matrix, scale); + const [matrixScaleX, matrixScaleY] = scale; + Util.singularValueDecompose2dScale(owner.baseTransform, scale); + scale[0] *= matrixScaleX; + scale[1] *= matrixScaleY; + } else { + Util.singularValueDecompose2dScale(owner.baseTransform, scale); + } + const temporaryPatternCanvas = this._createMeshCanvas(scale, pathType === PathType.SHADING ? null : this._background, owner.canvasFactory, owner.current.transferMapsFallback); + if (pathType !== PathType.SHADING) { + ctx.setTransform(...owner.baseTransform); + if (this.matrix) { + ctx.transform(...this.matrix); + } + } + ctx.translate(temporaryPatternCanvas.offsetX, temporaryPatternCanvas.offsetY); + ctx.scale(temporaryPatternCanvas.scaleX, temporaryPatternCanvas.scaleY); + const pattern = ctx.createPattern(temporaryPatternCanvas.canvas, "no-repeat"); + owner.canvasFactory.destroy(temporaryPatternCanvas); + return pattern; + } +} +class DummyShadingPattern extends BaseShadingPattern { + getPattern() { + return "hotpink"; + } +} +function getShadingPattern(IR) { + switch (IR[0]) { + case "RadialAxial": + return new RadialAxialShadingPattern(IR); + case "Mesh": + return new MeshShadingPattern(IR); + case "Dummy": + return new DummyShadingPattern(); + } + throw new Error(`Unknown IR type: ${IR[0]}`); +} +const PaintType = { + COLORED: 1, + UNCOLORED: 2 +}; +class TilingPattern { + static MAX_PATTERN_SIZE = 3000; + constructor(IR, ctx, canvasGraphicsFactory, baseTransform) { + this.color = IR[1]; + this.operatorList = IR[2]; + this.matrix = IR[3]; + this.bbox = IR[4]; + this.xstep = IR[5]; + this.ystep = IR[6]; + this.paintType = IR[7]; + this.tilingType = IR[8]; + this.needsIsolation = IR[9] ?? true; + this.ctx = ctx; + this.canvasGraphicsFactory = canvasGraphicsFactory; + this.baseTransform = baseTransform; + this.patternBaseMatrix = this.matrix ? Util.transform(baseTransform, this.matrix) : baseTransform; + } + canSkipPatternCanvas([width, height, offsetX, offsetY]) { + const [x0, y0, x1, y1] = this.bbox; + const absXStep = Math.abs(this.xstep); + const absYStep = Math.abs(this.ystep); + if (width > absXStep + 1e-6 || height > absYStep + 1e-6) { + return null; + } + const nXFirst = Math.floor((offsetX - x1) / absXStep) + 1; + const nXLast = Math.ceil((offsetX + width - x0) / absXStep) - 1; + const nYFirst = Math.floor((offsetY - y1) / absYStep) + 1; + const nYLast = Math.ceil((offsetY + height - y0) / absYStep) - 1; + return nXLast <= nXFirst && nYLast <= nYFirst ? [nXFirst, nYFirst] : null; + } + updatePatternDims(clippedBBox, dims) { + const bbox = BBOX_INIT.slice(); + Util.axialAlignedBoundingBox(clippedBBox, Util.inverseTransform(this.patternBaseMatrix), bbox); + dims[0] = bbox[2] - bbox[0]; + dims[1] = bbox[3] - bbox[1]; + dims[2] = bbox[0]; + dims[3] = bbox[1]; + } + _renderTileCanvas(owner, opIdx, dimx, dimy) { + const [x0, y0, x1, y1] = this.bbox; + const tmpCanvas = owner.canvasFactory.create(dimx.size, dimy.size); + const tmpCtx = tmpCanvas.context; + const graphics = this.canvasGraphicsFactory.createCanvasGraphics(tmpCtx, opIdx); + graphics.groupLevel = owner.groupLevel; + graphics.current.transferMapsFallback = owner.current.transferMapsFallback; + this.setFillAndStrokeStyleToContext(graphics, this.paintType, this.color); + tmpCtx.translate(-dimx.scale * x0, -dimy.scale * y0); + graphics.transform(0, dimx.scale, 0, 0, dimy.scale, 0, 0); + tmpCtx.save(); + graphics.dependencyTracker?.save(); + this.clipBbox(graphics, x0, y0, x1, y1); + graphics.baseTransform = getCurrentTransform(graphics.ctx); + graphics.executeOperatorList(this.operatorList); + graphics.endDrawing(); + graphics.dependencyTracker?.restore(); + tmpCtx.restore(); + return tmpCanvas; + } + _getCombinedScales() { + const scale = new Float32Array(2); + Util.singularValueDecompose2dScale(this.matrix, scale); + const [matrixScaleX, matrixScaleY] = scale; + Util.singularValueDecompose2dScale(this.baseTransform, scale); + return [matrixScaleX * scale[0], matrixScaleY * scale[1]]; + } + drawPattern(owner, path, useEOFill = false, [n, m], opIdx) { + const [x0, y0, x1, y1] = this.bbox; + const dependencyTracker = owner.dependencyTracker; + if (dependencyTracker) { + owner.dependencyTracker = new CanvasNestedDependencyTracker(dependencyTracker, opIdx); + } + owner.save(); + if (useEOFill) { + owner.ctx.clip(path, "evenodd"); + } else { + owner.ctx.clip(path); + } + owner.ctx.setTransform(...this.patternBaseMatrix); + owner.ctx.translate(n * this.xstep, m * this.ystep); + if (this.needsIsolation || owner.ctx.globalAlpha !== 1 || owner.ctx.globalCompositeOperation !== "source-over" || owner.inSMaskMode) { + const bboxWidth = x1 - x0; + const bboxHeight = y1 - y0; + const [combinedScaleX, combinedScaleY] = this._getCombinedScales(); + const dimx = this.getSizeAndScale(bboxWidth, this.ctx.canvas.width, combinedScaleX); + const dimy = this.getSizeAndScale(bboxHeight, this.ctx.canvas.height, combinedScaleY); + const tmpCanvas = this._renderTileCanvas(owner, opIdx, dimx, dimy); + owner.ctx.drawImage(tmpCanvas.canvas, x0, y0, bboxWidth, bboxHeight); + owner.canvasFactory.destroy(tmpCanvas); + } else { + this.setFillAndStrokeStyleToContext(owner, this.paintType, this.color); + this.clipBbox(owner, x0, y0, x1, y1); + owner.baseTransformStack.push(owner.baseTransform); + owner.baseTransform = getCurrentTransform(owner.ctx); + owner.executeOperatorList(this.operatorList); + owner.baseTransform = owner.baseTransformStack.pop(); + } + owner.restore(); + if (dependencyTracker) { + owner.dependencyTracker = dependencyTracker; + } + } + createPatternCanvas(owner, opIdx) { + const [x0, y0, x1, y1] = this.bbox; + const width = x1 - x0; + const height = y1 - y0; + let { + xstep, + ystep + } = this; + xstep = Math.abs(xstep); + ystep = Math.abs(ystep); + info("TilingType: " + this.tilingType); + const [combinedScaleX, combinedScaleY] = this._getCombinedScales(); + let canvasWidth = width, + canvasHeight = height, + redrawHorizontally = false, + redrawVertically = false; + if (Math.ceil(xstep * combinedScaleX) >= Math.ceil(width * combinedScaleX)) { + canvasWidth = xstep; + } else { + redrawHorizontally = true; + } + if (Math.ceil(ystep * combinedScaleY) >= Math.ceil(height * combinedScaleY)) { + canvasHeight = ystep; + } else { + redrawVertically = true; + } + const dimx = this.getSizeAndScale(canvasWidth, this.ctx.canvas.width, combinedScaleX); + const dimy = this.getSizeAndScale(canvasHeight, this.ctx.canvas.height, combinedScaleY); + const tmpCanvas = this._renderTileCanvas(owner, opIdx, dimx, dimy); + if (redrawHorizontally || redrawVertically) { + const image = tmpCanvas.canvas; + if (redrawHorizontally) { + canvasWidth = xstep; + } + if (redrawVertically) { + canvasHeight = ystep; + } + const dimx2 = this.getSizeAndScale(canvasWidth, this.ctx.canvas.width, combinedScaleX); + const dimy2 = this.getSizeAndScale(canvasHeight, this.ctx.canvas.height, combinedScaleY); + const xSize = dimx2.size; + const ySize = dimy2.size; + const tmpCanvas2 = owner.canvasFactory.create(xSize, ySize); + const tmpCtx2 = tmpCanvas2.context; + const ii = redrawHorizontally ? Math.min(Math.floor(width / xstep), Math.ceil(image.width / xSize)) : 0; + const jj = redrawVertically ? Math.min(Math.floor(height / ystep), Math.ceil(image.height / ySize)) : 0; + let rowSource = image; + let bandCanvas = null; + if (redrawVertically) { + bandCanvas = owner.canvasFactory.create(image.width, ySize); + const bandCtx = bandCanvas.context; + for (let j = jj; j >= 0; j--) { + bandCtx.drawImage(image, 0, ySize * j, image.width, ySize, 0, 0, image.width, ySize); + } + rowSource = bandCanvas.canvas; + } + for (let i = ii; i >= 0; i--) { + tmpCtx2.drawImage(rowSource, xSize * i, 0, xSize, ySize, 0, 0, xSize, ySize); + } + if (bandCanvas) { + owner.canvasFactory.destroy(bandCanvas); + } + owner.canvasFactory.destroy(tmpCanvas); + return { + canvas: tmpCanvas2.canvas, + canvasEntry: tmpCanvas2, + scaleX: dimx2.scale, + scaleY: dimy2.scale, + offsetX: x0, + offsetY: y0 + }; + } + return { + canvas: tmpCanvas.canvas, + canvasEntry: tmpCanvas, + scaleX: dimx.scale, + scaleY: dimy.scale, + offsetX: x0, + offsetY: y0 + }; + } + getSizeAndScale(step, realOutputSize, scale) { + const maxSize = Math.max(TilingPattern.MAX_PATTERN_SIZE, realOutputSize); + let size = Math.ceil(step * scale); + if (size >= maxSize) { + size = maxSize; + } else { + scale = size / step; + } + return { + scale, + size + }; + } + clipBbox(graphics, x0, y0, x1, y1) { + const bboxWidth = x1 - x0; + const bboxHeight = y1 - y0; + const clip = new Path2D(); + clip.rect(x0, y0, bboxWidth, bboxHeight); + Util.axialAlignedBoundingBox([x0, y0, x1, y1], getCurrentTransform(graphics.ctx), graphics.current.minMax); + graphics.ctx.clip(clip); + graphics.current.updateClipFromPath(); + } + setFillAndStrokeStyleToContext(graphics, paintType, color) { + switch (paintType) { + case PaintType.COLORED: + color = "#000000"; + break; + case PaintType.UNCOLORED: + break; + default: + throw new FormatError(`Unsupported paint type: ${paintType}`); + } + const { + ctx, + current + } = graphics; + current.patternFill = current.patternStroke = false; + ctx.fillStyle = ctx.strokeStyle = current.transferMapsFallback?.applyToColor(color) ?? color; + current.fillColor = current.strokeColor = color; + } + isModifyingCurrentTransform() { + return false; + } + getPattern(ctx, owner, inverse, pathType, opIdx) { + const matrix = pathType !== PathType.SHADING ? Util.transform(inverse, this.patternBaseMatrix) : inverse; + const temporaryPatternCanvas = this.createPatternCanvas(owner, opIdx); + let domMatrix = new DOMMatrix(matrix); + domMatrix = domMatrix.translate(temporaryPatternCanvas.offsetX, temporaryPatternCanvas.offsetY); + domMatrix = domMatrix.scale(1 / temporaryPatternCanvas.scaleX, 1 / temporaryPatternCanvas.scaleY); + const pattern = ctx.createPattern(temporaryPatternCanvas.canvas, "repeat"); + owner.canvasFactory.destroy(temporaryPatternCanvas.canvasEntry); + pattern.setTransform(domMatrix); + return pattern; + } +} + +;// ./src/display/canvas.js + + + + + + + + + + + + + + +const MIN_FONT_SIZE = 16; +const MAX_FONT_SIZE = 100; +const EXECUTION_TIME = 15; +const EXECUTION_STEPS = 10; +const FULL_CHUNK_HEIGHT = 16; +const XY = new Float32Array(2); +function mirrorContextOperations(ctx, destCtx) { + if (ctx._removeMirroring) { + throw new Error("Context is already forwarding operations."); + } + const originalMethods = new Map(); + for (const name of ["save", "restore", "rotate", "scale", "translate", "transform", "setTransform", "resetTransform", "clip", "moveTo", "lineTo", "bezierCurveTo", "quadraticCurveTo", "arc", "arcTo", "ellipse", "rect", "roundRect", "closePath", "beginPath"]) { + const original = ctx[name]; + if (typeof original !== "function" || typeof destCtx[name] !== "function") { + continue; + } + originalMethods.set(name, original); + ctx[name] = function (...args) { + destCtx[name](...args); + return original.apply(this, args); + }; + } + ctx._removeMirroring = () => { + for (const [name, original] of originalMethods) { + ctx[name] = original; + } + delete ctx._removeMirroring; + }; +} +function drawImageAtIntegerCoords(ctx, srcImg, srcX, srcY, srcW, srcH, destX, destY, destW, destH) { + const [a, b, c, d, tx, ty] = getCurrentTransform(ctx); + if (b === 0 && c === 0) { + const tlX = destX * a + tx; + const rTlX = Math.round(tlX); + const tlY = destY * d + ty; + const rTlY = Math.round(tlY); + const brX = (destX + destW) * a + tx; + const rWidth = Math.abs(Math.round(brX) - rTlX) || 1; + const brY = (destY + destH) * d + ty; + const rHeight = Math.abs(Math.round(brY) - rTlY) || 1; + ctx.setTransform(Math.sign(a), 0, 0, Math.sign(d), rTlX, rTlY); + ctx.drawImage(srcImg, srcX, srcY, srcW, srcH, 0, 0, rWidth, rHeight); + ctx.setTransform(a, b, c, d, tx, ty); + return [rWidth, rHeight]; + } + if (a === 0 && d === 0) { + const tlX = destY * c + tx; + const rTlX = Math.round(tlX); + const tlY = destX * b + ty; + const rTlY = Math.round(tlY); + const brX = (destY + destH) * c + tx; + const rWidth = Math.abs(Math.round(brX) - rTlX) || 1; + const brY = (destX + destW) * b + ty; + const rHeight = Math.abs(Math.round(brY) - rTlY) || 1; + ctx.setTransform(0, Math.sign(b), Math.sign(c), 0, rTlX, rTlY); + ctx.drawImage(srcImg, srcX, srcY, srcW, srcH, 0, 0, rHeight, rWidth); + ctx.setTransform(a, b, c, d, tx, ty); + return [rHeight, rWidth]; + } + ctx.drawImage(srcImg, srcX, srcY, srcW, srcH, destX, destY, destW, destH); + const scaleX = Math.hypot(a, b); + const scaleY = Math.hypot(c, d); + return [scaleX * destW, scaleY * destH]; +} +class CanvasExtraState { + alphaIsShape = false; + fontSize = 0; + fontSizeScale = 1; + textMatrix = null; + textMatrixScale = 1; + fontMatrix = FONT_IDENTITY_MATRIX; + leading = 0; + x = 0; + y = 0; + lineX = 0; + lineY = 0; + charSpacing = 0; + wordSpacing = 0; + textHScale = 1; + textRenderingMode = TextRenderingMode.FILL; + textRise = 0; + fillColor = "#000000"; + strokeColor = "#000000"; + tilingPatternDims = null; + patternFill = false; + patternStroke = false; + fillAlpha = 1; + strokeAlpha = 1; + lineWidth = 1; + activeSMask = null; + transferMaps = "none"; + transferMapsFallback = null; + minMax = F32_BBOX_INIT.slice(); + constructor(width, height) { + this.clipBox = new Float32Array([0, 0, width, height]); + } + clone() { + const clone = Object.create(this); + clone.clipBox = this.clipBox.slice(); + clone.minMax = this.minMax.slice(); + clone.tilingPatternDims = this.tilingPatternDims?.slice(); + return clone; + } + getPathBoundingBox(pathType = PathType.FILL, transform = null) { + const box = this.minMax.slice(); + if (pathType === PathType.STROKE) { + if (!transform) { + unreachable("Stroke bounding box must include transform."); + } + Util.singularValueDecompose2dScale(transform, XY); + const xStrokePad = XY[0] * this.lineWidth / 2; + const yStrokePad = XY[1] * this.lineWidth / 2; + box[0] -= xStrokePad; + box[1] -= yStrokePad; + box[2] += xStrokePad; + box[3] += yStrokePad; + } + return box; + } + updateClipFromPath() { + const intersect = Util.intersect(this.clipBox, this.getPathBoundingBox()); + this.startNewPathAndClipBox(intersect || [0, 0, 0, 0]); + } + isEmptyClip() { + return this.minMax[0] === Infinity; + } + startNewPathAndClipBox(box) { + this.clipBox.set(box, 0); + this.minMax.set(F32_BBOX_INIT, 0); + } + getClippedPathBoundingBox(pathType = PathType.FILL, transform = null) { + return Util.intersect(this.clipBox, this.getPathBoundingBox(pathType, transform)); + } +} +function putBinaryImageData(ctx, imgData) { + const { + width, + height, + kind + } = imgData; + const partialChunkHeight = height % FULL_CHUNK_HEIGHT; + const fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT; + const totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1; + const chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT); + let srcPos = 0; + const src = imgData.data; + const dest = chunkImgData.data; + let i; + if (kind === ImageKind.GRAYSCALE_1BPP) { + for (i = 0; i < totalChunks; i++) { + ({ + srcPos + } = convertBlackAndWhiteToRGBA({ + src, + srcPos, + dest, + width, + height: i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight + })); + ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT); + } + } else if (kind === ImageKind.RGBA_32BPP) { + let j = 0; + let elemsInThisChunk = width * FULL_CHUNK_HEIGHT * 4; + for (i = 0; i < fullChunks; i++) { + dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk)); + srcPos += elemsInThisChunk; + ctx.putImageData(chunkImgData, 0, j); + j += FULL_CHUNK_HEIGHT; + } + if (i < totalChunks) { + elemsInThisChunk = width * partialChunkHeight * 4; + dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk)); + ctx.putImageData(chunkImgData, 0, j); + } + } else if (kind === ImageKind.RGB_24BPP) { + for (i = 0; i < totalChunks; i++) { + ({ + srcPos + } = convertRGBToRGBA({ + src, + srcPos, + dest: new Uint32Array(dest.buffer), + width, + height: i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight + })); + ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT); + } + } else { + throw new Error(`bad image kind: ${kind}`); + } +} +function putBinaryImageMask(ctx, imgData) { + if (imgData.bitmap) { + ctx.drawImage(imgData.bitmap, 0, 0); + return; + } + const { + width, + height + } = imgData; + const partialChunkHeight = height % FULL_CHUNK_HEIGHT; + const fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT; + const totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1; + const chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT); + let srcPos = 0; + const src = imgData.data; + const dest = chunkImgData.data; + for (let i = 0; i < totalChunks; i++) { + ({ + srcPos + } = convertBlackAndWhiteToRGBA({ + src, + srcPos, + dest, + width, + height: i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight, + nonBlackColor: 0 + })); + ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT); + } +} +function copyCtxState(sourceCtx, destCtx) { + const properties = ["strokeStyle", "fillStyle", "fillRule", "globalAlpha", "lineWidth", "lineCap", "lineJoin", "miterLimit", "globalCompositeOperation", "font", "filter"]; + for (const property of properties) { + if (sourceCtx[property] !== undefined) { + destCtx[property] = sourceCtx[property]; + } + } + if (sourceCtx.setLineDash !== undefined) { + destCtx.setLineDash(sourceCtx.getLineDash()); + destCtx.lineDashOffset = sourceCtx.lineDashOffset; + } +} +function resetCtxToDefault(ctx) { + ctx.strokeStyle = ctx.fillStyle = "#000000"; + ctx.fillRule = "nonzero"; + ctx.globalAlpha = 1; + ctx.lineWidth = 1; + ctx.lineCap = "butt"; + ctx.lineJoin = "miter"; + ctx.miterLimit = 10; + ctx.globalCompositeOperation = "source-over"; + ctx.font = "10px sans-serif"; + if (ctx.setLineDash !== undefined) { + ctx.setLineDash([]); + ctx.lineDashOffset = 0; + } + const { + filter + } = ctx; + if (filter !== "none" && filter !== "") { + ctx.filter = "none"; + } +} +class TransferMapsFallback { + #maps; + constructor(maps) { + const [mapR, mapG = mapR, mapB = mapR] = maps; + const { + identityMap + } = TransferMapsFallback; + this.#maps = [mapR || identityMap, mapG || identityMap, mapB || identityMap]; + } + static get identityMap() { + return util_shadow(this, "identityMap", Uint8Array.from({ + length: 256 + }, (_, i) => i)); + } + applyToColor(color) { + if (typeof color !== "string" || !color.startsWith("#")) { + return color; + } + const [r, g, b] = getRGBA(color); + const [mapR, mapG, mapB] = this.#maps; + return Util.makeHexColor(mapR[r], mapG[g], mapB[b]); + } + applyToImageData({ + data + }) { + const [mapR, mapG, mapB] = this.#maps; + for (let i = 0, ii = data.length; i < ii; i += 4) { + data[i] = mapR[data[i]]; + data[i + 1] = mapG[data[i + 1]]; + data[i + 2] = mapB[data[i + 2]]; + } + } + applyToCanvas(ctx) { + const { + width, + height + } = ctx.canvas; + const imgData = ctx.getImageData(0, 0, width, height); + this.applyToImageData(imgData); + ctx.putImageData(imgData, 0, 0); + } +} +function getImageSmoothingEnabled(transform, interpolate) { + if (interpolate) { + return true; + } + Util.singularValueDecompose2dScale(transform, XY); + const actualScale = Math.fround(OutputScale.pixelRatio * PixelsPerInch.PDF_TO_CSS_UNITS); + return XY[0] <= actualScale && XY[1] <= actualScale; +} +const LINE_CAP_STYLES = ["butt", "round", "square"]; +const LINE_JOIN_STYLES = ["miter", "round", "bevel"]; +const NORMAL_CLIP = {}; +const EO_CLIP = {}; +class CanvasGraphics { + static #SCALE_MATRIX = null; + #knockoutGroupLevel = 0; + #knockoutElementDepth = 0; + #knockoutTempCanvasEntry = null; + #knockoutSavedCtx = null; + #knockoutSavedSMaskCtx = null; + #knockoutSavedGCO = null; + #knockoutElementAlpha = 1; + #knockoutFilterCache; + #knockoutElementGroupMeta = null; + #groupStackMeta = []; + constructor(canvasCtx, commonObjs, objs, canvasFactory, filterFactory, { + optionalContentConfig, + markedContentStack = null + }, annotationCanvasMap, pageColors, dependencyTracker, imagesTracker) { + this.ctx = canvasCtx; + this.current = new CanvasExtraState(this.ctx.canvas.width, this.ctx.canvas.height); + this.stateStack = []; + this.pendingClip = null; + this.pendingEOFill = false; + this.commonObjs = commonObjs; + this.objs = objs; + this.canvasFactory = canvasFactory; + this.filterFactory = filterFactory; + this.groupStack = []; + this.baseTransform = null; + this.baseTransformStack = []; + this.groupLevel = 0; + this.smaskStack = []; + this.tempSMask = null; + this.smaskGroupCanvases = []; + this.smaskPreparedEntry = null; + this.smaskPreparedFor = null; + this.smaskPreparedOffsetX = 0; + this.smaskPreparedOffsetY = 0; + this.smaskPreparedOOBAlpha = null; + this.suspendedCtx = null; + this.contentVisible = true; + this.markedContentStack = markedContentStack || []; + this.optionalContentConfig = optionalContentConfig; + this.cachedPatterns = new Map(); + this.annotationCanvasMap = annotationCanvasMap; + this.viewportScale = 1; + this.outputScaleX = 1; + this.outputScaleY = 1; + this.pageColors = pageColors; + this._cachedScaleForStroking = [-1, 0]; + this._cachedBitmapsMap = new Map(); + this.dependencyTracker = dependencyTracker ?? null; + this.imagesTracker = imagesTracker ?? null; + } + getObject(opIdx, data, fallback = null) { + if (typeof data === "string") { + this.dependencyTracker?.recordNamedDependency(opIdx, data); + return data.startsWith("g_") ? this.commonObjs.get(data) : this.objs.get(data); + } + return fallback; + } + beginDrawing({ + transform, + viewport, + transparency = false, + background = null + }) { + const width = this.ctx.canvas.width; + const height = this.ctx.canvas.height; + const savedFillStyle = this.ctx.fillStyle; + this.ctx.fillStyle = background || "#ffffff"; + this.ctx.fillRect(0, 0, width, height); + this.ctx.fillStyle = savedFillStyle; + if (transparency) { + const transparentCanvas = this.transparentCanvasEntry = this.canvasFactory.create(width, height); + this.compositeCtx = this.ctx; + ({ + canvas: this.transparentCanvas, + context: this.ctx + } = transparentCanvas); + this.ctx.save(); + this.ctx.transform(...getCurrentTransform(this.compositeCtx)); + } + this.ctx.save(); + resetCtxToDefault(this.ctx); + if (transform) { + this.ctx.transform(...transform); + this.outputScaleX = transform[0]; + this.outputScaleY = transform[3]; + } + this.ctx.transform(...viewport.transform); + this.viewportScale = viewport.scale; + this.baseTransform = getCurrentTransform(this.ctx); + } + executeOperatorList(operatorList, executionStartIdx, continueCallback, stepper, operationsFilter) { + const argsArray = operatorList.argsArray; + const fnArray = operatorList.fnArray; + let i = executionStartIdx || 0; + const argsArrayLen = argsArray.length; + if (argsArrayLen === i) { + return i; + } + const chunkOperations = argsArrayLen - i > EXECUTION_STEPS && typeof continueCallback === "function"; + const endTime = chunkOperations ? Date.now() + EXECUTION_TIME : 0; + let steps = 0; + const commonObjs = this.commonObjs; + const objs = this.objs; + let fnId, fnArgs; + while (true) { + if (stepper !== undefined) { + if (i === stepper.nextBreakPoint) { + stepper.breakIt(i, continueCallback); + return i; + } + if (stepper.shouldSkip(i)) { + if (++i === argsArrayLen) { + return i; + } + continue; + } + } + if (!operationsFilter || operationsFilter(i, operatorList)) { + fnId = fnArray[i]; + fnArgs = argsArray[i] ?? null; + if (fnId !== OPS.dependency) { + if (fnArgs === null) { + this[fnId](i); + } else { + this[fnId](i, ...fnArgs); + } + } else { + for (const depObjId of fnArgs) { + this.dependencyTracker?.recordNamedData(depObjId, i); + const objsPool = depObjId.startsWith("g_") ? commonObjs : objs; + if (!objsPool.has(depObjId)) { + objsPool.get(depObjId, continueCallback); + return i; + } + } + } + } + i++; + if (i === argsArrayLen) { + return i; + } + if (chunkOperations && ++steps > EXECUTION_STEPS) { + if (Date.now() > endTime) { + continueCallback(); + return i; + } + steps = 0; + } + } + } + #restoreInitialState() { + while (this.stateStack.length || this.inSMaskMode) { + this.restore(); + } + this.current.activeSMask = null; + this.ctx.restore(); + if (this.transparentCanvas) { + this.ctx = this.compositeCtx; + this.ctx.save(); + this.ctx.setTransform(1, 0, 0, 1, 0, 0); + this.ctx.drawImage(this.transparentCanvas, 0, 0); + this.ctx.restore(); + this.canvasFactory.destroy(this.transparentCanvasEntry); + this.transparentCanvas = null; + this.transparentCanvasEntry = null; + } + } + endDrawing() { + this.#restoreInitialState(); + for (const canvas of this.smaskGroupCanvases) { + this.canvasFactory.destroy(canvas); + } + this.smaskGroupCanvases.length = 0; + this._clearPreparedSMask(); + this.tempSMask = null; + this.smaskStack.length = 0; + for (const meta of this.#groupStackMeta) { + this.#destroyKnockoutPools(meta); + } + this.#groupStackMeta.length = 0; + this.#knockoutTempCanvasEntry = null; + this.#knockoutSavedCtx = null; + this.#knockoutSavedSMaskCtx = null; + this.#knockoutSavedGCO = null; + this.#knockoutElementAlpha = 1; + this.#knockoutElementGroupMeta = null; + this.#knockoutElementDepth = 0; + this.#knockoutGroupLevel = 0; + this.cachedPatterns.clear(); + for (const cache of this._cachedBitmapsMap.values()) { + for (const canvas of cache.values()) { + if (typeof HTMLCanvasElement !== "undefined" && canvas instanceof HTMLCanvasElement) { + canvas.width = canvas.height = 0; + } + } + cache.clear(); + } + this._cachedBitmapsMap.clear(); + this.#drawFilter(); + } + #drawFilter() { + if (this.pageColors) { + const hcmFilterId = this.filterFactory.addHCMFilter(this.pageColors.foreground, this.pageColors.background); + if (hcmFilterId !== "none") { + const savedFilter = this.ctx.filter; + this.ctx.filter = hcmFilterId; + this.ctx.drawImage(this.ctx.canvas, 0, 0); + this.ctx.filter = savedFilter; + } + } + } + _scaleImage(img, inverseTransform) { + const width = img.width ?? img.displayWidth; + const height = img.height ?? img.displayHeight; + const widthScale = Math.max(Math.hypot(inverseTransform[0], inverseTransform[1]), 1); + const heightScale = Math.max(Math.hypot(inverseTransform[2], inverseTransform[3]), 1); + const scaleSteps = []; + let ws = widthScale, + hs = heightScale, + pw = width, + ph = height; + while (ws > 2 && pw > 1 || hs > 2 && ph > 1) { + let nw = pw, + nh = ph; + if (ws > 2 && pw > 1) { + nw = Math.ceil(pw / 2); + ws /= pw / nw; + } + if (hs > 2 && ph > 1) { + nh = Math.ceil(ph / 2); + hs /= ph / nh; + } + scaleSteps.push({ + newWidth: nw, + newHeight: nh + }); + pw = nw; + ph = nh; + } + if (scaleSteps.length === 0) { + return { + img, + paintWidth: width, + paintHeight: height, + tmpCanvas: null + }; + } + if (scaleSteps.length === 1) { + const { + newWidth, + newHeight + } = scaleSteps[0]; + const tmpCanvas = this.canvasFactory.create(newWidth, newHeight); + tmpCanvas.context.drawImage(img, 0, 0, width, height, 0, 0, newWidth, newHeight); + return { + img: tmpCanvas.canvas, + paintWidth: newWidth, + paintHeight: newHeight, + tmpCanvas + }; + } + let readEntry = this.canvasFactory.create(1, 1); + let writeEntry = this.canvasFactory.create(1, 1); + let paintWidth = width, + paintHeight = height; + let source = img; + for (const { + newWidth, + newHeight + } of scaleSteps) { + this.canvasFactory.reset(writeEntry, newWidth, newHeight); + writeEntry.context.drawImage(source, 0, 0, paintWidth, paintHeight, 0, 0, newWidth, newHeight); + [readEntry, writeEntry] = [writeEntry, readEntry]; + source = readEntry.canvas; + paintWidth = newWidth; + paintHeight = newHeight; + } + this.canvasFactory.destroy(writeEntry); + return { + img: readEntry.canvas, + paintWidth, + paintHeight, + tmpCanvas: readEntry + }; + } + _createMaskCanvas(opIdx, img) { + const ctx = this.ctx; + const { + width, + height + } = img; + const isPatternFill = this.current.patternFill; + const fillColor = isPatternFill ? this.current.fillColor : ctx.fillStyle; + const currentTransform = getCurrentTransform(ctx); + let cache, cacheKey, scaled, maskCanvas; + if ((img.bitmap || img.data) && img.count > 1) { + const mainKey = img.bitmap || img.data.buffer; + cacheKey = JSON.stringify(isPatternFill ? currentTransform : [currentTransform.slice(0, 4), fillColor]); + cache = this._cachedBitmapsMap.getOrInsertComputed(mainKey, makeMap); + const cachedImage = cache.get(cacheKey); + if (cachedImage && !isPatternFill) { + const offsetX = Math.round(Math.min(currentTransform[0], currentTransform[2]) + currentTransform[4]); + const offsetY = Math.round(Math.min(currentTransform[1], currentTransform[3]) + currentTransform[5]); + this.dependencyTracker?.recordDependencies(opIdx, Dependencies.transformAndFill); + return { + canvas: cachedImage, + offsetX, + offsetY + }; + } + scaled = cachedImage; + } + if (!scaled) { + maskCanvas = this.canvasFactory.create(width, height); + putBinaryImageMask(maskCanvas.context, img); + } + let maskToCanvas = Util.transform(currentTransform, [1 / width, 0, 0, -1 / height, 0, 0]); + maskToCanvas = Util.transform(maskToCanvas, [1, 0, 0, 1, 0, -height]); + const minMax = F32_BBOX_INIT.slice(); + Util.axialAlignedBoundingBox([0, 0, width, height], maskToCanvas, minMax); + const [minX, minY, maxX, maxY] = minMax; + const drawnWidth = Math.round(maxX - minX) || 1; + const drawnHeight = Math.round(maxY - minY) || 1; + const fillCanvas = this.canvasFactory.create(drawnWidth, drawnHeight); + const fillCtx = fillCanvas.context; + const offsetX = minX; + const offsetY = minY; + fillCtx.translate(-offsetX, -offsetY); + fillCtx.transform(...maskToCanvas); + let scaledEntry = null; + if (!scaled) { + const scaleResult = this._scaleImage(maskCanvas.canvas, getCurrentTransformInverse(fillCtx)); + scaled = scaleResult.img; + scaledEntry = scaleResult.tmpCanvas; + if (scaled !== maskCanvas.canvas) { + this.canvasFactory.destroy(maskCanvas); + maskCanvas = null; + } + if (cache && isPatternFill) { + cache.set(cacheKey, scaled); + scaledEntry = null; + maskCanvas = null; + } + } + fillCtx.imageSmoothingEnabled = getImageSmoothingEnabled(getCurrentTransform(fillCtx), img.interpolate); + drawImageAtIntegerCoords(fillCtx, scaled, 0, 0, scaled.width, scaled.height, 0, 0, width, height); + if (scaledEntry) { + this.canvasFactory.destroy(scaledEntry); + } + if (maskCanvas) { + this.canvasFactory.destroy(maskCanvas); + } + fillCtx.globalCompositeOperation = "source-in"; + const inverse = Util.transform(getCurrentTransformInverse(fillCtx), [1, 0, 0, 1, -offsetX, -offsetY]); + fillCtx.fillStyle = isPatternFill ? fillColor.getPattern(ctx, this, inverse, PathType.FILL, opIdx) : fillColor; + fillCtx.fillRect(0, 0, width, height); + if (cache && !isPatternFill) { + cache.set(cacheKey, fillCanvas.canvas); + } + this.dependencyTracker?.recordDependencies(opIdx, Dependencies.transformAndFill); + return { + canvas: fillCanvas.canvas, + canvasEntry: cache && !isPatternFill ? null : fillCanvas, + offsetX: Math.round(offsetX), + offsetY: Math.round(offsetY) + }; + } + setLineWidth(opIdx, width) { + this.dependencyTracker?.recordSimpleData("lineWidth", opIdx); + if (width !== this.current.lineWidth) { + this._cachedScaleForStroking[0] = -1; + } + this.current.lineWidth = width; + this.ctx.lineWidth = width; + } + setLineCap(opIdx, style) { + this.dependencyTracker?.recordSimpleData("lineCap", opIdx); + this.ctx.lineCap = LINE_CAP_STYLES[style]; + } + setLineJoin(opIdx, style) { + this.dependencyTracker?.recordSimpleData("lineJoin", opIdx); + this.ctx.lineJoin = LINE_JOIN_STYLES[style]; + } + setMiterLimit(opIdx, limit) { + this.dependencyTracker?.recordSimpleData("miterLimit", opIdx); + this.ctx.miterLimit = limit; + } + setDash(opIdx, dashArray, dashPhase) { + this.dependencyTracker?.recordSimpleData("dash", opIdx); + const ctx = this.ctx; + if (ctx.setLineDash !== undefined) { + ctx.setLineDash(dashArray); + ctx.lineDashOffset = dashPhase; + } + } + setRenderingIntent(opIdx, intent) {} + setFlatness(opIdx, flatness) {} + setGState(opIdx, states) { + for (const [key, value] of states) { + switch (key) { + case "LW": + this.setLineWidth(opIdx, value); + break; + case "LC": + this.setLineCap(opIdx, value); + break; + case "LJ": + this.setLineJoin(opIdx, value); + break; + case "ML": + this.setMiterLimit(opIdx, value); + break; + case "D": + this.setDash(opIdx, value[0], value[1]); + break; + case "RI": + this.setRenderingIntent(opIdx, value); + break; + case "FL": + this.setFlatness(opIdx, value); + break; + case "Font": + this.setFont(opIdx, value[0], value[1]); + break; + case "CA": + this.dependencyTracker?.recordSimpleData("strokeAlpha", opIdx); + this.current.strokeAlpha = value; + break; + case "ca": + this.dependencyTracker?.recordSimpleData("fillAlpha", opIdx); + this.ctx.globalAlpha = this.current.fillAlpha = value; + break; + case "BM": + this.dependencyTracker?.recordSimpleData("globalCompositeOperation", opIdx); + this.ctx.globalCompositeOperation = value; + break; + case "SMask": + this.dependencyTracker?.recordSimpleData("SMask", opIdx); + this.current.activeSMask = value ? this.tempSMask : null; + if (this.current.activeSMask) { + this.current.activeSMask.blendMode = this.ctx.globalCompositeOperation; + } + this.tempSMask = null; + this.checkSMaskState(opIdx); + break; + case "TR": + { + this.dependencyTracker?.recordSimpleData("filter", opIdx); + let filter = this.filterFactory.addFilter(value); + this.ctx.filter = filter; + let fallback = null; + if (value && (filter === "none" || !FeatureTest.isCanvasFilterSupported || this.ctx.filter === "none" || this.ctx.filter === "")) { + this.ctx.filter = filter = "none"; + fallback = new TransferMapsFallback(value); + } + this.current.transferMaps = filter; + if (fallback || this.current.transferMapsFallback) { + this.current.transferMapsFallback = fallback; + if (!this.current.patternFill) { + this.ctx.fillStyle = this.#transferColor(this.current.fillColor); + } + if (!this.current.patternStroke) { + this.ctx.strokeStyle = this.#transferColor(this.current.strokeColor); + } + } + break; + } + } + } + } + get inSMaskMode() { + return !!this.suspendedCtx; + } + _clearPreparedSMask() { + if (this.smaskPreparedEntry) { + this.canvasFactory.destroy(this.smaskPreparedEntry); + this.smaskPreparedEntry = null; + } + this.smaskPreparedFor = null; + this.smaskPreparedOffsetX = 0; + this.smaskPreparedOffsetY = 0; + this.smaskPreparedOOBAlpha = null; + } + _ensurePreparedSMask(smask) { + if (smask === this.smaskPreparedFor) { + return; + } + this._clearPreparedSMask(); + this._prepareSMaskCanvas(smask); + } + checkSMaskState(opIdx) { + const inSMaskMode = this.inSMaskMode; + if (this.current.activeSMask && !inSMaskMode) { + this.beginSMaskMode(opIdx); + } else if (!this.current.activeSMask && inSMaskMode) { + this.endSMaskMode(); + } else if (this.current.activeSMask && inSMaskMode) { + this._ensurePreparedSMask(this.current.activeSMask); + } + } + _prepareSMaskCanvas(smask) { + const { + canvas: maskCanvas, + subtype, + backdrop, + transferMap + } = smask; + const hasFilter = subtype === "Luminosity" || subtype === "Alpha" && transferMap; + if (!hasFilter && !(subtype === "Luminosity" && backdrop)) { + this.smaskPreparedFor = smask; + return; + } + let filteredOOBAlpha; + if (subtype === "Luminosity" && backdrop) { + const [r, g, b] = getRGBA(backdrop); + const inputAlpha = Math.round(0.3 * r + 0.59 * g + 0.11 * b); + filteredOOBAlpha = transferMap?.[inputAlpha] ?? inputAlpha; + } else { + filteredOOBAlpha = transferMap?.[0] ?? 0; + } + const SMASK_LAYER_TO_MASK_AREA_RATIO = 4; + const { + width: layerW, + height: layerH + } = this.ctx.canvas; + const maskArea = maskCanvas.width * maskCanvas.height; + const useLayerSize = layerW * layerH < SMASK_LAYER_TO_MASK_AREA_RATIO * maskArea; + const filterSpec = hasFilter ? { + url: subtype === "Alpha" ? this.filterFactory.addAlphaFilter(transferMap) : this.filterFactory.addLuminosityFilter(transferMap), + subtype, + transferMap + } : null; + const bakedBackdrop = subtype === "Luminosity" ? backdrop : null; + let preparedEntry, offsetX, offsetY; + if (useLayerSize) { + preparedEntry = this._bakeSMaskCanvas(maskCanvas, smask.offsetX, smask.offsetY, layerW, layerH, bakedBackdrop, filterSpec); + offsetX = 0; + offsetY = 0; + } else { + preparedEntry = this._bakeSMaskCanvas(maskCanvas, 0, 0, maskCanvas.width, maskCanvas.height, bakedBackdrop, filterSpec); + offsetX = smask.offsetX; + offsetY = smask.offsetY; + } + this.smaskPreparedEntry = preparedEntry; + this.smaskPreparedFor = smask; + this.smaskPreparedOffsetX = offsetX; + this.smaskPreparedOffsetY = offsetY; + this.smaskPreparedOOBAlpha = !useLayerSize && filteredOOBAlpha !== 0 ? filteredOOBAlpha : null; + } + _bakeSMaskCanvas(maskCanvas, drawX, drawY, w, h, backdrop, filterSpec) { + if (!backdrop && !filterSpec) { + unreachable("_bakeSMaskCanvas with neither backdrop nor filter"); + } + const srcEntry = this.canvasFactory.create(w, h); + const sCtx = srcEntry.context; + sCtx.drawImage(maskCanvas, drawX, drawY); + if (backdrop) { + sCtx.globalCompositeOperation = "destination-atop"; + sCtx.fillStyle = backdrop; + sCtx.fillRect(0, 0, w, h); + } + if (!filterSpec) { + return srcEntry; + } + const preparedEntry = this.canvasFactory.create(w, h); + const pCtx = preparedEntry.context; + pCtx.filter = filterSpec.url; + const filterApplied = FeatureTest.isCanvasFilterSupported && pCtx.filter !== "none" && pCtx.filter !== ""; + pCtx.drawImage(srcEntry.canvas, 0, 0); + if (FeatureTest.isCanvasFilterSupported) { + pCtx.filter = "none"; + } + if (!filterApplied) { + const img = pCtx.getImageData(0, 0, w, h); + const { + data + } = img; + const { + transferMap + } = filterSpec; + if (filterSpec.subtype === "Luminosity") { + for (let i = 0, ii = data.length; i < ii; i += 4) { + const a = 0.3 * data[i] + 0.59 * data[i + 1] + 0.11 * data[i + 2] + 0.5 | 0; + data[i] = data[i + 1] = data[i + 2] = 0; + data[i + 3] = transferMap?.[a] ?? a; + } + } else { + for (let i = 3, ii = data.length; i < ii; i += 4) { + data[i] = transferMap[data[i]]; + } + } + pCtx.putImageData(img, 0, 0); + } + this.canvasFactory.destroy(srcEntry); + return preparedEntry; + } + beginSMaskMode(opIdx) { + if (this.inSMaskMode) { + throw new Error("beginSMaskMode called while already in smask mode"); + } + const { + width: drawnWidth, + height: drawnHeight + } = this.ctx.canvas; + const scratchCanvas = this.canvasFactory.create(drawnWidth, drawnHeight); + this.smaskScratchCanvas = scratchCanvas; + this.suspendedCtx = this.ctx; + const ctx = this.ctx = scratchCanvas.context; + ctx.setTransform(this.suspendedCtx.getTransform()); + copyCtxState(this.suspendedCtx, ctx); + mirrorContextOperations(ctx, this.suspendedCtx); + this._ensurePreparedSMask(this.current.activeSMask); + this.setGState(opIdx, [["BM", "source-over"]]); + } + endSMaskMode() { + if (!this.inSMaskMode) { + throw new Error("endSMaskMode called while not in smask mode"); + } + this.ctx._removeMirroring(); + copyCtxState(this.ctx, this.suspendedCtx); + this.ctx = this.suspendedCtx; + this.suspendedCtx = null; + this.canvasFactory.destroy(this.smaskScratchCanvas); + this.smaskScratchCanvas = null; + this._clearPreparedSMask(); + } + #createKnockoutMaskCanvas(sourceCanvas, reuseEntry = null, alpha = 1) { + const { + width, + height + } = sourceCanvas; + const maskEntry = reuseEntry ?? this.canvasFactory.create(width, height); + const maskCtx = maskEntry.context; + alpha = Math.round(alpha * 255) / 255; + const needsAlphaScaling = alpha < 1; + if (needsAlphaScaling && this.#knockoutFilterCache === undefined) { + this.#knockoutFilterCache = FeatureTest.isCanvasFilterSupported ? new Map() : "none"; + } + let knockoutFilter = "none"; + if (needsAlphaScaling && this.#knockoutFilterCache instanceof Map) { + knockoutFilter = this.#knockoutFilterCache.getOrInsertComputed(alpha, () => this.filterFactory.addKnockoutFilter(alpha)); + } + if (!needsAlphaScaling || knockoutFilter !== "none") { + if (reuseEntry) { + maskCtx.save(); + maskCtx.setTransform(1, 0, 0, 1, 0, 0); + maskCtx.clearRect(0, 0, width, height); + maskCtx.restore(); + } + maskCtx.filter = knockoutFilter; + maskCtx.drawImage(sourceCanvas, 0, 0); + maskCtx.filter = "none"; + return maskEntry; + } + const sourceData = sourceCanvas.getContext("2d", { + willReadFrequently: true + }).getImageData(0, 0, width, height); + const maskData = maskCtx.createImageData(width, height); + const sourcePixels = sourceData.data, + maskPixels = maskData.data; + const alphaScale = alpha > 0 ? 1 / alpha : 1e6; + for (let i = 3, ii = sourcePixels.length; i < ii; i += 4) { + maskPixels[i] = Math.min(Math.round(sourcePixels[i] * alphaScale), 255); + } + maskCtx.putImageData(maskData, 0, 0); + return maskEntry; + } + #getOrCreatePooledEntry(meta, key, width, height) { + let entry = meta?.[key] ?? null; + if (entry && (entry.canvas.width !== width || entry.canvas.height !== height)) { + this.canvasFactory.destroy(entry); + entry = null; + } + if (!entry) { + entry = this.canvasFactory.create(width, height); + if (meta) { + meta[key] = entry; + } + return entry; + } + const ctx = entry.context; + ctx.save(); + ctx.setTransform(1, 0, 0, 1, 0, 0); + ctx.clearRect(0, 0, width, height); + ctx.restore(); + return entry; + } + #compositeKnockoutSurface(destCtx, surfaceCanvas, options = {}) { + const { + backdropCanvas = null, + destTransform = [1, 0, 0, 1, 0, 0], + backdropOffset = [0, 0], + reuseMaskEntry = null, + poolMeta = null, + sourceAlpha = 1, + sourceFilter = "none", + knockoutAlpha = 1 + } = options; + const { + width, + height + } = surfaceCanvas; + const knockoutMaskEntry = this.#createKnockoutMaskCanvas(surfaceCanvas, reuseMaskEntry, knockoutAlpha); + const sourceCompositeOperation = destCtx.globalCompositeOperation; + destCtx.save(); + destCtx.setTransform(...destTransform); + destCtx.globalAlpha = 1; + if (FeatureTest.isCanvasFilterSupported) { + destCtx.filter = "none"; + } + destCtx.globalCompositeOperation = "destination-out"; + destCtx.drawImage(knockoutMaskEntry.canvas, 0, 0); + if (backdropCanvas) { + const [bx, by] = backdropOffset; + const backdropEntry = this.#getOrCreatePooledEntry(poolMeta, "knockoutBackdropEntry", width, height); + const backdropCtx = backdropEntry.context; + backdropCtx.drawImage(backdropCanvas, bx, by, width, height, 0, 0, width, height); + backdropCtx.globalCompositeOperation = "destination-in"; + backdropCtx.drawImage(knockoutMaskEntry.canvas, 0, 0); + backdropCtx.globalCompositeOperation = "source-over"; + destCtx.globalCompositeOperation = "destination-over"; + destCtx.drawImage(backdropEntry.canvas, 0, 0); + if (!poolMeta) { + this.canvasFactory.destroy(backdropEntry); + } + } + destCtx.globalCompositeOperation = sourceCompositeOperation; + destCtx.globalAlpha = sourceAlpha; + if (FeatureTest.isCanvasFilterSupported) { + destCtx.filter = sourceFilter ?? "none"; + } + destCtx.drawImage(surfaceCanvas, 0, 0); + destCtx.restore(); + if (!reuseMaskEntry) { + this.canvasFactory.destroy(knockoutMaskEntry); + } + } + #beginKnockoutElement(alpha = 1) { + if (this.#knockoutGroupLevel === 0 || this.#knockoutElementDepth > 0 || !this.contentVisible) { + return false; + } + this.#knockoutElementDepth++; + this.#knockoutElementAlpha = alpha; + const groupMeta = this.#groupStackMeta.at(-1); + const { + canvas + } = this.ctx; + const tempEntry = this.#getOrCreatePooledEntry(groupMeta, "knockoutTempEntry", canvas.width, canvas.height); + this.#knockoutTempCanvasEntry = tempEntry; + const tempCtx = tempEntry.context; + tempCtx.save(); + tempCtx.setTransform(this.ctx.getTransform()); + copyCtxState(this.ctx, tempCtx); + this.#knockoutSavedGCO = tempCtx.globalCompositeOperation; + tempCtx.globalCompositeOperation = "source-over"; + mirrorContextOperations(tempCtx, this.ctx); + this.#knockoutElementGroupMeta = groupMeta; + this.#knockoutSavedCtx = this.ctx; + this.#knockoutSavedSMaskCtx = this.suspendedCtx; + this.ctx = tempCtx; + if (this.inSMaskMode) { + this.suspendedCtx = tempCtx; + } + return true; + } + #endKnockoutElement(started) { + if (!started) { + return; + } + const tempEntry = this.#knockoutTempCanvasEntry; + const savedCtx = this.#knockoutSavedCtx; + const savedSMaskCtx = this.#knockoutSavedSMaskCtx; + const tempCtx = tempEntry.context; + this.#knockoutTempCanvasEntry = null; + this.#knockoutSavedCtx = null; + this.#knockoutSavedSMaskCtx = null; + if (this.inSMaskMode && this.suspendedCtx === tempCtx && this.ctx !== tempCtx) { + this.endSMaskMode(); + } + if (this.inSMaskMode) { + this.suspendedCtx = savedSMaskCtx; + } + this.ctx._removeMirroring(); + this.ctx.globalCompositeOperation = this.#knockoutSavedGCO; + this.#knockoutSavedGCO = null; + copyCtxState(this.ctx, savedCtx); + this.ctx = savedCtx; + const groupMeta = this.#knockoutElementGroupMeta; + this.#knockoutElementGroupMeta = null; + const knockoutAlpha = this.#knockoutElementAlpha; + this.#knockoutElementAlpha = 1; + try { + this.#compositeKnockoutSurface(savedSMaskCtx ?? savedCtx, tempEntry.canvas, { + backdropCanvas: groupMeta?.backdropCtx?.canvas ?? null, + backdropOffset: groupMeta?.backdropCtx ? [groupMeta.offsetX, groupMeta.offsetY] : [0, 0], + reuseMaskEntry: groupMeta?.knockoutMaskEntry ?? null, + poolMeta: groupMeta, + knockoutAlpha + }); + } finally { + tempCtx.restore(); + this.#knockoutElementDepth--; + if (!groupMeta) { + this.canvasFactory.destroy(tempEntry); + } + } + } + compose(dirtyBox) { + if (!this.current.activeSMask) { + return; + } + dirtyBox = dirtyBox ? [Math.floor(dirtyBox[0]), Math.floor(dirtyBox[1]), Math.ceil(dirtyBox[2]), Math.ceil(dirtyBox[3])] : [0, 0, this.ctx.canvas.width, this.ctx.canvas.height]; + const smask = this.current.activeSMask; + const suspendedCtx = this.suspendedCtx; + const applySMaskInPlace = this.#knockoutElementDepth > 0 && suspendedCtx === this.ctx; + this.composeSMask(applySMaskInPlace ? null : suspendedCtx, smask, this.ctx, dirtyBox); + if (applySMaskInPlace) { + return; + } + this.ctx.save(); + this.ctx.setTransform(1, 0, 0, 1, 0, 0); + this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height); + this.ctx.restore(); + } + composeSMask(ctx, smask, layerCtx, layerBox) { + const layerOffsetX = layerBox[0]; + const layerOffsetY = layerBox[1]; + const layerWidth = layerBox[2] - layerOffsetX; + const layerHeight = layerBox[3] - layerOffsetY; + if (layerWidth === 0 || layerHeight === 0) { + return; + } + const preparedEntry = this.smaskPreparedEntry; + if (preparedEntry) { + let clipX = layerOffsetX; + let clipY = layerOffsetY; + let clipW = layerWidth; + let clipH = layerHeight; + const oobAlpha = this.smaskPreparedOOBAlpha; + const hasOOBAlpha = oobAlpha !== null; + if (hasOOBAlpha) { + clipX = Math.max(layerOffsetX, smask.offsetX); + clipY = Math.max(layerOffsetY, smask.offsetY); + const x1 = Math.min(layerOffsetX + layerWidth, smask.offsetX + smask.canvas.width); + const y1 = Math.min(layerOffsetY + layerHeight, smask.offsetY + smask.canvas.height); + clipW = x1 - clipX; + clipH = y1 - clipY; + } + if (clipW > 0 && clipH > 0) { + const srcX = clipX - this.smaskPreparedOffsetX; + const srcY = clipY - this.smaskPreparedOffsetY; + layerCtx.save(); + layerCtx.globalAlpha = 1; + layerCtx.setTransform(1, 0, 0, 1, 0, 0); + const clip = new Path2D(); + clip.rect(clipX, clipY, clipW, clipH); + layerCtx.clip(clip); + layerCtx.globalCompositeOperation = "destination-in"; + layerCtx.drawImage(preparedEntry.canvas, srcX, srcY, clipW, clipH, clipX, clipY, clipW, clipH); + layerCtx.restore(); + } + if (hasOOBAlpha && oobAlpha < 255) { + this._applySMaskOOBAlpha(layerCtx, layerOffsetX, layerOffsetY, layerWidth, layerHeight, clipX, clipY, clipX + clipW, clipY + clipH, oobAlpha); + } + } else { + this.genericComposeSMask(smask, layerCtx, layerWidth, layerHeight, layerOffsetX, layerOffsetY); + } + if (!ctx) { + return; + } + ctx.save(); + ctx.globalAlpha = 1; + ctx.globalCompositeOperation = smask.blendMode || "source-over"; + ctx.setTransform(1, 0, 0, 1, 0, 0); + ctx.drawImage(layerCtx.canvas, layerOffsetX, layerOffsetY, layerWidth, layerHeight, layerOffsetX, layerOffsetY, layerWidth, layerHeight); + ctx.restore(); + } + _applySMaskOOBAlpha(layerCtx, layerOffsetX, layerOffsetY, layerWidth, layerHeight, maskX0, maskY0, maskX1, maskY1, alpha) { + const hasInnerCutout = maskX0 < maskX1 && maskY0 < maskY1; + if (hasInnerCutout && maskX0 === layerOffsetX && maskY0 === layerOffsetY && maskX1 === layerOffsetX + layerWidth && maskY1 === layerOffsetY + layerHeight) { + return; + } + const path = new Path2D(); + path.rect(layerOffsetX, layerOffsetY, layerWidth, layerHeight); + if (hasInnerCutout) { + path.rect(maskX0, maskY0, maskX1 - maskX0, maskY1 - maskY0); + } + layerCtx.save(); + layerCtx.globalAlpha = alpha / 255; + layerCtx.setTransform(1, 0, 0, 1, 0, 0); + layerCtx.clip(path, "evenodd"); + layerCtx.globalCompositeOperation = "destination-in"; + layerCtx.fillStyle = "#000000"; + layerCtx.fillRect(layerOffsetX, layerOffsetY, layerWidth, layerHeight); + layerCtx.restore(); + } + genericComposeSMask(smask, layerCtx, width, height, layerOffsetX, layerOffsetY) { + const { + context: maskCtx, + offsetX: maskOffsetX, + offsetY: maskOffsetY + } = smask; + layerCtx.save(); + layerCtx.globalAlpha = 1; + layerCtx.setTransform(1, 0, 0, 1, 0, 0); + const clip = new Path2D(); + clip.rect(layerOffsetX, layerOffsetY, width, height); + layerCtx.clip(clip); + layerCtx.globalCompositeOperation = "destination-in"; + layerCtx.drawImage(maskCtx.canvas, layerOffsetX - maskOffsetX, layerOffsetY - maskOffsetY, width, height, layerOffsetX, layerOffsetY, width, height); + layerCtx.restore(); + } + save(opIdx) { + if (this.inSMaskMode) { + copyCtxState(this.ctx, this.suspendedCtx); + } + this.ctx.save(); + const old = this.current; + this.stateStack.push(old); + this.current = old.clone(); + this.dependencyTracker?.save(opIdx); + } + restore(opIdx) { + this.dependencyTracker?.restore(opIdx); + if (this.stateStack.length === 0) { + if (this.inSMaskMode) { + this.endSMaskMode(); + } + return; + } + this.current = this.stateStack.pop(); + this.ctx.restore(); + if (this.inSMaskMode) { + copyCtxState(this.suspendedCtx, this.ctx); + this.ctx.setTransform(this.suspendedCtx.getTransform()); + } + this.checkSMaskState(opIdx); + this.pendingClip = null; + this._cachedScaleForStroking[0] = -1; + } + transform(opIdx, a, b, c, d, e, f) { + this.dependencyTracker?.recordIncrementalData("transform", opIdx); + this.ctx.transform(a, b, c, d, e, f); + this._cachedScaleForStroking[0] = -1; + } + constructPath(opIdx, op, data, minMax) { + let [path] = data; + if (!minMax) { + path ||= data[0] = new Path2D(); + if (op !== OPS.stroke && op !== OPS.closeStroke) { + this.current.tilingPatternDims = null; + } + this[op](opIdx, path); + return; + } + if (this.dependencyTracker !== null) { + const outerExtraSize = op === OPS.stroke ? this.current.lineWidth / 2 : 0; + this.dependencyTracker.resetBBox(opIdx).recordBBox(opIdx, this.ctx, minMax[0] - outerExtraSize, minMax[2] + outerExtraSize, minMax[1] - outerExtraSize, minMax[3] + outerExtraSize).recordDependencies(opIdx, ["transform"]); + } + if (!(path instanceof Path2D)) { + path = data[0] = makePathFromDrawOPS(path); + } + Util.axialAlignedBoundingBox(minMax, getCurrentTransform(this.ctx), this.current.minMax); + const tilingDims = this.current.tilingPatternDims; + if (tilingDims && op !== OPS.stroke && op !== OPS.closeStroke && this.current.fillColor instanceof TilingPattern) { + const clippedBBox = Util.intersect(this.current.clipBox, this.current.minMax); + if (!clippedBBox) { + this.current.tilingPatternDims = null; + } else { + this.current.fillColor.updatePatternDims(clippedBBox, tilingDims); + } + } + this[op](opIdx, path); + this._pathStartIdx = opIdx; + } + closePath(opIdx) { + this.ctx.closePath(); + } + stroke(opIdx, path, consumePath = true) { + const started = consumePath && this.#beginKnockoutElement(this.current.strokeAlpha); + const ctx = this.ctx; + const strokeColor = this.current.strokeColor; + ctx.globalAlpha = this.current.strokeAlpha; + if (this.contentVisible) { + if (typeof strokeColor === "object" && strokeColor?.getPattern) { + const baseTransform = strokeColor.isModifyingCurrentTransform() ? ctx.getTransform() : null; + ctx.save(); + ctx.strokeStyle = strokeColor.getPattern(ctx, this, getCurrentTransformInverse(ctx), PathType.STROKE, opIdx); + if (baseTransform) { + const newPath = new Path2D(); + newPath.addPath(path, ctx.getTransform().invertSelf().multiplySelf(baseTransform)); + path = newPath; + } + this.rescaleAndStroke(path, false); + ctx.restore(); + } else { + this.rescaleAndStroke(path, true); + } + } + this.dependencyTracker?.recordDependencies(opIdx, Dependencies.stroke); + if (consumePath) { + this.consumePath(opIdx, path, this.current.getClippedPathBoundingBox(PathType.STROKE, getCurrentTransform(this.ctx))); + } + ctx.globalAlpha = this.current.fillAlpha; + this.#endKnockoutElement(started); + } + closeStroke(opIdx, path) { + this.stroke(opIdx, path); + } + fill(opIdx, path, consumePath = true) { + const started = consumePath && this.#beginKnockoutElement(this.current.fillAlpha); + const ctx = this.ctx; + const fillColor = this.current.fillColor; + const isPatternFill = this.current.patternFill; + let needRestore = false; + const intersect = this.current.getClippedPathBoundingBox(); + this.dependencyTracker?.recordDependencies(opIdx, Dependencies.fill); + if (isPatternFill) { + const dims = this.current.tilingPatternDims; + const tileIdx = dims && fillColor.canSkipPatternCanvas(dims); + if (tileIdx) { + fillColor.drawPattern(this, path, this.pendingEOFill, tileIdx, opIdx); + this.pendingEOFill = false; + if (consumePath) { + this.consumePath(opIdx, path, intersect); + } + this.current.tilingPatternDims = null; + this.#endKnockoutElement(started); + return; + } + const baseTransform = fillColor.isModifyingCurrentTransform() ? ctx.getTransform() : null; + this.dependencyTracker?.save(opIdx); + ctx.save(); + ctx.fillStyle = fillColor.getPattern(ctx, this, getCurrentTransformInverse(ctx), PathType.FILL, opIdx); + if (baseTransform) { + const newPath = new Path2D(); + newPath.addPath(path, ctx.getTransform().invertSelf().multiplySelf(baseTransform)); + path = newPath; + } + needRestore = true; + } + if (this.contentVisible && intersect !== null) { + if (this.pendingEOFill) { + ctx.fill(path, "evenodd"); + this.pendingEOFill = false; + } else { + ctx.fill(path); + } + } + if (needRestore) { + ctx.restore(); + this.dependencyTracker?.restore(opIdx); + } + if (consumePath) { + this.consumePath(opIdx, path, intersect); + } + this.#endKnockoutElement(started); + } + eoFill(opIdx, path) { + this.pendingEOFill = true; + this.fill(opIdx, path); + } + fillStroke(opIdx, path) { + const started = this.#beginKnockoutElement(Math.min(this.current.fillAlpha, this.current.strokeAlpha)); + this.fill(opIdx, path, false); + this.stroke(opIdx, path, false); + this.consumePath(opIdx, path); + this.#endKnockoutElement(started); + } + eoFillStroke(opIdx, path) { + this.pendingEOFill = true; + this.fillStroke(opIdx, path); + } + closeFillStroke(opIdx, path) { + this.fillStroke(opIdx, path); + } + closeEOFillStroke(opIdx, path) { + this.pendingEOFill = true; + this.fillStroke(opIdx, path); + } + endPath(opIdx, path) { + this.consumePath(opIdx, path); + } + rawFillPath(opIdx, path) { + const started = this.#beginKnockoutElement(this.current.fillAlpha); + this.ctx.fill(path); + this.dependencyTracker?.recordDependencies(opIdx, Dependencies.rawFillPath).recordOperation(opIdx); + this.#endKnockoutElement(started); + } + clip(opIdx) { + this.dependencyTracker?.recordFutureForcedDependency("clipMode", opIdx); + this.pendingClip = NORMAL_CLIP; + } + eoClip(opIdx) { + this.dependencyTracker?.recordFutureForcedDependency("clipMode", opIdx); + this.pendingClip = EO_CLIP; + } + beginText(opIdx) { + this.current.textMatrix = null; + this.current.textMatrixScale = 1; + this.current.x = this.current.lineX = 0; + this.current.y = this.current.lineY = 0; + this.dependencyTracker?.recordOpenMarker(opIdx).resetIncrementalData("sameLineText").resetIncrementalData("moveText", opIdx); + } + endText(opIdx) { + const paths = this.pendingTextPaths; + const ctx = this.ctx; + if (this.dependencyTracker) { + const { + dependencyTracker + } = this; + if (paths !== undefined) { + dependencyTracker.recordFutureForcedDependency("textClip", dependencyTracker.getOpenMarker()).recordFutureForcedDependency("textClip", opIdx); + } + dependencyTracker.recordCloseMarker(opIdx); + } + if (paths !== undefined) { + const newPath = new Path2D(); + const invTransf = ctx.getTransform().invertSelf(); + for (const { + transform, + x, + y, + fontSize, + path + } of paths) { + if (!path) { + continue; + } + newPath.addPath(path, new DOMMatrix(transform).preMultiplySelf(invTransf).translate(x, y).scale(fontSize, -fontSize)); + } + ctx.clip(newPath); + } + delete this.pendingTextPaths; + } + setCharSpacing(opIdx, spacing) { + this.dependencyTracker?.recordSimpleData("charSpacing", opIdx); + this.current.charSpacing = spacing; + } + setWordSpacing(opIdx, spacing) { + this.dependencyTracker?.recordSimpleData("wordSpacing", opIdx); + this.current.wordSpacing = spacing; + } + setHScale(opIdx, scale) { + this.dependencyTracker?.recordSimpleData("hScale", opIdx); + this.current.textHScale = scale / 100; + } + setLeading(opIdx, leading) { + this.dependencyTracker?.recordSimpleData("leading", opIdx); + this.current.leading = -leading; + } + setFont(opIdx, fontRefName, size) { + this.dependencyTracker?.recordSimpleData("font", opIdx).recordSimpleDataFromNamed("fontObj", fontRefName, opIdx); + const fontObj = this.commonObjs.get(fontRefName); + const current = this.current; + if (!fontObj) { + throw new Error(`Can't find font for ${fontRefName}`); + } + current.fontMatrix = fontObj.fontMatrix || FONT_IDENTITY_MATRIX; + if (current.fontMatrix[0] === 0 || current.fontMatrix[3] === 0) { + warn("Invalid font matrix for font " + fontRefName); + } + if (size < 0) { + size = -size; + current.fontDirection = -1; + } else { + current.fontDirection = 1; + } + this.current.font = fontObj; + this.current.fontSize = size; + if (fontObj.isType3Font) { + return; + } + const name = fontObj.loadedName || "sans-serif"; + const typeface = fontObj.systemFontInfo?.css || `"${name}", ${fontObj.fallbackName}`; + let bold = "normal"; + if (fontObj.black) { + bold = "900"; + } else if (fontObj.bold) { + bold = "bold"; + } + const italic = fontObj.italic ? "italic" : "normal"; + const browserFontSize = MathClamp(size, MIN_FONT_SIZE, MAX_FONT_SIZE); + this.current.fontSizeScale = size / browserFontSize; + this.ctx.font = `${italic} ${bold} ${browserFontSize}px ${typeface}`; + } + setTextRenderingMode(opIdx, mode) { + this.dependencyTracker?.recordSimpleData("textRenderingMode", opIdx); + this.current.textRenderingMode = mode; + } + setTextRise(opIdx, rise) { + this.dependencyTracker?.recordSimpleData("textRise", opIdx); + this.current.textRise = rise; + } + moveText(opIdx, x, y) { + this.dependencyTracker?.resetIncrementalData("sameLineText").recordIncrementalData("moveText", opIdx); + this.current.x = this.current.lineX += x; + this.current.y = this.current.lineY += y; + } + setLeadingMoveText(opIdx, x, y) { + this.setLeading(opIdx, -y); + this.moveText(opIdx, x, y); + } + setTextMatrix(opIdx, matrix) { + this.dependencyTracker?.resetIncrementalData("sameLineText").recordSimpleData("textMatrix", opIdx); + const { + current + } = this; + current.textMatrix = matrix; + current.textMatrixScale = Math.hypot(matrix[0], matrix[1]); + current.x = current.lineX = 0; + current.y = current.lineY = 0; + } + nextLine(opIdx) { + this.moveText(opIdx, 0, this.current.leading); + this.dependencyTracker?.recordIncrementalData("moveText", this.dependencyTracker.getSimpleIndex("leading") ?? opIdx); + } + #getScaledPath(path, currentTransform, transform) { + const newPath = new Path2D(); + newPath.addPath(path, new DOMMatrix(transform).invertSelf().multiplySelf(currentTransform)); + return newPath; + } + paintChar(opIdx, character, x, y, patternFillTransform, patternStrokeTransform) { + const ctx = this.ctx; + const current = this.current; + const font = current.font; + const textRenderingMode = current.textRenderingMode; + const fontSize = current.fontSize / current.fontSizeScale; + const fillStrokeMode = textRenderingMode & TextRenderingMode.FILL_STROKE_MASK; + const isAddToPathSet = !!(textRenderingMode & TextRenderingMode.ADD_TO_PATH_FLAG); + const patternFill = current.patternFill && !font.missingFile; + const patternStroke = current.patternStroke && !font.missingFile; + let path; + if ((font.disableFontFace || isAddToPathSet || patternFill || patternStroke) && !font.missingFile) { + path = font.getPathGenerator(this.commonObjs, character); + } + if (path && (font.disableFontFace || patternFill || patternStroke)) { + ctx.save(); + ctx.translate(x, y); + ctx.scale(fontSize, -fontSize); + this.dependencyTracker?.recordCharacterBBox(opIdx, ctx, font); + let currentTransform; + if (fillStrokeMode === TextRenderingMode.FILL || fillStrokeMode === TextRenderingMode.FILL_STROKE) { + if (patternFillTransform) { + currentTransform = ctx.getTransform(); + ctx.setTransform(...patternFillTransform); + const scaledPath = this.#getScaledPath(path, currentTransform, patternFillTransform); + ctx.fill(scaledPath); + } else { + ctx.fill(path); + } + } + if (fillStrokeMode === TextRenderingMode.STROKE || fillStrokeMode === TextRenderingMode.FILL_STROKE) { + if (patternStrokeTransform) { + currentTransform ||= ctx.getTransform(); + ctx.setTransform(...patternStrokeTransform); + const { + a, + b, + c, + d + } = currentTransform; + const invPatternTransform = Util.inverseTransform(patternStrokeTransform); + const transf = Util.transform([a, b, c, d, 0, 0], invPatternTransform); + Util.singularValueDecompose2dScale(transf, XY); + ctx.lineWidth *= Math.max(XY[0], XY[1]) / fontSize; + ctx.stroke(this.#getScaledPath(path, currentTransform, patternStrokeTransform)); + } else { + ctx.lineWidth /= fontSize; + ctx.stroke(path); + } + } + ctx.restore(); + } else { + if (fillStrokeMode === TextRenderingMode.FILL || fillStrokeMode === TextRenderingMode.FILL_STROKE) { + ctx.fillText(character, x, y); + this.dependencyTracker?.recordCharacterBBox(opIdx, ctx, font, fontSize, x, y, () => ctx.measureText(character)); + } + if (fillStrokeMode === TextRenderingMode.STROKE || fillStrokeMode === TextRenderingMode.FILL_STROKE) { + if (this.dependencyTracker) { + this.dependencyTracker?.recordCharacterBBox(opIdx, ctx, font, fontSize, x, y, () => ctx.measureText(character)).recordDependencies(opIdx, Dependencies.stroke); + } + ctx.strokeText(character, x, y); + } + } + if (isAddToPathSet) { + const paths = this.pendingTextPaths ||= []; + paths.push({ + transform: getCurrentTransform(ctx), + x, + y, + fontSize, + path + }); + this.dependencyTracker?.recordCharacterBBox(opIdx, ctx, font, fontSize, x, y); + } + } + get isFontSubpixelAAEnabled() { + const tmpCanvas = this.canvasFactory.create(10, 10); + const ctx = tmpCanvas.context; + ctx.scale(1.5, 1); + ctx.fillText("I", 0, 10); + const data = ctx.getImageData(0, 0, 10, 10).data; + this.canvasFactory.destroy(tmpCanvas); + let enabled = false; + for (let i = 3; i < data.length; i += 4) { + if (data[i] > 0 && data[i] < 255) { + enabled = true; + break; + } + } + return util_shadow(this, "isFontSubpixelAAEnabled", enabled); + } + showText(opIdx, glyphs) { + if (this.dependencyTracker) { + this.dependencyTracker.recordDependencies(opIdx, Dependencies.showText).resetBBox(opIdx); + if (this.current.textRenderingMode & TextRenderingMode.ADD_TO_PATH_FLAG) { + this.dependencyTracker.recordFutureForcedDependency("textClip", opIdx).inheritPendingDependenciesAsFutureForcedDependencies(); + } + } + const current = this.current; + const font = current.font; + if (font.isType3Font) { + const started = this.#beginKnockoutElement(current.fillAlpha); + this.showType3Text(opIdx, glyphs); + this.dependencyTracker?.recordShowTextOperation(opIdx); + this.#endKnockoutElement(started); + return; + } + const fontSize = current.fontSize; + if (fontSize === 0) { + this.dependencyTracker?.recordOperation(opIdx); + return; + } + const started = this.#beginKnockoutElement(current.fillAlpha); + const ctx = this.ctx; + const fontSizeScale = current.fontSizeScale; + const charSpacing = current.charSpacing; + const wordSpacing = current.wordSpacing; + const fontDirection = current.fontDirection; + const textHScale = current.textHScale * fontDirection; + const glyphsLength = glyphs.length; + const vertical = font.vertical; + const spacingDir = vertical ? 1 : -1; + const widthAdvanceScale = fontSize * current.fontMatrix[0]; + const simpleFillText = current.textRenderingMode === TextRenderingMode.FILL && !font.disableFontFace && !current.patternFill; + ctx.save(); + if (current.textMatrix) { + ctx.transform(...current.textMatrix); + } + ctx.translate(current.x, current.y + current.textRise); + if (fontDirection > 0) { + ctx.scale(textHScale, -1); + } else { + ctx.scale(textHScale, 1); + } + let patternFillTransform, patternStrokeTransform; + const fillStrokeMode = current.textRenderingMode & TextRenderingMode.FILL_STROKE_MASK; + const needsFill = fillStrokeMode === TextRenderingMode.FILL || fillStrokeMode === TextRenderingMode.FILL_STROKE; + const needsStroke = fillStrokeMode === TextRenderingMode.STROKE || fillStrokeMode === TextRenderingMode.FILL_STROKE; + let lineWidth = current.lineWidth; + const scale = current.textMatrixScale; + if (scale === 0 || lineWidth === 0) { + if (needsStroke) { + lineWidth = this.getSinglePixelWidth(); + } + } else { + lineWidth /= scale; + } + if (fontSizeScale !== 1.0) { + ctx.scale(fontSizeScale, fontSizeScale); + lineWidth /= fontSizeScale; + } + ctx.lineWidth = lineWidth; + if (needsFill && current.patternFill) { + ctx.save(); + const pattern = current.fillColor.getPattern(ctx, this, getCurrentTransformInverse(ctx), PathType.FILL, opIdx); + patternFillTransform = getCurrentTransform(ctx); + ctx.restore(); + ctx.fillStyle = pattern; + } + if (needsStroke && current.patternStroke) { + ctx.save(); + const pattern = current.strokeColor.getPattern(ctx, this, getCurrentTransformInverse(ctx), PathType.STROKE, opIdx); + patternStrokeTransform = getCurrentTransform(ctx); + ctx.restore(); + ctx.strokeStyle = pattern; + } + if (font.isInvalidPDFjsFont) { + const chars = []; + let width = 0; + for (const glyph of glyphs) { + chars.push(glyph.unicode); + width += glyph.width; + } + const joinedChars = chars.join(""); + ctx.fillText(joinedChars, 0, 0); + if (this.dependencyTracker !== null) { + const measure = ctx.measureText(joinedChars); + this.dependencyTracker.recordBBox(opIdx, this.ctx, -measure.actualBoundingBoxLeft, measure.actualBoundingBoxRight, -measure.actualBoundingBoxAscent, measure.actualBoundingBoxDescent).recordShowTextOperation(opIdx); + } + current.x += width * widthAdvanceScale * textHScale; + ctx.restore(); + this.compose(); + this.#endKnockoutElement(started); + return; + } + let x = 0, + i; + for (i = 0; i < glyphsLength; ++i) { + const glyph = glyphs[i]; + if (typeof glyph === "number") { + x += spacingDir * glyph * fontSize / 1000; + continue; + } + let restoreNeeded = false; + const spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing; + const character = glyph.fontChar; + const accent = glyph.accent; + let scaledX, scaledY; + let width = glyph.width; + if (vertical) { + const vmetric = glyph.vmetric; + const vx = -vmetric[1] * widthAdvanceScale; + const vy = vmetric[2] * widthAdvanceScale; + width = -vmetric[0]; + scaledX = vx / fontSizeScale; + scaledY = (x + vy) / fontSizeScale; + } else { + scaledX = x / fontSizeScale; + scaledY = 0; + } + let measure; + if (font.remeasure && width > 0) { + measure = ctx.measureText(character); + const measuredWidth = measure.width * 1000 / fontSize * fontSizeScale; + if (width < measuredWidth && this.isFontSubpixelAAEnabled) { + const characterScaleX = width / measuredWidth; + restoreNeeded = true; + ctx.save(); + ctx.scale(characterScaleX, 1); + scaledX /= characterScaleX; + } else if (width !== measuredWidth) { + scaledX += (width - measuredWidth) / 2000 * fontSize / fontSizeScale; + } + } + if (this.contentVisible && (glyph.isInFont || font.missingFile)) { + if (simpleFillText && !accent) { + ctx.fillText(character, scaledX, scaledY); + this.dependencyTracker?.recordCharacterBBox(opIdx, ctx, measure ? { + bbox: null + } : font, fontSize / fontSizeScale, scaledX, scaledY, () => measure ?? ctx.measureText(character)); + } else { + this.paintChar(opIdx, character, scaledX, scaledY, patternFillTransform, patternStrokeTransform); + if (accent) { + const scaledAccentX = scaledX + fontSize * accent.offset.x / fontSizeScale; + const scaledAccentY = scaledY - fontSize * accent.offset.y / fontSizeScale; + this.paintChar(opIdx, accent.fontChar, scaledAccentX, scaledAccentY, patternFillTransform, patternStrokeTransform); + } + } + } + const charWidth = vertical ? width * widthAdvanceScale - spacing * fontDirection : width * widthAdvanceScale + spacing * fontDirection; + x += charWidth; + if (restoreNeeded) { + ctx.restore(); + } + } + if (vertical) { + current.y -= x; + } else { + current.x += x * textHScale; + } + ctx.restore(); + this.compose(); + this.dependencyTracker?.recordShowTextOperation(opIdx); + this.#endKnockoutElement(started); + } + showType3Text(opIdx, glyphs) { + const ctx = this.ctx; + const current = this.current; + const font = current.font; + const fontSize = current.fontSize; + const fontDirection = current.fontDirection; + const spacingDir = font.vertical ? 1 : -1; + const charSpacing = current.charSpacing; + const wordSpacing = current.wordSpacing; + const textHScale = current.textHScale * fontDirection; + const fontMatrix = current.fontMatrix || FONT_IDENTITY_MATRIX; + const glyphsLength = glyphs.length; + const isTextInvisible = current.textRenderingMode === TextRenderingMode.INVISIBLE; + let i, glyph, width, spacingLength; + if (isTextInvisible || fontSize === 0) { + return; + } + this._cachedScaleForStroking[0] = -1; + ctx.save(); + if (current.textMatrix) { + ctx.transform(...current.textMatrix); + } + ctx.translate(current.x, current.y + current.textRise); + ctx.scale(textHScale, fontDirection); + const dependencyTracker = this.dependencyTracker; + this.dependencyTracker = dependencyTracker ? new CanvasNestedDependencyTracker(dependencyTracker, opIdx) : null; + for (i = 0; i < glyphsLength; ++i) { + glyph = glyphs[i]; + if (typeof glyph === "number") { + spacingLength = spacingDir * glyph * fontSize / 1000; + this.ctx.translate(spacingLength, 0); + current.x += spacingLength * textHScale; + continue; + } + const spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing; + const operatorList = font.charProcOperatorList.get(glyph.operatorListId); + if (!operatorList) { + warn(`Type3 character "${glyph.operatorListId}" is not available.`); + } else if (this.contentVisible) { + this.save(); + if (operatorList.fnArray[0] === OPS.setCharWidth) { + current.fillAlpha = current.strokeAlpha = 1; + ctx.globalAlpha = 1; + } + ctx.scale(fontSize, fontSize); + ctx.transform(...fontMatrix); + this.executeOperatorList(operatorList); + this.restore(); + } + const p = [glyph.width, 0]; + Util.applyTransform(p, fontMatrix); + width = p[0] * fontSize + spacing; + ctx.translate(width, 0); + current.x += width * textHScale; + } + ctx.restore(); + if (dependencyTracker) { + this.dependencyTracker = dependencyTracker; + } + } + setCharWidth(opIdx, xWidth, yWidth) {} + setCharWidthAndBounds(opIdx, xWidth, yWidth, llx, lly, urx, ury) { + const clip = new Path2D(); + clip.rect(llx, lly, urx - llx, ury - lly); + this.ctx.clip(clip); + this.dependencyTracker?.recordBBox(opIdx, this.ctx, llx, urx, lly, ury).recordClipBox(opIdx, this.ctx, llx, urx, lly, ury); + this.endPath(opIdx); + } + getColorN_Pattern(opIdx, IR) { + let pattern; + if (IR[0] === "TilingPattern") { + const baseTransform = this.baseTransform || getCurrentTransform(this.ctx); + const canvasGraphicsFactory = { + createCanvasGraphics: (ctx, renderingOpIdx) => new CanvasGraphics(ctx, this.commonObjs, this.objs, this.canvasFactory, this.filterFactory, { + optionalContentConfig: this.optionalContentConfig, + markedContentStack: this.markedContentStack + }, undefined, undefined, this.dependencyTracker ? new CanvasNestedDependencyTracker(this.dependencyTracker, renderingOpIdx, true) : null) + }; + pattern = new TilingPattern(IR, this.ctx, canvasGraphicsFactory, baseTransform); + } else { + pattern = this._getPattern(opIdx, IR[1], IR[2]); + } + return pattern; + } + setStrokeColorN(opIdx, ...args) { + this.dependencyTracker?.recordSimpleData("strokeColor", opIdx); + this.current.strokeColor = this.getColorN_Pattern(opIdx, args); + this.current.patternStroke = true; + } + setFillColorN(opIdx, ...args) { + this.dependencyTracker?.recordSimpleData("fillColor", opIdx); + const pattern = this.current.fillColor = this.getColorN_Pattern(opIdx, args); + this.current.patternFill = true; + this.current.tilingPatternDims = pattern instanceof TilingPattern ? [0, 0, 0, 0] : null; + } + #transferColor(color) { + return this.current.transferMapsFallback?.applyToColor(color) ?? color; + } + setStrokeRGBColor(opIdx, color) { + this.dependencyTracker?.recordSimpleData("strokeColor", opIdx); + this.current.strokeColor = color; + this.ctx.strokeStyle = this.#transferColor(color); + this.current.patternStroke = false; + } + setStrokeTransparent(opIdx) { + this.dependencyTracker?.recordSimpleData("strokeColor", opIdx); + this.ctx.strokeStyle = this.current.strokeColor = "transparent"; + this.current.patternStroke = false; + } + setFillRGBColor(opIdx, color) { + this.dependencyTracker?.recordSimpleData("fillColor", opIdx); + this.current.fillColor = color; + this.ctx.fillStyle = this.#transferColor(color); + this.current.patternFill = false; + this.current.tilingPatternDims = null; + } + setFillTransparent(opIdx) { + this.dependencyTracker?.recordSimpleData("fillColor", opIdx); + this.ctx.fillStyle = this.current.fillColor = "transparent"; + this.current.patternFill = false; + this.current.tilingPatternDims = null; + } + _getPattern(opIdx, objId, matrix = null) { + const pattern = this.cachedPatterns.getOrInsertComputed(objId, () => getShadingPattern(this.getObject(opIdx, objId))); + if (matrix) { + pattern.matrix = matrix; + } + return pattern; + } + shadingFill(opIdx, objId) { + if (!this.contentVisible) { + return; + } + const started = this.#beginKnockoutElement(this.current.fillAlpha); + const ctx = this.ctx; + this.save(opIdx); + const pattern = this._getPattern(opIdx, objId); + ctx.fillStyle = pattern.getPattern(ctx, this, getCurrentTransformInverse(ctx), PathType.SHADING, opIdx); + const inv = getCurrentTransformInverse(ctx); + if (inv) { + const { + width, + height + } = ctx.canvas; + const minMax = F32_BBOX_INIT.slice(); + Util.axialAlignedBoundingBox([0, 0, width, height], inv, minMax); + const [x0, y0, x1, y1] = minMax; + this.ctx.fillRect(x0, y0, x1 - x0, y1 - y0); + } else { + this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10); + } + this.dependencyTracker?.resetBBox(opIdx).recordFullPageBBox(opIdx).recordDependencies(opIdx, Dependencies.transform).recordDependencies(opIdx, Dependencies.fill).recordOperation(opIdx); + this.compose(this.current.getClippedPathBoundingBox()); + this.restore(opIdx); + this.#endKnockoutElement(started); + } + beginInlineImage() { + unreachable("Should not call beginInlineImage"); + } + beginImageData() { + unreachable("Should not call beginImageData"); + } + paintFormXObjectBegin(opIdx, matrix, bbox) { + if (!this.contentVisible) { + return; + } + this.save(opIdx); + this.baseTransformStack.push(this.baseTransform); + if (matrix) { + this.transform(opIdx, ...matrix); + } + this.baseTransform = getCurrentTransform(this.ctx); + if (bbox) { + Util.axialAlignedBoundingBox(bbox, this.baseTransform, this.current.minMax); + const [x0, y0, x1, y1] = bbox; + const clip = new Path2D(); + clip.rect(x0, y0, x1 - x0, y1 - y0); + this.ctx.clip(clip); + this.dependencyTracker?.recordClipBox(opIdx, this.ctx, x0, x1, y0, y1); + this.endPath(opIdx); + } + } + paintFormXObjectEnd(opIdx) { + if (!this.contentVisible) { + return; + } + this.restore(opIdx); + this.baseTransform = this.baseTransformStack.pop(); + } + beginGroup(opIdx, group) { + if (!this.contentVisible) { + return; + } + this.save(opIdx); + const { + inSMaskMode + } = this; + if (inSMaskMode) { + this.endSMaskMode(); + this.current.activeSMask = null; + } + const currentCtx = this.ctx; + if ((!group.needsIsolation || !group.isolated && !group.hasSoftMask) && !group.knockout && !group.isGray && this.#knockoutGroupLevel === 0 && currentCtx.globalAlpha === 1 && currentCtx.globalCompositeOperation === "source-over" && !inSMaskMode) { + if (group.bbox) { + let clip = new Path2D(); + const [x0, y0, x1, y1] = group.bbox; + clip.rect(x0, y0, x1 - x0, y1 - y0); + if (group.matrix) { + const path = new Path2D(); + path.addPath(clip, new DOMMatrix(group.matrix)); + clip = path; + } + currentCtx.clip(clip); + } + this.groupStack.push(null); + this.#groupStackMeta.push(null); + this.groupLevel++; + return; + } + if (!group.isolated && !group.knockout && this.#knockoutGroupLevel === 0) { + info("TODO: Fully support non-isolated non-knockout groups."); + } + const currentTransform = getCurrentTransform(currentCtx); + if (group.matrix) { + currentCtx.transform(...group.matrix); + } + const canvasBounds = [0, 0, currentCtx.canvas.width, currentCtx.canvas.height]; + let bounds; + if (group.bbox) { + bounds = F32_BBOX_INIT.slice(); + Util.axialAlignedBoundingBox(group.bbox, getCurrentTransform(currentCtx), bounds); + bounds = Util.intersect(bounds, canvasBounds) || [0, 0, 0, 0]; + } else { + bounds = canvasBounds; + } + const offsetX = Math.floor(bounds[0]); + const offsetY = Math.floor(bounds[1]); + const drawnWidth = Math.max(Math.ceil(bounds[2]) - offsetX, 1); + const drawnHeight = Math.max(Math.ceil(bounds[3]) - offsetY, 1); + this.current.startNewPathAndClipBox([0, 0, drawnWidth, drawnHeight]); + const scratchCanvas = this.canvasFactory.create(drawnWidth, drawnHeight); + if (group.smask) { + this.smaskGroupCanvases.push(scratchCanvas); + } + const groupCtx = scratchCanvas.context; + const backdropCtx = group.knockout && !group.isolated ? currentCtx : null; + const hasInnerBackdrop = !group.isolated && !group.knockout && !group.smask && group.needsIsolation && this.#knockoutGroupLevel > 0; + const knockoutMaskEntry = group.knockout ? this.canvasFactory.create(drawnWidth, drawnHeight) : null; + const savedKnockoutLevel = this.#knockoutGroupLevel; + if (group.knockout) { + this.#knockoutGroupLevel++; + } else { + this.#knockoutGroupLevel = 0; + } + groupCtx.translate(-offsetX, -offsetY); + groupCtx.transform(...currentTransform); + const needsBackdropCopy = !group.isolated && !group.smask && group.needsIsolation; + const replaceBackdrop = needsBackdropCopy && !inSMaskMode && savedKnockoutLevel === 0 && !group.knockout && !group.isGray && group.hasSoftMask && currentCtx.globalAlpha === 1 && currentCtx.globalCompositeOperation === "source-over" && this.current.transferMaps === "none" && !this.current.transferMapsFallback; + if (needsBackdropCopy && (inSMaskMode || replaceBackdrop)) { + groupCtx.save(); + groupCtx.setTransform(1, 0, 0, 1, 0, 0); + groupCtx.drawImage(currentCtx.canvas, -offsetX, -offsetY); + groupCtx.restore(); + } + if (group.bbox) { + let clip = new Path2D(); + const [x0, y0, x1, y1] = group.bbox; + clip.rect(x0, y0, x1 - x0, y1 - y0); + if (group.matrix) { + const path = new Path2D(); + path.addPath(clip, new DOMMatrix(group.matrix)); + clip = path; + } + groupCtx.clip(clip); + } + if (group.smask) { + this.smaskStack.push({ + canvas: scratchCanvas.canvas, + context: groupCtx, + offsetX, + offsetY, + subtype: group.smask.subtype, + backdrop: group.smask.backdrop, + transferMap: group.smask.transferMap || null + }); + } + if (!group.smask || this.dependencyTracker) { + currentCtx.setTransform(1, 0, 0, 1, 0, 0); + currentCtx.translate(offsetX, offsetY); + currentCtx.save(); + } + copyCtxState(currentCtx, groupCtx); + this.ctx = groupCtx; + this.dependencyTracker?.inheritSimpleDataAsFutureForcedDependencies(["fillAlpha", "strokeAlpha", "globalCompositeOperation"]).pushBaseTransform(currentCtx); + this.setGState(opIdx, [["BM", "source-over"], ["ca", 1], ["CA", 1], ["TR", null]]); + this.groupStack.push(currentCtx); + this.#groupStackMeta.push({ + backdropCtx, + savedKnockoutLevel, + offsetX, + offsetY, + hasInnerBackdrop, + replaceBackdrop, + knockoutMaskEntry, + knockoutTempEntry: null, + knockoutBackdropEntry: null + }); + this.groupLevel++; + } + endGroup(opIdx, group) { + if (!this.contentVisible) { + return; + } + this.groupLevel--; + const groupCtx = this.ctx; + const ctx = this.groupStack.pop(); + const groupMeta = this.#groupStackMeta.pop(); + if (groupMeta) { + this.#knockoutGroupLevel = groupMeta.savedKnockoutLevel; + } + if (ctx === null) { + this.restore(opIdx); + return; + } + if (group.isGray) { + this.#convertGroupToGray(groupCtx); + } + this.ctx = ctx; + this.ctx.imageSmoothingEnabled = false; + this.dependencyTracker?.popBaseTransform(); + if (group.smask) { + this.tempSMask = this.smaskStack.pop(); + this.restore(opIdx); + if (this.dependencyTracker) { + this.ctx.restore(); + if (this.inSMaskMode) { + this.ctx.setTransform(this.suspendedCtx.getTransform()); + } + } + this.#destroyKnockoutPools(groupMeta); + } else { + this.ctx.restore(); + const currentMtx = getCurrentTransform(this.ctx); + this.restore(opIdx); + this.current.transferMapsFallback?.applyToCanvas(groupCtx); + this.ctx.save(); + this.ctx.setTransform(...currentMtx); + const dirtyBox = F32_BBOX_INIT.slice(); + Util.axialAlignedBoundingBox([0, 0, groupCtx.canvas.width, groupCtx.canvas.height], currentMtx, dirtyBox); + const parentGroupMeta = this.#groupStackMeta.at(-1); + if (this.#knockoutGroupLevel > 0) { + if (groupMeta.hasInnerBackdrop) { + const { + width, + height + } = groupCtx.canvas; + const colorEntry = this.canvasFactory.create(width, height); + const colorCtx = colorEntry.context; + colorCtx.drawImage(ctx.canvas, groupMeta.offsetX, groupMeta.offsetY, width, height, 0, 0, width, height); + colorCtx.globalCompositeOperation = "source-over"; + colorCtx.drawImage(groupCtx.canvas, 0, 0); + const shapeMaskEntry = this.#createKnockoutMaskCanvas(groupCtx.canvas); + colorCtx.globalCompositeOperation = "destination-in"; + colorCtx.drawImage(shapeMaskEntry.canvas, 0, 0); + const sourceCompositeOperation = this.ctx.globalCompositeOperation; + const sourceAlpha = this.ctx.globalAlpha; + const sourceFilter = this.ctx.filter; + this.ctx.save(); + this.ctx.setTransform(...currentMtx); + this.ctx.globalAlpha = 1; + if (FeatureTest.isCanvasFilterSupported) { + this.ctx.filter = "none"; + } + this.ctx.globalCompositeOperation = "destination-out"; + this.ctx.drawImage(shapeMaskEntry.canvas, 0, 0); + this.ctx.globalCompositeOperation = sourceCompositeOperation; + this.ctx.globalAlpha = sourceAlpha; + if (FeatureTest.isCanvasFilterSupported) { + this.ctx.filter = sourceFilter ?? "none"; + } + this.ctx.drawImage(colorEntry.canvas, 0, 0); + this.ctx.restore(); + this.canvasFactory.destroy(shapeMaskEntry); + this.canvasFactory.destroy(colorEntry); + } else { + const backdropCtx = parentGroupMeta?.backdropCtx ?? null; + this.#compositeKnockoutSurface(this.ctx, groupCtx.canvas, { + backdropCanvas: backdropCtx?.canvas ?? null, + destTransform: currentMtx, + backdropOffset: backdropCtx ? [parentGroupMeta.offsetX + groupMeta.offsetX, parentGroupMeta.offsetY + groupMeta.offsetY] : [0, 0], + sourceAlpha: this.ctx.globalAlpha, + sourceFilter: this.ctx.filter + }); + } + } else { + if (groupMeta.replaceBackdrop) { + const clip = new Path2D(); + clip.rect(0, 0, groupCtx.canvas.width, groupCtx.canvas.height); + this.ctx.clip(clip); + this.ctx.globalCompositeOperation = "copy"; + } + this.ctx.drawImage(groupCtx.canvas, 0, 0); + } + this.ctx.restore(); + this.canvasFactory.destroy({ + canvas: groupCtx.canvas, + context: groupCtx + }); + this.#destroyKnockoutPools(groupMeta); + this.compose(dirtyBox); + } + } + #convertGroupToGray(groupCtx) { + const { + canvas + } = groupCtx; + const { + width, + height + } = canvas; + if (FeatureTest.isCanvasFilterSupported) { + groupCtx.save(); + groupCtx.setTransform(1, 0, 0, 1, 0, 0); + groupCtx.filter = "grayscale(1)"; + groupCtx.globalAlpha = 1; + groupCtx.globalCompositeOperation = "copy"; + groupCtx.drawImage(canvas, 0, 0); + groupCtx.restore(); + return; + } + const imageData = groupCtx.getImageData(0, 0, width, height); + const { + data + } = imageData; + for (let i = 0, ii = data.length; i < ii; i += 4) { + const gray = data[i] * 0.2126 + data[i + 1] * 0.7152 + data[i + 2] * 0.0722 + 0.5 | 0; + data[i] = data[i + 1] = data[i + 2] = gray; + } + groupCtx.putImageData(imageData, 0, 0); + } + #destroyKnockoutPools(groupMeta) { + if (!groupMeta) { + return; + } + if (groupMeta.knockoutMaskEntry) { + this.canvasFactory.destroy(groupMeta.knockoutMaskEntry); + groupMeta.knockoutMaskEntry = null; + } + if (groupMeta.knockoutTempEntry) { + this.canvasFactory.destroy(groupMeta.knockoutTempEntry); + groupMeta.knockoutTempEntry = null; + } + if (groupMeta.knockoutBackdropEntry) { + this.canvasFactory.destroy(groupMeta.knockoutBackdropEntry); + groupMeta.knockoutBackdropEntry = null; + } + } + beginAnnotation(opIdx, id, rect, transform, matrix, hasOwnCanvas, canvasName) { + this.#restoreInitialState(); + resetCtxToDefault(this.ctx); + this.ctx.save(); + this.save(opIdx); + if (this.baseTransform) { + this.ctx.setTransform(...this.baseTransform); + } + if (rect) { + const width = rect[2] - rect[0]; + const height = rect[3] - rect[1]; + if (hasOwnCanvas && this.annotationCanvasMap) { + transform = transform.slice(); + transform[4] -= rect[0]; + transform[5] -= rect[1]; + Util.singularValueDecompose2dScale(getCurrentTransform(this.ctx), XY); + const { + viewportScale + } = this; + const canvasWidth = Math.ceil(width * this.outputScaleX * viewportScale); + const canvasHeight = Math.ceil(height * this.outputScaleY * viewportScale); + this.annotationCanvas = this.canvasFactory.create(canvasWidth, canvasHeight); + const { + canvas, + context + } = this.annotationCanvas; + if (canvasName) { + const canvases = this.annotationCanvasMap.getOrInsertComputed(id, makeArr); + canvas.setAttribute("data-canvas-name", canvasName); + const index = canvases.findIndex(c => c.getAttribute("data-canvas-name") === canvasName); + if (index === -1) { + canvases.push(canvas); + } else { + canvases[index] = canvas; + } + } else { + this.annotationCanvasMap.set(id, canvas); + } + this.annotationCanvas.savedCtx = this.ctx; + this.ctx = context; + this.ctx.save(); + this.ctx.setTransform(XY[0], 0, 0, -XY[1], 0, height * XY[1]); + resetCtxToDefault(this.ctx); + } else { + resetCtxToDefault(this.ctx); + this.endPath(opIdx); + const clip = new Path2D(); + clip.rect(rect[0], rect[1], width, height); + this.ctx.clip(clip); + } + } + this.current = new CanvasExtraState(this.ctx.canvas.width, this.ctx.canvas.height); + this.baseTransformStack.push(this.baseTransform); + this.transform(opIdx, ...transform); + this.transform(opIdx, ...matrix); + this.baseTransform = getCurrentTransform(this.ctx); + } + endAnnotation(opIdx) { + if (this.annotationCanvas) { + this.ctx.restore(); + this.#drawFilter(); + this.ctx = this.annotationCanvas.savedCtx; + delete this.annotationCanvas.savedCtx; + delete this.annotationCanvas; + } + this.baseTransform = this.baseTransformStack.pop(); + } + paintImageMaskXObject(opIdx, img) { + if (!this.contentVisible) { + return; + } + const count = img.count; + img = this.getObject(opIdx, img.data, img); + img.count = count; + const started = this.#beginKnockoutElement(this.current.fillAlpha); + const ctx = this.ctx; + const mask = this._createMaskCanvas(opIdx, img); + const maskCanvas = mask.canvas; + ctx.save(); + ctx.setTransform(1, 0, 0, 1, 0, 0); + ctx.drawImage(maskCanvas, mask.offsetX, mask.offsetY); + this.dependencyTracker?.resetBBox(opIdx).recordBBox(opIdx, this.ctx, mask.offsetX, mask.offsetX + maskCanvas.width, mask.offsetY, mask.offsetY + maskCanvas.height).recordOperation(opIdx); + ctx.restore(); + if (mask.canvasEntry) { + this.canvasFactory.destroy(mask.canvasEntry); + } + this.compose(); + this.#endKnockoutElement(started); + } + paintImageMaskXObjectRepeat(opIdx, img, scaleX, skewX = 0, skewY = 0, scaleY, positions) { + if (!this.contentVisible) { + return; + } + img = this.getObject(opIdx, img.data, img); + const started = this.#beginKnockoutElement(this.current.fillAlpha); + const ctx = this.ctx; + ctx.save(); + const currentTransform = getCurrentTransform(ctx); + ctx.transform(scaleX, skewX, skewY, scaleY, 0, 0); + const mask = this._createMaskCanvas(opIdx, img); + ctx.setTransform(1, 0, 0, 1, mask.offsetX - currentTransform[4], mask.offsetY - currentTransform[5]); + this.dependencyTracker?.resetBBox(opIdx); + for (let i = 0, ii = positions.length; i < ii; i += 2) { + const trans = Util.transform(currentTransform, [scaleX, skewX, skewY, scaleY, positions[i], positions[i + 1]]); + ctx.drawImage(mask.canvas, trans[4], trans[5]); + this.dependencyTracker?.recordBBox(opIdx, this.ctx, trans[4], trans[4] + mask.canvas.width, trans[5], trans[5] + mask.canvas.height); + } + ctx.restore(); + if (mask.canvasEntry) { + this.canvasFactory.destroy(mask.canvasEntry); + } + this.compose(); + this.dependencyTracker?.recordOperation(opIdx); + this.#endKnockoutElement(started); + } + paintImageMaskXObjectGroup(opIdx, images) { + if (!this.contentVisible) { + return; + } + const started = this.#beginKnockoutElement(this.current.fillAlpha); + const ctx = this.ctx; + const isPatternFill = this.current.patternFill; + const fillColor = isPatternFill ? this.current.fillColor : ctx.fillStyle; + this.dependencyTracker?.resetBBox(opIdx).recordDependencies(opIdx, Dependencies.transformAndFill); + for (const image of images) { + const { + data, + width, + height, + transform + } = image; + const maskCanvas = this.canvasFactory.create(width, height); + const maskCtx = maskCanvas.context; + maskCtx.save(); + const img = this.getObject(opIdx, data, image); + putBinaryImageMask(maskCtx, img); + maskCtx.globalCompositeOperation = "source-in"; + maskCtx.fillStyle = isPatternFill ? fillColor.getPattern(maskCtx, this, getCurrentTransformInverse(ctx), PathType.FILL, opIdx) : fillColor; + maskCtx.fillRect(0, 0, width, height); + maskCtx.restore(); + ctx.save(); + ctx.transform(...transform); + ctx.scale(1, -1); + drawImageAtIntegerCoords(ctx, maskCanvas.canvas, 0, 0, width, height, 0, -1, 1, 1); + this.canvasFactory.destroy(maskCanvas); + this.dependencyTracker?.recordBBox(opIdx, ctx, 0, width, 0, height); + ctx.restore(); + } + this.compose(); + this.dependencyTracker?.recordOperation(opIdx); + this.#endKnockoutElement(started); + } + paintImageXObject(opIdx, objId) { + if (!this.contentVisible) { + return; + } + const imgData = this.getObject(opIdx, objId); + if (!imgData) { + warn("Dependent image isn't ready yet"); + return; + } + this.paintInlineImageXObject(opIdx, imgData); + } + paintImageXObjectRepeat(opIdx, objId, scaleX, scaleY, positions) { + if (!this.contentVisible) { + return; + } + const imgData = this.getObject(opIdx, objId); + if (!imgData) { + warn("Dependent image isn't ready yet"); + return; + } + const width = imgData.width; + const height = imgData.height; + const map = []; + for (let i = 0, ii = positions.length; i < ii; i += 2) { + map.push({ + transform: [scaleX, 0, 0, scaleY, positions[i], positions[i + 1]], + x: 0, + y: 0, + w: width, + h: height + }); + } + this.paintInlineImageXObjectGroup(opIdx, imgData, map); + } + applyTransferMapsToCanvas(ctx) { + if (this.current.transferMaps !== "none") { + ctx.filter = this.current.transferMaps; + ctx.drawImage(ctx.canvas, 0, 0); + ctx.filter = "none"; + } else { + this.current.transferMapsFallback?.applyToCanvas(ctx); + } + return ctx.canvas; + } + applyTransferMapsToBitmap(imgData) { + const { + transferMaps, + transferMapsFallback + } = this.current; + if (transferMaps === "none" && !transferMapsFallback) { + return { + img: imgData.bitmap, + canvasEntry: null + }; + } + const { + bitmap, + width, + height + } = imgData; + const tmpCanvas = this.canvasFactory.create(width, height); + const tmpCtx = tmpCanvas.context; + tmpCtx.filter = transferMaps; + tmpCtx.drawImage(bitmap, 0, 0); + tmpCtx.filter = "none"; + transferMapsFallback?.applyToCanvas(tmpCtx); + return { + img: tmpCanvas.canvas, + canvasEntry: tmpCanvas + }; + } + paintInlineImageXObject(opIdx, imgData) { + if (!this.contentVisible) { + return; + } + const width = imgData.width; + const height = imgData.height; + const started = this.#beginKnockoutElement(this.current.fillAlpha); + const ctx = this.ctx; + this.save(opIdx); + const { + filter + } = ctx; + if (filter !== "none" && filter !== "") { + ctx.filter = "none"; + } + ctx.scale(1 / width, -1 / height); + let imgToPaint; + let inlineImgCanvas = null; + if (imgData.bitmap) { + const result = this.applyTransferMapsToBitmap(imgData); + imgToPaint = result.img; + inlineImgCanvas = result.canvasEntry; + } else { + const tmpCanvas = this.canvasFactory.create(width, height); + putBinaryImageData(tmpCanvas.context, imgData); + imgToPaint = this.applyTransferMapsToCanvas(tmpCanvas.context); + inlineImgCanvas = tmpCanvas; + } + const scaled = this._scaleImage(imgToPaint, getCurrentTransformInverse(ctx)); + ctx.imageSmoothingEnabled = getImageSmoothingEnabled(getCurrentTransform(ctx), imgData.interpolate); + if (this.dependencyTracker) { + this.dependencyTracker.resetBBox(opIdx).recordBBox(opIdx, ctx, 0, width, -height, 0).recordDependencies(opIdx, Dependencies.imageXObject).recordOperation(opIdx); + this.imagesTracker?.record(ctx, width, height, this.dependencyTracker.clipBox); + } + drawImageAtIntegerCoords(ctx, scaled.img, 0, 0, scaled.paintWidth, scaled.paintHeight, 0, -height, width, height); + if (scaled.tmpCanvas) { + this.canvasFactory.destroy(scaled.tmpCanvas); + } + if (inlineImgCanvas) { + this.canvasFactory.destroy(inlineImgCanvas); + } + this.compose(); + this.restore(opIdx); + this.#endKnockoutElement(started); + } + paintInlineImageXObjectGroup(opIdx, imgData, map) { + if (!this.contentVisible) { + return; + } + const started = this.#beginKnockoutElement(this.current.fillAlpha); + const ctx = this.ctx; + let imgToPaint; + let inlineImgCanvas = null; + if (imgData.bitmap && !this.current.transferMapsFallback) { + imgToPaint = imgData.bitmap; + } else if (imgData.bitmap) { + ({ + img: imgToPaint, + canvasEntry: inlineImgCanvas + } = this.applyTransferMapsToBitmap(imgData)); + } else { + const w = imgData.width; + const h = imgData.height; + const tmpCanvas = this.canvasFactory.create(w, h); + putBinaryImageData(tmpCanvas.context, imgData); + imgToPaint = this.applyTransferMapsToCanvas(tmpCanvas.context); + inlineImgCanvas = tmpCanvas; + } + this.dependencyTracker?.resetBBox(opIdx); + for (const entry of map) { + ctx.save(); + ctx.transform(...entry.transform); + ctx.scale(1, -1); + drawImageAtIntegerCoords(ctx, imgToPaint, entry.x, entry.y, entry.w, entry.h, 0, -1, 1, 1); + this.dependencyTracker?.recordBBox(opIdx, ctx, 0, 1, -1, 0); + ctx.restore(); + } + if (inlineImgCanvas) { + this.canvasFactory.destroy(inlineImgCanvas); + } + this.dependencyTracker?.recordOperation(opIdx); + this.compose(); + this.#endKnockoutElement(started); + } + paintSolidColorImageMask(opIdx) { + if (!this.contentVisible) { + return; + } + const started = this.#beginKnockoutElement(this.current.fillAlpha); + this.dependencyTracker?.resetBBox(opIdx).recordBBox(opIdx, this.ctx, 0, 1, 0, 1).recordDependencies(opIdx, Dependencies.fill).recordOperation(opIdx); + this.ctx.fillRect(0, 0, 1, 1); + this.compose(); + this.#endKnockoutElement(started); + } + markPoint(opIdx, tag) {} + markPointProps(opIdx, tag, properties) {} + beginMarkedContent(opIdx, tag) { + this.dependencyTracker?.beginMarkedContent(opIdx); + this.markedContentStack.push({ + visible: true + }); + } + beginMarkedContentProps(opIdx, tag, properties) { + this.dependencyTracker?.beginMarkedContent(opIdx); + if (tag === "OC") { + this.markedContentStack.push({ + visible: this.optionalContentConfig.isVisible(properties) + }); + } else { + this.markedContentStack.push({ + visible: true + }); + } + this.contentVisible = this.isContentVisible(); + } + endMarkedContent(opIdx) { + this.dependencyTracker?.endMarkedContent(opIdx); + this.markedContentStack.pop(); + this.contentVisible = this.isContentVisible(); + } + beginCompat(opIdx) {} + endCompat(opIdx) {} + consumePath(opIdx, path, clipBox) { + const isEmpty = this.current.isEmptyClip(); + if (this.pendingClip) { + this.current.updateClipFromPath(); + } + if (!this.pendingClip) { + this.compose(clipBox); + } + const ctx = this.ctx; + if (this.pendingClip) { + if (!isEmpty) { + if (this.pendingClip === EO_CLIP) { + ctx.clip(path, "evenodd"); + } else { + ctx.clip(path); + } + } + this.pendingClip = null; + this.dependencyTracker?.bboxToClipBoxDropOperation(opIdx).recordFutureForcedDependency("clipPath", opIdx); + } else { + this.dependencyTracker?.recordOperation(opIdx); + } + this.current.startNewPathAndClipBox(this.current.clipBox); + } + getSinglePixelWidth() { + const m = getCurrentTransform(this.ctx); + if (m[1] === 0 && m[2] === 0) { + return 1 / Math.min(Math.abs(m[0]), Math.abs(m[3])); + } + const absDet = Math.abs(m[0] * m[3] - m[2] * m[1]); + const normX = Math.hypot(m[0], m[2]); + const normY = Math.hypot(m[1], m[3]); + return Math.max(normX, normY) / absDet; + } + getScaleForStroking() { + if (this._cachedScaleForStroking[0] === -1) { + const { + lineWidth + } = this.current; + const { + a, + b, + c, + d + } = this.ctx.getTransform(); + let scaleX, scaleY; + if (b === 0 && c === 0) { + const normX = Math.abs(a); + const normY = Math.abs(d); + if (normX === normY) { + if (lineWidth === 0) { + scaleX = scaleY = 1 / normX; + } else { + const scaledLineWidth = normX * lineWidth; + scaleX = scaleY = scaledLineWidth < 1 ? 1 / scaledLineWidth : 1; + } + } else if (lineWidth === 0) { + scaleX = 1 / normX; + scaleY = 1 / normY; + } else { + const scaledXLineWidth = normX * lineWidth; + const scaledYLineWidth = normY * lineWidth; + scaleX = scaledXLineWidth < 1 ? 1 / scaledXLineWidth : 1; + scaleY = scaledYLineWidth < 1 ? 1 / scaledYLineWidth : 1; + } + } else { + const absDet = Math.abs(a * d - b * c); + const normX = Math.hypot(a, b); + const normY = Math.hypot(c, d); + if (lineWidth === 0) { + scaleX = normY / absDet; + scaleY = normX / absDet; + } else { + const baseArea = lineWidth * absDet; + scaleX = normY > baseArea ? normY / baseArea : 1; + scaleY = normX > baseArea ? normX / baseArea : 1; + } + } + this._cachedScaleForStroking[0] = scaleX; + this._cachedScaleForStroking[1] = scaleY; + } + return this._cachedScaleForStroking; + } + rescaleAndStroke(path, saveRestore) { + const { + ctx, + current: { + lineWidth + } + } = this; + const [scaleX, scaleY] = this.getScaleForStroking(); + if (scaleX === scaleY) { + ctx.lineWidth = (lineWidth || 1) * scaleX; + ctx.stroke(path); + return; + } + const SCALE_MATRIX = CanvasGraphics.#SCALE_MATRIX ??= new DOMMatrix(); + const dashes = ctx.getLineDash(); + if (saveRestore) { + ctx.save(); + } + ctx.scale(scaleX, scaleY); + SCALE_MATRIX.a = 1 / scaleX; + SCALE_MATRIX.d = 1 / scaleY; + const newPath = new Path2D(); + newPath.addPath(path, SCALE_MATRIX); + if (dashes.length > 0) { + const scale = Math.max(scaleX, scaleY); + ctx.setLineDash(dashes.map(x => x / scale)); + ctx.lineDashOffset /= scale; + } + ctx.lineWidth = lineWidth || 1; + ctx.stroke(newPath); + if (saveRestore) { + ctx.restore(); + } + } + isContentVisible() { + for (let i = this.markedContentStack.length - 1; i >= 0; i--) { + if (!this.markedContentStack[i].visible) { + return false; + } + } + return true; + } +} +for (const op in OPS) { + if (CanvasGraphics.prototype[op] !== undefined) { + CanvasGraphics.prototype[OPS[op]] = CanvasGraphics.prototype[op]; + } +} + +;// ./src/shared/base_pdf_stream.js + + + + + + + + +class BasePDFStream { + #PDFStreamReader = null; + #PDFStreamRangeReader = null; + _fullReader = null; + _rangeReaders = new Set(); + _source = null; + constructor(source, PDFStreamReader, PDFStreamRangeReader) { + this._source = source; + this.#PDFStreamReader = PDFStreamReader; + this.#PDFStreamRangeReader = PDFStreamRangeReader; + } + get _progressiveDataLength() { + return this._fullReader?._loaded ?? 0; + } + getFullReader() { + util_assert(!this._fullReader, "BasePDFStream.getFullReader can only be called once."); + return this._fullReader = new this.#PDFStreamReader(this); + } + getRangeReader(begin, end) { + if (end <= this._progressiveDataLength) { + return null; + } + const reader = new this.#PDFStreamRangeReader(this, begin, end); + this._rangeReaders.add(reader); + return reader; + } + cancelAllRequests(reason) { + this._fullReader?.cancel(reason); + for (const reader of new Set(this._rangeReaders)) { + reader.cancel(reason); + } + } +} +class BasePDFStreamReader { + onProgress = null; + _contentLength = 0; + _filename = null; + _headersCapability = Promise.withResolvers(); + _isRangeSupported = false; + _isStreamingSupported = false; + _loaded = 0; + _stream = null; + constructor(stream) { + this._stream = stream; + } + _callOnProgress() { + this.onProgress?.({ + loaded: this._loaded, + total: this._contentLength + }); + } + get headersReady() { + return this._headersCapability.promise; + } + get filename() { + return this._filename; + } + get contentLength() { + return this._contentLength; + } + get isRangeSupported() { + return this._isRangeSupported; + } + get isStreamingSupported() { + return this._isStreamingSupported; + } + async read() { + unreachable("Abstract method `read` called"); + } + cancel(reason) { + unreachable("Abstract method `cancel` called"); + } +} +class BasePDFStreamRangeReader { + _stream = null; + constructor(stream, begin, end) { + this._stream = stream; + } + async read() { + unreachable("Abstract method `read` called"); + } + cancel(reason) { + unreachable("Abstract method `cancel` called"); + } +} + +;// ./src/display/content_disposition.js + + + +function getFilenameFromContentDispositionHeader(contentDisposition) { + let needsEncodingFixup = true; + let tmp = toParamRegExp("filename\\*", "i").exec(contentDisposition); + if (tmp) { + tmp = tmp[1]; + let filename = rfc2616unquote(tmp); + filename = unescape(filename); + filename = rfc5987decode(filename); + filename = rfc2047decode(filename); + return fixupEncoding(filename); + } + tmp = rfc2231getparam(contentDisposition); + if (tmp) { + const filename = rfc2047decode(tmp); + return fixupEncoding(filename); + } + tmp = toParamRegExp("filename", "i").exec(contentDisposition); + if (tmp) { + tmp = tmp[1]; + let filename = rfc2616unquote(tmp); + filename = rfc2047decode(filename); + return fixupEncoding(filename); + } + function toParamRegExp(attributePattern, flags) { + return new RegExp("(?:^|;)\\s*" + attributePattern + "\\s*=\\s*" + "(" + '[^";\\s][^;\\s]*' + "|" + '"(?:[^"\\\\]|\\\\"?)+"?' + ")", flags); + } + function textdecode(encoding, value) { + if (encoding) { + if (!/^[\x00-\xFF]+$/.test(value)) { + return value; + } + try { + const decoder = new TextDecoder(encoding, { + fatal: true + }); + const buffer = stringToBytes(value); + value = decoder.decode(buffer); + needsEncodingFixup = false; + } catch {} + } + return value; + } + function fixupEncoding(value) { + if (needsEncodingFixup && /[\x80-\xff]/.test(value)) { + value = textdecode("utf-8", value); + if (needsEncodingFixup) { + value = textdecode("iso-8859-1", value); + } + } + return value; + } + function rfc2231getparam(contentDispositionStr) { + const matches = []; + let match; + const iter = toParamRegExp("filename\\*((?!0\\d)\\d+)(\\*?)", "ig"); + while ((match = iter.exec(contentDispositionStr)) !== null) { + let [, n, quot, part] = match; + n = parseInt(n, 10); + if (n in matches) { + if (n === 0) { + break; + } + continue; + } + matches[n] = [quot, part]; + } + const parts = []; + for (let n = 0; n < matches.length; ++n) { + if (!(n in matches)) { + break; + } + let [quot, part] = matches[n]; + part = rfc2616unquote(part); + if (quot) { + part = unescape(part); + if (n === 0) { + part = rfc5987decode(part); + } + } + parts.push(part); + } + return parts.join(""); + } + function rfc2616unquote(value) { + if (value.startsWith('"')) { + const parts = value.slice(1).split('\\"'); + for (let i = 0; i < parts.length; ++i) { + const quotindex = parts[i].indexOf('"'); + if (quotindex !== -1) { + parts[i] = parts[i].slice(0, quotindex); + parts.length = i + 1; + } + parts[i] = parts[i].replaceAll(/\\(.)/g, "$1"); + } + value = parts.join('"'); + } + return value; + } + function rfc5987decode(extvalue) { + const encodingend = extvalue.indexOf("'"); + if (encodingend === -1) { + return extvalue; + } + const encoding = extvalue.slice(0, encodingend); + const langvalue = extvalue.slice(encodingend + 1); + const value = langvalue.replace(/^[^']*'/, ""); + return textdecode(encoding, value); + } + function rfc2047decode(value) { + if (!value.startsWith("=?") || /[\x00-\x19\x80-\xff]/.test(value)) { + return value; + } + return value.replaceAll(/=\?([\w-]*)\?([QB])\?((?:[^?]|\?(?!=))*)\?=/gi, function (matches, charset, encoding, text) { + if (encoding === "q" || encoding === "Q") { + text = text.replaceAll("_", " ").replaceAll(/=([0-9a-f]{2})/gi, (_, hex) => String.fromCharCode(parseInt(hex, 16))); + return textdecode(charset, text); + } + try { + text = atob(text); + } catch {} + return textdecode(charset, text); + }); + } + return ""; +} + +;// ./src/display/network_utils.js + + + + + +function createHeaders(isHttp, httpHeaders) { + const headers = new Headers(); + if (!isHttp || !httpHeaders || typeof httpHeaders !== "object") { + return headers; + } + for (const key in httpHeaders) { + const val = httpHeaders[key]; + if (val !== undefined) { + headers.append(key, val); + } + } + return headers; +} +function trimHeadersEnd(str) { + let end = str.length; + while (end > 0 && str[end - 1] !== " " && /\s/.test(str[end - 1])) { + end--; + } + return str.slice(0, end); +} +function getResponseOrigin(url) { + return URL.parse(url)?.origin ?? null; +} +function validateRangeRequestCapabilities({ + responseHeaders, + isHttp, + rangeChunkSize, + disableRange +}) { + const rv = { + contentLength: 0, + isRangeSupported: false + }; + const length = parseInt(responseHeaders.get("Content-Length"), 10); + if (!Number.isInteger(length)) { + return rv; + } + rv.contentLength = length; + if (length <= 2 * rangeChunkSize) { + return rv; + } + if (disableRange || !isHttp || responseHeaders.get("Accept-Ranges") !== "bytes") { + return rv; + } + const contentEncoding = responseHeaders.get("Content-Encoding") || "identity"; + if (contentEncoding === "identity") { + rv.isRangeSupported = true; + } + return rv; +} +function extractFilenameFromHeader(responseHeaders) { + const contentDisposition = responseHeaders.get("Content-Disposition"); + if (contentDisposition) { + let filename = getFilenameFromContentDispositionHeader(contentDisposition); + if (filename.includes("%")) { + try { + filename = decodeURIComponent(filename); + } catch {} + } + if (isPdfFile(filename)) { + return filename; + } + } + return null; +} +function createResponseError(status, url) { + return new ResponseException(`Unexpected server response (${status}) while retrieving PDF "${url.href}".`, status, status === 404 || status === 0 && url.protocol === "file:"); +} +function ensureResponseOrigin(rangeOrigin, origin) { + if (rangeOrigin !== origin) { + throw new Error(`Expected range response-origin "${rangeOrigin}" to match "${origin}".`); + } +} + +;// ./src/display/fetch_stream.js + + + + + + + + +function fetchUrl(url, headers, withCredentials, abortController) { + return fetch(url, { + method: "GET", + headers, + signal: abortController.signal, + mode: "cors", + credentials: withCredentials ? "include" : "same-origin", + redirect: "follow" + }); +} +function ensureResponseStatus(status, url) { + if (status !== 200 && status !== 206) { + throw createResponseError(status, url); + } +} +function getArrayBuffer(val) { + if (val instanceof Uint8Array) { + return val.buffer; + } + if (val instanceof ArrayBuffer) { + return val; + } + throw new Error(`getArrayBuffer - unexpected data: ${val}`); +} +class PDFFetchStream extends BasePDFStream { + _responseOrigin = null; + constructor(source) { + super(source, PDFFetchStreamReader, PDFFetchStreamRangeReader); + const { + httpHeaders, + url + } = source; + util_assert(/https?:/.test(url.protocol), "PDFFetchStream only supports http(s):// URLs."); + this.headers = createHeaders(true, httpHeaders); + } +} +class PDFFetchStreamReader extends BasePDFStreamReader { + _abortController = new AbortController(); + _reader = null; + constructor(stream) { + super(stream); + const { + disableRange, + disableStream, + rangeChunkSize, + url, + withCredentials + } = stream._source; + this._isStreamingSupported = !disableStream; + const headers = new Headers(stream.headers); + fetchUrl(url, headers, withCredentials, this._abortController).then(response => { + stream._responseOrigin = getResponseOrigin(response.url); + ensureResponseStatus(response.status, url); + this._reader = response.body.getReader(); + const responseHeaders = response.headers; + const { + contentLength, + isRangeSupported + } = validateRangeRequestCapabilities({ + responseHeaders, + isHttp: true, + rangeChunkSize, + disableRange + }); + this._contentLength = contentLength; + this._isRangeSupported = isRangeSupported; + this._filename = extractFilenameFromHeader(responseHeaders); + if (!this._isStreamingSupported && this._isRangeSupported) { + this.cancel(new AbortException("Streaming is disabled.")); + } + this._headersCapability.resolve(); + }).catch(this._headersCapability.reject); + } + async read() { + await this._headersCapability.promise; + const { + value, + done + } = await this._reader.read(); + if (done) { + return { + value, + done + }; + } + this._loaded += value.byteLength; + this._callOnProgress(); + return { + value: getArrayBuffer(value), + done: false + }; + } + cancel(reason) { + this._reader?.cancel(reason); + this._abortController.abort(); + } +} +class PDFFetchStreamRangeReader extends BasePDFStreamRangeReader { + _abortController = new AbortController(); + _readCapability = Promise.withResolvers(); + _reader = null; + constructor(stream, begin, end) { + super(stream, begin, end); + const { + url, + withCredentials + } = stream._source; + const headers = new Headers(stream.headers); + headers.append("Range", `bytes=${begin}-${end - 1}`); + fetchUrl(url, headers, withCredentials, this._abortController).then(response => { + const responseOrigin = getResponseOrigin(response.url); + ensureResponseOrigin(responseOrigin, stream._responseOrigin); + ensureResponseStatus(response.status, url); + this._reader = response.body.getReader(); + this._readCapability.resolve(); + }).catch(this._readCapability.reject); + } + async read() { + await this._readCapability.promise; + const { + value, + done + } = await this._reader.read(); + return done ? { + value, + done + } : { + value: getArrayBuffer(value), + done: false + }; + } + cancel(reason) { + this._reader?.cancel(reason); + this._abortController.abort(); + } +} + +;// ./src/display/transport_stream.js + + + + + + + + + + + +function transport_stream_getArrayBuffer(val) { + return val instanceof Uint8Array && val.byteLength === val.buffer.byteLength ? val.buffer : new Uint8Array(val).buffer; +} +function endRequests() { + for (const capability of this._requests) { + capability.resolve({ + value: undefined, + done: true + }); + } + this._requests.length = 0; +} +class PDFDataTransportStream extends BasePDFStream { + _progressiveDone = false; + _queuedChunks = []; + constructor(source) { + super(source, PDFDataTransportStreamReader, PDFDataTransportStreamRangeReader); + const { + pdfDataRangeTransport + } = source; + const { + initialData, + progressiveDone + } = pdfDataRangeTransport; + if (initialData?.length > 0) { + const buffer = transport_stream_getArrayBuffer(initialData); + this._queuedChunks.push(buffer); + } + this._progressiveDone = progressiveDone; + const listener = args => { + switch (args.type) { + case "range": + case "progressiveRead": + this.#onReceiveData(args.begin, args.chunk); + break; + case "progressiveDone": + this._fullReader?.progressiveDone(); + this._progressiveDone = true; + break; + } + }; + pdfDataRangeTransport.transportReady(listener); + } + #onReceiveData(begin, chunk) { + const buffer = transport_stream_getArrayBuffer(chunk); + if (begin === undefined) { + if (this._fullReader) { + this._fullReader._enqueue(buffer); + } else { + this._queuedChunks.push(buffer); + } + } else { + const rangeReader = this._rangeReaders.keys().find(r => r._begin === begin); + util_assert(rangeReader, "#onReceiveData - no `PDFDataTransportStreamRangeReader` instance found."); + rangeReader._enqueue(buffer); + } + } + getFullReader() { + const reader = super.getFullReader(); + this._queuedChunks = null; + return reader; + } + getRangeReader(begin, end) { + const reader = super.getRangeReader(begin, end); + if (reader) { + reader.onDone = () => this._rangeReaders.delete(reader); + this._source.pdfDataRangeTransport.requestDataRange(begin, end); + } + return reader; + } + cancelAllRequests(reason) { + super.cancelAllRequests(reason); + this._source.pdfDataRangeTransport.abort(); + } +} +class PDFDataTransportStreamReader extends BasePDFStreamReader { + #endRequests = endRequests.bind(this); + _done = false; + _queuedChunks = null; + _requests = []; + constructor(stream) { + super(stream); + const { + pdfDataRangeTransport, + disableRange, + disableStream + } = stream._source; + const { + length, + contentDispositionFilename + } = pdfDataRangeTransport; + this._queuedChunks = stream._queuedChunks || []; + for (const chunk of this._queuedChunks) { + this._loaded += chunk.byteLength; + } + this._done = stream._progressiveDone; + this._contentLength = length; + this._isStreamingSupported = !disableStream; + this._isRangeSupported = !disableRange; + if (isPdfFile(contentDispositionFilename)) { + this._filename = contentDispositionFilename; + } + this._headersCapability.resolve(); + const loaded = this._loaded; + Promise.resolve().then(() => { + if (loaded > 0 && this._loaded === loaded) { + this._callOnProgress(); + } + }); + } + _enqueue(chunk) { + if (this._done) { + return; + } + if (this._requests.length > 0) { + const capability = this._requests.shift(); + capability.resolve({ + value: chunk, + done: false + }); + } else { + this._queuedChunks.push(chunk); + } + this._loaded += chunk.byteLength; + this._callOnProgress(); + } + async read() { + if (this._queuedChunks.length > 0) { + const chunk = this._queuedChunks.shift(); + return { + value: chunk, + done: false + }; + } + if (this._done) { + return { + value: undefined, + done: true + }; + } + const capability = Promise.withResolvers(); + this._requests.push(capability); + return capability.promise; + } + cancel(reason) { + this._done = true; + this.#endRequests(); + } + progressiveDone() { + this._done ||= true; + if (this._queuedChunks.length === 0) { + this.#endRequests(); + } + } +} +class PDFDataTransportStreamRangeReader extends BasePDFStreamRangeReader { + #endRequests = endRequests.bind(this); + onDone = null; + _begin = -1; + _done = false; + _queuedChunk = null; + _requests = []; + constructor(stream, begin, end) { + super(stream, begin, end); + this._begin = begin; + } + _enqueue(chunk) { + if (this._done) { + return; + } + if (this._requests.length === 0) { + this._queuedChunk = chunk; + } else { + const capability = this._requests.shift(); + capability.resolve({ + value: chunk, + done: false + }); + this.#endRequests(); + } + this._done = true; + this.onDone?.(); + } + async read() { + if (this._queuedChunk) { + const chunk = this._queuedChunk; + this._queuedChunk = null; + return { + value: chunk, + done: false + }; + } + if (this._done) { + return { + value: undefined, + done: true + }; + } + const capability = Promise.withResolvers(); + this._requests.push(capability); + return capability.promise; + } + cancel(reason) { + this._done = true; + this.#endRequests(); + this.onDone?.(); + } +} + +;// ./src/display/network.js + + + + + + + + + +const OK_RESPONSE = 200; +const PARTIAL_CONTENT_RESPONSE = 206; +function network_getArrayBuffer(val) { + return typeof val !== "string" ? val : stringToBytes(val).buffer; +} +class PDFNetworkStream extends BasePDFStream { + #pendingRequests = new WeakMap(); + _responseOrigin = null; + constructor(source) { + super(source, PDFNetworkStreamReader, PDFNetworkStreamRangeReader); + const { + httpHeaders, + url + } = source; + this.url = url; + this.isHttp = /https?:/.test(url.protocol); + this.headers = createHeaders(this.isHttp, httpHeaders); + } + _request(args) { + const xhr = new XMLHttpRequest(); + const pendingRequest = { + validateStatus: null, + onHeadersReceived: args.onHeadersReceived, + onDone: args.onDone, + onError: args.onError, + onProgress: args.onProgress + }; + this.#pendingRequests.set(xhr, pendingRequest); + xhr.open("GET", this.url); + xhr.withCredentials = this._source.withCredentials; + for (const [key, val] of this.headers) { + xhr.setRequestHeader(key, val); + } + if (this.isHttp && "begin" in args && "end" in args) { + xhr.setRequestHeader("Range", `bytes=${args.begin}-${args.end - 1}`); + pendingRequest.validateStatus = status => status === PARTIAL_CONTENT_RESPONSE || status === OK_RESPONSE; + } else { + pendingRequest.validateStatus = status => status === OK_RESPONSE; + } + xhr.responseType = "arraybuffer"; + util_assert(args.onError, "Expected `onError` callback to be provided."); + xhr.onerror = () => args.onError(xhr.status); + xhr.onreadystatechange = this.#onStateChange.bind(this, xhr); + xhr.onprogress = this.#onProgress.bind(this, xhr); + xhr.send(null); + return xhr; + } + #onProgress(xhr, evt) { + const pendingRequest = this.#pendingRequests.get(xhr); + pendingRequest?.onProgress?.(evt); + } + #onStateChange(xhr, evt) { + const pendingRequest = this.#pendingRequests.get(xhr); + if (!pendingRequest) { + return; + } + if (xhr.readyState >= 2 && pendingRequest.onHeadersReceived) { + pendingRequest.onHeadersReceived(); + delete pendingRequest.onHeadersReceived; + } + if (xhr.readyState !== 4) { + return; + } + if (!this.#pendingRequests.has(xhr)) { + return; + } + this.#pendingRequests.delete(xhr); + if (xhr.status === 0 && this.isHttp) { + pendingRequest.onError(xhr.status); + return; + } + const xhrStatus = xhr.status || OK_RESPONSE; + if (!pendingRequest.validateStatus(xhrStatus)) { + pendingRequest.onError(xhr.status); + return; + } + const chunk = network_getArrayBuffer(xhr.response); + if (xhrStatus === PARTIAL_CONTENT_RESPONSE) { + const rangeHeader = xhr.getResponseHeader("Content-Range"); + if (/bytes \d+-\d+\/\d+/.test(rangeHeader)) { + pendingRequest.onDone(chunk); + } else { + warn(`Missing or invalid "Content-Range" header.`); + pendingRequest.onError(0); + } + } else if (chunk) { + pendingRequest.onDone(chunk); + } else { + pendingRequest.onError(xhr.status); + } + } + _abortRequest(xhr) { + if (this.#pendingRequests.has(xhr)) { + this.#pendingRequests.delete(xhr); + xhr.abort(); + } + } + getRangeReader(begin, end) { + const reader = super.getRangeReader(begin, end); + if (reader) { + reader.onClosed = () => this._rangeReaders.delete(reader); + } + return reader; + } +} +class PDFNetworkStreamReader extends BasePDFStreamReader { + #endRequests = endRequests.bind(this); + _cachedChunks = []; + _done = false; + _requests = []; + _storedError = null; + constructor(stream) { + super(stream); + this._fullRequestXhr = stream._request({ + onHeadersReceived: this.#onHeadersReceived.bind(this), + onDone: this.#onDone.bind(this), + onError: this.#onError.bind(this), + onProgress: this.#onProgress.bind(this) + }); + } + #onHeadersReceived() { + const stream = this._stream; + const { + disableRange, + rangeChunkSize + } = stream._source; + const fullRequestXhr = this._fullRequestXhr; + stream._responseOrigin = getResponseOrigin(fullRequestXhr.responseURL); + const rawResponseHeaders = fullRequestXhr.getAllResponseHeaders(); + const responseHeaders = new Headers(rawResponseHeaders ? trimHeadersEnd(rawResponseHeaders.trimStart()).split(/[\r\n]+/).map(x => { + const [key, ...val] = x.split(": "); + return [key, val.join(": ")]; + }) : []); + const { + contentLength, + isRangeSupported + } = validateRangeRequestCapabilities({ + responseHeaders, + isHttp: stream.isHttp, + rangeChunkSize, + disableRange + }); + this._contentLength = contentLength; + this._isRangeSupported = isRangeSupported; + this._filename = extractFilenameFromHeader(responseHeaders); + if (this._isRangeSupported) { + stream._abortRequest(fullRequestXhr); + } + this._headersCapability.resolve(); + } + #onDone(chunk) { + if (this._requests.length > 0) { + const capability = this._requests.shift(); + capability.resolve({ + value: chunk, + done: false + }); + } else { + this._cachedChunks.push(chunk); + } + this._done = true; + if (this._cachedChunks.length === 0) { + this.#endRequests(); + } + } + #onError(status) { + this._storedError = createResponseError(status, this._stream.url); + this._headersCapability.reject(this._storedError); + for (const capability of this._requests) { + capability.reject(this._storedError); + } + this._requests.length = 0; + this._cachedChunks.length = 0; + } + #onProgress(evt) { + this.onProgress?.({ + loaded: evt.loaded, + total: evt.lengthComputable ? evt.total : this._contentLength + }); + } + async read() { + await this._headersCapability.promise; + if (this._storedError) { + throw this._storedError; + } + if (this._cachedChunks.length > 0) { + const chunk = this._cachedChunks.shift(); + return { + value: chunk, + done: false + }; + } + if (this._done) { + return { + value: undefined, + done: true + }; + } + const capability = Promise.withResolvers(); + this._requests.push(capability); + return capability.promise; + } + cancel(reason) { + this._done = true; + this._headersCapability.reject(reason); + this.#endRequests(); + this._stream._abortRequest(this._fullRequestXhr); + this._fullRequestXhr = null; + } +} +class PDFNetworkStreamRangeReader extends BasePDFStreamRangeReader { + #endRequests = endRequests.bind(this); + onClosed = null; + _done = false; + _queuedChunk = null; + _requests = []; + _storedError = null; + constructor(stream, begin, end) { + super(stream, begin, end); + this._requestXhr = stream._request({ + begin, + end, + onHeadersReceived: this.#onHeadersReceived.bind(this), + onDone: this.#onDone.bind(this), + onError: this.#onError.bind(this), + onProgress: null + }); + } + #onHeadersReceived() { + const responseOrigin = getResponseOrigin(this._requestXhr?.responseURL); + try { + ensureResponseOrigin(responseOrigin, this._stream._responseOrigin); + } catch (ex) { + this._storedError = ex; + this.#onError(0); + } + } + #onDone(chunk) { + if (this._requests.length > 0) { + const capability = this._requests.shift(); + capability.resolve({ + value: chunk, + done: false + }); + } else { + this._queuedChunk = chunk; + } + this._done = true; + this.#endRequests(); + this.onClosed?.(); + } + #onError(status) { + this._storedError ??= createResponseError(status, this._stream.url); + for (const capability of this._requests) { + capability.reject(this._storedError); + } + this._requests.length = 0; + this._queuedChunk = null; + } + async read() { + if (this._storedError) { + throw this._storedError; + } + if (this._queuedChunk !== null) { + const chunk = this._queuedChunk; + this._queuedChunk = null; + return { + value: chunk, + done: false + }; + } + if (this._done) { + return { + value: undefined, + done: true + }; + } + const capability = Promise.withResolvers(); + this._requests.push(capability); + return capability.promise; + } + cancel(reason) { + this._done = true; + this.#endRequests(); + this._stream._abortRequest(this._requestXhr); + this.onClosed?.(); + } +} + +;// ./src/display/node_stream.js + + + + +function getReadableStream(url, opts = null) { + const fs = process.getBuiltinModule("fs"); + const { + Readable + } = process.getBuiltinModule("stream"); + const readStream = fs.createReadStream(url, opts); + return Readable.toWeb(readStream); +} +class PDFNodeStream extends BasePDFStream { + constructor(source) { + super(source, PDFNodeStreamReader, PDFNodeStreamRangeReader); + const { + url + } = source; + util_assert(url.protocol === "file:", "PDFNodeStream only supports file:// URLs."); + } +} +class PDFNodeStreamReader extends BasePDFStreamReader { + _reader = null; + constructor(stream) { + super(stream); + const { + disableRange, + disableStream, + rangeChunkSize, + url + } = stream._source; + this._isStreamingSupported = !disableStream; + const fs = process.getBuiltinModule("fs/promises"); + fs.lstat(url).then(stat => { + const readableStream = getReadableStream(url); + this._reader = readableStream.getReader(); + const { + size + } = stat; + this._contentLength = size; + this._isRangeSupported = !disableRange && size > 2 * rangeChunkSize; + if (!this._isStreamingSupported && this._isRangeSupported) { + this.cancel(new AbortException("Streaming is disabled.")); + } + this._headersCapability.resolve(); + }).catch(error => { + if (error.code === "ENOENT") { + error = createResponseError(0, url); + } + this._headersCapability.reject(error); + }); + } + async read() { + await this._headersCapability.promise; + const { + value, + done + } = await this._reader.read(); + if (done) { + return { + value, + done + }; + } + this._loaded += value.byteLength; + this._callOnProgress(); + return { + value: getArrayBuffer(value), + done: false + }; + } + cancel(reason) { + this._reader?.cancel(reason); + } +} +class PDFNodeStreamRangeReader extends BasePDFStreamRangeReader { + _readCapability = Promise.withResolvers(); + _reader = null; + constructor(stream, begin, end) { + super(stream, begin, end); + const { + url + } = stream._source; + try { + const readableStream = getReadableStream(url, { + start: begin, + end: end - 1 + }); + this._reader = readableStream.getReader(); + this._readCapability.resolve(); + } catch (error) { + this._readCapability.reject(error); + } + } + async read() { + await this._readCapability.promise; + const { + value, + done + } = await this._reader.read(); + return done ? { + value, + done + } : { + value: getArrayBuffer(value), + done: false + }; + } + cancel(reason) { + this._reader?.cancel(reason); + } +} + +;// ./src/display/network_stream.js + + + + + +function getNetworkStream(url) { + return isValidFetchUrl(url) ? PDFFetchStream : isNodeJS ? PDFNodeStream : PDFNetworkStream; +} + +;// ./src/display/worker_options.js +class GlobalWorkerOptions { + static #port = null; + static #src = ""; + static get workerPort() { + return this.#port; + } + static set workerPort(val) { + if (!(typeof Worker !== "undefined" && val instanceof Worker) && val !== null) { + throw new Error("Invalid `workerPort` type."); + } + this.#port = val; + } + static get workerSrc() { + return this.#src; + } + static set workerSrc(val) { + if (typeof val !== "string") { + throw new Error("Invalid `workerSrc` type."); + } + this.#src = val; + } +} + +;// ./src/display/metadata.js +class Metadata { + #map; + #data; + constructor({ + parsedData, + rawData + }) { + this.#map = parsedData; + this.#data = rawData; + } + getRaw() { + return this.#data; + } + get(name) { + return this.#map.get(name) ?? null; + } + [Symbol.iterator]() { + return this.#map.entries(); + } +} + +;// ./src/display/optional_content_config.js + + + + +const INTERNAL = Symbol("INTERNAL"); +class OptionalContentGroup { + #isDisplay = false; + #isPrint = false; + #userSet = false; + #visible = true; + constructor(renderingIntent, { + name, + intent, + usage, + rbGroups + }) { + this.#isDisplay = !!(renderingIntent & RenderingIntentFlag.DISPLAY); + this.#isPrint = !!(renderingIntent & RenderingIntentFlag.PRINT); + this.name = name; + this.intent = intent; + this.usage = usage; + this.rbGroups = rbGroups; + } + get visible() { + if (this.#userSet) { + return this.#visible; + } + if (!this.#visible) { + return false; + } + const { + print, + view + } = this.usage; + if (this.#isDisplay) { + return view?.viewState !== "OFF"; + } else if (this.#isPrint) { + return print?.printState !== "OFF"; + } + return true; + } + _setVisible(internal, visible, userSet = false) { + if (internal !== INTERNAL) { + unreachable("Internal method `_setVisible` called."); + } + this.#userSet = userSet; + this.#visible = visible; + } + get serializable() { + return { + userSet: this.#userSet, + visible: this.#visible + }; + } +} +class OptionalContentConfig { + #cachedGetHash = null; + #groups = new Map(); + #initialHash = null; + #order = null; + #rawData; + creator = null; + name = null; + constructor(data, renderingIntent = RenderingIntentFlag.DISPLAY, groupState = null) { + this.#rawData = data; + this.renderingIntent = renderingIntent; + if (data === null) { + return; + } + this.name = data.name; + this.creator = data.creator; + this.#order = data.order; + for (const group of data.groups) { + this.#groups.set(group.id, new OptionalContentGroup(renderingIntent, group)); + } + if (groupState) { + if (groupState.size !== this.#groups.size) { + unreachable("Incorrect serialized groupState."); + } + for (const [id, group] of groupState) { + this.#groups.get(id)._setVisible(INTERNAL, group.visible, group.userSet); + } + } else { + if (data.baseState === "OFF") { + for (const group of this.#groups.values()) { + group._setVisible(INTERNAL, false); + } + } + for (const on of data.on) { + this.#groups.get(on)._setVisible(INTERNAL, true); + } + for (const off of data.off) { + this.#groups.get(off)._setVisible(INTERNAL, false); + } + } + this.#initialHash = this.getHash(); + } + #evaluateVisibilityExpression(array) { + const length = array.length; + if (length < 2) { + return true; + } + const operator = array[0]; + for (let i = 1; i < length; i++) { + const element = array[i]; + let state; + if (Array.isArray(element)) { + state = this.#evaluateVisibilityExpression(element); + } else if (this.#groups.has(element)) { + state = this.#groups.get(element).visible; + } else { + warn(`Optional content group not found: ${element}`); + return true; + } + switch (operator) { + case "And": + if (!state) { + return false; + } + break; + case "Or": + if (state) { + return true; + } + break; + case "Not": + return !state; + default: + return true; + } + } + return operator === "And"; + } + isVisible(group) { + if (this.#groups.size === 0) { + return true; + } + if (!group) { + info("Optional content group not defined."); + return true; + } + if (group.type === "OCG") { + if (!this.#groups.has(group.id)) { + warn(`Optional content group not found: ${group.id}`); + return true; + } + return this.#groups.get(group.id).visible; + } else if (group.type === "OCMD") { + if (group.expression) { + return this.#evaluateVisibilityExpression(group.expression); + } + if (!group.policy || group.policy === "AnyOn") { + for (const id of group.ids) { + if (!this.#groups.has(id)) { + warn(`Optional content group not found: ${id}`); + return true; + } + if (this.#groups.get(id).visible) { + return true; + } + } + return false; + } else if (group.policy === "AllOn") { + for (const id of group.ids) { + if (!this.#groups.has(id)) { + warn(`Optional content group not found: ${id}`); + return true; + } + if (!this.#groups.get(id).visible) { + return false; + } + } + return true; + } else if (group.policy === "AnyOff") { + for (const id of group.ids) { + if (!this.#groups.has(id)) { + warn(`Optional content group not found: ${id}`); + return true; + } + if (!this.#groups.get(id).visible) { + return true; + } + } + return false; + } else if (group.policy === "AllOff") { + for (const id of group.ids) { + if (!this.#groups.has(id)) { + warn(`Optional content group not found: ${id}`); + return true; + } + if (this.#groups.get(id).visible) { + return false; + } + } + return true; + } + warn(`Unknown optional content policy ${group.policy}.`); + return true; + } + warn(`Unknown group type ${group.type}.`); + return true; + } + setVisibility(id, visible = true, preserveRB = true) { + const group = this.#groups.get(id); + if (!group) { + warn(`Optional content group not found: ${id}`); + return; + } + if (preserveRB && visible && group.rbGroups.length) { + for (const rbGroup of group.rbGroups) { + for (const otherId of rbGroup) { + if (otherId !== id) { + this.#groups.get(otherId)?._setVisible(INTERNAL, false, true); + } + } + } + } + group._setVisible(INTERNAL, !!visible, true); + this.#cachedGetHash = null; + } + setOCGState({ + state, + preserveRB + }) { + let operator; + for (const elem of state) { + switch (elem) { + case "ON": + case "OFF": + case "Toggle": + operator = elem; + continue; + } + const group = this.#groups.get(elem); + if (!group) { + continue; + } + switch (operator) { + case "ON": + this.setVisibility(elem, true, preserveRB); + break; + case "OFF": + this.setVisibility(elem, false, preserveRB); + break; + case "Toggle": + this.setVisibility(elem, !group.visible, preserveRB); + break; + } + } + this.#cachedGetHash = null; + } + get hasInitialVisibility() { + return this.#initialHash === null || this.getHash() === this.#initialHash; + } + getOrder() { + if (!this.#groups.size) { + return null; + } + return this.#order ? this.#order.slice() : [...this.#groups.keys()]; + } + getGroup(id) { + return this.#groups.get(id) || null; + } + getHash() { + if (this.#cachedGetHash !== null) { + return this.#cachedGetHash; + } + const hash = new MurmurHash3_64(); + for (const [id, group] of this.#groups) { + hash.update(`${id}:${group.visible}`); + } + return this.#cachedGetHash = hash.hexdigest(); + } + [Symbol.iterator]() { + return this.#groups.entries(); + } + get serializable() { + const groupState = new Map(); + for (const [id, group] of this.#groups) { + groupState.set(id, group.serializable); + } + return { + data: this.#rawData, + renderingIntent: this.renderingIntent, + groupState + }; + } + static fromSerializable({ + data, + renderingIntent, + groupState + }) { + return new OptionalContentConfig(data, renderingIntent, groupState); + } +} + +;// ./src/display/pages_mapper.js + + + + + + + + + + + + + + + + +class PagesMapper { + #pageNumberToId = null; + #prevPageNumbers = null; + #pagesNumber = 0; + #clipboard = null; + #savedData = null; + get pagesNumber() { + return this.#pagesNumber; + } + set pagesNumber(n) { + if (this.#pagesNumber === n) { + return; + } + this.#pagesNumber = n; + this.#pageNumberToId = null; + this.#prevPageNumbers = null; + } + #ensureInit() { + if (this.#pageNumberToId) { + return; + } + const n = this.#pagesNumber; + const pageNumberToId = this.#pageNumberToId = new Uint32Array(n); + for (let i = 0; i < n; i++) { + pageNumberToId[i] = i + 1; + } + this.#prevPageNumbers = new Int32Array(pageNumberToId); + } + #buildIdToPageNumber() { + const idToPageNumber = new Map(); + const pageNumberToId = this.#pageNumberToId; + for (let i = 0, ii = this.#pagesNumber; i < ii; i++) { + const id = pageNumberToId[i]; + const pageNumbers = idToPageNumber.get(id); + if (pageNumbers) { + pageNumbers.push(i + 1); + } else { + idToPageNumber.set(id, [i + 1]); + } + } + return idToPageNumber; + } + movePages(selectedPages, pagesToMove, index) { + this.#ensureInit(); + const pageNumberToId = this.#pageNumberToId; + const movedCount = pagesToMove.length; + const mappedPagesToMove = new Uint32Array(movedCount); + let removedBeforeTarget = 0; + for (let i = 0; i < movedCount; i++) { + const pageIndex = pagesToMove[i] - 1; + mappedPagesToMove[i] = pageNumberToId[pageIndex]; + if (pageIndex < index) { + removedBeforeTarget++; + } + } + const pagesNumber = this.#pagesNumber; + const remainingLen = pagesNumber - movedCount; + const prevPageNumbers = new Int32Array(pagesNumber); + const adjustedTarget = MathClamp(index - removedBeforeTarget, 0, remainingLen); + for (let i = 0, r = 0; i < pagesNumber; i++) { + if (!selectedPages.has(i + 1)) { + pageNumberToId[r] = pageNumberToId[i]; + prevPageNumbers[r++] = i + 1; + } + } + pageNumberToId.copyWithin(adjustedTarget + movedCount, adjustedTarget, remainingLen); + pageNumberToId.set(mappedPagesToMove, adjustedTarget); + prevPageNumbers.copyWithin(adjustedTarget + movedCount, adjustedTarget, remainingLen); + prevPageNumbers.set(pagesToMove, adjustedTarget); + this.#prevPageNumbers = prevPageNumbers; + if (pageNumberToId.every((id, i) => id === i + 1)) { + this.#pageNumberToId = null; + } + } + deletePages(pagesToDelete) { + this.#ensureInit(); + const pageNumberToId = this.#pageNumberToId; + const prevIdToPageNumber = this.#buildIdToPageNumber(); + this.#savedData = { + pageNumberToId: pageNumberToId.slice(), + pagesNumber: this.#pagesNumber, + prevPageNumbers: this.#prevPageNumbers.slice() + }; + const newN = this.#pagesNumber - pagesToDelete.length; + this.#pagesNumber = newN; + const newPageNumberToId = this.#pageNumberToId = new Uint32Array(newN); + this.#prevPageNumbers = new Int32Array(newN); + let sourceIndex = 0; + let destIndex = 0; + for (const pageNumber of pagesToDelete) { + const pageIndex = pageNumber - 1; + if (pageIndex !== sourceIndex) { + newPageNumberToId.set(pageNumberToId.subarray(sourceIndex, pageIndex), destIndex); + destIndex += pageIndex - sourceIndex; + } + sourceIndex = pageIndex + 1; + } + if (sourceIndex < pageNumberToId.length) { + newPageNumberToId.set(pageNumberToId.subarray(sourceIndex), destIndex); + } + this.#updatePrevPageNumbers(prevIdToPageNumber, new Set(pagesToDelete)); + } + cancelDelete() { + if (this.#savedData) { + this.#pageNumberToId = this.#savedData.pageNumberToId; + this.#pagesNumber = this.#savedData.pagesNumber; + this.#prevPageNumbers = this.#savedData.prevPageNumbers; + this.#savedData = null; + } + } + cleanSavedData() { + this.#savedData = null; + } + copyPages(pagesToCopy) { + this.#ensureInit(); + this.#clipboard = { + pageNumbers: pagesToCopy, + pageIds: pagesToCopy.map(n => this.#pageNumberToId[n - 1]) + }; + } + cancelCopy() { + this.#clipboard = null; + } + pastePages(index) { + this.#ensureInit(); + const pageNumberToId = this.#pageNumberToId; + const prevIdToPageNumber = this.#buildIdToPageNumber(); + const { + pageNumbers: copiedPageNumbers, + pageIds: copiedPageIds + } = this.#clipboard; + const newN = this.#pagesNumber + copiedPageNumbers.length; + this.#pagesNumber = newN; + const newPageNumberToId = this.#pageNumberToId = new Uint32Array(newN); + this.#prevPageNumbers = new Int32Array(newN); + newPageNumberToId.set(pageNumberToId.subarray(0, index), 0); + newPageNumberToId.set(copiedPageIds, index); + newPageNumberToId.set(pageNumberToId.subarray(index), index + copiedPageNumbers.length); + this.#updatePrevPageNumbers(prevIdToPageNumber, null, index, copiedPageNumbers); + this.#clipboard = null; + } + #updatePrevPageNumbers(prevIdToPageNumber, deletedPageNumbers = null, pasteIndex = -1, copiedPageNumbers = null) { + const prevPageNumbers = this.#prevPageNumbers; + const newPageNumberToId = this.#pageNumberToId; + const pasteEnd = pasteIndex + (copiedPageNumbers?.length ?? 0); + const idsIndices = new Map(); + for (let i = 0, ii = this.#pagesNumber; i < ii; i++) { + if (i >= pasteIndex && i < pasteEnd) { + prevPageNumbers[i] = -copiedPageNumbers[i - pasteIndex]; + continue; + } + const id = newPageNumberToId[i]; + const oldPositions = prevIdToPageNumber.get(id); + let j = idsIndices.get(id) || 0; + if (deletedPageNumbers && oldPositions) { + while (j < oldPositions.length && deletedPageNumbers.has(oldPositions[j])) { + j++; + } + } + prevPageNumbers[i] = oldPositions?.[j]; + idsIndices.set(id, j + 1); + } + } + hasBeenAltered() { + return this.#pageNumberToId !== null; + } + #buildCopyLevels(extractedPageNumbers = null) { + if (!this.#pageNumberToId) { + return null; + } + const copyLevels = new Int32Array(this.#pagesNumber).fill(-1); + const counts = new Map(); + if (extractedPageNumbers) { + for (const pageNumber of extractedPageNumbers) { + const id = this.getPageId(pageNumber); + const level = counts.get(id) ?? 0; + counts.set(id, level + 1); + copyLevels[pageNumber - 1] = level; + } + } else { + for (let i = 0, ii = this.#pagesNumber; i < ii; i++) { + const id = this.#pageNumberToId[i]; + const level = counts.get(id) ?? 0; + counts.set(id, level + 1); + copyLevels[i] = level; + } + } + return copyLevels; + } + getPageMappingForSaving(idToPageNumber = null, copyLevels = this.#buildCopyLevels()) { + idToPageNumber ??= this.#buildIdToPageNumber(); + let nCopy = 0; + for (const pageNumbers of idToPageNumber.values()) { + nCopy = Math.max(nCopy, pageNumbers.length); + } + const extractParams = new Array(nCopy); + for (let i = 0; i < nCopy; i++) { + extractParams[i] = { + document: null, + pageIndices: [], + includePages: [] + }; + } + for (const [id, pageNumbers] of idToPageNumber) { + for (let i = 0, ii = pageNumbers.length; i < ii; i++) { + extractParams[i].includePages.push([id - 1, pageNumbers[i] - 1]); + } + } + for (const { + includePages, + pageIndices + } of extractParams) { + includePages.sort((a, b) => a[0] - b[0]); + for (let i = 0, ii = includePages.length; i < ii; i++) { + pageIndices.push(includePages[i][1]); + includePages[i] = includePages[i][0]; + } + } + return { + pageInfos: extractParams, + copyLevels + }; + } + extractPages(extractedPageNumbers) { + extractedPageNumbers = Array.from(extractedPageNumbers).sort((a, b) => a - b); + const usedIds = new Map(); + for (let i = 0, ii = extractedPageNumbers.length; i < ii; i++) { + const id = this.getPageId(extractedPageNumbers[i]); + const usedPageNumbers = usedIds.getOrInsertComputed(id, makeArr); + usedPageNumbers.push(i + 1); + } + return this.getPageMappingForSaving(usedIds, this.#buildCopyLevels(extractedPageNumbers)); + } + getPrevPageNumber(pageNumber) { + return this.#prevPageNumbers?.[pageNumber - 1] ?? 0; + } + getPageNumber(id) { + if (!this.#pageNumberToId) { + return id; + } + const pageNumberToId = this.#pageNumberToId; + for (let i = 0, ii = this.#pagesNumber; i < ii; i++) { + if (pageNumberToId[i] === id) { + return i + 1; + } + } + return 0; + } + getPageId(pageNumber) { + return this.#pageNumberToId?.[pageNumber - 1] ?? pageNumber; + } + getMapping() { + return this.#pageNumberToId?.subarray(0, this.pagesNumber); + } +} + +;// ./src/display/pdf_objects.js + + +const INITIAL_DATA = Symbol("INITIAL_DATA"); +const dataObj = () => ({ + ...Promise.withResolvers(), + data: INITIAL_DATA +}); +class PDFObjects { + #objs = new Map(); + get(objId, callback = null) { + if (callback) { + const obj = this.#objs.getOrInsertComputed(objId, dataObj); + obj.promise.then(() => callback(obj.data)); + return null; + } + const obj = this.#objs.get(objId); + if (!obj || obj.data === INITIAL_DATA) { + throw new Error(`Requesting object that isn't resolved yet ${objId}.`); + } + return obj.data; + } + has(objId) { + const obj = this.#objs.get(objId); + return !!obj && obj.data !== INITIAL_DATA; + } + delete(objId) { + const obj = this.#objs.get(objId); + if (!obj || obj.data === INITIAL_DATA) { + return false; + } + this.#objs.delete(objId); + return true; + } + resolve(objId, data = null) { + const obj = this.#objs.getOrInsertComputed(objId, dataObj); + if (obj.data !== INITIAL_DATA) { + throw new Error(`Object already resolved ${objId}.`); + } + obj.data = data; + obj.resolve(); + } + clear() { + for (const { + data + } of this.#objs.values()) { + data?.bitmap?.close(); + } + this.#objs.clear(); + } + *[Symbol.iterator]() { + for (const [objId, { + data + }] of this.#objs) { + if (data !== INITIAL_DATA) { + yield [objId, data]; + } + } + } +} + +;// ./src/display/text_layer.js + + + + + + + + + + + + + + +const MAX_TEXT_DIVS_TO_RENDER = 100000; +const DEFAULT_FONT_SIZE = 30; +class TextLayer { + #capability = Promise.withResolvers(); + #container = null; + #disableProcessItems = false; + #fontInspectorEnabled = !!globalThis.FontInspector?.enabled; + #imagesHandler = null; + #lang = null; + #layoutTextParams = null; + #pageHeight = 0; + #pageWidth = 0; + #pixelRatio = OutputScale.pixelRatio; + #reader = null; + #rootContainer = null; + #rotation = 0; + #scale = 0; + #styleCache = Object.create(null); + #textContentItemsStr = []; + #textContentSource = null; + #textDivs = []; + #textDivProperties = new WeakMap(); + #transform = null; + static #ascentCache = new Map(); + static #canvasContexts = new Map(); + static #canvasCtxFonts = new WeakMap(); + static #minFontSize = null; + static #pendingTextLayers = new Set(); + constructor({ + textContentSource, + images, + container, + viewport + }) { + if (textContentSource instanceof ReadableStream) { + this.#textContentSource = textContentSource; + } else if (typeof textContentSource === "object") { + this.#textContentSource = new ReadableStream({ + start(controller) { + controller.enqueue(textContentSource); + controller.close(); + } + }); + } else { + throw new Error('No "textContentSource" parameter specified.'); + } + this.#container = this.#rootContainer = container; + this.#imagesHandler = images; + this.#scale = viewport.scale * this.#pixelRatio; + this.#rotation = viewport.rotation; + this.#layoutTextParams = { + div: null, + properties: null, + ctx: null + }; + const { + pageWidth, + pageHeight, + pageX, + pageY + } = viewport.rawDims; + this.#transform = [1, 0, 0, -1, -pageX, pageY + pageHeight]; + this.#pageWidth = pageWidth; + this.#pageHeight = pageHeight; + TextLayer.#ensureMinFontSizeComputed(); + container.style.setProperty("--min-font-size", TextLayer.#minFontSize); + setLayerDimensions(container, viewport); + this.#capability.promise.finally(() => { + TextLayer.#pendingTextLayers.delete(this); + this.#layoutTextParams = null; + this.#styleCache = null; + }).catch(() => {}); + } + static get fontFamilyMap() { + const { + isWindows, + isFirefox + } = FeatureTest.platform; + return util_shadow(this, "fontFamilyMap", new Map([["sans-serif", `${isWindows && isFirefox ? "Calibri, " : ""}sans-serif`], ["monospace", `${isWindows && isFirefox ? "Lucida Console, " : ""}monospace`]])); + } + render() { + if (this.#imagesHandler) { + this.#container.append(this.#imagesHandler.render()); + } + const pump = () => { + this.#reader.read().then(({ + value, + done + }) => { + if (done) { + this.#capability.resolve(); + return; + } + this.#lang ??= value.lang; + Object.assign(this.#styleCache, value.styles); + this.#processItems(value.items); + pump(); + }, this.#capability.reject); + }; + this.#reader = this.#textContentSource.getReader(); + TextLayer.#pendingTextLayers.add(this); + pump(); + return this.#capability.promise; + } + update({ + viewport, + onBefore = null + }) { + const scale = viewport.scale * OutputScale.pixelRatio; + const rotation = viewport.rotation; + if (rotation !== this.#rotation) { + onBefore?.(); + this.#rotation = rotation; + setLayerDimensions(this.#rootContainer, { + rotation + }); + } + if (scale !== this.#scale) { + onBefore?.(); + this.#scale = scale; + this.#pixelRatio = OutputScale.pixelRatio; + const params = { + div: null, + properties: null, + ctx: TextLayer.#getCtx(this.#lang) + }; + for (const div of this.#textDivs) { + params.properties = this.#textDivProperties.get(div); + params.div = div; + this.#layout(params); + } + } + } + cancel() { + const abortEx = new AbortException("TextLayer task cancelled."); + this.#reader?.cancel(abortEx).catch(() => {}); + this.#reader = null; + this.#capability.reject(abortEx); + } + get textDivs() { + return this.#textDivs; + } + get textContentItemsStr() { + return this.#textContentItemsStr; + } + #processItems(items) { + if (this.#disableProcessItems) { + return; + } + this.#layoutTextParams.ctx ??= TextLayer.#getCtx(this.#lang); + const textDivs = this.#textDivs, + textContentItemsStr = this.#textContentItemsStr; + for (const item of items) { + if (textDivs.length > MAX_TEXT_DIVS_TO_RENDER) { + warn("Ignoring additional textDivs for performance reasons."); + this.#disableProcessItems = true; + return; + } + if (item.str === undefined) { + if (item.type === "beginMarkedContentProps" || item.type === "beginMarkedContent") { + const parent = this.#container; + this.#container = document.createElement("span"); + this.#container.classList.add("markedContent"); + if (item.id) { + this.#container.setAttribute("id", item.id); + } + if (item.tag === "Artifact") { + this.#container.ariaHidden = true; + } + parent.append(this.#container); + } else if (item.type === "endMarkedContent") { + this.#container = this.#container.parentNode; + } + continue; + } + textContentItemsStr.push(item.str); + this.#appendText(item); + } + } + #appendText(geom) { + const textDiv = document.createElement("span"); + const textDivProperties = { + angle: 0, + canvasWidth: 0, + hasText: geom.str !== "", + hasEOL: geom.hasEOL, + fontSize: 0 + }; + this.#textDivs.push(textDiv); + const tx = Util.transform(this.#transform, geom.transform); + let angle = Math.atan2(tx[1], tx[0]); + const style = this.#styleCache[geom.fontName]; + if (style.vertical) { + angle += Math.PI / 2; + } + let fontFamily = this.#fontInspectorEnabled && style.fontSubstitution || style.fontFamily; + fontFamily = TextLayer.fontFamilyMap.get(fontFamily) || fontFamily; + const fontHeight = Math.hypot(tx[2], tx[3]); + const fontAscent = fontHeight * TextLayer.#getAscent(fontFamily, style, this.#lang); + let left, top; + if (angle === 0) { + left = tx[4]; + top = tx[5] - fontAscent; + } else { + left = tx[4] + fontAscent * Math.sin(angle); + top = tx[5] - fontAscent * Math.cos(angle); + } + const divStyle = textDiv.style; + divStyle.left = `${(100 * left / this.#pageWidth).toFixed(2)}%`; + divStyle.top = `${(100 * top / this.#pageHeight).toFixed(2)}%`; + const roundedFontHeight = Math.round(fontHeight * 100) / 100; + divStyle.setProperty("--font-height", `${roundedFontHeight}px`); + divStyle.fontFamily = fontFamily; + textDivProperties.fontSize = roundedFontHeight; + textDiv.setAttribute("role", "presentation"); + textDiv.textContent = geom.str; + textDiv.dir = geom.dir; + if (this.#fontInspectorEnabled) { + textDiv.dataset.fontName = style.fontSubstitutionLoadedName || geom.fontName; + } + if (angle !== 0) { + textDivProperties.angle = angle * (180 / Math.PI); + } + let shouldScaleText = false; + if (geom.str.length > 1) { + shouldScaleText = true; + } else if (geom.str !== " " && geom.transform[0] !== geom.transform[3]) { + const absScaleX = Math.abs(geom.transform[0]), + absScaleY = Math.abs(geom.transform[3]); + if (absScaleX !== absScaleY && Math.max(absScaleX, absScaleY) / Math.min(absScaleX, absScaleY) > 1.5) { + shouldScaleText = true; + } + } + if (shouldScaleText) { + textDivProperties.canvasWidth = style.vertical ? geom.height : geom.width; + } + this.#textDivProperties.set(textDiv, textDivProperties); + this.#layoutTextParams.div = textDiv; + this.#layoutTextParams.properties = textDivProperties; + this.#layout(this.#layoutTextParams); + if (textDivProperties.hasText) { + this.#container.append(textDiv); + } + if (textDivProperties.hasEOL) { + const br = document.createElement("br"); + br.setAttribute("role", "presentation"); + this.#container.append(br); + } + } + #layout(params) { + const { + div, + properties, + ctx + } = params; + const { + style + } = div; + const { + canvasWidth, + fontSize + } = properties; + if (canvasWidth !== 0 && fontSize !== 0 && properties.hasText) { + const { + fontFamily + } = style; + const pixelRatio = this.#pixelRatio; + const measuredSize = TextLayer.#quantizeFontSize(fontSize * this.#scale / pixelRatio) * pixelRatio; + TextLayer.#ensureCtxFont(ctx, measuredSize, fontFamily); + const { + width + } = ctx.measureText(div.textContent); + if (width > 0) { + style.setProperty("--scale-x", canvasWidth * measuredSize / (width * fontSize)); + } + } + if (properties.angle !== 0) { + style.setProperty("--rotate", `${properties.angle}deg`); + } + } + static cleanup() { + if (this.#pendingTextLayers.size > 0) { + return; + } + this.#ascentCache.clear(); + for (const { + canvas + } of this.#canvasContexts.values()) { + canvas.remove(); + } + this.#canvasContexts.clear(); + } + static #getCtx(lang = null) { + let ctx = this.#canvasContexts.get(lang ||= ""); + if (!ctx) { + const canvas = document.createElement("canvas"); + canvas.style.cssText = "position:absolute;top:0;left:0;width:0;height:0;display:none;" + "letter-spacing:normal;word-spacing:normal"; + canvas.lang = lang; + document.body.append(canvas); + ctx = canvas.getContext("2d", { + alpha: false, + willReadFrequently: true + }); + this.#canvasContexts.set(lang, ctx); + this.#canvasCtxFonts.set(ctx, { + size: 0, + family: "" + }); + } + return ctx; + } + static #quantizeFontSize(size) { + size = Math.fround(size); + const d = Math.fround(size * ((1 << 17) + 1)); + return Math.fround(d - Math.fround(d - size)); + } + static #ensureCtxFont(ctx, size, family) { + const cached = this.#canvasCtxFonts.get(ctx); + if (size === cached.size && family === cached.family) { + return; + } + ctx.font = `${size}px ${family}`; + cached.size = size; + cached.family = family; + } + static #ensureMinFontSizeComputed() { + if (this.#minFontSize !== null) { + return; + } + const div = document.createElement("div"); + div.style.opacity = 0; + div.style.lineHeight = 1; + div.style.fontSize = "1px"; + div.style.position = "absolute"; + div.textContent = "X"; + document.body.append(div); + this.#minFontSize = div.getBoundingClientRect().height; + div.remove(); + } + static #getAscent(fontFamily, style, lang) { + const cachedAscent = this.#ascentCache.get(fontFamily); + if (cachedAscent) { + return cachedAscent; + } + const ctx = this.#getCtx(lang); + this.#ensureCtxFont(ctx, DEFAULT_FONT_SIZE, fontFamily); + const metrics = ctx.measureText(""); + const ascent = metrics.fontBoundingBoxAscent; + const descent = Math.abs(metrics.fontBoundingBoxDescent); + let ratio = 0.8; + if (ascent) { + ratio = ascent / (ascent + descent); + } else { + if (FeatureTest.platform.isFirefox) { + warn("Enable the `dom.textMetrics.fontBoundingBox.enabled` preference " + "in `about:config` to improve TextLayer rendering."); + } + if (style.ascent) { + ratio = style.ascent; + } else if (style.descent) { + ratio = 1 + style.descent; + } + } + this.#ascentCache.set(fontFamily, ratio); + return ratio; + } +} + +;// ./src/display/api.js + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +const RENDERING_CANCELLED_TIMEOUT = 100; +function getDocument(src = {}) { + const task = new PDFDocumentLoadingTask(); + const { + docId + } = task; + const url = src.url ? getUrlProp(src.url) : null; + const data = src.data ? getDataProp(src.data) : null; + const httpHeaders = src.httpHeaders || null; + const withCredentials = src.withCredentials === true; + const password = src.password ?? null; + const rangeTransport = src.range instanceof PDFDataRangeTransport ? src.range : null; + const rangeChunkSize = Number.isInteger(src.rangeChunkSize) && src.rangeChunkSize > 0 ? src.rangeChunkSize : 2 ** 16; + let worker = src.worker instanceof PDFWorker ? src.worker : null; + const verbosity = src.verbosity; + const docBaseUrl = typeof src.docBaseUrl === "string" && !isDataScheme(src.docBaseUrl) ? src.docBaseUrl : null; + const cMapUrl = getFactoryUrlProp(src.cMapUrl); + const cMapPacked = src.cMapPacked !== false; + const iccUrl = getFactoryUrlProp(src.iccUrl); + const standardFontDataUrl = getFactoryUrlProp(src.standardFontDataUrl); + const wasmUrl = getFactoryUrlProp(src.wasmUrl); + const ignoreErrors = src.stopAtErrors !== true; + const maxImageSize = Number.isInteger(src.maxImageSize) && src.maxImageSize > -1 ? src.maxImageSize : -1; + const isOffscreenCanvasSupported = typeof src.isOffscreenCanvasSupported === "boolean" ? src.isOffscreenCanvasSupported : !isNodeJS; + const isImageDecoderSupported = typeof src.isImageDecoderSupported === "boolean" ? src.isImageDecoderSupported : !isNodeJS; + const canvasMaxAreaInBytes = Number.isInteger(src.canvasMaxAreaInBytes) ? src.canvasMaxAreaInBytes : -1; + const disableFontFace = typeof src.disableFontFace === "boolean" ? src.disableFontFace : isNodeJS; + const fontExtraProperties = src.fontExtraProperties === true; + const enableXfa = src.enableXfa === true; + const ownerDocument = src.ownerDocument || globalThis.document; + const disableRange = src.disableRange === true; + const disableStream = src.disableStream === true; + const disableAutoFetch = src.disableAutoFetch === true; + const pdfBug = src.pdfBug === true; + const CanvasFactory = src.CanvasFactory || (isNodeJS ? NodeCanvasFactory : DOMCanvasFactory); + const FilterFactory = src.FilterFactory || (isNodeJS ? NodeFilterFactory : DOMFilterFactory); + const BinaryDataFactory = src.BinaryDataFactory || (isNodeJS ? NodeBinaryDataFactory : DOMBinaryDataFactory); + const enableHWA = src.enableHWA === true; + const enableWebGPU = src.enableWebGPU === true; + const gpuPromise = enableWebGPU ? initGPU() : Promise.resolve(false); + const useWasm = src.useWasm !== false; + const pagesMapper = src.pagesMapper || new PagesMapper(); + const useSystemFonts = typeof src.useSystemFonts === "boolean" ? src.useSystemFonts : !isNodeJS && !disableFontFace; + const useWorkerFetch = typeof src.useWorkerFetch === "boolean" ? src.useWorkerFetch : !!(BinaryDataFactory === DOMBinaryDataFactory && cMapUrl && cMapPacked && standardFontDataUrl && wasmUrl && isValidFetchUrl(cMapUrl, document.baseURI) && isValidFetchUrl(standardFontDataUrl, document.baseURI) && isValidFetchUrl(wasmUrl, document.baseURI)); + const styleElement = null; + setVerbosityLevel(verbosity); + const transportFactory = { + canvasFactory: new CanvasFactory({ + ownerDocument, + enableHWA + }), + filterFactory: new FilterFactory({ + docId, + ownerDocument + }), + binaryDataFactory: useWorkerFetch ? null : new BinaryDataFactory({ + cMapUrl, + standardFontDataUrl, + wasmUrl + }) + }; + if (!worker) { + worker = PDFWorker.create({ + verbosity, + port: GlobalWorkerOptions.workerPort + }); + task._worker = worker; + } + const docParams = { + docId, + apiVersion: "6.4.299", + data, + password, + disableAutoFetch, + rangeChunkSize, + docBaseUrl, + enableXfa, + evaluatorOptions: { + maxImageSize, + disableFontFace, + ignoreErrors, + isOffscreenCanvasSupported, + isImageDecoderSupported, + canvasMaxAreaInBytes, + fontExtraProperties, + useSystemFonts, + useWasm, + useWorkerFetch, + cMapUrl, + cMapPacked, + iccUrl, + standardFontDataUrl, + wasmUrl, + hasGPU: false + } + }; + const transportParams = { + ownerDocument, + pdfBug, + styleElement, + enableHWA, + loadingParams: { + disableAutoFetch, + enableXfa + } + }; + Promise.all([worker.promise, gpuPromise]).then(function ([, hasGPU]) { + if (worker.destroyed) { + throw new Error("Worker was destroyed"); + } + docParams.evaluatorOptions.hasGPU = hasGPU; + const workerIdPromise = worker.messageHandler.sendWithPromise("GetDocRequest", docParams, data ? [data.buffer] : null); + let networkStream; + if (data) {} else if (rangeTransport) { + networkStream = new PDFDataTransportStream({ + pdfDataRangeTransport: rangeTransport, + disableRange, + disableStream + }); + } else if (url) { + const NetworkStream = getNetworkStream(url); + networkStream = new NetworkStream({ + url, + httpHeaders, + withCredentials, + rangeChunkSize, + disableRange, + disableStream + }); + } else { + throw new Error("getDocument - expected either `data`, `range`, or `url` parameter."); + } + return workerIdPromise.then(workerId => { + if (worker.destroyed) { + throw new Error("Worker was destroyed"); + } + const messageHandler = new MessageHandler(docId, workerId, worker.port); + const transport = new WorkerTransport(messageHandler, task, networkStream, transportParams, transportFactory, pagesMapper); + task._transport = transport; + if (task.destroyed) { + throw new Error("Loading aborted"); + } + messageHandler.send("Ready", null); + }); + }).catch(task._capability.reject).finally(task._setupCapability.resolve); + return task; +} +class PDFDocumentLoadingTask { + static #docId = 0; + _capability = Promise.withResolvers(); + _setupCapability = Promise.withResolvers(); + _transport = null; + _worker = null; + docId = `d${PDFDocumentLoadingTask.#docId++}`; + destroyed = false; + onPassword = null; + onProgress = null; + get promise() { + return this._capability.promise; + } + async destroy() { + this.destroyed = true; + this._capability.promise.catch(() => {}); + try { + if (this._worker?.port) { + this._worker._pendingDestroy = true; + } + await this._setupCapability.promise; + await this._transport?.destroy(); + } catch (ex) { + if (this._worker?.port) { + delete this._worker._pendingDestroy; + } + throw ex; + } + this._transport = null; + this._worker?.destroy(); + this._worker = null; + } + async getData() { + return this._transport.getData(); + } +} +class PDFDataRangeTransport { + #capability = Promise.withResolvers(); + #listener = null; + constructor(length, initialData, progressiveDone = false, contentDispositionFilename = null) { + this.length = length; + this.initialData = initialData; + this.progressiveDone = progressiveDone; + this.contentDispositionFilename = contentDispositionFilename; + } + onDataRange(begin, chunk) { + this.#listener({ + type: "range", + begin, + chunk + }); + } + onDataProgressiveRead(chunk) { + this.#capability.promise.then(() => { + this.#listener({ + type: "progressiveRead", + chunk + }); + }); + } + onDataProgressiveDone() { + this.#capability.promise.then(() => { + this.#listener({ + type: "progressiveDone" + }); + }); + } + transportReady(listener) { + this.#listener = listener; + this.#capability.resolve(); + } + requestDataRange(begin, end) { + unreachable("Abstract method PDFDataRangeTransport.requestDataRange"); + } + abort() {} +} +class PDFDocumentProxy { + constructor(pdfInfo, transport) { + this._pdfInfo = pdfInfo; + this._transport = transport; + } + get pagesMapper() { + return this._transport.pagesMapper; + } + get annotationStorage() { + return this._transport.annotationStorage; + } + get canvasFactory() { + return this._transport.canvasFactory; + } + get filterFactory() { + return this._transport.filterFactory; + } + get numPages() { + return this._pdfInfo.numPages; + } + get fingerprints() { + return this._pdfInfo.fingerprints; + } + get isPureXfa() { + return util_shadow(this, "isPureXfa", !!this._transport._htmlForXfa); + } + get allXfaHtml() { + return this._transport._htmlForXfa; + } + getPage(pageNumber) { + return this._transport.getPage(pageNumber); + } + getPageIndex(ref) { + return this._transport.getPageIndex(ref); + } + getDestinations() { + return this._transport.getDestinations(); + } + getDestination(id) { + return this._transport.getDestination(id); + } + getPageLabels() { + return this._transport.getPageLabels(); + } + getPageLayout() { + return this._transport.getPageLayout(); + } + getPageMode() { + return this._transport.getPageMode(); + } + getViewerPreferences() { + return this._transport.getViewerPreferences(); + } + getOpenAction() { + return this._transport.getOpenAction(); + } + getAttachments() { + return this._transport.getAttachments(); + } + getAttachmentContent(id) { + return this._transport.getAttachmentContent(id); + } + getAnnotationsByType(types, pageIndexesToSkip) { + return this._transport.getAnnotationsByType(types, pageIndexesToSkip); + } + getJSActions() { + return this._transport.getDocJSActions(); + } + getOutline() { + return this._transport.getOutline(); + } + getOptionalContentConfig({ + intent = "display" + } = {}) { + const { + renderingIntent + } = this._transport.getRenderingIntent(intent); + return this._transport.getOptionalContentConfig(renderingIntent); + } + getPermissions() { + return this._transport.getPermissions(); + } + getMetadata() { + return this._transport.getMetadata(); + } + getMarkInfo() { + return this._transport.getMarkInfo(); + } + getData() { + return this._transport.getData(); + } + saveDocument(printToPDF) { + return this._transport.saveDocument(printToPDF); + } + extractPages(pageInfos, copyLevels = null) { + return this._transport.extractPages(pageInfos, copyLevels); + } + getDownloadInfo() { + return this._transport.downloadInfoCapability.promise; + } + cleanup(keepLoadedFonts = false) { + return this._transport.startCleanup(keepLoadedFonts || this.isPureXfa); + } + cachedPageNumber(ref) { + return this._transport.cachedPageNumber(ref); + } + get loadingParams() { + return this._transport.loadingParams; + } + get loadingTask() { + return this._transport.loadingTask; + } + getFieldObjects() { + return this._transport.getFieldObjects(); + } + getSignatures() { + return this._transport.getSignatures(); + } + getSignatureData(id) { + return this._transport.getSignatureData(id); + } + hasJSActions() { + return this._transport.hasJSActions(); + } + getCalculationOrderIds() { + return this._transport.getCalculationOrderIds(); + } +} +class PDFPageProxy { + #pendingCleanup = false; + #pagesMapper = null; + static #idCounter = 0; + constructor(pageIndex, pageInfo, transport, pagesMapper, pdfBug = false) { + this._pageIndex = pageIndex; + this._id = PDFPageProxy.#idCounter++; + this._pageInfo = pageInfo; + this._transport = transport; + this._stats = pdfBug ? new StatTimer() : null; + this._pdfBug = pdfBug; + this.commonObjs = transport.commonObjs; + this.objs = new PDFObjects(); + this._intentStates = new Map(); + this.destroyed = false; + this.recordedBBoxes = null; + this.#pagesMapper = pagesMapper; + this.imageCoordinates = null; + } + clone(id) { + const clone = new PDFPageProxy(id, this._pageInfo, this._transport, this.#pagesMapper, this._pdfBug); + clone.clonedFromIndex = this.clonedFromIndex ?? this._pageIndex; + this._transport.updatePage(clone); + return clone; + } + get pageNumber() { + return this._pageIndex + 1; + } + set pageNumber(value) { + this._pageIndex = value - 1; + this._transport.updatePage(this); + } + get rotate() { + return this._pageInfo.rotate; + } + get ref() { + return this._pageInfo.ref; + } + get userUnit() { + return this._pageInfo.userUnit; + } + get view() { + return this._pageInfo.view; + } + getViewport({ + scale, + rotation = this.rotate, + offsetX = 0, + offsetY = 0, + dontFlip = false + } = {}) { + return new PageViewport({ + viewBox: this.view, + userUnit: this.userUnit, + scale, + rotation, + offsetX, + offsetY, + dontFlip + }); + } + getAnnotations({ + intent = "display" + } = {}) { + const { + renderingIntent + } = this._transport.getRenderingIntent(intent); + return this._transport.getAnnotations(this._pageIndex, renderingIntent); + } + getJSActions() { + return this._transport.getPageJSActions(this._pageIndex); + } + get filterFactory() { + return this._transport.filterFactory; + } + get isPureXfa() { + return util_shadow(this, "isPureXfa", !!this._transport._htmlForXfa); + } + async getXfa() { + return this._transport._htmlForXfa?.children[this._pageIndex] || null; + } + render({ + canvasContext, + canvas = canvasContext.canvas, + viewport, + intent = "display", + annotationMode = AnnotationMode.ENABLE, + transform = null, + background = null, + optionalContentConfigPromise = null, + annotationCanvasMap = null, + pageColors = null, + printAnnotationStorage = null, + isEditing = false, + recordImages = false, + recordOperations = false, + operationsFilter = null + }) { + this._stats?.time("Overall"); + const intentArgs = this._transport.getRenderingIntent(intent, annotationMode, printAnnotationStorage, isEditing); + const { + renderingIntent, + cacheKey + } = intentArgs; + this.#pendingCleanup = false; + optionalContentConfigPromise ||= this._transport.getOptionalContentConfig(renderingIntent); + const intentState = this._intentStates.getOrInsertComputed(cacheKey, makeObj); + if (intentState.streamReaderCancelTimeout) { + clearTimeout(intentState.streamReaderCancelTimeout); + intentState.streamReaderCancelTimeout = null; + } + const intentPrint = !!(renderingIntent & RenderingIntentFlag.PRINT); + if (!intentState.displayReadyCapability) { + intentState.displayReadyCapability = Promise.withResolvers(); + intentState.operatorList = { + fnArray: [], + argsArray: [], + lastChunk: false, + separateAnnots: null + }; + this._stats?.time("Page Request"); + this._pumpOperatorList(intentArgs); + } + const recordForDebugger = !!(this._pdfBug && globalThis.StepperManager?.enabled); + const shouldRecordOperations = !!canvas && !this.recordedBBoxes && (recordOperations || recordForDebugger); + const shouldRecordImages = !!canvas && !this.imageCoordinates && recordImages; + const complete = error => { + intentState.renderTasks.delete(internalRenderTask); + if (shouldRecordOperations) { + const recordedBBoxes = internalRenderTask.gfx?.dependencyTracker.take(); + if (recordedBBoxes) { + internalRenderTask.stepper?.setOperatorBBoxes(recordedBBoxes, internalRenderTask.gfx.dependencyTracker.takeDebugMetadata()); + if (recordOperations) { + this.recordedBBoxes = recordedBBoxes; + } + } + } + if (shouldRecordImages && !error) { + this.imageCoordinates = internalRenderTask.gfx?.imagesTracker.take(); + } + if (intentPrint) { + this.#pendingCleanup = true; + } + this.#tryCleanup(); + if (error) { + internalRenderTask.capability.reject(error); + this._abortOperatorList({ + intentState, + reason: error instanceof Error ? error : new Error(error) + }); + } else { + internalRenderTask.capability.resolve(); + } + if (this._stats) { + this._stats.timeEnd("Rendering"); + this._stats.timeEnd("Overall"); + if (globalThis.Stats?.enabled) { + globalThis.Stats.add(this.pageNumber, this._stats); + } + } + }; + let dependencyTracker = null; + let bboxTracker = null; + if (shouldRecordOperations || shouldRecordImages) { + bboxTracker = new CanvasBBoxTracker(canvas, intentState.operatorList.length); + } + if (shouldRecordOperations) { + dependencyTracker = new CanvasDependencyTracker(bboxTracker, recordForDebugger); + } + const internalRenderTask = new InternalRenderTask({ + callback: complete, + params: { + canvas, + canvasContext, + dependencyTracker: dependencyTracker ?? bboxTracker, + imagesTracker: shouldRecordImages ? new CanvasImagesTracker(canvas) : null, + viewport, + transform, + background + }, + objs: this.objs, + commonObjs: this.commonObjs, + annotationCanvasMap, + operatorList: intentState.operatorList, + pageIndex: this._pageIndex, + canvasFactory: this._transport.canvasFactory, + filterFactory: this._transport.filterFactory, + useRequestAnimationFrame: !intentPrint, + pdfBug: this._pdfBug, + pageColors, + enableHWA: this._transport.enableHWA, + operationsFilter + }); + (intentState.renderTasks ||= new Set()).add(internalRenderTask); + const renderTask = internalRenderTask.task; + Promise.all([intentState.displayReadyCapability.promise, optionalContentConfigPromise]).then(([transparency, optionalContentConfig]) => { + if (this.destroyed) { + complete(); + return; + } + this._stats?.time("Rendering"); + if (!(optionalContentConfig.renderingIntent & renderingIntent)) { + throw new Error("Must use the same `intent`-argument when calling the `PDFPageProxy.render` " + "and `PDFDocumentProxy.getOptionalContentConfig` methods."); + } + internalRenderTask.initializeGraphics({ + transparency, + optionalContentConfig + }); + internalRenderTask.operatorListChanged(); + }).catch(complete); + return renderTask; + } + getOperatorList({ + intent = "display", + annotationMode = AnnotationMode.ENABLE, + printAnnotationStorage = null, + isEditing = false + } = {}) { + function operatorListChanged() { + if (intentState.operatorList.lastChunk) { + intentState.opListReadCapability.resolve(intentState.operatorList); + intentState.renderTasks.delete(opListTask); + } + } + const intentArgs = this._transport.getRenderingIntent(intent, annotationMode, printAnnotationStorage, isEditing, true); + const intentState = this._intentStates.getOrInsertComputed(intentArgs.cacheKey, makeObj); + let opListTask; + if (!intentState.opListReadCapability) { + opListTask = Object.create(null); + opListTask.operatorListChanged = operatorListChanged; + intentState.opListReadCapability = Promise.withResolvers(); + (intentState.renderTasks ||= new Set()).add(opListTask); + intentState.operatorList = { + fnArray: [], + argsArray: [], + lastChunk: false, + separateAnnots: null + }; + this._stats?.time("Page Request"); + this._pumpOperatorList(intentArgs); + } + return intentState.opListReadCapability.promise; + } + streamTextContent({ + includeMarkedContent = false, + disableNormalization = false + } = {}) { + const TEXT_CONTENT_CHUNK_SIZE = 100; + return this._transport.messageHandler.sendWithStream("GetTextContent", { + pageId: this.#pagesMapper.getPageId(this._pageIndex + 1) - 1, + pageIndex: this._pageIndex, + includeMarkedContent: includeMarkedContent === true, + disableNormalization: disableNormalization === true + }, { + highWaterMark: TEXT_CONTENT_CHUNK_SIZE, + size: textContent => textContent.items.length + }); + } + async getTextContent(params = {}) { + if (this._transport._htmlForXfa) { + return this.getXfa().then(xfa => XfaText.textContent(xfa)); + } + const readableStream = this.streamTextContent(params); + const textContent = { + items: [], + styles: Object.create(null), + lang: null + }; + for await (const value of readableStream) { + textContent.lang ??= value.lang; + Object.assign(textContent.styles, value.styles); + textContent.items.push(...value.items); + } + return textContent; + } + getStructTree() { + return this._transport.getStructTree(this._pageIndex); + } + _destroy() { + this.destroyed = true; + const waitOn = []; + for (const intentState of this._intentStates.values()) { + this._abortOperatorList({ + intentState, + reason: new Error("Page was destroyed."), + force: true + }); + if (intentState.opListReadCapability) { + continue; + } + for (const internalRenderTask of intentState.renderTasks) { + waitOn.push(internalRenderTask.completed); + internalRenderTask.cancel(); + } + } + this.objs.clear(); + this.#pendingCleanup = false; + return Promise.all(waitOn); + } + cleanup(resetStats = false) { + this.#pendingCleanup = true; + const success = this.#tryCleanup(); + if (resetStats && success) { + this._stats &&= new StatTimer(); + } + return success; + } + #tryCleanup() { + if (!this.#pendingCleanup || this.destroyed) { + return false; + } + for (const { + renderTasks, + operatorList + } of this._intentStates.values()) { + if (renderTasks.size > 0 || !operatorList.lastChunk) { + return false; + } + } + this._intentStates.clear(); + this.objs.clear(); + this.#pendingCleanup = false; + return true; + } + _startRenderPage(transparency, cacheKey) { + const intentState = this._intentStates.get(cacheKey); + if (!intentState) { + return; + } + this._stats?.timeEnd("Page Request"); + intentState.displayReadyCapability?.resolve(transparency); + } + _renderPageChunk(operatorListChunk, intentState) { + for (let i = 0, ii = operatorListChunk.length; i < ii; i++) { + intentState.operatorList.fnArray.push(operatorListChunk.fnArray[i]); + intentState.operatorList.argsArray.push(operatorListChunk.argsArray[i]); + } + intentState.operatorList.lastChunk = operatorListChunk.lastChunk; + intentState.operatorList.separateAnnots = operatorListChunk.separateAnnots; + for (const internalRenderTask of intentState.renderTasks) { + internalRenderTask.operatorListChanged(); + } + if (operatorListChunk.lastChunk) { + this.#tryCleanup(); + } + } + _pumpOperatorList({ + renderingIntent, + cacheKey, + annotationStorageSerializable, + modifiedIds + }) { + const { + map, + transfer + } = annotationStorageSerializable; + const readableStream = this._transport.messageHandler.sendWithStream("GetOperatorList", { + pageId: this.#pagesMapper.getPageId(this._pageIndex + 1) - 1, + pageIndex: this._pageIndex, + pageProxyId: this._id, + intent: renderingIntent, + cacheKey, + annotationStorage: map, + modifiedIds + }, undefined, transfer); + const reader = readableStream.getReader(); + const intentState = this._intentStates.get(cacheKey); + intentState.streamReader = reader; + const pump = () => { + reader.read().then(({ + value, + done + }) => { + if (done) { + intentState.streamReader = null; + return; + } + if (this._transport.destroyed) { + return; + } + this._renderPageChunk(value, intentState); + pump(); + }, reason => { + intentState.streamReader = null; + if (this._transport.destroyed) { + return; + } + if (intentState.operatorList) { + intentState.operatorList.lastChunk = true; + for (const internalRenderTask of intentState.renderTasks) { + internalRenderTask.operatorListChanged(); + } + this.#tryCleanup(); + } + if (intentState.displayReadyCapability) { + intentState.displayReadyCapability.reject(reason); + } else if (intentState.opListReadCapability) { + intentState.opListReadCapability.reject(reason); + } else { + throw reason; + } + }); + }; + pump(); + } + _abortOperatorList({ + intentState, + reason, + force = false + }) { + if (!intentState.streamReader) { + return; + } + if (intentState.streamReaderCancelTimeout) { + clearTimeout(intentState.streamReaderCancelTimeout); + intentState.streamReaderCancelTimeout = null; + } + if (!force) { + if (intentState.renderTasks.size > 0) { + return; + } + if (reason instanceof RenderingCancelledException) { + let delay = RENDERING_CANCELLED_TIMEOUT; + if (reason.extraDelay > 0 && reason.extraDelay < 1000) { + delay += reason.extraDelay; + } + intentState.streamReaderCancelTimeout = setTimeout(() => { + intentState.streamReaderCancelTimeout = null; + this._abortOperatorList({ + intentState, + reason, + force: true + }); + }, delay); + return; + } + } + intentState.streamReader.cancel(new AbortException(reason.message)).catch(() => {}); + intentState.streamReader = null; + if (this._transport.destroyed) { + return; + } + for (const [curCacheKey, curIntentState] of this._intentStates) { + if (curIntentState === intentState) { + this._intentStates.delete(curCacheKey); + break; + } + } + this.cleanup(); + } + get stats() { + return this._stats; + } +} +class PDFWorker { + #capability = Promise.withResolvers(); + #messageHandler = null; + #port = null; + #webWorker = null; + static #fakeWorkerId = 0; + static #isWorkerDisabled = false; + static #workerPorts = new WeakMap(); + static { + if (isNodeJS) { + this.#isWorkerDisabled = true; + GlobalWorkerOptions.workerSrc ||= "./pdf.worker.mjs"; + } + this._isSameOrigin = (baseUrl, otherUrl) => { + const base = URL.parse(baseUrl); + if (!base?.origin || base.origin === "null") { + return false; + } + const other = new URL(otherUrl, base); + return base.origin === other.origin; + }; + this._createCDNWrapper = url => { + const wrapper = `await import("${url}");`; + return URL.createObjectURL(new Blob([wrapper], { + type: "text/javascript" + })); + }; + } + constructor({ + name = null, + port = null, + verbosity = getVerbosityLevel() + } = {}) { + this.name = name; + this.destroyed = false; + this.verbosity = verbosity; + if (port) { + if (PDFWorker.#workerPorts.has(port)) { + throw new Error("Cannot use more than one PDFWorker per port."); + } + PDFWorker.#workerPorts.set(port, this); + this.#initializeFromPort(port); + } else { + this.#initialize(); + } + } + get promise() { + return this.#capability.promise; + } + #resolve() { + this.#capability.resolve(); + this.#messageHandler.send("configure", { + verbosity: this.verbosity + }); + } + get port() { + return this.#port; + } + get messageHandler() { + return this.#messageHandler; + } + #initializeFromPort(port) { + this.#port = port; + this.#messageHandler = new MessageHandler("main", "worker", port); + this.#messageHandler.on("ready", () => {}); + this.#resolve(); + } + #initialize() { + if (PDFWorker.#isWorkerDisabled || PDFWorker.#mainThreadWorkerMessageHandler) { + this.#setupFakeWorker(); + return; + } + let { + workerSrc + } = PDFWorker; + try { + if (!PDFWorker._isSameOrigin(window.location, workerSrc)) { + workerSrc = PDFWorker._createCDNWrapper(new URL(workerSrc, window.location).href); + } + const worker = new Worker(workerSrc, { + type: "module" + }); + const messageHandler = new MessageHandler("main", "worker", worker); + const terminateEarly = () => { + ac.abort(); + messageHandler.destroy(); + worker.terminate(); + if (this.destroyed) { + this.#capability.reject(new Error("Worker was destroyed")); + } else { + this.#setupFakeWorker(); + } + }; + const ac = new AbortController(); + worker.addEventListener("error", () => { + if (!this.#webWorker) { + terminateEarly(); + } + }, { + signal: ac.signal + }); + messageHandler.on("ready", data => { + ac.abort(); + if (this.destroyed || !(data instanceof Uint8Array)) { + terminateEarly(); + return; + } + this.#messageHandler = messageHandler; + this.#port = worker; + this.#webWorker = worker; + this.#resolve(); + }); + } catch { + info("The worker has been disabled."); + this.#setupFakeWorker(); + } + } + #setupFakeWorker() { + if (!PDFWorker.#isWorkerDisabled) { + warn("Setting up fake worker."); + PDFWorker.#isWorkerDisabled = true; + } + PDFWorker._setupFakeWorkerGlobal.then(WorkerMessageHandler => { + if (this.destroyed) { + this.#capability.reject(new Error("Worker was destroyed")); + return; + } + const port = new LoopbackPort(); + this.#port = port; + const id = `fake${PDFWorker.#fakeWorkerId++}`; + const workerHandler = new MessageHandler(id + "_worker", id, port); + WorkerMessageHandler.setup(workerHandler, port); + this.#messageHandler = new MessageHandler(id, id + "_worker", port); + this.#resolve(); + }).catch(reason => { + this.#capability.reject(new Error(`Setting up fake worker failed: "${reason.message}".`)); + }); + } + destroy() { + this.destroyed = true; + this.#webWorker?.terminate(); + this.#webWorker = null; + PDFWorker.#workerPorts.delete(this.#port); + this.#port = null; + this.#messageHandler?.destroy(); + this.#messageHandler = null; + } + static create(params) { + const cachedPort = this.#workerPorts.get(params?.port); + if (cachedPort) { + if (cachedPort._pendingDestroy) { + throw new Error("PDFWorker.create - the worker is being destroyed.\n" + "Please remember to await `PDFDocumentLoadingTask.destroy()`-calls."); + } + return cachedPort; + } + return new PDFWorker(params); + } + static get workerSrc() { + if (GlobalWorkerOptions.workerSrc) { + return GlobalWorkerOptions.workerSrc; + } + throw new Error('No "GlobalWorkerOptions.workerSrc" specified.'); + } + static get #mainThreadWorkerMessageHandler() { + try { + return globalThis.pdfjsWorker?.WorkerMessageHandler || null; + } catch { + return null; + } + } + static get _setupFakeWorkerGlobal() { + const loader = async () => { + if (this.#mainThreadWorkerMessageHandler) { + return this.#mainThreadWorkerMessageHandler; + } + const worker = await import( + /*webpackIgnore: true*/ + /*@vite-ignore*/ + this.workerSrc); + return worker.WorkerMessageHandler; + }; + return util_shadow(this, "_setupFakeWorkerGlobal", loader()); + } +} +class WorkerTransport { + downloadInfoCapability = Promise.withResolvers(); + #fullReader = null; + #methodPromises = new Map(); + #networkStream = null; + #pageCache = new Map(); + #pagePromises = new Map(); + #pageRefCache = new Map(); + #passwordCapability = null; + #printToPDF = null; + constructor(messageHandler, loadingTask, networkStream, params, factory, pagesMapper) { + this.messageHandler = messageHandler; + this.loadingTask = loadingTask; + this.#networkStream = networkStream; + this.commonObjs = new PDFObjects(); + this.fontLoader = new FontLoader({ + ownerDocument: params.ownerDocument, + styleElement: params.styleElement + }); + this.enableHWA = params.enableHWA; + this.loadingParams = params.loadingParams; + this._params = params; + this.canvasFactory = factory.canvasFactory; + this.filterFactory = factory.filterFactory; + this.binaryDataFactory = factory.binaryDataFactory; + this.pagesMapper = pagesMapper; + this.destroyed = false; + this.destroyCapability = null; + this.setupMessageHandler(); + } + updatePage(page) { + this.#pageCache.set(page._id, page); + this.#pagePromises.set(page._pageIndex, Promise.resolve(page)); + } + #cacheSimpleMethod(name, data = null) { + return this.#methodPromises.getOrInsertComputed(name, () => this.messageHandler.sendWithPromise(name, data)); + } + #onProgress({ + loaded, + total + }) { + this.loadingTask.onProgress?.({ + loaded, + total, + percent: total ? MathClamp(Math.round(loaded / total * 100), 0, 100) : NaN + }); + } + get annotationStorage() { + return util_shadow(this, "annotationStorage", new AnnotationStorage()); + } + getRenderingIntent(intent, annotationMode = AnnotationMode.ENABLE, printAnnotationStorage = null, isEditing = false, isOpList = false) { + let renderingIntent = RenderingIntentFlag.DISPLAY; + let annotationStorageSerializable = SerializableEmpty; + switch (intent) { + case "any": + renderingIntent = RenderingIntentFlag.ANY; + break; + case "display": + break; + case "print": + renderingIntent = RenderingIntentFlag.PRINT; + break; + default: + warn(`getRenderingIntent - invalid intent: ${intent}`); + } + const annotationStorage = renderingIntent & RenderingIntentFlag.PRINT && printAnnotationStorage instanceof PrintAnnotationStorage ? printAnnotationStorage : this.annotationStorage; + switch (annotationMode) { + case AnnotationMode.DISABLE: + renderingIntent += RenderingIntentFlag.ANNOTATIONS_DISABLE; + break; + case AnnotationMode.ENABLE: + break; + case AnnotationMode.ENABLE_FORMS: + renderingIntent += RenderingIntentFlag.ANNOTATIONS_FORMS; + break; + case AnnotationMode.ENABLE_STORAGE: + renderingIntent += RenderingIntentFlag.ANNOTATIONS_STORAGE; + annotationStorageSerializable = annotationStorage.serializable; + break; + default: + warn(`getRenderingIntent - invalid annotationMode: ${annotationMode}`); + } + if (isEditing) { + renderingIntent += RenderingIntentFlag.IS_EDITING; + } + if (isOpList) { + renderingIntent += RenderingIntentFlag.OPLIST; + } + const { + ids: modifiedIds, + hash: modifiedIdsHash + } = annotationStorage.modifiedIds; + const cacheKeyBuf = [renderingIntent, annotationStorageSerializable.hash, modifiedIdsHash]; + return { + renderingIntent, + cacheKey: cacheKeyBuf.join("_"), + annotationStorageSerializable, + modifiedIds + }; + } + destroy() { + if (this.destroyCapability) { + return this.destroyCapability.promise; + } + this.destroyed = true; + this.destroyCapability = Promise.withResolvers(); + this.#passwordCapability?.reject(new Error("Worker was destroyed during onPassword callback")); + const waitOn = []; + for (const page of this.#pageCache.values()) { + waitOn.push(page._destroy()); + } + this.#pageCache.clear(); + this.#pagePromises.clear(); + this.#pageRefCache.clear(); + if (Object.hasOwn(this, "annotationStorage")) { + this.annotationStorage.resetModified(); + } + const terminated = this.messageHandler.sendWithPromise("Terminate", null); + waitOn.push(terminated); + Promise.all(waitOn).then(() => { + this.commonObjs.clear(); + this.fontLoader.clear(); + this.#methodPromises.clear(); + this.filterFactory.destroy(); + TextLayer.cleanup(); + this.#networkStream?.cancelAllRequests(new AbortException("Worker was terminated.")); + this.messageHandler?.destroy(); + this.messageHandler = null; + this.destroyCapability.resolve(); + }, this.destroyCapability.reject); + return this.destroyCapability.promise; + } + setupMessageHandler() { + const { + messageHandler, + loadingTask + } = this; + messageHandler.on("GetReader", (data, sink) => { + util_assert(this.#networkStream, "GetReader - no `BasePDFStream` instance available."); + this.#fullReader = this.#networkStream.getFullReader(); + this.#fullReader.onProgress = evt => this.#onProgress(evt); + sink.onPull = () => { + this.#fullReader.read().then(function ({ + value, + done + }) { + if (done) { + sink.close(); + return; + } + util_assert(value instanceof ArrayBuffer, "GetReader - expected an ArrayBuffer."); + sink.enqueue(new Uint8Array(value), 1, [value]); + }).catch(reason => { + sink.error(reason); + }); + }; + sink.onCancel = reason => { + this.#fullReader.cancel(reason); + sink.ready.catch(readyReason => { + if (this.destroyed) { + return; + } + throw readyReason; + }); + }; + }); + messageHandler.on("ReaderHeadersReady", async data => { + await this.#fullReader.headersReady; + const { + isStreamingSupported, + isRangeSupported, + contentLength + } = this.#fullReader; + if (isStreamingSupported && isRangeSupported) { + this.#fullReader.onProgress = null; + } + return { + isStreamingSupported, + isRangeSupported, + contentLength + }; + }); + messageHandler.on("GetRangeReader", (data, sink) => { + util_assert(this.#networkStream, "GetRangeReader - no `BasePDFStream` instance available."); + const rangeReader = this.#networkStream.getRangeReader(data.begin, data.end); + if (!rangeReader) { + sink.close(); + return; + } + sink.onPull = () => { + rangeReader.read().then(function ({ + value, + done + }) { + if (done) { + sink.close(); + return; + } + util_assert(value instanceof ArrayBuffer, "GetRangeReader - expected an ArrayBuffer."); + sink.enqueue(new Uint8Array(value), 1, [value]); + }).catch(reason => { + sink.error(reason); + }); + }; + sink.onCancel = reason => { + rangeReader.cancel(reason); + sink.ready.catch(readyReason => { + if (this.destroyed) { + return; + } + throw readyReason; + }); + }; + }); + messageHandler.on("GetDoc", ({ + pdfInfo + }) => { + this.pagesMapper.pagesNumber = pdfInfo.numPages; + this._numPages = pdfInfo.numPages; + this._htmlForXfa = pdfInfo.htmlForXfa; + delete pdfInfo.htmlForXfa; + loadingTask._capability.resolve(new PDFDocumentProxy(pdfInfo, this)); + }); + messageHandler.on("DocException", ex => { + loadingTask._capability.reject(wrapReason(ex)); + }); + messageHandler.on("PasswordRequest", ex => { + this.#passwordCapability = Promise.withResolvers(); + try { + if (!loadingTask.onPassword) { + throw wrapReason(ex); + } + const updatePassword = password => { + if (password instanceof Error) { + this.#passwordCapability.reject(password); + } else { + this.#passwordCapability.resolve({ + password + }); + } + }; + loadingTask.onPassword(updatePassword, ex.code); + } catch (err) { + this.#passwordCapability.reject(err); + } + return this.#passwordCapability.promise; + }); + messageHandler.on("DataLoaded", data => { + this.#onProgress({ + loaded: data.length, + total: data.length + }); + this.downloadInfoCapability.resolve(data); + }); + messageHandler.on("StartRenderPage", data => { + if (this.destroyed) { + return; + } + const page = this.#pageCache.get(data.pageProxyId); + page._startRenderPage(data.transparency, data.cacheKey); + }); + messageHandler.on("commonobj", ([id, type, exportedData]) => { + if (this.destroyed) { + return null; + } + if (this.commonObjs.has(id)) { + return null; + } + switch (type) { + case "Font": + if ("error" in exportedData) { + const exportedError = exportedData.error; + warn(`Error during font loading: ${exportedError}`); + this.commonObjs.resolve(id, exportedError); + break; + } + const fontData = new FontInfo(exportedData.buffer); + const inspectFont = this._params.pdfBug && globalThis.FontInspector?.enabled ? (font, url) => globalThis.FontInspector.fontAdded(font, url) : null; + const font = new FontFaceObject(fontData, inspectFont, exportedData.charProcOperatorList, exportedData.extra); + this.fontLoader.bind(font).catch(() => messageHandler.sendWithPromise("FontFallback", { + id + })).finally(() => { + if (!font.fontExtraProperties) { + font.clearData(); + } + this.commonObjs.resolve(id, font); + }); + break; + case "CopyLocalImage": + const { + imageRef + } = exportedData; + util_assert(imageRef, "The imageRef must be defined."); + for (const pageProxy of this.#pageCache.values()) { + for (const [, data] of pageProxy.objs) { + if (data?.ref !== imageRef) { + continue; + } + if (!data.dataLen) { + return null; + } + const copy = structuredClone(data); + this.commonObjs.resolve(id, copy); + return data.dataLen; + } + } + break; + case "FontPath": + this.commonObjs.resolve(id, new FontPathInfo(exportedData)); + break; + case "Image": + this.commonObjs.resolve(id, exportedData); + break; + case "Pattern": + const pattern = new PatternInfo(exportedData); + this.commonObjs.resolve(id, pattern.getIR()); + break; + default: + throw new Error(`Got unknown common object type ${type}`); + } + return null; + }); + messageHandler.on("obj", ([id, pageProxyId, type, imageData]) => { + if (this.destroyed) { + return; + } + const pageProxy = this.#pageCache.get(pageProxyId); + if (pageProxy.objs.has(id)) { + return; + } + if (pageProxy._intentStates.size === 0) { + imageData?.bitmap?.close(); + return; + } + switch (type) { + case "Image": + case "Pattern": + pageProxy.objs.resolve(id, imageData); + break; + default: + throw new Error(`Got unknown object type ${type}`); + } + }); + messageHandler.on("DocProgress", data => { + if (this.destroyed) { + return; + } + this.#onProgress(data); + }); + messageHandler.on("FetchBinaryData", async data => { + if (this.destroyed) { + throw new Error("Worker was destroyed."); + } + if (!this.binaryDataFactory) { + throw new Error("`BinaryDataFactory` not initialized, see the `useWorkerFetch` parameter."); + } + return this.binaryDataFactory.fetch(data); + }); + } + getData() { + return this.messageHandler.sendWithPromise("GetData", null); + } + saveDocument(printToPDF = null) { + if (this.annotationStorage.size <= 0) { + warn("saveDocument called while `annotationStorage` is empty, " + "please use the getData-method instead."); + } + const { + map, + transfer + } = this.annotationStorage.serializable; + return this.messageHandler.sendWithPromise("SaveDocument", { + isPureXfa: !!this._htmlForXfa, + numPages: this._numPages, + annotationStorage: map, + supportsPrintToPDF: this.#printToPDF !== null, + filename: this.#fullReader?.filename ?? null + }, transfer).finally(() => { + this.#printToPDF = null; + this.annotationStorage.resetModified(); + }); + } + extractPages(pageInfos, copyLevels = null) { + const params = { + pageInfos + }; + let transfer; + const ImageBitmapCtor = globalThis.ImageBitmap; + if (typeof ImageBitmapCtor === "function") { + const infos = Array.isArray(pageInfos) ? pageInfos : [pageInfos]; + for (const pageInfo of infos) { + if (pageInfo?.image instanceof ImageBitmapCtor) { + (transfer ||= []).push(pageInfo.image); + } + } + } + if (this.annotationStorage.size > 0) { + const serialized = this.annotationStorage.serializable; + let { + map + } = serialized; + if (serialized.transfer?.length) { + if (transfer) { + transfer.push(...serialized.transfer); + } else { + transfer = serialized.transfer; + } + } + const mapping = this.pagesMapper.getMapping(); + if (mapping) { + const remapped = new Map(); + for (const [k, v] of map) { + if (v?.pageIndex !== undefined && v.pageIndex >= 0 && v.pageIndex < mapping.length) { + const copyLevel = copyLevels?.[v.pageIndex] ?? 0; + const sourceIdx = mapping[v.pageIndex] - 1; + if (sourceIdx !== v.pageIndex || copyLevel !== 0) { + remapped.set(k, { + ...v, + pageIndex: sourceIdx, + copyLevel + }); + continue; + } + } + remapped.set(k, v); + } + map = remapped; + } + params.annotationStorage = map; + } + return this.messageHandler.sendWithPromise("ExtractPages", params, transfer).finally(() => { + this.annotationStorage.resetModified(); + }); + } + getPage(pageNumber) { + if (!Number.isInteger(pageNumber) || pageNumber <= 0 || pageNumber > this.pagesMapper.pagesNumber) { + return Promise.reject(new Error("Invalid page request.")); + } + const pageIndex = pageNumber - 1; + const newPageIndex = this.pagesMapper.getPageId(pageNumber) - 1; + const cachedPromise = this.#pagePromises.get(pageIndex); + if (cachedPromise) { + return cachedPromise; + } + const promise = this.messageHandler.sendWithPromise("GetPage", { + pageIndex: newPageIndex + }).then(pageInfo => { + if (this.destroyed) { + throw new Error("Transport destroyed"); + } + if (pageInfo.refStr) { + this.#pageRefCache.set(pageInfo.refStr, newPageIndex); + } + const page = new PDFPageProxy(pageIndex, pageInfo, this, this.pagesMapper, this._params.pdfBug); + this.#pageCache.set(page._id, page); + return page; + }); + this.#pagePromises.set(pageIndex, promise); + return promise; + } + async getPageIndex(ref) { + if (!isRefProxy(ref)) { + throw new Error("Invalid pageIndex request."); + } + const index = await this.messageHandler.sendWithPromise("GetPageIndex", { + num: ref.num, + gen: ref.gen + }); + const pageNumber = this.pagesMapper.getPageNumber(index + 1); + if (pageNumber === 0) { + throw new Error("GetPageIndex: page has been removed."); + } + return pageNumber - 1; + } + getAnnotations(pageIndex, intent) { + return this.messageHandler.sendWithPromise("GetAnnotations", { + pageIndex: this.pagesMapper.getPageId(pageIndex + 1) - 1, + intent + }); + } + getFieldObjects() { + return this.#cacheSimpleMethod("GetFieldObjects"); + } + getSignatures() { + return this.#cacheSimpleMethod("GetSignatures"); + } + getSignatureData(id) { + return this.messageHandler.sendWithPromise("GetSignatureData", id); + } + hasJSActions() { + return this.#cacheSimpleMethod("HasJSActions"); + } + getCalculationOrderIds() { + return this.messageHandler.sendWithPromise("GetCalculationOrderIds", null); + } + getDestinations() { + return this.messageHandler.sendWithPromise("GetDestinations", null); + } + getDestination(id) { + return typeof id !== "string" ? Promise.reject(new Error("Invalid destination request.")) : this.messageHandler.sendWithPromise("GetDestination", { + id + }); + } + getPageLabels() { + return this.messageHandler.sendWithPromise("GetPageLabels", null); + } + getPageLayout() { + return this.messageHandler.sendWithPromise("GetPageLayout", null); + } + getPageMode() { + return this.messageHandler.sendWithPromise("GetPageMode", null); + } + getViewerPreferences() { + return this.messageHandler.sendWithPromise("GetViewerPreferences", null); + } + getOpenAction() { + return this.messageHandler.sendWithPromise("GetOpenAction", null); + } + getAttachments() { + return this.messageHandler.sendWithPromise("GetAttachments", null); + } + getAttachmentContent(id) { + return this.messageHandler.sendWithPromise("GetAttachmentContent", id); + } + getAnnotationsByType(types, pageIndexesToSkip) { + return this.messageHandler.sendWithPromise("GetAnnotationsByType", { + types, + pageIndexesToSkip + }); + } + getDocJSActions() { + return this.#cacheSimpleMethod("GetDocJSActions"); + } + getPageJSActions(pageIndex) { + return this.messageHandler.sendWithPromise("GetPageJSActions", { + pageIndex: this.pagesMapper.getPageId(pageIndex + 1) - 1 + }); + } + getStructTree(pageIndex) { + return this.messageHandler.sendWithPromise("GetStructTree", { + pageIndex: this.pagesMapper.getPageId(pageIndex + 1) - 1 + }); + } + getOutline() { + return this.messageHandler.sendWithPromise("GetOutline", null); + } + getOptionalContentConfig(renderingIntent) { + return this.#cacheSimpleMethod("GetOptionalContentConfig").then(data => new OptionalContentConfig(data, renderingIntent)); + } + getPermissions() { + return this.messageHandler.sendWithPromise("GetPermissions", null); + } + getMetadata() { + const name = "GetMetadata"; + return this.#methodPromises.getOrInsertComputed(name, () => this.messageHandler.sendWithPromise(name, null).then(results => ({ + info: results[0], + metadata: results[1] ? new Metadata(results[1]) : null, + contentDispositionFilename: this.#fullReader?.filename ?? null, + contentLength: this.#fullReader?.contentLength ?? null, + hasStructTree: results[2] + }))); + } + getMarkInfo() { + return this.messageHandler.sendWithPromise("GetMarkInfo", null); + } + async startCleanup(keepLoadedFonts = false) { + if (this.destroyed) { + return; + } + await this.messageHandler.sendWithPromise("Cleanup", null); + for (const page of this.#pageCache.values()) { + const cleanupSuccessful = page.cleanup(); + if (!cleanupSuccessful) { + throw new Error(`startCleanup: Page ${page.pageNumber} is currently rendering.`); + } + } + this.commonObjs.clear(); + if (!keepLoadedFonts) { + this.fontLoader.clear(); + } + this.#methodPromises.clear(); + this.filterFactory.destroy(true); + TextLayer.cleanup(); + } + cachedPageNumber(ref) { + if (!isRefProxy(ref)) { + return null; + } + const refStr = ref.gen === 0 ? `${ref.num}R` : `${ref.num}R${ref.gen}`; + const pageIndex = this.#pageRefCache.get(refStr); + if (pageIndex >= 0) { + const pageNumber = this.pagesMapper.getPageNumber(pageIndex + 1); + if (pageNumber !== 0) { + return pageNumber; + } + } + return null; + } +} +class RenderTask { + _internalRenderTask = null; + onContinue = null; + onError = null; + constructor(internalRenderTask) { + this._internalRenderTask = internalRenderTask; + } + get promise() { + return this._internalRenderTask.capability.promise; + } + cancel(extraDelay = 0) { + this._internalRenderTask.cancel(null, extraDelay); + } + get separateAnnots() { + const { + separateAnnots + } = this._internalRenderTask.operatorList; + if (!separateAnnots) { + return false; + } + const { + annotationCanvasMap + } = this._internalRenderTask; + return separateAnnots.form || separateAnnots.canvas && annotationCanvasMap?.size > 0; + } + get imageCoordinates() { + return this._internalRenderTask.imageCoordinates || null; + } +} +class InternalRenderTask { + #rAF = null; + static #canvasInUse = new WeakSet(); + constructor({ + callback, + params, + objs, + commonObjs, + annotationCanvasMap, + operatorList, + pageIndex, + canvasFactory, + filterFactory, + useRequestAnimationFrame = false, + pdfBug = false, + pageColors = null, + enableHWA = false, + operationsFilter = null + }) { + this.callback = callback; + this.params = params; + this.objs = objs; + this.commonObjs = commonObjs; + this.annotationCanvasMap = annotationCanvasMap; + this.operatorListIdx = null; + this.operatorList = operatorList; + this._pageIndex = pageIndex; + this.canvasFactory = canvasFactory; + this.filterFactory = filterFactory; + this._pdfBug = pdfBug; + this.pageColors = pageColors; + this.running = false; + this.graphicsReadyCallback = null; + this.graphicsReady = false; + this._useRequestAnimationFrame = useRequestAnimationFrame === true && typeof window !== "undefined"; + this.cancelled = false; + this.capability = Promise.withResolvers(); + this.task = new RenderTask(this); + this._cancelBound = this.cancel.bind(this); + this._continueBound = this._continue.bind(this); + this._scheduleNextBound = this._scheduleNext.bind(this); + this._nextBound = this._next.bind(this); + this._canvas = params.canvas; + this._canvasContext = params.canvas ? null : params.canvasContext; + this._enableHWA = enableHWA; + this._dependencyTracker = params.dependencyTracker; + this._imagesTracker = params.imagesTracker; + this._operationsFilter = operationsFilter; + } + get completed() { + return this.capability.promise.catch(() => {}); + } + initializeGraphics({ + transparency = false, + optionalContentConfig + }) { + if (this.cancelled) { + return; + } + if (this._canvas) { + if (InternalRenderTask.#canvasInUse.has(this._canvas)) { + throw new Error("Cannot use the same canvas during multiple render() operations. " + "Use different canvas or ensure previous operations were " + "cancelled or completed."); + } + InternalRenderTask.#canvasInUse.add(this._canvas); + } + if (this._pdfBug && globalThis.StepperManager?.enabled) { + this.stepper = globalThis.StepperManager.create(this._pageIndex); + this.stepper.init(this.operatorList); + this.stepper.nextBreakPoint = this.stepper.getNextBreakPoint(); + } + const { + viewport, + transform, + background, + dependencyTracker, + imagesTracker + } = this.params; + const canvasContext = this._canvasContext || this._canvas.getContext("2d", { + alpha: false, + willReadFrequently: !this._enableHWA + }); + this.gfx = new CanvasGraphics(canvasContext, this.commonObjs, this.objs, this.canvasFactory, this.filterFactory, { + optionalContentConfig + }, this.annotationCanvasMap, this.pageColors, dependencyTracker, imagesTracker); + this.gfx.beginDrawing({ + transform, + viewport, + transparency, + background + }); + this.operatorListIdx = 0; + this.graphicsReady = true; + this.graphicsReadyCallback?.(); + } + cancel(error = null, extraDelay = 0) { + this.running = false; + this.cancelled = true; + this.gfx?.endDrawing(); + if (this.#rAF) { + window.cancelAnimationFrame(this.#rAF); + this.#rAF = null; + } + InternalRenderTask.#canvasInUse.delete(this._canvas); + error ||= new RenderingCancelledException(`Rendering cancelled, page ${this._pageIndex + 1}`, extraDelay); + this.callback(error); + this.task.onError?.(error); + } + operatorListChanged() { + if (!this.graphicsReady) { + this.graphicsReadyCallback ||= this._continueBound; + return; + } + this.gfx.dependencyTracker?.growOperationsCount(this.operatorList.fnArray.length); + this.stepper?.updateOperatorList(this.operatorList); + if (this.running) { + return; + } + this._continue(); + } + _continue() { + this.running = true; + if (this.cancelled) { + return; + } + if (this.task.onContinue) { + this.task.onContinue(this._scheduleNextBound); + } else { + this._scheduleNext(); + } + } + _scheduleNext() { + if (this._useRequestAnimationFrame) { + this.#rAF = window.requestAnimationFrame(() => { + this.#rAF = null; + this._nextBound().catch(this._cancelBound); + }); + } else { + Promise.resolve().then(this._nextBound).catch(this._cancelBound); + } + } + async _next() { + if (this.cancelled) { + return; + } + this.operatorListIdx = this.gfx.executeOperatorList(this.operatorList, this.operatorListIdx, this._continueBound, this.stepper, this._operationsFilter); + if (this.operatorListIdx === this.operatorList.argsArray.length) { + this.running = false; + if (this.operatorList.lastChunk) { + this.gfx.endDrawing(); + InternalRenderTask.#canvasInUse.delete(this._canvas); + this.callback(); + } + } + } +} +const api_version = "6.4.299"; +const build = "d0991a0d5"; + +;// ./node_modules/core-js/modules/es.math.sum-precise.js +es_math_sum_precise_namespaceFn(); + +;// ./src/display/editor/color_picker.js + + + +class ColorPicker { + #button = null; + #buttonSwatch = null; + #defaultColor; + #dropdown = null; + #dropdownWasFromKeyboard = false; + #isMainColorPicker = false; + #editor = null; + #eventBus; + #openDropdownAC = null; + #uiManager = null; + static #l10nColor = null; + static get _keyboardManager() { + return util_shadow(this, "_keyboardManager", new KeyboardManager([[["Escape"], ColorPicker.prototype._hideDropdownFromKeyboard], [["Space"], ColorPicker.prototype._colorSelectFromKeyboard], [["ArrowDown", "ArrowRight"], ColorPicker.prototype._moveToNext], [["ArrowUp", "ArrowLeft"], ColorPicker.prototype._moveToPrevious], [["Home"], ColorPicker.prototype._moveToBeginning], [["End"], ColorPicker.prototype._moveToEnd]])); + } + constructor({ + editor = null, + uiManager = null + }) { + if (editor) { + this.#isMainColorPicker = false; + this.#editor = editor; + } else { + this.#isMainColorPicker = true; + } + this.#uiManager = editor?._uiManager || uiManager; + this.#eventBus = this.#uiManager._eventBus; + this.#defaultColor = editor?.color?.toUpperCase() || this.#uiManager?.highlightColors.values().next().value || "#FFFF98"; + ColorPicker.#l10nColor ||= Object.freeze({ + blue: "pdfjs-editor-colorpicker-blue", + green: "pdfjs-editor-colorpicker-green", + pink: "pdfjs-editor-colorpicker-pink", + red: "pdfjs-editor-colorpicker-red", + yellow: "pdfjs-editor-colorpicker-yellow" + }); + } + renderButton() { + const button = this.#button = document.createElement("button"); + button.className = "colorPicker"; + button.tabIndex = "0"; + button.setAttribute("data-l10n-id", "pdfjs-editor-colorpicker-button"); + button.ariaHasPopup = "true"; + if (this.#editor) { + button.ariaControls = `${this.#editor.id}_colorpicker_dropdown`; + } + const signal = this.#uiManager._signal; + button.addEventListener("click", this.#openDropdown.bind(this), { + signal + }); + button.addEventListener("keydown", this.#keyDown.bind(this), { + signal + }); + const swatch = this.#buttonSwatch = document.createElement("span"); + swatch.className = "swatch"; + swatch.ariaHidden = "true"; + swatch.style.backgroundColor = this.#defaultColor; + button.append(swatch); + return button; + } + renderMainDropdown() { + const dropdown = this.#dropdown = this.#getDropdownRoot(); + dropdown.ariaOrientation = "horizontal"; + dropdown.ariaLabelledBy = "highlightColorPickerLabel"; + return dropdown; + } + #getDropdownRoot() { + const div = document.createElement("div"); + const signal = this.#uiManager._signal; + div.addEventListener("contextmenu", noContextMenu, { + signal + }); + div.className = "dropdown"; + div.role = "listbox"; + div.ariaMultiSelectable = "false"; + div.ariaOrientation = "vertical"; + div.setAttribute("data-l10n-id", "pdfjs-editor-colorpicker-dropdown"); + if (this.#editor) { + div.id = `${this.#editor.id}_colorpicker_dropdown`; + } + for (const [name, color] of this.#uiManager.highlightColors) { + const button = document.createElement("button"); + button.tabIndex = "0"; + button.role = "option"; + button.setAttribute("data-color", color); + button.title = name; + button.setAttribute("data-l10n-id", ColorPicker.#l10nColor[name]); + const swatch = document.createElement("span"); + button.append(swatch); + swatch.className = "swatch"; + swatch.style.backgroundColor = color; + button.ariaSelected = color === this.#defaultColor; + button.addEventListener("click", this.#colorSelect.bind(this, color), { + signal + }); + div.append(button); + } + div.addEventListener("keydown", this.#keyDown.bind(this), { + signal + }); + return div; + } + #colorSelect(color, event) { + event.stopPropagation(); + this.#eventBus.dispatch("switchannotationeditorparams", { + source: this, + type: AnnotationEditorParamsType.HIGHLIGHT_COLOR, + value: color + }); + this.update(color); + } + _colorSelectFromKeyboard(event) { + if (event.target === this.#button) { + this.#openDropdown(event); + return; + } + const color = event.target.getAttribute("data-color"); + if (!color) { + return; + } + this.#colorSelect(color, event); + } + _moveToNext(event) { + if (!this.#isDropdownVisible) { + this.#openDropdown(event); + return; + } + if (event.target === this.#button) { + this.#dropdown.firstElementChild?.focus(); + return; + } + event.target.nextSibling?.focus(); + } + _moveToPrevious(event) { + if (event.target === this.#dropdown?.firstElementChild || event.target === this.#button) { + if (this.#isDropdownVisible) { + this._hideDropdownFromKeyboard(); + } + return; + } + if (!this.#isDropdownVisible) { + this.#openDropdown(event); + } + event.target.previousSibling?.focus(); + } + _moveToBeginning(event) { + if (!this.#isDropdownVisible) { + this.#openDropdown(event); + return; + } + this.#dropdown.firstElementChild?.focus(); + } + _moveToEnd(event) { + if (!this.#isDropdownVisible) { + this.#openDropdown(event); + return; + } + this.#dropdown.lastElementChild?.focus(); + } + #keyDown(event) { + ColorPicker._keyboardManager.exec(this, event); + } + #openDropdown(event) { + if (this.#isDropdownVisible) { + this.hideDropdown(); + return; + } + this.#dropdownWasFromKeyboard = event.detail === 0; + if (!this.#openDropdownAC) { + this.#openDropdownAC = new AbortController(); + window.addEventListener("pointerdown", this.#pointerDown.bind(this), { + signal: this.#uiManager.combinedSignal(this.#openDropdownAC) + }); + } + this.#button.ariaExpanded = "true"; + if (this.#dropdown) { + this.#dropdown.classList.remove("hidden"); + return; + } + const root = this.#dropdown = this.#getDropdownRoot(); + this.#button.append(root); + } + #pointerDown(event) { + if (this.#dropdown?.contains(event.target)) { + return; + } + this.hideDropdown(); + } + hideDropdown() { + this.#dropdown?.classList.add("hidden"); + this.#button.ariaExpanded = "false"; + this.#openDropdownAC?.abort(); + this.#openDropdownAC = null; + } + get #isDropdownVisible() { + return this.#dropdown && !this.#dropdown.classList.contains("hidden"); + } + _hideDropdownFromKeyboard() { + if (this.#isMainColorPicker) { + return; + } + if (!this.#isDropdownVisible) { + this.#editor?.unselect(); + return; + } + this.hideDropdown(); + this.#button.focus({ + preventScroll: true, + focusVisible: this.#dropdownWasFromKeyboard + }); + } + update(color) { + if (this.#buttonSwatch) { + this.#buttonSwatch.style.backgroundColor = color; + } + if (!this.#dropdown) { + return; + } + const i = this.#uiManager.highlightColors.values(); + for (const child of this.#dropdown.children) { + child.ariaSelected = i.next().value === color.toUpperCase(); + } + } + destroy() { + this.#button?.remove(); + this.#button = null; + this.#buttonSwatch = null; + this.#dropdown?.remove(); + this.#dropdown = null; + } +} +class BasicColorPicker { + #input = null; + #hasAlpha = false; + #editor = null; + #uiManager = null; + static #l10nColor = null; + constructor(editor) { + this.#editor = editor; + this.#uiManager = editor._uiManager; + BasicColorPicker.#l10nColor ||= Object.freeze({ + freetext: "pdfjs-editor-color-picker-free-text-input", + ink: "pdfjs-editor-color-picker-ink-input" + }); + } + renderButton() { + if (this.#input) { + return this.#input; + } + const { + editorType, + colorType, + colorAndOpacityType, + opacityType, + color, + opacity + } = this.#editor; + const hasAlpha = this.#hasAlpha = FeatureTest.isAlphaColorInputSupported && opacityType !== undefined; + const input = this.#input = document.createElement("input"); + input.type = "color"; + if (hasAlpha) { + input.setAttribute("alpha", ""); + const alphaHex = Util.hexNums[Math.round((opacity ?? 1) * 255)]; + input.value = (color || "#000000") + alphaHex; + } else { + input.value = color || "#000000"; + } + input.className = "basicColorPicker"; + input.tabIndex = 0; + input.setAttribute("data-l10n-id", BasicColorPicker.#l10nColor[editorType]); + input.addEventListener("input", () => { + if (hasAlpha) { + const rgba = getRGBA(input.value); + if (!rgba) { + return; + } + const [r, g, b, op] = rgba; + const hex = Util.makeHexColor(r, g, b); + if (colorAndOpacityType !== undefined) { + this.#uiManager.updateParams(colorAndOpacityType, { + color: hex, + opacity: op + }); + } else { + this.#uiManager.updateParams(colorType, hex); + this.#uiManager.updateParams(opacityType, op); + } + } else { + this.#uiManager.updateParams(colorType, input.value); + } + }, { + signal: this.#uiManager._signal + }); + return input; + } + update(value) { + if (!this.#input) { + return; + } + if (this.#hasAlpha) { + const alphaHex = Util.hexNums[Math.round(this.#editor.opacity * 255)]; + this.#input.value = value + alphaHex; + } else { + this.#input.value = value; + } + } + updateOpacity(value) { + if (!this.#input || !this.#hasAlpha) { + return; + } + const alphaHex = Util.hexNums[Math.round(value * 255)]; + this.#input.value = this.#editor.color + alphaHex; + } + destroy() { + this.#input?.remove(); + this.#input = null; + } + hideDropdown() {} +} + +;// ./node_modules/core-js/modules/es.iterator.flat-map.js +es_iterator_flat_map_namespaceFn(); + +;// ./src/shared/scripting_utils.js + + + +function makeColorComp(n) { + return Math.floor(MathClamp(n, 0, 1) * 255).toString(16).padStart(2, "0"); +} +function scaleAndClamp(x) { + return MathClamp(x, 0, 1) * 255; +} +class ColorConverters { + static CMYK_G([c, y, m, k]) { + return ["G", 1 - Math.min(1, 0.3 * c + 0.59 * m + 0.11 * y + k)]; + } + static G_CMYK([g]) { + return ["CMYK", 0, 0, 0, 1 - g]; + } + static G_RGB([g]) { + return ["RGB", g, g, g]; + } + static G_rgb([g]) { + g = scaleAndClamp(g); + return [g, g, g]; + } + static G_HTML([g]) { + const G = makeColorComp(g); + return `#${G}${G}${G}`; + } + static RGB_G([r, g, b]) { + return ["G", 0.3 * r + 0.59 * g + 0.11 * b]; + } + static RGB_rgb(color) { + return color.map(scaleAndClamp); + } + static RGB_HTML(color) { + return `#${color.map(makeColorComp).join("")}`; + } + static T_HTML() { + return "#00000000"; + } + static T_rgb() { + return [null]; + } + static CMYK_RGB([c, y, m, k]) { + return ["RGB", 1 - Math.min(1, c + k), 1 - Math.min(1, m + k), 1 - Math.min(1, y + k)]; + } + static CMYK_rgb([c, y, m, k]) { + return [scaleAndClamp(1 - Math.min(1, c + k)), scaleAndClamp(1 - Math.min(1, m + k)), scaleAndClamp(1 - Math.min(1, y + k))]; + } + static CMYK_HTML(components) { + const rgb = this.CMYK_RGB(components).slice(1); + return this.RGB_HTML(rgb); + } + static RGB_CMYK([r, g, b]) { + const c = 1 - r; + const m = 1 - g; + const y = 1 - b; + const k = Math.min(c, m, y); + return ["CMYK", c, m, y, k]; + } +} +const DateFormats = (/* unused pure expression or super */ null && (["m/d", "m/d/yy", "mm/dd/yy", "mm/yy", "d-mmm", "d-mmm-yy", "dd-mmm-yy", "yy-mm-dd", "mmm-yy", "mmmm-yy", "mmm d, yyyy", "mmmm d, yyyy", "m/d/yy h:MM tt", "m/d/yy HH:MM"])); +const TimeFormats = (/* unused pure expression or super */ null && (["HH:MM", "h:MM tt", "HH:MM:ss", "h:MM:ss tt"])); + +;// ./src/display/svg_factory.js + +class BaseSVGFactory { + create(width, height, skipDimensions = false) { + if (width <= 0 || height <= 0) { + throw new Error("Invalid SVG dimensions"); + } + const svg = this._createSVG("svg:svg"); + svg.setAttribute("version", "1.1"); + if (!skipDimensions) { + svg.setAttribute("width", `${width}px`); + svg.setAttribute("height", `${height}px`); + } + svg.setAttribute("preserveAspectRatio", "none"); + svg.setAttribute("viewBox", `0 0 ${width} ${height}`); + return svg; + } + createElement(type) { + if (typeof type !== "string") { + throw new Error("Invalid SVG element type"); + } + return this._createSVG(type); + } + _createSVG(type) { + unreachable("Abstract method `_createSVG` called."); + } +} +class DOMSVGFactory extends BaseSVGFactory { + _createSVG(type) { + return document.createElementNS(SVG_NS, type); + } +} + +;// ./src/display/annotation_layer.js + + + + + + + + + + + + + + + + + + + + + +const annotation_layer_DEFAULT_FONT_SIZE = 9; +const GetElementsByNameSet = new WeakSet(); +const TIMEZONE_OFFSET = new Date().getTimezoneOffset() * 60 * 1000; +class AnnotationElementFactory { + static create(parameters) { + const subtype = parameters.data.annotationType; + switch (subtype) { + case AnnotationType.LINK: + return new LinkAnnotationElement(parameters); + case AnnotationType.TEXT: + return new TextAnnotationElement(parameters); + case AnnotationType.WIDGET: + const fieldType = parameters.data.fieldType; + switch (fieldType) { + case "Tx": + return new TextWidgetAnnotationElement(parameters); + case "Btn": + if (parameters.data.radioButton) { + return new RadioButtonWidgetAnnotationElement(parameters); + } else if (parameters.data.checkBox) { + return new CheckboxWidgetAnnotationElement(parameters); + } + return new PushButtonWidgetAnnotationElement(parameters); + case "Ch": + return new ChoiceWidgetAnnotationElement(parameters); + case "Sig": + return new SignatureWidgetAnnotationElement(parameters); + } + return new WidgetAnnotationElement(parameters); + case AnnotationType.POPUP: + return new PopupAnnotationElement(parameters); + case AnnotationType.FREETEXT: + return new FreeTextAnnotationElement(parameters); + case AnnotationType.LINE: + return new LineAnnotationElement(parameters); + case AnnotationType.SQUARE: + return new SquareAnnotationElement(parameters); + case AnnotationType.CIRCLE: + return new CircleAnnotationElement(parameters); + case AnnotationType.POLYLINE: + return new PolylineAnnotationElement(parameters); + case AnnotationType.CARET: + return new CaretAnnotationElement(parameters); + case AnnotationType.INK: + return new InkAnnotationElement(parameters); + case AnnotationType.POLYGON: + return new PolygonAnnotationElement(parameters); + case AnnotationType.HIGHLIGHT: + return new HighlightAnnotationElement(parameters); + case AnnotationType.UNDERLINE: + return new UnderlineAnnotationElement(parameters); + case AnnotationType.SQUIGGLY: + return new SquigglyAnnotationElement(parameters); + case AnnotationType.STRIKEOUT: + return new StrikeOutAnnotationElement(parameters); + case AnnotationType.STAMP: + return new StampAnnotationElement(parameters); + case AnnotationType.FILEATTACHMENT: + return new FileAttachmentAnnotationElement(parameters); + case AnnotationType.RICHMEDIA: + case AnnotationType.SCREEN: + case AnnotationType.SOUND: + return new MediaAnnotationElement(parameters); + default: + return new AnnotationElement(parameters); + } + } +} +class AnnotationElement { + #updates = null; + #hasBorder = false; + #popupElement = null; + constructor(parameters, { + isRenderable = false, + ignoreBorder = false, + createQuadrilaterals = false + } = {}) { + this.isRenderable = isRenderable; + this.data = parameters.data; + this.layer = parameters.layer; + this.linkService = parameters.linkService; + this.downloadManager = parameters.downloadManager; + this.imageResourcesPath = parameters.imageResourcesPath; + this.renderForms = parameters.renderForms; + this.svgFactory = parameters.svgFactory; + this.annotationStorage = parameters.annotationStorage; + this.enableComment = parameters.enableComment; + this.enableScripting = parameters.enableScripting; + this.hasJSActions = parameters.hasJSActions; + this._fieldObjects = parameters.fieldObjects; + this.parent = parameters.parent; + this.hasOwnCommentButton = false; + if (isRenderable) { + this.contentElement = this.container = this._createContainer(ignoreBorder); + } + if (createQuadrilaterals) { + this._createQuadrilaterals(); + } + } + static _hasPopupData({ + contentsObj, + richText + }) { + return !!(contentsObj?.str || richText?.str); + } + get _isEditable() { + return this.data.isEditable; + } + get hasPopupData() { + return AnnotationElement._hasPopupData(this.data) || this.enableComment && !!this.commentText; + } + get commentData() { + const { + data + } = this; + const editor = this.annotationStorage?.getEditor(data.id); + return editor ? editor.getData() : data; + } + get hasCommentButton() { + return this.enableComment && this.hasPopupElement; + } + get commentButtonPosition() { + const editor = this.annotationStorage?.getEditor(this.data.id); + if (editor) { + return editor.commentButtonPositionInPage; + } + const { + quadPoints, + inkLists, + rect + } = this.data; + let maxX = -Infinity; + let maxY = -Infinity; + if (quadPoints?.length >= 8) { + for (let i = 0; i < quadPoints.length; i += 8) { + if (quadPoints[i + 1] > maxY) { + maxY = quadPoints[i + 1]; + maxX = quadPoints[i + 2]; + } else if (quadPoints[i + 1] === maxY) { + maxX = Math.max(maxX, quadPoints[i + 2]); + } + } + return [maxX, maxY]; + } + if (inkLists?.length >= 1) { + for (const inkList of inkLists) { + for (let i = 0, ii = inkList.length; i < ii; i += 2) { + if (inkList[i + 1] > maxY) { + maxY = inkList[i + 1]; + maxX = inkList[i]; + } else if (inkList[i + 1] === maxY) { + maxX = Math.max(maxX, inkList[i]); + } + } + } + if (maxX !== Infinity) { + return [maxX, maxY]; + } + } + return rect ? [rect[2], rect[3]] : null; + } + _normalizePoint(point) { + const { + page: { + view + }, + viewport: { + rawDims: { + pageWidth, + pageHeight, + pageX, + pageY + } + } + } = this.parent; + point[1] = view[3] - point[1] + view[1]; + point[0] = 100 * (point[0] - pageX) / pageWidth; + point[1] = 100 * (point[1] - pageY) / pageHeight; + return point; + } + get commentText() { + const { + data + } = this; + return this.annotationStorage.getRawValue(`${AnnotationEditorPrefix}${data.id}`)?.popup?.contents || data.contentsObj?.str || ""; + } + set commentText(text) { + const { + data + } = this; + const popup = { + deleted: !text, + contents: text || "" + }; + if (!this.annotationStorage.updateEditor(data.id, { + popup + })) { + this.annotationStorage.setValue(`${AnnotationEditorPrefix}${data.id}`, { + id: data.id, + annotationType: data.annotationType, + page: this.parent.page, + popup, + popupRef: data.popupRef, + modificationDate: new Date() + }); + } + if (!text) { + this.removePopup(); + } + } + removePopup() { + (this.#popupElement?.popup || this.popup)?.remove(); + this.#popupElement = this.popup = null; + } + updateEdited(params) { + if (!this.container) { + return; + } + if (params.rect) { + this.#updates ||= { + rect: this.data.rect.slice(0) + }; + } + const { + rect, + popup: newPopup + } = params; + if (rect) { + this.#setRectEdited(rect); + } + let popup = this.#popupElement?.popup || this.popup; + if (!popup && newPopup?.text) { + this._createPopup(newPopup); + popup = this.#popupElement.popup; + } + if (!popup) { + return; + } + popup.updateEdited(params); + if (newPopup?.deleted) { + popup.remove(); + this.#popupElement = null; + this.popup = null; + } + } + resetEdited() { + if (!this.#updates) { + return; + } + this.#setRectEdited(this.#updates.rect); + this.#popupElement?.popup.resetEdited(); + this.#updates = null; + } + #setRectEdited(rect) { + const { + container: { + style + }, + data: { + rect: currentRect, + rotation + }, + parent: { + viewport: { + rawDims: { + pageWidth, + pageHeight, + pageX, + pageY + } + } + } + } = this; + currentRect?.splice(0, 4, ...rect); + style.left = `${100 * (rect[0] - pageX) / pageWidth}%`; + style.top = `${100 * (pageHeight - rect[3] + pageY) / pageHeight}%`; + if (rotation === 0) { + style.width = `${100 * (rect[2] - rect[0]) / pageWidth}%`; + style.height = `${100 * (rect[3] - rect[1]) / pageHeight}%`; + } else { + this.setRotation(rotation); + } + } + _createContainer(ignoreBorder) { + const { + data, + parent: { + page, + viewport + } + } = this; + const container = document.createElement("section"); + container.setAttribute("data-annotation-id", data.id); + if (!(this instanceof WidgetAnnotationElement) && !(this instanceof LinkAnnotationElement) && !(this instanceof MediaAnnotationElement)) { + container.tabIndex = 0; + } + const { + style + } = container; + style.zIndex = this.parent.zIndex; + this.parent.zIndex += 2; + if (data.alternativeText) { + container.title = data.alternativeText; + } + if (data.noRotate) { + container.classList.add("norotate"); + } + if (!data.rect || this instanceof PopupAnnotationElement) { + const { + rotation + } = data; + if (!data.hasOwnCanvas && rotation !== 0) { + this.setRotation(rotation, container); + } + return container; + } + const { + width, + height + } = this; + if (!ignoreBorder && data.borderStyle.width > 0) { + style.borderWidth = `${data.borderStyle.width}px`; + const horizontalRadius = data.borderStyle.horizontalCornerRadius; + const verticalRadius = data.borderStyle.verticalCornerRadius; + if (horizontalRadius > 0 || verticalRadius > 0) { + const radius = `calc(${horizontalRadius}px * var(--total-scale-factor)) / calc(${verticalRadius}px * var(--total-scale-factor))`; + style.borderRadius = radius; + } + switch (data.borderStyle.style) { + case AnnotationBorderStyleType.SOLID: + style.borderStyle = "solid"; + break; + case AnnotationBorderStyleType.DASHED: + style.borderStyle = "dashed"; + break; + case AnnotationBorderStyleType.BEVELED: + warn("Unimplemented border style: beveled"); + break; + case AnnotationBorderStyleType.INSET: + warn("Unimplemented border style: inset"); + break; + case AnnotationBorderStyleType.UNDERLINE: + style.borderBottomStyle = "solid"; + break; + default: + break; + } + const borderColor = data.borderColor || null; + if (borderColor) { + this.#hasBorder = true; + style.borderColor = Util.makeHexColor(...borderColor); + } else { + style.borderWidth = 0; + } + } + const rect = Util.normalizeRect([data.rect[0], page.view[3] - data.rect[1] + page.view[1], data.rect[2], page.view[3] - data.rect[3] + page.view[1]]); + const { + pageWidth, + pageHeight, + pageX, + pageY + } = viewport.rawDims; + style.left = `${100 * (rect[0] - pageX) / pageWidth}%`; + style.top = `${100 * (rect[1] - pageY) / pageHeight}%`; + const { + rotation + } = data; + if (data.hasOwnCanvas || rotation === 0) { + style.width = `${100 * width / pageWidth}%`; + style.height = `${100 * height / pageHeight}%`; + } else { + this.setRotation(rotation, container); + } + return container; + } + setRotation(angle, container = this.container) { + if (!this.data.rect) { + return; + } + const { + pageWidth, + pageHeight + } = this.parent.viewport.rawDims; + let { + width, + height + } = this; + if (angle % 180 !== 0) { + [width, height] = [height, width]; + } + container.style.width = `${100 * width / pageWidth}%`; + container.style.height = `${100 * height / pageHeight}%`; + container.setAttribute("data-main-rotation", (360 - angle) % 360); + } + get _commonActions() { + const setColor = (jsName, styleName, event) => { + const color = event.detail[jsName]; + const colorType = color[0]; + const colorArray = color.slice(1); + event.target.style[styleName] = ColorConverters[`${colorType}_HTML`](colorArray); + this.annotationStorage.setValue(this.data.id, { + [styleName]: ColorConverters[`${colorType}_rgb`](colorArray) + }); + }; + return util_shadow(this, "_commonActions", { + display: event => { + const { + display + } = event.detail; + const hidden = display % 2 === 1; + this.container.style.visibility = hidden ? "hidden" : "visible"; + this.annotationStorage.setValue(this.data.id, { + noView: hidden, + noPrint: display === 1 || display === 2 + }); + }, + print: event => { + this.annotationStorage.setValue(this.data.id, { + noPrint: !event.detail.print + }); + }, + hidden: event => { + const { + hidden + } = event.detail; + this.container.style.visibility = hidden ? "hidden" : "visible"; + this.annotationStorage.setValue(this.data.id, { + noPrint: hidden, + noView: hidden + }); + }, + focus: event => { + setTimeout(() => event.target.focus({ + preventScroll: false + }), 0); + }, + userName: event => { + event.target.title = event.detail.userName; + }, + readonly: event => { + event.target.disabled = event.detail.readonly; + }, + required: event => { + this._setRequired(event.target, event.detail.required); + }, + bgColor: event => { + setColor("bgColor", "backgroundColor", event); + }, + fillColor: event => { + setColor("fillColor", "backgroundColor", event); + }, + fgColor: event => { + setColor("fgColor", "color", event); + }, + textColor: event => { + setColor("textColor", "color", event); + }, + borderColor: event => { + setColor("borderColor", "borderColor", event); + }, + strokeColor: event => { + setColor("strokeColor", "borderColor", event); + }, + rotation: event => { + const angle = event.detail.rotation; + this.setRotation(angle); + this.annotationStorage.setValue(this.data.id, { + rotation: angle + }); + } + }); + } + _dispatchEventFromSandbox(actions, jsEvent) { + const commonActions = this._commonActions; + for (const name of Object.keys(jsEvent.detail)) { + const action = actions[name] || commonActions[name]; + action?.(jsEvent); + } + } + _setDefaultPropertiesFromJS(element) { + if (!this.enableScripting) { + return; + } + const storedData = this.annotationStorage.getRawValue(this.data.id); + if (!storedData) { + return; + } + const commonActions = this._commonActions; + for (const [actionName, detail] of Object.entries(storedData)) { + const action = commonActions[actionName]; + if (action) { + const eventProxy = { + detail: { + [actionName]: detail + }, + target: element + }; + action(eventProxy); + delete storedData[actionName]; + } + } + } + _createQuadrilaterals() { + if (!this.container) { + return; + } + const { + quadPoints + } = this.data; + if (!quadPoints) { + return; + } + const [rectBlX, rectBlY, rectTrX, rectTrY] = this.data.rect.map(Math.fround); + if (quadPoints.length === 8) { + const [trX, trY, blX, blY] = quadPoints.subarray(2, 6); + if (rectTrX === trX && rectTrY === trY && rectBlX === blX && rectBlY === blY) { + return; + } + } + const { + style + } = this.container; + let svgBuffer; + if (this.#hasBorder) { + const { + borderColor, + borderWidth + } = style; + style.borderWidth = 0; + svgBuffer = ["url('data:image/svg+xml;utf8,", ``, ``]; + this.container.classList.add("hasBorder"); + } + const width = rectTrX - rectBlX; + const height = rectTrY - rectBlY; + const { + svgFactory + } = this; + const svg = svgFactory.createElement("svg"); + svg.classList.add("quadrilateralsContainer"); + svg.setAttribute("width", 0); + svg.setAttribute("height", 0); + svg.role = "none"; + const defs = svgFactory.createElement("defs"); + svg.append(defs); + const clipPath = svgFactory.createElement("clipPath"); + const id = `clippath_${this.data.id}`; + clipPath.setAttribute("id", id); + clipPath.setAttribute("clipPathUnits", "objectBoundingBox"); + defs.append(clipPath); + for (let i = 2, ii = quadPoints.length; i < ii; i += 8) { + const trX = quadPoints[i]; + const trY = quadPoints[i + 1]; + const blX = quadPoints[i + 2]; + const blY = quadPoints[i + 3]; + const rect = svgFactory.createElement("rect"); + const x = (blX - rectBlX) / width; + const y = (rectTrY - trY) / height; + const rectWidth = (trX - blX) / width; + const rectHeight = (trY - blY) / height; + rect.setAttribute("x", x); + rect.setAttribute("y", y); + rect.setAttribute("width", rectWidth); + rect.setAttribute("height", rectHeight); + clipPath.append(rect); + svgBuffer?.push(``); + } + if (this.#hasBorder) { + svgBuffer.push(`')`); + style.backgroundImage = svgBuffer.join(""); + } + this.container.append(svg); + this.container.style.clipPath = `url(#${id})`; + } + _createPopup(popupData = null) { + const { + data + } = this; + let contentsObj, modificationDate; + if (popupData) { + contentsObj = { + str: popupData.text + }; + modificationDate = popupData.date; + } else { + contentsObj = data.contentsObj; + modificationDate = data.modificationDate; + } + this.#popupElement = new PopupAnnotationElement({ + data: { + color: data.color, + titleObj: data.titleObj, + modificationDate, + contentsObj, + richText: data.richText, + parentRect: data.rect, + borderStyle: 0, + id: `popup_${data.id}`, + rotation: data.rotation, + noRotate: true + }, + linkService: this.linkService, + parent: this.parent, + elements: [this] + }); + } + get hasPopupElement() { + return !!(this.#popupElement || this.popup || this.data.popupRef); + } + get extraPopupElement() { + return this.#popupElement; + } + render() { + unreachable("Abstract method `AnnotationElement.render` called"); + } + _getElementsByName(name, skipId = null) { + const fields = []; + if (this._fieldObjects) { + const fieldObj = this._fieldObjects.get(name) || []; + for (const { + page, + id, + exportValues + } of fieldObj) { + if (page === -1 || id === skipId) { + continue; + } + const exportValue = typeof exportValues === "string" ? exportValues : null; + const domElement = document.querySelector(`[data-element-id="${id}"]`); + if (domElement && !GetElementsByNameSet.has(domElement)) { + warn(`_getElementsByName - element not allowed: ${id}`); + continue; + } + fields.push({ + id, + exportValue, + domElement + }); + } + return fields; + } + for (const domElement of document.getElementsByName(name)) { + const { + exportValue + } = domElement; + const id = domElement.getAttribute("data-element-id"); + if (id === skipId || !GetElementsByNameSet.has(domElement)) { + continue; + } + fields.push({ + id, + exportValue, + domElement + }); + } + return fields; + } + show() { + if (this.container) { + this.container.hidden = false; + } + this.popup?.maybeShow(); + } + hide() { + if (this.container) { + this.container.hidden = true; + } + this.popup?.forceHide(); + } + getElementsToTriggerPopup() { + return this.container; + } + addHighlightArea() { + const triggers = this.getElementsToTriggerPopup(); + if (Array.isArray(triggers)) { + for (const element of triggers) { + element.classList.add("highlightArea"); + } + } else { + triggers.classList.add("highlightArea"); + } + } + _editOnDoubleClick() { + if (!this._isEditable) { + return; + } + const { + annotationEditorType: mode, + data: { + id: editId + } + } = this; + this.container.addEventListener("dblclick", () => { + this.linkService.eventBus?.dispatch("switchannotationeditormode", { + source: this, + mode, + editId, + mustEnterInEditMode: true + }); + }); + } + updateOC(optionalContentConfig) { + if (!this.data.oc || !optionalContentConfig) { + return; + } + const isVisible = optionalContentConfig.isVisible(this.data.oc); + if (isVisible) { + this.show(); + } else { + this.hide(); + } + } + get width() { + return this.data.rect[2] - this.data.rect[0]; + } + get height() { + return this.data.rect[3] - this.data.rect[1]; + } + _setBackgroundColor(element) { + const color = this.data.backgroundColor || null; + element.style.backgroundColor = color === null ? "transparent" : Util.makeHexColor(...color); + } +} +class EditorAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + this.editor = parameters.editor; + } + render() { + this.container.className = "editorAnnotation"; + return this.container; + } + createOrUpdatePopup() { + const { + editor + } = this; + if (!editor.hasComment) { + return; + } + this._createPopup(editor.comment); + } + get hasCommentButton() { + return this.enableComment && this.editor.hasComment; + } + get commentButtonPosition() { + return this.editor.commentButtonPositionInPage; + } + get commentText() { + return this.editor.comment.text; + } + set commentText(text) { + this.editor.comment = text; + if (!text) { + this.removePopup(); + } + } + get commentData() { + return this.editor.getData(); + } + remove() { + this.parent.removeAnnotation(this.data.id); + this.container.remove(); + this.container = null; + this.removePopup(); + } +} +class LinkAnnotationElement extends AnnotationElement { + constructor(parameters, options = null) { + super(parameters, { + isRenderable: true, + ignoreBorder: !!options?.ignoreBorder, + createQuadrilaterals: true + }); + this.isTooltipOnly = parameters.data.isTooltipOnly; + } + render() { + const { + data, + linkService + } = this; + const link = document.createElement("a"); + link.setAttribute("data-element-id", data.id); + let isBound = false; + if (data.url) { + linkService.addLinkAttributes(link, data.url, data.newWindow); + isBound = true; + } else if (data.action) { + this._bindNamedAction(link, data.action, data.overlaidText); + isBound = true; + } else if (data.attachment) { + this.#bindAttachment(link, data.attachmentId, data.attachment, data.overlaidText, data.attachmentDest); + isBound = true; + } else if (data.setOCGState) { + this.#bindSetOCGState(link, data.setOCGState, data.overlaidText); + isBound = true; + } else if (data.dest) { + this._bindLink(link, data.dest, data.overlaidText); + isBound = true; + } else { + if (data.actions && (data.actions.has("Action") || data.actions.has("Mouse Up") || data.actions.has("Mouse Down")) && this.enableScripting && this.hasJSActions) { + this._bindJSAction(link, data); + isBound = true; + } + if (data.resetForm) { + this._bindResetFormAction(link, data.resetForm); + isBound = true; + } else if (this.isTooltipOnly && !isBound) { + this._bindLink(link, ""); + isBound = true; + } + } + this.container.classList.add("linkAnnotation"); + if (isBound) { + this.contentElement = link; + this.container.append(link); + } + return this.container; + } + #setInternalLink() { + this.container.setAttribute("data-internal-link", ""); + } + _bindLink(link, destination, overlaidText = "") { + link.href = this.linkService.getDestinationHash(destination); + link.onclick = () => { + if (destination) { + this.linkService.goToDestination(destination); + } + return false; + }; + if (destination || destination === "") { + this.#setInternalLink(); + } + if (overlaidText) { + link.title = overlaidText; + } + } + _bindNamedAction(link, action, overlaidText = "") { + link.href = this.linkService.getAnchorUrl(""); + link.onclick = () => { + this.linkService.executeNamedAction(action); + return false; + }; + if (overlaidText) { + link.title = overlaidText; + } + this.#setInternalLink(); + } + #bindAttachment(link, attachmentId, attachment, overlaidText = "", dest = null) { + link.href = this.linkService.getAnchorUrl(""); + if (attachment.description) { + link.title = attachment.description; + } else if (overlaidText) { + link.title = overlaidText; + } + const openAttachment = async () => { + const content = await this.linkService.getAttachmentContent(attachmentId); + if (content) { + this.downloadManager?.openOrDownloadData(content, attachment.filename, dest); + } + }; + link.onclick = () => { + openAttachment(); + return false; + }; + this.#setInternalLink(); + } + #bindSetOCGState(link, action, overlaidText = "") { + link.href = this.linkService.getAnchorUrl(""); + link.onclick = () => { + this.linkService.executeSetOCGState(action); + return false; + }; + if (overlaidText) { + link.title = overlaidText; + } + this.#setInternalLink(); + } + _bindJSAction(link, { + actions, + id, + overlaidText + }) { + link.href = this.linkService.getAnchorUrl(""); + const map = new Map([["Action", "onclick"], ["Mouse Up", "onmouseup"], ["Mouse Down", "onmousedown"]]); + for (const name of actions.keys()) { + const jsName = map.get(name); + if (!jsName) { + continue; + } + link[jsName] = () => { + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id, + name + } + }); + return false; + }; + } + if (overlaidText) { + link.title = overlaidText; + } + link.onclick ||= () => false; + this.#setInternalLink(); + } + _bindResetFormAction(link, resetForm) { + const otherClickAction = link.onclick; + if (!otherClickAction) { + link.href = this.linkService.getAnchorUrl(""); + } + this.#setInternalLink(); + if (!this._fieldObjects) { + warn(`_bindResetFormAction - "resetForm" action not supported, ` + "ensure that the `fieldObjects` parameter is provided."); + if (!otherClickAction) { + link.onclick = () => false; + } + return; + } + link.onclick = () => { + otherClickAction?.(); + const { + fields: resetFormFields, + refs: resetFormRefs, + include + } = resetForm; + const allFields = []; + if (resetFormFields.length !== 0 || resetFormRefs.length !== 0) { + const fieldIds = new Set(resetFormRefs); + for (const fieldName of resetFormFields) { + const fields = this._fieldObjects.get(fieldName) || []; + for (const { + id + } of fields) { + fieldIds.add(id); + } + } + const kidIdsById = new Map(); + for (const fields of this._fieldObjects.values()) { + for (const { + id, + kidIds + } of fields) { + if (kidIds) { + kidIdsById.set(id, kidIds); + } + } + } + for (const id of fieldIds) { + for (const kidId of kidIdsById.get(id) || []) { + fieldIds.add(kidId); + } + } + for (const fields of this._fieldObjects.values()) { + for (const field of fields) { + if (fieldIds.has(field.id) === include) { + allFields.push(field); + } + } + } + } else { + for (const fields of this._fieldObjects.values()) { + allFields.push(...fields); + } + } + const storage = this.annotationStorage; + const allIds = []; + for (const field of allFields) { + const { + id + } = field; + allIds.push(id); + switch (field.type) { + case "text": + { + const value = field.defaultValue || ""; + storage.setValue(id, { + value + }); + break; + } + case "checkbox": + case "radiobutton": + { + const value = field.defaultValue === field.exportValues; + storage.setValue(id, { + value + }); + break; + } + case "combobox": + case "listbox": + { + const value = field.defaultValue || ""; + storage.setValue(id, { + value + }); + break; + } + default: + continue; + } + const domElement = document.querySelector(`[data-element-id="${id}"]`); + if (!domElement) { + continue; + } else if (!GetElementsByNameSet.has(domElement)) { + warn(`_bindResetFormAction - element not allowed: ${id}`); + continue; + } + domElement.dispatchEvent(new Event("resetform")); + } + if (this.enableScripting) { + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id: "app", + ids: allIds, + name: "ResetForm" + } + }); + } + return false; + }; + } +} +class TextAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true + }); + } + render() { + this.container.classList.add("textAnnotation"); + const image = document.createElement("img"); + image.src = this.imageResourcesPath + "annotation-" + this.data.name.toLowerCase() + ".svg"; + image.setAttribute("data-l10n-id", "pdfjs-text-annotation-type"); + image.setAttribute("data-l10n-args", JSON.stringify({ + type: this.data.name + })); + if (!this.data.popupRef && this.hasPopupData) { + this.hasOwnCommentButton = true; + this._createPopup(); + } + this.container.append(image); + return this.container; + } +} +class WidgetAnnotationElement extends AnnotationElement { + render() { + return this.container; + } + _getKeyModifier(event) { + return FeatureTest.platform.isMac ? event.metaKey : event.ctrlKey; + } + _setEventListener(element, elementData, baseName, eventName, valueGetter) { + if (baseName.includes("mouse")) { + element.addEventListener(baseName, event => { + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id: this.data.id, + name: eventName, + value: valueGetter(event), + shift: event.shiftKey, + modifier: this._getKeyModifier(event) + } + }); + }); + } else { + element.addEventListener(baseName, event => { + if (baseName === "blur") { + if (!elementData.focused || !event.relatedTarget) { + return; + } + elementData.focused = false; + } else if (baseName === "focus") { + if (elementData.focused) { + return; + } + elementData.focused = true; + } + if (!valueGetter) { + return; + } + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id: this.data.id, + name: eventName, + value: valueGetter(event) + } + }); + }); + } + } + _setEventListeners(element, elementData, names, getter) { + const { + actions + } = this.data; + for (const [baseName, eventName] of names) { + if (eventName === "Action" || actions?.has(eventName)) { + if (eventName === "Focus" || eventName === "Blur") { + elementData ||= { + focused: false + }; + } + this._setEventListener(element, elementData, baseName, eventName, getter); + if (eventName === "Focus" && !actions?.has("Blur")) { + this._setEventListener(element, elementData, "blur", "Blur", null); + } else if (eventName === "Blur" && !actions?.has("Focus")) { + this._setEventListener(element, elementData, "focus", "Focus", null); + } + } + } + } + _setTextStyle(element) { + const TEXT_ALIGNMENT = ["left", "center", "right"]; + const { + fontColor + } = this.data.defaultAppearanceData; + const fontSize = this.data.defaultAppearanceData.fontSize || annotation_layer_DEFAULT_FONT_SIZE; + const style = element.style; + let computedFontSize; + const BORDER_SIZE = 2; + const roundToOneDecimal = x => Math.round(10 * x) / 10; + if (this.data.multiLine) { + const height = Math.abs(this.data.rect[3] - this.data.rect[1] - BORDER_SIZE); + const numberOfLines = Math.round(height / ((/* inlined export .LINE_FACTOR */1.35) * fontSize)) || 1; + const lineHeight = height / numberOfLines; + computedFontSize = Math.min(fontSize, roundToOneDecimal(lineHeight / (/* inlined export .LINE_FACTOR */1.35))); + } else { + const height = Math.abs(this.data.rect[3] - this.data.rect[1] - BORDER_SIZE); + computedFontSize = Math.min(fontSize, roundToOneDecimal(height / (/* inlined export .LINE_FACTOR */1.35))); + } + style.fontSize = `calc(${computedFontSize}px * var(--total-scale-factor))`; + style.color = Util.makeHexColor(...fontColor); + if (this.data.textAlignment !== null && !this.data.comb) { + style.textAlign = TEXT_ALIGNMENT[this.data.textAlignment]; + } + } + _setRequired(element, isRequired) { + if (isRequired) { + element.setAttribute("required", true); + } else { + element.removeAttribute("required"); + } + element.setAttribute("aria-required", isRequired); + } +} +class TextWidgetAnnotationElement extends WidgetAnnotationElement { + constructor(parameters) { + const isRenderable = parameters.renderForms || parameters.data.hasOwnCanvas || !parameters.data.hasAppearance && !!parameters.data.fieldValue; + super(parameters, { + isRenderable + }); + } + setPropertyOnSiblings(base, key, value, keyInStorage) { + const storage = this.annotationStorage; + for (const element of this._getElementsByName(base.name, base.id)) { + if (element.domElement) { + element.domElement[key] = value; + } + storage.setValue(element.id, { + [keyInStorage]: value + }); + } + } + render() { + const storage = this.annotationStorage; + const id = this.data.id; + this.container.classList.add("textWidgetAnnotation"); + let element = null; + if (this.renderForms) { + const storedData = storage.getValue(id, { + value: this.data.fieldValue + }); + let textContent = storedData.value || ""; + const maxLen = storage.getValue(id, { + charLimit: this.data.maxLen + }).charLimit; + if (maxLen && textContent.length > maxLen) { + textContent = textContent.slice(0, maxLen); + } + let fieldFormattedValues = storedData.formattedValue || this.data.textContent?.join("\n") || null; + if (fieldFormattedValues && this.data.comb) { + fieldFormattedValues = fieldFormattedValues.replaceAll(/\s+/g, ""); + } + const elementData = { + userValue: textContent, + formattedValue: fieldFormattedValues, + lastCommittedValue: null, + commitKey: 1, + focused: false + }; + if (this.data.multiLine) { + element = document.createElement("textarea"); + element.textContent = fieldFormattedValues ?? textContent; + if (this.data.doNotScroll) { + element.style.overflowY = "hidden"; + } + } else { + element = document.createElement("input"); + element.type = this.data.password ? "password" : "text"; + element.setAttribute("value", fieldFormattedValues ?? textContent); + if (this.data.doNotScroll) { + element.style.overflowX = "hidden"; + } + } + if (this.data.hasOwnCanvas) { + this.container.classList.add("hasOwnCanvas"); + if (storage.has(id)) { + this.container.classList.add("sandboxModified"); + } + } + GetElementsByNameSet.add(element); + this.contentElement = element; + element.setAttribute("data-element-id", id); + element.disabled = this.data.readOnly; + element.name = this.data.fieldName; + element.tabIndex = 0; + const { + datetimeFormat, + datetimeType, + timeStep + } = this.data; + const hasDateOrTime = !!datetimeType && this.enableScripting; + if (datetimeFormat) { + element.title = datetimeFormat; + } + this._setRequired(element, this.data.required); + if (maxLen) { + element.maxLength = maxLen; + } + element.addEventListener("input", event => { + storage.setValue(id, { + value: event.target.value + }); + this.setPropertyOnSiblings(element, "value", event.target.value, "value"); + elementData.formattedValue = null; + }); + element.addEventListener("resetform", event => { + const defaultValue = this.data.defaultFieldValue ?? ""; + element.value = elementData.userValue = defaultValue; + elementData.formattedValue = null; + }); + let blurListener = event => { + const { + formattedValue + } = elementData; + if (formattedValue !== null && formattedValue !== undefined) { + event.target.value = formattedValue; + } + event.target.scrollLeft = 0; + }; + if (this.enableScripting && this.hasJSActions) { + element.addEventListener("focus", event => { + if (elementData.focused) { + return; + } + const { + target + } = event; + if (hasDateOrTime) { + target.type = datetimeType; + if (timeStep) { + target.step = timeStep; + } + } + if (elementData.userValue) { + const value = elementData.userValue; + if (hasDateOrTime) { + if (datetimeType === "time") { + const date = new Date(value); + const parts = [date.getHours(), date.getMinutes(), date.getSeconds()]; + target.value = parts.map(v => v.toString().padStart(2, "0")).join(":"); + } else { + target.value = new Date(value - TIMEZONE_OFFSET).toISOString().split(datetimeType === "date" ? "T" : ".", 1)[0]; + } + } else { + target.value = value; + } + } + elementData.lastCommittedValue = target.value; + elementData.commitKey = 1; + if (!this.data.actions?.has("Focus")) { + elementData.focused = true; + } + }); + element.addEventListener("updatefromsandbox", jsEvent => { + this.container.classList.add("sandboxModified"); + const actions = { + value(event) { + elementData.userValue = event.detail.value ?? ""; + if (!hasDateOrTime) { + storage.setValue(id, { + value: elementData.userValue.toString() + }); + } + event.target.value = elementData.userValue; + }, + formattedValue(event) { + const { + formattedValue + } = event.detail; + elementData.formattedValue = formattedValue; + if (formattedValue !== null && formattedValue !== undefined && event.target !== document.activeElement) { + event.target.value = formattedValue; + } + const data = { + formattedValue + }; + if (hasDateOrTime) { + data.value = formattedValue; + } + storage.setValue(id, data); + }, + selRange(event) { + event.target.setSelectionRange(...event.detail.selRange); + }, + charLimit: event => { + const { + charLimit + } = event.detail; + const { + target + } = event; + if (charLimit === 0) { + target.removeAttribute("maxLength"); + return; + } + target.setAttribute("maxLength", charLimit); + let value = elementData.userValue; + if (!value || value.length <= charLimit) { + return; + } + value = value.slice(0, charLimit); + target.value = elementData.userValue = value; + storage.setValue(id, { + value + }); + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id, + name: "Keystroke", + value, + willCommit: true, + commitKey: 1, + selStart: target.selectionStart, + selEnd: target.selectionEnd + } + }); + } + }; + this._dispatchEventFromSandbox(actions, jsEvent); + }); + element.addEventListener("keydown", event => { + elementData.commitKey = 1; + let commitKey = -1; + if (event.key === "Escape") { + commitKey = 0; + } else if (event.key === "Enter" && !this.data.multiLine) { + commitKey = 2; + } else if (event.key === "Tab") { + elementData.commitKey = 3; + } + if (commitKey === -1) { + return; + } + const { + value + } = event.target; + if (elementData.lastCommittedValue === value) { + return; + } + elementData.lastCommittedValue = value; + elementData.userValue = value; + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id, + name: "Keystroke", + value, + willCommit: true, + commitKey, + selStart: event.target.selectionStart, + selEnd: event.target.selectionEnd + } + }); + }); + const _blurListener = blurListener; + blurListener = null; + element.addEventListener("blur", event => { + if (!elementData.focused || !event.relatedTarget) { + return; + } + if (!this.data.actions?.has("Blur")) { + elementData.focused = false; + } + const { + target + } = event; + let { + value + } = target; + if (hasDateOrTime) { + if (value && datetimeType === "time") { + const parts = value.split(":").map(v => parseInt(v, 10)); + value = new Date(2000, 0, 1, parts[0], parts[1], parts[2] || 0).valueOf(); + target.step = ""; + } else { + if (!value.includes("T")) { + value = `${value}T00:00`; + } + value = new Date(value).valueOf(); + } + target.type = "text"; + } + elementData.userValue = value; + if (elementData.lastCommittedValue !== value) { + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id, + name: "Keystroke", + value, + willCommit: true, + commitKey: elementData.commitKey, + selStart: event.target.selectionStart, + selEnd: event.target.selectionEnd + } + }); + } + _blurListener(event); + }); + if (this.data.actions?.has("Keystroke")) { + element.addEventListener("beforeinput", event => { + elementData.lastCommittedValue = null; + const { + data, + target + } = event; + const { + value, + selectionStart, + selectionEnd + } = target; + let selStart = selectionStart, + selEnd = selectionEnd; + switch (event.inputType) { + case "deleteWordBackward": + { + const wordCharPattern = /\w/; + while (selStart > 0 && !wordCharPattern.test(value[selStart - 1])) { + selStart--; + } + while (selStart > 0 && wordCharPattern.test(value[selStart - 1])) { + selStart--; + } + break; + } + case "deleteWordForward": + { + const match = value.substring(selectionStart).match(/^\W*\w*/); + if (match) { + selEnd += match[0].length; + } + break; + } + case "deleteContentBackward": + if (selectionStart === selectionEnd) { + selStart -= 1; + } + break; + case "deleteContentForward": + if (selectionStart === selectionEnd) { + selEnd += 1; + } + break; + } + event.preventDefault(); + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id, + name: "Keystroke", + value, + change: data || "", + willCommit: false, + selStart, + selEnd + } + }); + }); + } + this._setEventListeners(element, elementData, [["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"]], event => event.target.value); + } + if (blurListener) { + element.addEventListener("blur", blurListener); + } + if (this.data.comb) { + const fieldWidth = this.data.rect[2] - this.data.rect[0]; + const combWidth = fieldWidth / maxLen; + element.classList.add("comb"); + element.style.setProperty("--comb-width", `calc(${combWidth}px * var(--total-scale-factor))`); + const alignment = this.data.textAlignment; + if (alignment === 1 || alignment === 2) { + const setCombOffset = () => { + const free = maxLen - element.value.length; + element.style.setProperty("--comb-offset", `${alignment === 1 ? free >> 1 : free}`); + }; + setCombOffset(); + for (const evt of ["input", "blur", "resetform", "updatefromsandbox"]) { + element.addEventListener(evt, setCombOffset); + } + } + } + } else { + element = document.createElement("div"); + element.textContent = this.data.fieldValue; + element.style.verticalAlign = "middle"; + element.style.display = "table-cell"; + if (this.data.hasOwnCanvas) { + element.hidden = true; + } + } + this._setTextStyle(element); + this._setBackgroundColor(element); + this._setDefaultPropertiesFromJS(element); + this.container.append(element); + return this.container; + } +} +class SignatureWidgetAnnotationElement extends WidgetAnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: !!parameters.data.hasOwnCanvas + }); + } +} +class CheckboxWidgetAnnotationElement extends WidgetAnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: parameters.renderForms + }); + } + render() { + const storage = this.annotationStorage; + const data = this.data; + const id = data.id; + let value = storage.getValue(id, { + value: data.exportValue === data.fieldValue + }).value; + if (typeof value === "string") { + value = value !== "Off"; + storage.setValue(id, { + value + }); + } + this.container.classList.add("buttonWidgetAnnotation", "checkBox"); + const element = document.createElement("input"); + GetElementsByNameSet.add(element); + element.setAttribute("data-element-id", id); + element.disabled = data.readOnly; + this._setRequired(element, this.data.required); + element.type = "checkbox"; + element.name = data.fieldName; + if (value) { + element.setAttribute("checked", true); + } + element.setAttribute("exportValue", data.exportValue); + element.tabIndex = 0; + element.addEventListener("change", event => { + const { + name, + checked + } = event.target; + for (const checkbox of this._getElementsByName(name, id)) { + const curChecked = checked && checkbox.exportValue === data.exportValue; + if (checkbox.domElement) { + checkbox.domElement.checked = curChecked; + } + storage.setValue(checkbox.id, { + value: curChecked + }); + } + storage.setValue(id, { + value: checked + }); + }); + element.addEventListener("resetform", event => { + const defaultValue = data.defaultFieldValue || "Off"; + event.target.checked = defaultValue === data.exportValue; + }); + if (this.enableScripting && this.hasJSActions) { + element.addEventListener("updatefromsandbox", jsEvent => { + const actions = { + value(event) { + event.target.checked = event.detail.value !== "Off"; + storage.setValue(id, { + value: event.target.checked + }); + } + }; + this._dispatchEventFromSandbox(actions, jsEvent); + }); + this._setEventListeners(element, null, [["change", "Validate"], ["change", "Action"], ["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"]], event => event.target.checked); + } + this._setDefaultPropertiesFromJS(element); + this.container.append(element); + return this.container; + } +} +class RadioButtonWidgetAnnotationElement extends WidgetAnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: parameters.renderForms + }); + } + render() { + this.container.classList.add("buttonWidgetAnnotation", "radioButton"); + const storage = this.annotationStorage; + const data = this.data; + const id = data.id; + let value = storage.getValue(id, { + value: data.buttonValue !== null && data.fieldValue === data.buttonValue + }).value; + if (typeof value === "string") { + value = value !== data.buttonValue; + storage.setValue(id, { + value + }); + } + if (value) { + for (const radio of this._getElementsByName(data.fieldName, id)) { + storage.setValue(radio.id, { + value: false + }); + } + } + const element = document.createElement("input"); + GetElementsByNameSet.add(element); + element.setAttribute("data-element-id", id); + element.disabled = data.readOnly; + this._setRequired(element, this.data.required); + element.type = "radio"; + element.name = data.fieldName; + if (value) { + element.setAttribute("checked", true); + } + element.tabIndex = 0; + element.addEventListener("change", event => { + const { + name, + checked + } = event.target; + for (const radio of this._getElementsByName(name, id)) { + storage.setValue(radio.id, { + value: false + }); + } + storage.setValue(id, { + value: checked + }); + }); + element.addEventListener("resetform", event => { + const defaultValue = data.defaultFieldValue; + event.target.checked = defaultValue !== null && defaultValue !== undefined && defaultValue === data.buttonValue; + }); + if (this.enableScripting && this.hasJSActions) { + const pdfButtonValue = data.buttonValue; + element.addEventListener("updatefromsandbox", jsEvent => { + const actions = { + value: event => { + const checked = pdfButtonValue === event.detail.value; + for (const radio of this._getElementsByName(event.target.name)) { + const curChecked = checked && radio.id === id; + if (radio.domElement) { + radio.domElement.checked = curChecked; + } + storage.setValue(radio.id, { + value: curChecked + }); + } + } + }; + this._dispatchEventFromSandbox(actions, jsEvent); + }); + this._setEventListeners(element, null, [["change", "Validate"], ["change", "Action"], ["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"]], event => event.target.checked); + } + this._setDefaultPropertiesFromJS(element); + this.container.append(element); + return this.container; + } +} +class PushButtonWidgetAnnotationElement extends LinkAnnotationElement { + constructor(parameters) { + super(parameters, { + ignoreBorder: parameters.data.hasAppearance + }); + } + render() { + const container = super.render(); + container.classList.add("buttonWidgetAnnotation", "pushButton"); + const linkElement = container.lastChild; + if (this.enableScripting && this.hasJSActions && linkElement) { + this._setDefaultPropertiesFromJS(linkElement); + linkElement.addEventListener("updatefromsandbox", jsEvent => { + this._dispatchEventFromSandbox({}, jsEvent); + }); + } + return container; + } +} +class ChoiceWidgetAnnotationElement extends WidgetAnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: parameters.renderForms + }); + } + render() { + this.container.classList.add("choiceWidgetAnnotation"); + const storage = this.annotationStorage; + const id = this.data.id; + const storedData = storage.getValue(id, { + value: this.data.fieldValue + }); + const selectElement = document.createElement("select"); + GetElementsByNameSet.add(selectElement); + selectElement.setAttribute("data-element-id", id); + selectElement.disabled = this.data.readOnly; + this._setRequired(selectElement, this.data.required); + selectElement.name = this.data.fieldName; + selectElement.tabIndex = 0; + let addAnEmptyEntry = this.data.combo && this.data.options.length > 0; + if (!this.data.combo) { + selectElement.size = this.data.options.length; + if (this.data.multiSelect) { + selectElement.multiple = true; + } + } + selectElement.addEventListener("resetform", event => { + const defaultValue = this.data.defaultFieldValue; + for (const option of selectElement.options) { + option.selected = option.value === defaultValue; + } + }); + const fixDisplayValue = (option, value) => { + const newValue = value.replaceAll(" ", "\u00A0"); + option.textContent = newValue; + if (newValue !== value) { + option.setAttribute("display-value", value); + } + }; + for (const option of this.data.options) { + const optionElement = document.createElement("option"); + fixDisplayValue(optionElement, option.displayValue); + optionElement.value = option.exportValue; + if (storedData.value.includes(option.exportValue)) { + optionElement.setAttribute("selected", true); + addAnEmptyEntry = false; + } + selectElement.append(optionElement); + } + let removeEmptyEntry = null; + if (addAnEmptyEntry) { + const noneOptionElement = document.createElement("option"); + noneOptionElement.value = " "; + noneOptionElement.setAttribute("hidden", true); + noneOptionElement.setAttribute("selected", true); + selectElement.prepend(noneOptionElement); + removeEmptyEntry = () => { + noneOptionElement.remove(); + selectElement.removeEventListener("input", removeEmptyEntry); + removeEmptyEntry = null; + }; + selectElement.addEventListener("input", removeEmptyEntry); + } + const getValue = isExport => { + const name = isExport ? "value" : "textContent"; + const { + options, + multiple + } = selectElement; + if (!multiple) { + return options.selectedIndex === -1 ? null : options[options.selectedIndex][name]; + } + return Array.prototype.filter.call(options, option => option.selected).map(option => option[name]); + }; + let selectedValues = getValue(false); + const getItems = event => { + const options = event.target.options; + return Array.prototype.map.call(options, option => ({ + displayValue: option.getAttribute("display-value") || option.textContent, + exportValue: option.value + })); + }; + if (this.enableScripting && this.hasJSActions) { + selectElement.addEventListener("updatefromsandbox", jsEvent => { + const actions = { + value(event) { + removeEmptyEntry?.(); + const value = event.detail.value; + const values = new Set(Array.isArray(value) ? value : [value]); + for (const option of selectElement.options) { + option.selected = values.has(option.value); + } + storage.setValue(id, { + value: getValue(true) + }); + selectedValues = getValue(false); + }, + multipleSelection(event) { + selectElement.multiple = true; + }, + remove(event) { + const options = selectElement.options; + const index = event.detail.remove; + options[index].selected = false; + selectElement.remove(index); + if (options.length > 0) { + const i = Array.prototype.findIndex.call(options, option => option.selected); + if (i === -1) { + options[0].selected = true; + } + } + storage.setValue(id, { + value: getValue(true), + items: getItems(event) + }); + selectedValues = getValue(false); + }, + clear(event) { + while (selectElement.length !== 0) { + selectElement.remove(0); + } + storage.setValue(id, { + value: null, + items: [] + }); + selectedValues = getValue(false); + }, + insert(event) { + const { + index, + displayValue, + exportValue + } = event.detail.insert; + const selectChild = selectElement.children[index]; + const optionElement = document.createElement("option"); + fixDisplayValue(optionElement, displayValue); + optionElement.value = exportValue; + if (selectChild) { + selectChild.before(optionElement); + } else { + selectElement.append(optionElement); + } + storage.setValue(id, { + value: getValue(true), + items: getItems(event) + }); + selectedValues = getValue(false); + }, + items(event) { + const { + items + } = event.detail; + while (selectElement.length !== 0) { + selectElement.remove(0); + } + for (const item of items) { + const { + displayValue, + exportValue + } = item; + const optionElement = document.createElement("option"); + fixDisplayValue(optionElement, displayValue); + optionElement.value = exportValue; + selectElement.append(optionElement); + } + if (selectElement.options.length > 0) { + selectElement.options[0].selected = true; + } + storage.setValue(id, { + value: getValue(true), + items: getItems(event) + }); + selectedValues = getValue(false); + }, + indices(event) { + const indices = new Set(event.detail.indices); + for (const option of event.target.options) { + option.selected = indices.has(option.index); + } + storage.setValue(id, { + value: getValue(true) + }); + selectedValues = getValue(false); + }, + editable(event) { + event.target.disabled = !event.detail.editable; + } + }; + this._dispatchEventFromSandbox(actions, jsEvent); + }); + selectElement.addEventListener("input", event => { + const exportValue = getValue(true); + const change = getValue(false); + storage.setValue(id, { + value: exportValue + }); + event.preventDefault(); + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id, + name: "Keystroke", + value: selectedValues, + change, + changeEx: exportValue, + willCommit: false, + commitKey: 1, + keyDown: false + } + }); + }); + this._setEventListeners(selectElement, null, [["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"], ["input", "Action"], ["input", "Validate"]], event => event.target.value); + } else { + selectElement.addEventListener("input", function (event) { + storage.setValue(id, { + value: getValue(true) + }); + }); + } + if (this.data.combo) { + this._setTextStyle(selectElement); + } else {} + this._setBackgroundColor(selectElement); + this._setDefaultPropertiesFromJS(selectElement); + this.container.append(selectElement); + return this.container; + } +} +class PopupAnnotationElement extends AnnotationElement { + constructor(parameters) { + const { + data, + elements, + parent + } = parameters; + const hasCommentManager = !!parent._commentManager; + super(parameters, { + isRenderable: !hasCommentManager && AnnotationElement._hasPopupData(data) + }); + this.elements = elements; + if (hasCommentManager && AnnotationElement._hasPopupData(data)) { + const popup = this.popup = this.#createPopup(); + for (const element of elements) { + element.popup = popup; + } + } else { + this.popup = null; + } + } + #createPopup() { + return new PopupElement({ + container: this.container, + color: this.data.color, + titleObj: this.data.titleObj, + modificationDate: this.data.modificationDate || this.data.creationDate, + contentsObj: this.data.contentsObj, + richText: this.data.richText, + rect: this.data.rect, + parentRect: this.data.parentRect || null, + parent: this.parent, + elements: this.elements, + open: this.data.open, + commentManager: this.parent._commentManager + }); + } + render() { + const { + container + } = this; + container.classList.add("popupAnnotation"); + container.role = "comment"; + const popup = this.popup = this.#createPopup(); + const elementIds = []; + for (const element of this.elements) { + element.popup = popup; + element.container.ariaHasPopup = "dialog"; + elementIds.push(element.data.id); + element.addHighlightArea(); + } + this.container.setAttribute("aria-controls", elementIds.map(id => `${AnnotationPrefix}${id}`).join(",")); + return this.container; + } +} +class PopupElement { + #commentManager = null; + #boundKeyDown = this.#keyDown.bind(this); + #boundHide = this.#hide.bind(this); + #boundShow = this.#show.bind(this); + #boundToggle = this.#toggle.bind(this); + #color = null; + #container = null; + #contentsObj = null; + #dateObj = null; + #elements = null; + #parent = null; + #parentRect = null; + #pinned = false; + #popup = null; + #popupAbortController = null; + #position = null; + #commentButton = null; + #commentButtonPosition = null; + #popupPosition = null; + #rect = null; + #richText = null; + #titleObj = null; + #updates = null; + #wasVisible = false; + #firstElement = null; + #commentText = null; + constructor({ + container, + color, + elements, + titleObj, + modificationDate, + contentsObj, + richText, + parent, + rect, + parentRect, + open, + commentManager = null + }) { + this.#container = container; + this.#titleObj = titleObj; + this.#contentsObj = contentsObj; + this.#richText = richText; + this.#parent = parent; + this.#color = color; + this.#rect = rect; + this.#parentRect = parentRect; + this.#elements = elements; + this.#commentManager = commentManager; + this.#firstElement = elements[0]; + this.#dateObj = PDFDateString.toDateObject(modificationDate); + this.trigger = elements.flatMap(e => e.getElementsToTriggerPopup()); + if (!commentManager) { + this.#addEventListeners(); + this.#container.hidden = true; + if (open) { + this.#toggle(); + } + } + } + #addEventListeners() { + if (this.#popupAbortController) { + return; + } + this.#popupAbortController = new AbortController(); + const { + signal + } = this.#popupAbortController; + for (const element of this.trigger) { + element.addEventListener("click", this.#boundToggle, { + signal + }); + element.addEventListener("pointerenter", this.#boundShow, { + signal + }); + element.addEventListener("pointerleave", this.#boundHide, { + signal + }); + element.classList.add("popupTriggerArea"); + } + for (const element of this.#elements) { + element.container?.addEventListener("keydown", this.#boundKeyDown, { + signal + }); + } + } + #setCommentButtonPosition() { + const element = this.#elements.find(e => e.hasCommentButton); + if (!element) { + return; + } + this.#commentButtonPosition = element._normalizePoint(element.commentButtonPosition); + } + renderCommentButton() { + if (this.#commentButton) { + if (!this.#commentButton.parentNode) { + this.#firstElement.container.after(this.#commentButton); + } + return; + } + if (!this.#commentButtonPosition) { + this.#setCommentButtonPosition(); + } + if (!this.#commentButtonPosition) { + return; + } + const { + signal + } = this.#popupAbortController = new AbortController(); + const hasOwnButton = this.#firstElement.hasOwnCommentButton; + const togglePopup = () => { + this.#commentManager.toggleCommentPopup(this, true, undefined, !hasOwnButton); + }; + const showPopup = () => { + this.#commentManager.toggleCommentPopup(this, false, true, !hasOwnButton); + }; + const hidePopup = () => { + this.#commentManager.toggleCommentPopup(this, false, false); + }; + if (!hasOwnButton) { + const button = this.#commentButton = document.createElement("button"); + button.className = "annotationCommentButton"; + const parentContainer = this.#firstElement.container; + button.style.zIndex = parseInt(parentContainer.style.zIndex, 10) + 1; + button.tabIndex = 0; + button.ariaHasPopup = "dialog"; + button.ariaControls = "commentPopup"; + button.setAttribute("data-l10n-id", "pdfjs-show-comment-button"); + this.#updateColor(); + this.#updateCommentButtonPosition(); + button.addEventListener("keydown", this.#boundKeyDown, { + signal + }); + button.addEventListener("click", togglePopup, { + signal + }); + button.addEventListener("pointerenter", showPopup, { + signal + }); + button.addEventListener("pointerleave", hidePopup, { + signal + }); + parentContainer.after(button); + } else { + this.#commentButton = this.#firstElement.container; + for (const element of this.trigger) { + element.ariaHasPopup = "dialog"; + element.ariaControls = "commentPopup"; + element.addEventListener("keydown", this.#boundKeyDown, { + signal + }); + element.addEventListener("click", togglePopup, { + signal + }); + element.addEventListener("pointerenter", showPopup, { + signal + }); + element.addEventListener("pointerleave", hidePopup, { + signal + }); + element.classList.add("popupTriggerArea"); + } + } + } + #updateCommentButtonPosition() { + if (this.#firstElement.extraPopupElement && !this.#firstElement.editor) { + return; + } + if (!this.#commentButton) { + this.renderCommentButton(); + } + const [x, y] = this.#commentButtonPosition; + const { + style + } = this.#commentButton; + style.left = `calc(${x}%)`; + style.top = `calc(${y}% - var(--comment-button-dim))`; + } + #updateColor() { + if (this.#firstElement.extraPopupElement) { + return; + } + if (!this.#commentButton) { + this.renderCommentButton(); + } + this.#commentButton.style.backgroundColor = this.commentButtonColor || ""; + } + get commentButtonColor() { + const { + color, + opacity + } = this.#firstElement.commentData; + return !color ? null : this.#parent._commentManager.makeCommentColor(color, opacity); + } + focusCommentButton() { + setTimeout(() => { + this.#commentButton?.focus(); + }, 0); + } + getData() { + const { + richText, + color, + opacity, + creationDate, + modificationDate + } = this.#firstElement.commentData; + return { + contentsObj: { + str: this.comment + }, + richText, + color, + opacity, + creationDate, + modificationDate + }; + } + get elementBeforePopup() { + return this.#commentButton; + } + get comment() { + this.#commentText ||= this.#firstElement.commentText; + return this.#commentText; + } + set comment(text) { + if (text === this.comment) { + return; + } + this.#firstElement.commentText = this.#commentText = text; + } + focus() { + this.#firstElement.container?.focus(); + } + get parentBoundingClientRect() { + return this.#firstElement.layer.getBoundingClientRect(); + } + setCommentButtonStates({ + selected, + hasPopup + }) { + if (!this.#commentButton) { + return; + } + this.#commentButton.classList.toggle("selected", selected); + this.#commentButton.ariaExpanded = hasPopup; + } + setSelectedCommentButton(selected) { + this.#commentButton.classList.toggle("selected", selected); + } + get commentPopupPosition() { + if (this.#popupPosition) { + return this.#popupPosition; + } + const { + x, + y, + height + } = this.#commentButton.getBoundingClientRect(); + const { + x: parentX, + y: parentY, + width: parentWidth, + height: parentHeight + } = this.#firstElement.layer.getBoundingClientRect(); + return [(x - parentX) / parentWidth, (y + height - parentY) / parentHeight]; + } + set commentPopupPosition(pos) { + this.#popupPosition = pos; + } + hasDefaultPopupPosition() { + return this.#popupPosition === null; + } + get commentButtonPosition() { + return this.#commentButtonPosition; + } + get commentButtonWidth() { + return this.#commentButton.getBoundingClientRect().width / this.parentBoundingClientRect.width; + } + editComment(options) { + const [posX, posY] = this.#popupPosition || this.commentButtonPosition.map(x => x / 100); + const parentDimensions = this.parentBoundingClientRect; + const { + x: parentX, + y: parentY, + width: parentWidth, + height: parentHeight + } = parentDimensions; + this.#commentManager.showDialog(null, this, parentX + posX * parentWidth, parentY + posY * parentHeight, { + ...options, + parentDimensions + }); + } + render() { + if (this.#popup) { + return; + } + const popup = this.#popup = document.createElement("div"); + popup.className = "popup"; + if (this.#color) { + const baseColor = popup.style.outlineColor = Util.makeHexColor(...this.#color); + popup.style.backgroundColor = `color-mix(in srgb, ${baseColor} 30%, white)`; + } + const header = document.createElement("span"); + header.className = "header"; + if (this.#titleObj?.str) { + const title = document.createElement("span"); + title.className = "title"; + header.append(title); + ({ + dir: title.dir, + str: title.textContent + } = this.#titleObj); + } + popup.append(header); + if (this.#dateObj) { + const modificationDate = document.createElement("time"); + modificationDate.className = "popupDate"; + modificationDate.setAttribute("data-l10n-id", "pdfjs-annotation-date-time-string"); + modificationDate.setAttribute("data-l10n-args", JSON.stringify({ + dateObj: this.#dateObj.valueOf() + })); + modificationDate.dateTime = this.#dateObj.toISOString(); + header.append(modificationDate); + } + renderRichText({ + html: this.#html || this.#contentsObj.str, + dir: this.#contentsObj?.dir, + className: "popupContent" + }, popup); + this.#container.append(popup); + } + get #html() { + const richText = this.#richText; + const contentsObj = this.#contentsObj; + if (richText?.str && (!contentsObj?.str || contentsObj.str === richText.str)) { + return this.#richText.html || null; + } + return null; + } + get #fontSize() { + return this.#html?.attributes?.style?.fontSize || 0; + } + get #fontColor() { + return this.#html?.attributes?.style?.color || null; + } + #makePopupContent(text) { + const popupLines = []; + const popupContent = { + str: text, + html: { + name: "div", + attributes: { + dir: "auto" + }, + children: [{ + name: "p", + children: popupLines + }] + } + }; + const lineAttributes = { + style: { + color: this.#fontColor, + fontSize: this.#fontSize ? `calc(${this.#fontSize}px * var(--total-scale-factor))` : "" + } + }; + for (const line of text.split("\n")) { + popupLines.push({ + name: "span", + value: line, + attributes: lineAttributes + }); + } + return popupContent; + } + #keyDown(event) { + if (event.altKey || event.shiftKey || event.ctrlKey || event.metaKey) { + return; + } + if (event.key === "Enter" || event.key === "Escape" && this.#pinned) { + this.#toggle(); + } + } + updateEdited({ + rect, + popup, + deleted + }) { + if (this.#commentManager) { + if (deleted) { + this.remove(); + this.#commentText = null; + } else if (popup) { + if (popup.deleted) { + this.remove(); + } else { + this.#updateColor(); + this.#commentText = popup.text; + } + } + if (rect) { + this.#commentButtonPosition = null; + this.#setCommentButtonPosition(); + this.#updateCommentButtonPosition(); + } + return; + } + if (deleted || popup?.deleted) { + this.remove(); + return; + } + this.#addEventListeners(); + this.#updates ||= { + contentsObj: this.#contentsObj, + richText: this.#richText + }; + if (rect) { + this.#position = null; + } + if (popup && popup.text) { + this.#richText = this.#makePopupContent(popup.text); + this.#dateObj = PDFDateString.toDateObject(popup.date); + this.#contentsObj = null; + } + this.#popup?.remove(); + this.#popup = null; + } + resetEdited() { + if (!this.#updates) { + return; + } + ({ + contentsObj: this.#contentsObj, + richText: this.#richText + } = this.#updates); + this.#updates = null; + this.#popup?.remove(); + this.#popup = null; + this.#position = null; + } + remove() { + this.#popupAbortController?.abort(); + this.#popupAbortController = null; + this.#popup?.remove(); + this.#popup = null; + this.#wasVisible = false; + this.#pinned = false; + this.#commentButton?.remove(); + this.#commentButton = null; + if (this.trigger) { + for (const element of this.trigger) { + element.classList.remove("popupTriggerArea"); + } + } + } + #setPosition() { + if (this.#position !== null) { + return; + } + const { + page: { + view + }, + viewport: { + rawDims: { + pageWidth, + pageHeight, + pageX, + pageY + } + } + } = this.#parent; + let useParentRect = !!this.#parentRect; + let rect = useParentRect ? this.#parentRect : this.#rect; + for (const element of this.#elements) { + if (!rect || Util.intersect(element.data.rect, rect) !== null) { + rect = element.data.rect; + useParentRect = true; + break; + } + } + const normalizedRect = Util.normalizeRect([rect[0], view[3] - rect[1] + view[1], rect[2], view[3] - rect[3] + view[1]]); + const HORIZONTAL_SPACE_AFTER_ANNOTATION = 5; + const parentWidth = useParentRect ? rect[2] - rect[0] + HORIZONTAL_SPACE_AFTER_ANNOTATION : 0; + const popupLeft = normalizedRect[0] + parentWidth; + const popupTop = normalizedRect[1]; + this.#position = [100 * (popupLeft - pageX) / pageWidth, 100 * (popupTop - pageY) / pageHeight]; + const { + style + } = this.#container; + style.left = `${this.#position[0]}%`; + style.top = `${this.#position[1]}%`; + } + #toggle() { + if (this.#commentManager) { + this.#commentManager.toggleCommentPopup(this, false); + return; + } + this.#pinned = !this.#pinned; + if (this.#pinned) { + this.#show(); + this.#container.addEventListener("click", this.#boundToggle); + this.#container.addEventListener("keydown", this.#boundKeyDown); + } else { + this.#hide(); + this.#container.removeEventListener("click", this.#boundToggle); + this.#container.removeEventListener("keydown", this.#boundKeyDown); + } + } + #show() { + if (!this.#popup) { + this.render(); + } + if (!this.isVisible) { + this.#setPosition(); + this.#container.hidden = false; + this.#container.style.zIndex = parseInt(this.#container.style.zIndex, 10) + 1000; + } else if (this.#pinned) { + this.#container.classList.add("focused"); + } + } + #hide() { + this.#container.classList.remove("focused"); + if (this.#pinned || !this.isVisible) { + return; + } + this.#container.hidden = true; + this.#container.style.zIndex = parseInt(this.#container.style.zIndex, 10) - 1000; + } + forceHide() { + this.#wasVisible = this.isVisible; + if (!this.#wasVisible) { + return; + } + this.#container.hidden = true; + } + maybeShow() { + if (this.#commentManager) { + return; + } + this.#addEventListeners(); + if (!this.#wasVisible) { + return; + } + if (!this.#popup) { + this.#show(); + } + this.#wasVisible = false; + this.#container.hidden = false; + } + get isVisible() { + return !this.#commentManager && this.#container.hidden === false; + } +} +class FreeTextAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + this.textContent = parameters.data.textContent; + this.textPosition = parameters.data.textPosition; + this.annotationEditorType = AnnotationEditorType.FREETEXT; + } + render() { + this.container.classList.add("freeTextAnnotation"); + if (this.textContent) { + const content = this.contentElement = document.createElement("div"); + content.classList.add("annotationTextContent"); + content.setAttribute("role", "comment"); + for (const line of this.textContent) { + const lineSpan = document.createElement("span"); + lineSpan.textContent = line; + content.append(lineSpan); + } + this.container.append(content); + } + if (!this.data.popupRef && this.hasPopupData) { + this.hasOwnCommentButton = true; + this._createPopup(); + } + this._editOnDoubleClick(); + return this.container; + } +} +class LineAnnotationElement extends AnnotationElement { + #line = null; + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + } + render() { + this.container.classList.add("lineAnnotation"); + const { + data, + width, + height + } = this; + const svg = this.svgFactory.create(width, height, true); + const line = this.#line = this.svgFactory.createElement("svg:line"); + line.setAttribute("x1", data.rect[2] - data.lineCoordinates[0]); + line.setAttribute("y1", data.rect[3] - data.lineCoordinates[1]); + line.setAttribute("x2", data.rect[2] - data.lineCoordinates[2]); + line.setAttribute("y2", data.rect[3] - data.lineCoordinates[3]); + line.setAttribute("stroke-width", data.borderStyle.width || 1); + line.setAttribute("stroke", "transparent"); + line.setAttribute("fill", "transparent"); + svg.append(line); + this.container.append(svg); + if (!data.popupRef && this.hasPopupData) { + this.hasOwnCommentButton = true; + this._createPopup(); + } + return this.container; + } + getElementsToTriggerPopup() { + return this.#line; + } + addHighlightArea() { + this.container.classList.add("highlightArea"); + } +} +class SquareAnnotationElement extends AnnotationElement { + #square = null; + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + } + render() { + this.container.classList.add("squareAnnotation"); + const { + data, + width, + height + } = this; + const svg = this.svgFactory.create(width, height, true); + const borderWidth = data.borderStyle.width; + const square = this.#square = this.svgFactory.createElement("svg:rect"); + square.setAttribute("x", borderWidth / 2); + square.setAttribute("y", borderWidth / 2); + square.setAttribute("width", width - borderWidth); + square.setAttribute("height", height - borderWidth); + square.setAttribute("stroke-width", borderWidth || 1); + square.setAttribute("stroke", "transparent"); + square.setAttribute("fill", "transparent"); + svg.append(square); + this.container.append(svg); + if (!data.popupRef && this.hasPopupData) { + this.hasOwnCommentButton = true; + this._createPopup(); + } + return this.container; + } + getElementsToTriggerPopup() { + return this.#square; + } + addHighlightArea() { + this.container.classList.add("highlightArea"); + } +} +class CircleAnnotationElement extends AnnotationElement { + #circle = null; + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + } + render() { + this.container.classList.add("circleAnnotation"); + const { + data, + width, + height + } = this; + const svg = this.svgFactory.create(width, height, true); + const borderWidth = data.borderStyle.width; + const circle = this.#circle = this.svgFactory.createElement("svg:ellipse"); + circle.setAttribute("cx", width / 2); + circle.setAttribute("cy", height / 2); + circle.setAttribute("rx", width / 2 - borderWidth / 2); + circle.setAttribute("ry", height / 2 - borderWidth / 2); + circle.setAttribute("stroke-width", borderWidth || 1); + circle.setAttribute("stroke", "transparent"); + circle.setAttribute("fill", "transparent"); + svg.append(circle); + this.container.append(svg); + if (!data.popupRef && this.hasPopupData) { + this.hasOwnCommentButton = true; + this._createPopup(); + } + return this.container; + } + getElementsToTriggerPopup() { + return this.#circle; + } + addHighlightArea() { + this.container.classList.add("highlightArea"); + } +} +class PolylineAnnotationElement extends AnnotationElement { + #polyline = null; + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + this.containerClassName = "polylineAnnotation"; + this.svgElementName = "svg:polyline"; + } + render() { + this.container.classList.add(this.containerClassName); + const { + data: { + rect, + vertices, + borderStyle, + popupRef + }, + width, + height + } = this; + if (!vertices) { + return this.container; + } + const svg = this.svgFactory.create(width, height, true); + let points = []; + for (let i = 0, ii = vertices.length; i < ii; i += 2) { + const x = vertices[i] - rect[0]; + const y = rect[3] - vertices[i + 1]; + points.push(`${x},${y}`); + } + points = points.join(" "); + const polyline = this.#polyline = this.svgFactory.createElement(this.svgElementName); + polyline.setAttribute("points", points); + polyline.setAttribute("stroke-width", borderStyle.width || 1); + polyline.setAttribute("stroke", "transparent"); + polyline.setAttribute("fill", "transparent"); + svg.append(polyline); + this.container.append(svg); + if (!popupRef && this.hasPopupData) { + this.hasOwnCommentButton = true; + this._createPopup(); + } + return this.container; + } + getElementsToTriggerPopup() { + return this.#polyline; + } + addHighlightArea() { + this.container.classList.add("highlightArea"); + } +} +class PolygonAnnotationElement extends PolylineAnnotationElement { + constructor(parameters) { + super(parameters); + this.containerClassName = "polygonAnnotation"; + this.svgElementName = "svg:polygon"; + } +} +class CaretAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + } + render() { + this.container.classList.add("caretAnnotation"); + if (!this.data.popupRef && this.hasPopupData) { + this.hasOwnCommentButton = true; + this._createPopup(); + } + return this.container; + } +} +class InkAnnotationElement extends AnnotationElement { + #polylinesGroupElement = null; + #polylines = []; + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + this.containerClassName = "inkAnnotation"; + this.svgElementName = "svg:polyline"; + this.annotationEditorType = this.data.it === "InkHighlight" ? AnnotationEditorType.HIGHLIGHT : AnnotationEditorType.INK; + } + #getTransform(rotation, rect) { + switch (rotation) { + case 90: + return { + transform: `rotate(90) translate(${-rect[0]},${rect[1]}) scale(1,-1)`, + width: rect[3] - rect[1], + height: rect[2] - rect[0] + }; + case 180: + return { + transform: `rotate(180) translate(${-rect[2]},${rect[1]}) scale(1,-1)`, + width: rect[2] - rect[0], + height: rect[3] - rect[1] + }; + case 270: + return { + transform: `rotate(270) translate(${-rect[2]},${rect[3]}) scale(1,-1)`, + width: rect[3] - rect[1], + height: rect[2] - rect[0] + }; + default: + return { + transform: `translate(${-rect[0]},${rect[3]}) scale(1,-1)`, + width: rect[2] - rect[0], + height: rect[3] - rect[1] + }; + } + } + render() { + this.container.classList.add(this.containerClassName); + const { + data: { + rect, + rotation, + inkLists, + borderStyle, + popupRef + } + } = this; + const { + transform, + width, + height + } = this.#getTransform(rotation, rect); + const svg = this.svgFactory.create(width, height, true); + const g = this.#polylinesGroupElement = this.svgFactory.createElement("svg:g"); + svg.append(g); + g.setAttribute("stroke-width", borderStyle.width || 1); + g.setAttribute("stroke-linecap", "round"); + g.setAttribute("stroke-linejoin", "round"); + g.setAttribute("stroke-miterlimit", 10); + g.setAttribute("stroke", "transparent"); + g.setAttribute("fill", "transparent"); + g.setAttribute("transform", transform); + for (const inkList of inkLists) { + const polyline = this.svgFactory.createElement(this.svgElementName); + this.#polylines.push(polyline); + polyline.setAttribute("points", inkList.join(",")); + g.append(polyline); + } + if (!popupRef && this.hasPopupData) { + this.hasOwnCommentButton = true; + this._createPopup(); + } + this.container.append(svg); + this._editOnDoubleClick(); + return this.container; + } + updateEdited(params) { + super.updateEdited(params); + const { + thickness, + points, + rect + } = params; + const g = this.#polylinesGroupElement; + if (thickness >= 0) { + g.setAttribute("stroke-width", thickness || 1); + } + if (points) { + for (let i = 0, ii = this.#polylines.length; i < ii; i++) { + this.#polylines[i].setAttribute("points", points[i].join(",")); + } + } + if (rect) { + const { + transform, + width, + height + } = this.#getTransform(this.data.rotation, rect); + const root = g.parentElement; + root.setAttribute("viewBox", `0 0 ${width} ${height}`); + g.setAttribute("transform", transform); + } + } + getElementsToTriggerPopup() { + return this.#polylines; + } + addHighlightArea() { + this.container.classList.add("highlightArea"); + } +} +class HighlightAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true, + createQuadrilaterals: true + }); + this.annotationEditorType = AnnotationEditorType.HIGHLIGHT; + } + render() { + const { + data: { + overlaidText, + popupRef + } + } = this; + if (!popupRef && this.hasPopupData) { + this.hasOwnCommentButton = true; + this._createPopup(); + } + this.container.classList.add("highlightAnnotation"); + this._editOnDoubleClick(); + if (overlaidText) { + const mark = document.createElement("mark"); + mark.classList.add("overlaidText"); + mark.textContent = overlaidText; + this.container.append(mark); + } + return this.container; + } +} +class UnderlineAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true, + createQuadrilaterals: true + }); + } + render() { + const { + data: { + overlaidText, + popupRef + } + } = this; + if (!popupRef && this.hasPopupData) { + this.hasOwnCommentButton = true; + this._createPopup(); + } + this.container.classList.add("underlineAnnotation"); + if (overlaidText) { + const underline = document.createElement("u"); + underline.classList.add("overlaidText"); + underline.textContent = overlaidText; + this.container.append(underline); + } + return this.container; + } +} +class SquigglyAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true, + createQuadrilaterals: true + }); + } + render() { + const { + data: { + overlaidText, + popupRef + } + } = this; + if (!popupRef && this.hasPopupData) { + this.hasOwnCommentButton = true; + this._createPopup(); + } + this.container.classList.add("squigglyAnnotation"); + if (overlaidText) { + const underline = document.createElement("u"); + underline.classList.add("overlaidText"); + underline.textContent = overlaidText; + this.container.append(underline); + } + return this.container; + } +} +class StrikeOutAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true, + createQuadrilaterals: true + }); + } + render() { + const { + data: { + overlaidText, + popupRef + } + } = this; + if (!popupRef && this.hasPopupData) { + this.hasOwnCommentButton = true; + this._createPopup(); + } + this.container.classList.add("strikeoutAnnotation"); + if (overlaidText) { + const strikeout = document.createElement("s"); + strikeout.classList.add("overlaidText"); + strikeout.textContent = overlaidText; + this.container.append(strikeout); + } + return this.container; + } +} +class StampAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + this.annotationEditorType = AnnotationEditorType.STAMP; + } + render() { + this.container.classList.add("stampAnnotation"); + this.container.setAttribute("role", "img"); + if (!this.data.popupRef && this.hasPopupData) { + this.hasOwnCommentButton = true; + this._createPopup(); + } + this._editOnDoubleClick(); + return this.container; + } +} +class FileAttachmentAnnotationElement extends AnnotationElement { + #trigger = null; + constructor(parameters) { + super(parameters, { + isRenderable: true + }); + const { + fileId, + file + } = this.data; + this.filename = file.filename; + this.content = file.content; + this.fileId = fileId; + this.linkService.eventBus?.dispatch("fileattachmentannotation", { + source: this, + attachmentId: this.fileId, + ...file + }); + } + render() { + this.container.classList.add("fileAttachmentAnnotation"); + const { + container, + data + } = this; + let trigger; + if (data.hasAppearance || data.fillAlpha === 0) { + trigger = document.createElement("div"); + } else { + trigger = document.createElement("img"); + trigger.src = `${this.imageResourcesPath}annotation-${/paperclip/i.test(data.name) ? "paperclip" : "pushpin"}.svg`; + if (data.fillAlpha && data.fillAlpha < 1) { + trigger.style = `filter: opacity(${Math.round(data.fillAlpha * 100)}%);`; + } + } + trigger.addEventListener("dblclick", this.#download.bind(this)); + this.#trigger = trigger; + const { + isMac + } = FeatureTest.platform; + container.addEventListener("keydown", evt => { + if (evt.key === "Enter" && (isMac ? evt.metaKey : evt.ctrlKey)) { + this.#download(); + } + }); + if (!data.popupRef && this.hasPopupData) { + this.hasOwnCommentButton = true; + this._createPopup(); + } else { + trigger.classList.add("popupTriggerArea"); + } + container.append(trigger); + return container; + } + getElementsToTriggerPopup() { + return this.#trigger; + } + addHighlightArea() { + this.container.classList.add("highlightArea"); + } + async #download() { + const { + fileId, + filename, + content: fallbackContent + } = this; + const content = (await this.linkService.getAttachmentContent(fileId)) || fallbackContent; + if (content) { + this.downloadManager?.openOrDownloadData(content, filename); + } + } +} +class MediaAnnotationElement extends AnnotationElement { + #abortController = new AbortController(); + #contentUrl = null; + #media = null; + constructor(parameters) { + super(parameters, { + isRenderable: !!parameters.data.richMedia + }); + } + render() { + this.container.classList.add("mediaAnnotation"); + const { + filename + } = this.data.richMedia; + const button = document.createElement("button"); + button.className = "mediaPlayButton"; + button.type = "button"; + button.title = button.ariaLabel = filename; + button.addEventListener("click", () => this.#load(button), { + signal: this.#abortController.signal + }); + this.container.append(button); + return this.container; + } + async #load(button) { + const { + fileId, + filename, + contentType + } = this.data.richMedia; + button.disabled = true; + let content; + try { + content = await this.linkService.getAttachmentContent(fileId); + } catch { + return; + } finally { + button.disabled = false; + } + if (!content || !button.isConnected) { + return; + } + const { + signal + } = this.#abortController; + const blob = new Blob([content], { + type: contentType + }); + if (!/^(?:video|audio)\//.test(blob.type)) { + return; + } + const url = URL.createObjectURL(blob); + this.#contentUrl = url; + const isAudio = blob.type.startsWith("audio/"); + const media = document.createElement(isAudio ? "audio" : "video"); + this.#media = media; + media.className = "mediaContent"; + this._setBackgroundColor(media); + media.src = url; + media.title = filename; + media.controls = true; + media.autoplay = true; + media.tabIndex = 0; + if (isAudio) { + let hovered = false; + let focused = false; + const updateControls = () => { + media.controls = hovered || focused; + }; + this.container.addEventListener("pointerenter", () => { + hovered = true; + updateControls(); + }, { + signal + }); + this.container.addEventListener("pointerleave", () => { + hovered = false; + updateControls(); + }, { + signal + }); + this.container.addEventListener("focusin", () => { + focused = true; + updateControls(); + }, { + signal + }); + this.container.addEventListener("focusout", () => { + focused = false; + updateControls(); + }, { + signal + }); + } + media.addEventListener("emptied", () => this.#revokeContentUrl(url), { + once: true, + signal + }); + button.replaceWith(media); + media.play().catch(() => {}); + } + #revokeContentUrl(url = this.#contentUrl) { + if (url && url === this.#contentUrl) { + URL.revokeObjectURL(url); + this.#contentUrl = null; + } + } + destroy() { + this.#abortController.abort(); + if (this.#media) { + this.#media.pause(); + this.#media.removeAttribute("src"); + this.#media.load(); + this.#media = null; + } + this.#revokeContentUrl(); + } +} +class AnnotationLayer { + #accessibilityManager = null; + #annotationCanvasMap = null; + #annotationStorage = null; + #editableAnnotations = new Map(); + #structTreeLayer = null; + #linkService = null; + #elements = []; + #hasAriaAttributesFromStructTree = false; + zIndex = 0; + constructor({ + div, + accessibilityManager, + annotationCanvasMap, + annotationEditorUIManager, + page, + viewport, + structTreeLayer, + commentManager, + linkService, + annotationStorage + }) { + this.div = div; + this.#accessibilityManager = accessibilityManager; + this.#annotationCanvasMap = annotationCanvasMap; + this.#structTreeLayer = structTreeLayer || null; + this.#linkService = linkService || null; + this.#annotationStorage = annotationStorage || new AnnotationStorage(); + this.page = page; + this.viewport = viewport; + this._annotationEditorUIManager = annotationEditorUIManager; + this._commentManager = commentManager || null; + } + hasEditableAnnotations() { + return this.#editableAnnotations.size > 0; + } + async render(params) { + const { + annotations, + optionalContentConfig + } = params; + const layer = this.div; + setLayerDimensions(layer, this.viewport); + const popupToElements = new Map(); + const popupAnnotations = []; + const elementParams = { + data: null, + layer, + linkService: this.#linkService, + downloadManager: params.downloadManager, + imageResourcesPath: params.imageResourcesPath || "", + renderForms: params.renderForms !== false, + svgFactory: new DOMSVGFactory(), + annotationStorage: this.#annotationStorage, + enableComment: params.enableComment === true, + enableScripting: params.enableScripting === true, + hasJSActions: params.hasJSActions, + fieldObjects: params.fieldObjects, + parent: this, + elements: null + }; + for (const data of annotations) { + if (data.noHTML) { + continue; + } + const isPopupAnnotation = data.annotationType === AnnotationType.POPUP; + if (!isPopupAnnotation) { + if (data.rect[2] === data.rect[0] || data.rect[3] === data.rect[1]) { + continue; + } + } else { + const elements = popupToElements.get(data.id); + if (!elements) { + continue; + } + if (!this._commentManager) { + popupAnnotations.push(data); + continue; + } + elementParams.elements = elements; + } + elementParams.data = data; + const element = AnnotationElementFactory.create(elementParams); + if (!element.isRenderable) { + continue; + } + if (!isPopupAnnotation) { + this.#elements.push(element); + if (data.popupRef) { + popupToElements.getOrInsertComputed(data.popupRef, makeArr).push(element); + } + } + const rendered = element.render(); + if (data.hidden) { + rendered.style.visibility = "hidden"; + } + element.updateOC(optionalContentConfig); + if (element._isEditable) { + this.#editableAnnotations.set(element.data.id, element); + this._annotationEditorUIManager?.renderAnnotationElement(element); + } + } + await this.#addElementsToDOM(); + for (const data of popupAnnotations) { + const elements = elementParams.elements = popupToElements.get(data.id); + elementParams.data = data; + const element = AnnotationElementFactory.create(elementParams); + if (!element.isRenderable) { + continue; + } + const rendered = element.render(); + element.contentElement.id = `${AnnotationPrefix}${data.id}`; + if (data.hidden) { + rendered.style.visibility = "hidden"; + } + elements.at(-1).container.after(rendered); + } + this.#setAnnotationCanvasMap(); + } + async #addElementsToDOM() { + if (this.#elements.length === 0) { + return; + } + this.div.replaceChildren(); + const promises = []; + if (!this.#hasAriaAttributesFromStructTree) { + this.#hasAriaAttributesFromStructTree = true; + for (const { + contentElement, + data: { + hidden, + id, + oc + } + } of this.#elements) { + const annotationId = contentElement.id = `${AnnotationPrefix}${id}`; + const enableLinkOwnership = contentElement.localName === "a" && !hidden && !oc; + promises.push(this.#structTreeLayer?.getAriaAttributes(annotationId, { + enableLinkOwnership + }).then(ariaAttributes => { + if (ariaAttributes) { + for (const [key, value] of ariaAttributes) { + contentElement.setAttribute(key, value); + } + } + })); + } + } + this.#elements.sort(({ + data: { + rect: [a0, a1, a2, a3] + } + }, { + data: { + rect: [b0, b1, b2, b3] + } + }) => { + if (a0 === a2 && a1 === a3) { + return +1; + } + if (b0 === b2 && b1 === b3) { + return -1; + } + const top1 = a3; + const bot1 = a1; + const mid1 = (a1 + a3) / 2; + const top2 = b3; + const bot2 = b1; + const mid2 = (b1 + b3) / 2; + if (mid1 >= top2 && mid2 <= bot1) { + return -1; + } + if (mid2 >= top1 && mid1 <= bot2) { + return +1; + } + const centerX1 = (a0 + a2) / 2; + const centerX2 = (b0 + b2) / 2; + return centerX1 - centerX2; + }); + const fragment = document.createDocumentFragment(); + for (const element of this.#elements) { + fragment.append(element.container); + if (this._commentManager) { + (element.extraPopupElement?.popup || element.popup)?.renderCommentButton(); + } else if (element.extraPopupElement) { + fragment.append(element.extraPopupElement.render()); + } + } + this.div.append(fragment); + await Promise.all(promises); + if (this.#accessibilityManager) { + const annotationIds = await this.#structTreeLayer?.getAnnotationIds(); + for (const { + contentElement + } of this.#elements) { + if (annotationIds?.has(contentElement.id)) { + continue; + } + this.#accessibilityManager.addPointerInTextLayer(contentElement, false); + } + } + } + async addLinkAnnotations(annotations) { + const elementParams = { + data: null, + layer: this.div, + linkService: this.#linkService, + svgFactory: new DOMSVGFactory(), + parent: this + }; + for (const data of annotations) { + data.borderStyle ||= AnnotationLayer._defaultBorderStyle; + elementParams.data = data; + const element = AnnotationElementFactory.create(elementParams); + if (!element.isRenderable) { + continue; + } + element.render(); + element.contentElement.id = `${AnnotationPrefix}${data.id}`; + this.#elements.push(element); + } + await this.#addElementsToDOM(); + } + update({ + viewport, + optionalContentConfig + }) { + const layer = this.div; + this.viewport = viewport; + setLayerDimensions(layer, { + rotation: viewport.rotation + }); + for (const element of this.#elements) { + element.updateOC(optionalContentConfig); + } + this.#setAnnotationCanvasMap(); + layer.hidden = false; + } + destroy() { + for (const element of this.#elements) { + element.destroy?.(); + this.#accessibilityManager?.removePointerInTextLayer(element.contentElement); + } + this.#elements.length = 0; + this.#editableAnnotations.clear(); + this.div.replaceChildren(); + } + #setAnnotationCanvasMap() { + if (!this.#annotationCanvasMap) { + return; + } + const layer = this.div; + for (const [id, canvas] of this.#annotationCanvasMap) { + const element = layer.querySelector(`[data-annotation-id="${id}"]`); + if (!element) { + continue; + } + if (Array.isArray(canvas)) { + for (const cvs of canvas) { + cvs.className = "annotationContent"; + cvs.ariaHidden = true; + } + } else { + canvas.className = "annotationContent"; + canvas.ariaHidden = true; + } + const toRemove = []; + for (const child of element.children) { + if (child.nodeName === "CANVAS") { + toRemove.push(child); + } + } + for (const child of toRemove) { + child.remove(); + } + const firstCanvas = Array.isArray(canvas) ? canvas[0] : canvas; + const { + firstChild + } = element; + if (!firstChild) { + element.append(firstCanvas); + } else if (!firstChild.classList.contains("annotationContent")) { + firstChild.before(firstCanvas); + } else { + firstChild.after(firstCanvas); + } + if (Array.isArray(canvas)) { + let lastCanvas = firstCanvas; + for (let i = 1, ii = canvas.length; i < ii; i++) { + lastCanvas.after(canvas[i]); + lastCanvas = canvas[i]; + } + } + this.#annotationCanvasMap.delete(id); + const editableAnnotation = this.#editableAnnotations.get(id); + if (!editableAnnotation) { + continue; + } + if (editableAnnotation._hasNoCanvas) { + this._annotationEditorUIManager?.setMissingCanvas(id, element.id, canvas); + editableAnnotation._hasNoCanvas = false; + } else { + editableAnnotation.canvas = canvas; + } + } + } + refreshCanvases() { + this.#setAnnotationCanvasMap(); + } + getEditableAnnotations() { + return this.#editableAnnotations.values(); + } + getEditableAnnotation(id) { + return this.#editableAnnotations.get(id); + } + addFakeAnnotation(editor) { + const { + div + } = this; + const { + id, + rotation + } = editor; + const element = new EditorAnnotationElement({ + data: { + id, + rect: editor.getPDFRect(), + rotation + }, + editor, + layer: div, + parent: this, + enableComment: !!this._commentManager, + linkService: this.#linkService, + annotationStorage: this.#annotationStorage + }); + element.render(); + element.contentElement.id = `${AnnotationPrefix}${id}`; + element.createOrUpdatePopup(); + this.#elements.push(element); + return element; + } + removeAnnotation(id) { + const index = this.#elements.findIndex(el => el.data.id === id); + if (index < 0) { + return; + } + const [element] = this.#elements.splice(index, 1); + this.#accessibilityManager?.removePointerInTextLayer(element.contentElement); + } + updateFakeAnnotations(editors) { + if (editors.length === 0) { + return; + } + for (const editor of editors) { + editor.updateFakeAnnotationElement(this); + } + this.#addElementsToDOM(); + } + togglePointerEvents(enabled = false) { + this.div.classList.toggle("disabled", !enabled); + } + static get _defaultBorderStyle() { + return util_shadow(this, "_defaultBorderStyle", Object.freeze({ + width: 1, + rawWidth: 1, + style: AnnotationBorderStyleType.SOLID, + dashArray: [3], + horizontalCornerRadius: 0, + verticalCornerRadius: 0 + })); + } +} + +;// ./src/display/editor/freetext.js + + + + + + + + + + +const EOL_PATTERN = /\r\n?|\n/g; +class FreeTextEditor extends AnnotationEditor { + #content = ""; + #editorDivId = `${this.id}-editor`; + #editModeAC = null; + #fontSize; + _colorPicker = null; + static _freeTextDefaultContent = ""; + static _internalPadding = 0; + static _defaultColor = null; + static _defaultFontSize = 10; + static get _keyboardManager() { + const proto = FreeTextEditor.prototype; + const arrowChecker = self => self.isEmpty(); + const small = AnnotationEditorUIManager.TRANSLATE_SMALL; + const big = AnnotationEditorUIManager.TRANSLATE_BIG; + return util_shadow(this, "_keyboardManager", new KeyboardManager([[["ctrl+s", "mac+meta+s", "ctrl+p", "mac+meta+p"], proto.commitOrRemove, { + bubbles: true + }], [["ctrl+Enter", "mac+meta+Enter"], proto.commitOrRemove], [["Escape"], proto.commitOrRemove], [["ArrowLeft"], proto._translateEmpty, { + args: [-small, 0], + checker: arrowChecker + }], [["ctrl+ArrowLeft", "mac+shift+ArrowLeft"], proto._translateEmpty, { + args: [-big, 0], + checker: arrowChecker + }], [["ArrowRight"], proto._translateEmpty, { + args: [small, 0], + checker: arrowChecker + }], [["ctrl+ArrowRight", "mac+shift+ArrowRight"], proto._translateEmpty, { + args: [big, 0], + checker: arrowChecker + }], [["ArrowUp"], proto._translateEmpty, { + args: [0, -small], + checker: arrowChecker + }], [["ctrl+ArrowUp", "mac+shift+ArrowUp"], proto._translateEmpty, { + args: [0, -big], + checker: arrowChecker + }], [["ArrowDown"], proto._translateEmpty, { + args: [0, small], + checker: arrowChecker + }], [["ctrl+ArrowDown", "mac+shift+ArrowDown"], proto._translateEmpty, { + args: [0, big], + checker: arrowChecker + }]])); + } + static _type = "freetext"; + static _editorType = AnnotationEditorType.FREETEXT; + constructor(params) { + super({ + ...params, + name: "freeTextEditor" + }); + this.color = params.color || FreeTextEditor._defaultColor || AnnotationEditor._defaultLineColor; + this.#fontSize = params.fontSize || FreeTextEditor._defaultFontSize; + if (!this.annotationElementId) { + this._uiManager.a11yAlert(AnnotationEditor._l10nAlert.freetext); + } + this.canAddComment = false; + } + static initialize(l10n, uiManager) { + AnnotationEditor.initialize(l10n, uiManager); + const style = getComputedStyle(document.documentElement); + this._internalPadding = parseFloat(style.getPropertyValue("--freetext-padding")); + } + static updateDefaultParams(type, value) { + switch (type) { + case AnnotationEditorParamsType.FREETEXT_SIZE: + FreeTextEditor._defaultFontSize = value; + break; + case AnnotationEditorParamsType.FREETEXT_COLOR: + FreeTextEditor._defaultColor = value; + break; + } + } + updateParams(type, value) { + switch (type) { + case AnnotationEditorParamsType.FREETEXT_SIZE: + this.#updateFontSize(value); + break; + case AnnotationEditorParamsType.FREETEXT_COLOR: + this.#updateColor(value); + break; + } + } + static get defaultPropertiesToUpdate() { + return [[AnnotationEditorParamsType.FREETEXT_SIZE, FreeTextEditor._defaultFontSize], [AnnotationEditorParamsType.FREETEXT_COLOR, FreeTextEditor._defaultColor || AnnotationEditor._defaultLineColor]]; + } + get propertiesToUpdate() { + return [[AnnotationEditorParamsType.FREETEXT_SIZE, this.#fontSize], [AnnotationEditorParamsType.FREETEXT_COLOR, this.color]]; + } + get toolbarButtons() { + this._colorPicker ||= new BasicColorPicker(this); + return [["colorPicker", this._colorPicker]]; + } + get colorType() { + return AnnotationEditorParamsType.FREETEXT_COLOR; + } + #updateFontSize(fontSize) { + const setFontsize = size => { + this.editorDiv.style.fontSize = `calc(${size}px * var(--total-scale-factor))`; + this.translate(0, -(size - this.#fontSize) * this.parentScale); + this.#fontSize = size; + this.#setEditorDimensions(); + }; + const savedFontsize = this.#fontSize; + this.addCommands({ + cmd: setFontsize.bind(this, fontSize), + undo: setFontsize.bind(this, savedFontsize), + post: this._uiManager.updateUI.bind(this._uiManager, this), + mustExec: true, + type: AnnotationEditorParamsType.FREETEXT_SIZE, + overwriteIfSameType: true, + keepUndo: true + }); + } + onUpdatedColor() { + this.editorDiv.style.color = this.color; + this._colorPicker?.update(this.color); + super.onUpdatedColor(); + } + #updateColor(color) { + const setColor = col => { + this.color = col; + this.onUpdatedColor(); + }; + const savedColor = this.color; + this.addCommands({ + cmd: setColor.bind(this, color), + undo: setColor.bind(this, savedColor), + post: this._uiManager.updateUI.bind(this._uiManager, this), + mustExec: true, + type: AnnotationEditorParamsType.FREETEXT_COLOR, + overwriteIfSameType: true, + keepUndo: true + }); + } + _translateEmpty(x, y) { + this._uiManager.translateSelectedEditors(x, y, true); + } + getInitialTranslation() { + const scale = this.parentScale; + return [-FreeTextEditor._internalPadding * scale, -(FreeTextEditor._internalPadding + this.#fontSize) * scale]; + } + rebuild() { + if (!this.parent) { + return; + } + super.rebuild(); + if (this.div === null) { + return; + } + if (!this.isAttachedToDOM) { + this.parent.add(this); + } + } + enableEditMode() { + if (!super.enableEditMode()) { + return false; + } + this.overlayDiv.classList.remove("enabled"); + this.editorDiv.contentEditable = true; + this._isDraggable = false; + this.div.removeAttribute("aria-activedescendant"); + this.#editModeAC = new AbortController(); + const signal = this._uiManager.combinedSignal(this.#editModeAC); + this.editorDiv.addEventListener("keydown", this.editorDivKeydown.bind(this), { + signal + }); + this.editorDiv.addEventListener("focus", this.editorDivFocus.bind(this), { + signal + }); + this.editorDiv.addEventListener("blur", this.editorDivBlur.bind(this), { + signal + }); + this.editorDiv.addEventListener("input", this.editorDivInput.bind(this), { + signal + }); + this.editorDiv.addEventListener("paste", this.editorDivPaste.bind(this), { + signal + }); + return true; + } + disableEditMode() { + if (!super.disableEditMode()) { + return false; + } + this.overlayDiv.classList.add("enabled"); + this.editorDiv.contentEditable = false; + this.div.setAttribute("aria-activedescendant", this.#editorDivId); + this._isDraggable = true; + this.#editModeAC?.abort(); + this.#editModeAC = null; + this.div.focus({ + preventScroll: true + }); + this.isEditing = false; + this.parent.div.classList.add("freetextEditing"); + return true; + } + focusin(event) { + if (!this._focusEventsAllowed) { + return; + } + super.focusin(event); + if (event.target !== this.editorDiv) { + this.editorDiv.focus(); + } + } + onceAdded(focus) { + if (this.width) { + return; + } + this.enableEditMode(); + if (focus) { + this.editorDiv.focus(); + } + if (this._initialOptions?.isCentered) { + this.center(); + } + this._initialOptions = null; + } + isEmpty() { + return !this.editorDiv || this.editorDiv.innerText.trim() === ""; + } + remove() { + this.isEditing = false; + if (this.parent) { + this.parent.setEditingState(true); + this.parent.div.classList.add("freetextEditing"); + } + super.remove(); + } + #extractText() { + const buffer = []; + this.editorDiv.normalize(); + let prevChild = null; + for (const child of this.editorDiv.childNodes) { + if (prevChild?.nodeType === Node.TEXT_NODE && child.nodeName === "BR") { + continue; + } + buffer.push(FreeTextEditor.#getNodeContent(child)); + prevChild = child; + } + return buffer.join("\n"); + } + #setEditorDimensions() { + const [parentWidth, parentHeight] = this.parentDimensions; + let rect; + if (this.isAttachedToDOM) { + rect = this.div.getBoundingClientRect(); + } else { + const { + currentLayer, + div + } = this; + const savedDisplay = div.style.display; + const savedVisibility = div.classList.contains("hidden"); + div.classList.remove("hidden"); + div.style.display = "hidden"; + currentLayer.div.append(this.div); + rect = div.getBoundingClientRect(); + div.remove(); + div.style.display = savedDisplay; + div.classList.toggle("hidden", savedVisibility); + } + if (this.rotation % 180 === this.parentRotation % 180) { + this.width = rect.width / parentWidth; + this.height = rect.height / parentHeight; + } else { + this.width = rect.height / parentWidth; + this.height = rect.width / parentHeight; + } + this.fixAndSetPosition(); + } + commit() { + if (!this.isInEditMode()) { + return; + } + super.commit(); + this.disableEditMode(); + const savedText = this.#content; + const newText = this.#content = this.#extractText().trimEnd(); + if (savedText === newText) { + return; + } + const setText = text => { + this.#content = text; + if (!text) { + this.remove(); + return; + } + this.#setContent(); + this._uiManager.rebuild(this); + this.#setEditorDimensions(); + }; + this.addCommands({ + cmd: () => { + setText(newText); + }, + undo: () => { + setText(savedText); + }, + mustExec: false + }); + this.#setEditorDimensions(); + } + shouldGetKeyboardEvents() { + return this.isInEditMode(); + } + enterInEditMode() { + this.enableEditMode(); + this.editorDiv.focus(); + } + keydown(event) { + if (event.target === this.div && event.key === "Enter") { + this.enterInEditMode(); + event.preventDefault(); + } + } + editorDivKeydown(event) { + FreeTextEditor._keyboardManager.exec(this, event); + } + editorDivFocus(event) { + this.isEditing = true; + } + editorDivBlur(event) { + this.isEditing = false; + } + editorDivInput(event) { + this.parent.div.classList.toggle("freetextEditing", this.isEmpty()); + } + disableEditing() { + this.editorDiv.setAttribute("role", "comment"); + this.editorDiv.removeAttribute("aria-multiline"); + } + enableEditing() { + this.editorDiv.setAttribute("role", "textbox"); + this.editorDiv.setAttribute("aria-multiline", true); + } + get canChangeContent() { + return true; + } + render() { + if (this.div) { + return this.div; + } + let baseX, baseY; + if (this._isCopy || this.annotationElementId) { + baseX = this.x; + baseY = this.y; + } + super.render(); + this.editorDiv = document.createElement("div"); + this.editorDiv.className = "internal"; + this.editorDiv.setAttribute("id", this.#editorDivId); + this.editorDiv.setAttribute("data-l10n-id", "pdfjs-free-text2"); + this.editorDiv.setAttribute("data-l10n-attrs", "default-content"); + this.enableEditing(); + this.editorDiv.contentEditable = true; + const { + style + } = this.editorDiv; + style.fontSize = `calc(${this.#fontSize}px * var(--total-scale-factor))`; + style.color = this.color; + this.div.append(this.editorDiv); + this.overlayDiv = document.createElement("div"); + this.overlayDiv.classList.add("overlay", "enabled"); + this.div.append(this.overlayDiv); + if (this._isCopy || this.annotationElementId) { + const [parentWidth, parentHeight] = this.parentDimensions; + if (this.annotationElementId) { + const { + position + } = this._initialData; + let [tx, ty] = this.getInitialTranslation(); + [tx, ty] = this.pageTranslationToScreen(tx, ty); + const [pageWidth, pageHeight] = this.pageDimensions; + const [pageX, pageY] = this.pageTranslation; + let posX, posY; + switch (this.rotation) { + case 0: + posX = baseX + (position[0] - pageX) / pageWidth; + posY = baseY + this.height - (position[1] - pageY) / pageHeight; + break; + case 90: + posX = baseX + (position[0] - pageX) / pageWidth; + posY = baseY - (position[1] - pageY) / pageHeight; + [tx, ty] = [ty, -tx]; + break; + case 180: + posX = baseX - this.width + (position[0] - pageX) / pageWidth; + posY = baseY - (position[1] - pageY) / pageHeight; + [tx, ty] = [-tx, -ty]; + break; + case 270: + posX = baseX + (position[0] - pageX - this.height * pageHeight) / pageWidth; + posY = baseY + (position[1] - pageY - this.width * pageWidth) / pageHeight; + [tx, ty] = [-ty, tx]; + break; + } + this.setAt(posX * parentWidth, posY * parentHeight, tx, ty); + } else { + this._moveAfterPaste(baseX, baseY); + } + this.#setContent(); + this._isDraggable = true; + this.editorDiv.contentEditable = false; + } else { + this._isDraggable = false; + this.editorDiv.contentEditable = true; + } + return this.div; + } + static #getNodeContent(node) { + return (node.nodeType === Node.TEXT_NODE ? node.nodeValue : node.innerText).replaceAll(EOL_PATTERN, ""); + } + editorDivPaste(event) { + const clipboardData = event.clipboardData || window.clipboardData; + const { + types + } = clipboardData; + if (types.length === 1 && types[0] === "text/plain") { + return; + } + event.preventDefault(); + const paste = FreeTextEditor.#deserializeContent(clipboardData.getData("text") || "").replaceAll(EOL_PATTERN, "\n"); + if (!paste) { + return; + } + const selection = window.getSelection(); + if (!selection.rangeCount) { + return; + } + this.editorDiv.normalize(); + selection.deleteFromDocument(); + const range = selection.getRangeAt(0); + if (!paste.includes("\n")) { + range.insertNode(document.createTextNode(paste)); + this.editorDiv.normalize(); + selection.collapseToStart(); + return; + } + const { + startContainer, + startOffset + } = range; + const bufferBefore = []; + const bufferAfter = []; + if (startContainer.nodeType === Node.TEXT_NODE) { + const parent = startContainer.parentElement; + bufferAfter.push(startContainer.nodeValue.slice(startOffset).replaceAll(EOL_PATTERN, "")); + if (parent !== this.editorDiv) { + let buffer = bufferBefore; + for (const child of this.editorDiv.childNodes) { + if (child === parent) { + buffer = bufferAfter; + continue; + } + buffer.push(FreeTextEditor.#getNodeContent(child)); + } + } + bufferBefore.push(startContainer.nodeValue.slice(0, startOffset).replaceAll(EOL_PATTERN, "")); + } else if (startContainer === this.editorDiv) { + let buffer = bufferBefore; + let i = 0; + for (const child of this.editorDiv.childNodes) { + if (i++ === startOffset) { + buffer = bufferAfter; + } + buffer.push(FreeTextEditor.#getNodeContent(child)); + } + } + this.#content = `${bufferBefore.join("\n")}${paste}${bufferAfter.join("\n")}`; + this.#setContent(); + const newRange = new Range(); + let beforeLength = Math.sumPrecise(bufferBefore.map(line => line.length)); + for (const { + firstChild + } of this.editorDiv.childNodes) { + if (firstChild.nodeType === Node.TEXT_NODE) { + const length = firstChild.nodeValue.length; + if (beforeLength <= length) { + newRange.setStart(firstChild, beforeLength); + newRange.setEnd(firstChild, beforeLength); + break; + } + beforeLength -= length; + } + } + selection.removeAllRanges(); + selection.addRange(newRange); + } + #setContent() { + this.editorDiv.replaceChildren(); + if (!this.#content) { + return; + } + for (const line of this.#content.split("\n")) { + const div = document.createElement("div"); + div.append(line ? document.createTextNode(line) : document.createElement("br")); + this.editorDiv.append(div); + } + } + #serializeContent() { + return this.#content.replaceAll("\xa0", " "); + } + static #deserializeContent(content) { + return content.replaceAll(" ", "\xa0"); + } + get contentDiv() { + return this.editorDiv; + } + getPDFRect() { + const padding = FreeTextEditor._internalPadding * this.parentScale; + return this.getRect(padding, padding); + } + static async deserialize(data, parent, uiManager) { + let initialData = null; + if (data instanceof FreeTextAnnotationElement) { + const { + data: { + defaultAppearanceData: { + fontSize, + fontColor + }, + rect, + rotation, + id, + popupRef, + richText, + contentsObj, + creationDate, + modificationDate + }, + textContent, + textPosition, + parent: { + page: { + pageNumber + } + } + } = data; + if (!textContent?.length) { + return null; + } + initialData = data = { + annotationType: AnnotationEditorType.FREETEXT, + color: Array.from(fontColor), + fontSize, + value: textContent.join("\n"), + position: textPosition, + pageIndex: pageNumber - 1, + rect: rect.slice(0), + rotation, + annotationElementId: id, + id, + deleted: false, + popupRef, + comment: contentsObj?.str || null, + richText, + creationDate, + modificationDate + }; + } + const editor = await super.deserialize(data, parent, uiManager); + editor.#fontSize = data.fontSize; + editor.color = Util.makeHexColor(...data.color); + editor.#content = FreeTextEditor.#deserializeContent(data.value); + editor._initialData = initialData; + if (data.comment) { + editor.setCommentData(data); + } + return editor; + } + serialize(isForCopying = false) { + if (this.isEmpty()) { + return null; + } + if (this.deleted) { + return this.serializeDeleted(); + } + const color = AnnotationEditor._colorManager.convert(this.isAttachedToDOM ? getComputedStyle(this.editorDiv).color : this.color); + const serialized = Object.assign(super.serialize(isForCopying), { + color, + fontSize: this.#fontSize, + value: this.#serializeContent() + }); + this.addComment(serialized); + if (isForCopying) { + serialized.isCopy = true; + return serialized; + } + if (this.annotationElementId && !this.#hasElementChanged(serialized)) { + return null; + } + serialized.id = this.annotationElementId; + return serialized; + } + #hasElementChanged(serialized) { + const { + value, + fontSize, + color, + pageIndex + } = this._initialData; + return this.hasEditedComment || this._hasBeenMoved || serialized.value !== value || serialized.fontSize !== fontSize || serialized.color.some((c, i) => c !== color[i]) || serialized.pageIndex !== pageIndex; + } + renderAnnotationElement(annotation) { + const content = super.renderAnnotationElement(annotation); + if (!content) { + return null; + } + const { + style + } = content; + style.fontSize = `calc(${this.#fontSize}px * var(--total-scale-factor))`; + style.color = this.color; + content.replaceChildren(); + for (const line of this.#content.split("\n")) { + const div = document.createElement("div"); + div.append(line ? document.createTextNode(line) : document.createElement("br")); + content.append(div); + } + annotation.updateEdited({ + rect: this.getPDFRect(), + popup: this._uiManager.hasCommentManager() || this.hasEditedComment ? this.comment : { + text: this.#content + } + }); + return content; + } + resetAnnotationElement(annotation) { + super.resetAnnotationElement(annotation); + annotation.resetEdited(); + } +} + +;// ./src/display/editor/draw.js + + + + + + + + + + + + +class DrawingOptions { + #svgProperties = Object.create(null); + updateProperty(name, value) { + this[name] = value; + this.updateSVGProperty(name, value); + } + updateProperties(properties) { + if (!properties) { + return; + } + for (const [name, value] of Object.entries(properties)) { + if (!name.startsWith("_")) { + this.updateProperty(name, value); + } + } + } + updateSVGProperty(name, value) { + this.#svgProperties[name] = value; + } + toSVGProperties() { + const root = this.#svgProperties; + this.#svgProperties = Object.create(null); + return { + root + }; + } + reset() { + this.#svgProperties = Object.create(null); + } + updateAll(options = this) { + this.updateProperties(options); + } + clone() { + unreachable("Not implemented"); + } +} +class DrawingEditor extends AnnotationEditor { + #internalDiv = null; + #mustBeCommitted; + _clipPathId = null; + _colorPicker = null; + _drawId = null; + _drawOutlines = null; + _focusDrawId = null; + static _currentDrawId = -1; + static _currentParent = null; + static #currentDraw = null; + static #currentDrawingAC = null; + static #currentDrawingOptions = null; + static #currentClipPathId = null; + static _INNER_MARGIN = 3; + constructor(params) { + super(params); + this.#mustBeCommitted = params.mustBeCommitted || false; + this._addOutlines(params); + } + onUpdatedColor() { + this._colorPicker?.update(this.color); + super.onUpdatedColor(); + } + onUpdatedOpacity() { + this._colorPicker?.updateOpacity?.(this.opacity); + } + _addOutlines(params) { + if (params.drawOutlines) { + this.#createDrawOutlines(params); + this.#addToDrawLayer(); + } + } + #createDrawOutlines({ + drawOutlines, + drawId, + drawingOptions, + clipPathId + }) { + this._drawOutlines = drawOutlines; + this._drawingOptions ||= drawingOptions; + if (!this.annotationElementId) { + this._uiManager.a11yAlert(AnnotationEditor._l10nAlert[this.editorType]); + } + if (drawId >= 0) { + this._drawId = drawId; + this._clipPathId = clipPathId ?? null; + this.parent.drawLayer.finalizeDraw(drawId, drawOutlines.defaultProperties); + this.#createFocusOutline(this.parent); + } else { + this._drawId = this.#createDrawing(drawOutlines, this.parent); + } + this.#updateBbox(drawOutlines.box); + } + #createDrawing(drawOutlines, parent) { + const { + id, + clipPathId + } = parent.drawLayer.draw(DrawingEditor._mergeSVGProperties(this._drawingOptions.toSVGProperties(), drawOutlines.defaultSVGProperties), false, this.constructor._hasClipPath); + if (this.constructor._hasClipPath) { + this._clipPathId = clipPathId; + } + this.#createFocusOutline(parent); + return id; + } + #createFocusOutline(parent) { + const properties = this._drawOutlines.getFocusSVGProperties(this.#rotationAngle); + if (properties) { + this._focusDrawId = parent.drawLayer.drawOutline(properties, this._drawOutlines.focusMustRemoveSelfIntersections); + } + } + #updateFocusOutline(angle = this.#rotationAngle) { + if (this._focusDrawId === null) { + return; + } + this.parent?.drawLayer.updateProperties(this._focusDrawId, this._drawOutlines.getFocusSVGProperties(angle)); + } + #toggleFocusOutlineClass(rootClass) { + if (this._focusDrawId !== null) { + this.parent?.drawLayer.updateProperties(this._focusDrawId, { + rootClass + }); + } + } + #updateVisibility() { + const { + parent, + _drawId, + _focusDrawId, + _isVisible + } = this; + if (!parent || _drawId === null) { + return; + } + const rootClass = { + hidden: !_isVisible + }; + parent.drawLayer.updateProperties(_drawId, { + rootClass + }); + if (_focusDrawId !== null) { + parent.drawLayer.updateProperties(_focusDrawId, { + rootClass + }); + } + } + static _mergeSVGProperties(p1, p2) { + const p1Keys = new Set(Object.keys(p1)); + for (const [key, value] of Object.entries(p2)) { + if (p1Keys.has(key)) { + Object.assign(p1[key], value); + } else { + p1[key] = value; + } + } + return p1; + } + static getDefaultDrawingOptions(_options) { + unreachable("Not implemented"); + } + static get typesMap() { + unreachable("Not implemented"); + } + static get isDrawer() { + return true; + } + static get _hasClipPath() { + return false; + } + static get _hasDrawClass() { + return true; + } + static get supportMultipleDrawings() { + return false; + } + get _drawRotation() { + return this.rotation; + } + get _opacityName() { + return this.constructor.typesMap.get(this.opacityType); + } + get #rotationAngle() { + return (this.parentRotation - this._drawRotation + 360) % 360; + } + static updateDefaultParams(type, value) { + const propertyName = this.typesMap.get(type); + if (propertyName) { + this._defaultDrawingOptions.updateProperty(propertyName, value); + } + if (this._currentParent) { + DrawingEditor.#currentDraw.updateProperty(propertyName, value); + this._currentParent.drawLayer.updateProperties(this._currentDrawId, this._defaultDrawingOptions.toSVGProperties()); + } + } + updateParams(type, value) { + const propertyName = this.constructor.typesMap.get(type); + if (propertyName) { + this._updateProperty(type, propertyName, value); + } + } + static get defaultPropertiesToUpdate() { + const properties = []; + const options = this._defaultDrawingOptions; + for (const [type, name] of this.typesMap) { + properties.push([type, options[name]]); + } + return properties; + } + get propertiesToUpdate() { + const properties = []; + const { + _drawingOptions + } = this; + for (const [type, name] of this.constructor.typesMap) { + properties.push([type, _drawingOptions[name]]); + } + return properties; + } + _updateProperty(type, name, value) { + const options = this._drawingOptions; + const savedValue = options[name]; + const setter = val => { + options.updateProperty(name, val); + const bbox = this._drawOutlines.updateProperty(name, val); + if (bbox) { + this.#updateBbox(bbox); + } + this.parent?.drawLayer.updateProperties(this._drawId, options.toSVGProperties()); + if (type === this.colorType) { + this.onUpdatedColor(); + } else if (type === this.opacityType) { + this.onUpdatedOpacity(); + } + }; + this.addCommands({ + cmd: setter.bind(this, value), + undo: setter.bind(this, savedValue), + post: this._uiManager.updateUI.bind(this._uiManager, this), + mustExec: true, + type, + overwriteIfSameType: true, + keepUndo: true + }); + } + _updateColorAndOpacity(color, opacity, type = this.colorAndOpacityType) { + const colorName = this.constructor.typesMap.get(this.colorType); + const opacityName = this._opacityName; + const options = this._drawingOptions; + const savedColor = options[colorName]; + const savedOpacity = options[opacityName]; + const setter = (c, op) => { + options.updateProperty(colorName, c); + options.updateProperty(opacityName, op); + this._drawOutlines.updateProperty(colorName, c); + this._drawOutlines.updateProperty(opacityName, op); + this.parent?.drawLayer.updateProperties(this._drawId, options.toSVGProperties()); + this.onUpdatedColor(); + this.onUpdatedOpacity(); + }; + this.addCommands({ + cmd: setter.bind(this, color, opacity), + undo: setter.bind(this, savedColor, savedOpacity), + post: this._uiManager.updateUI.bind(this._uiManager, this), + mustExec: true, + type, + overwriteIfSameType: true, + keepUndo: true + }); + } + _onResizing() { + this.parent?.drawLayer.updateProperties(this._drawId, DrawingEditor._mergeSVGProperties(this._drawOutlines.getPathResizingSVGProperties(this.#convertToDrawSpace()), { + bbox: this.#rotateBox() + })); + } + _onResized() { + this.parent?.drawLayer.updateProperties(this._drawId, DrawingEditor._mergeSVGProperties(this._drawOutlines.getPathResizedSVGProperties(this.#convertToDrawSpace()), { + bbox: this.#rotateBox() + })); + this.#updateFocusOutline(); + } + _onTranslating(_x, _y) { + this.parent?.drawLayer.updateProperties(this._drawId, { + bbox: this.#rotateBox() + }); + } + _onTranslated() { + this.parent?.drawLayer.updateProperties(this._drawId, DrawingEditor._mergeSVGProperties(this._drawOutlines.getPathTranslatedSVGProperties(this.#convertToDrawSpace(), this.parentDimensions), { + bbox: this.#rotateBox() + })); + } + _onStartDragging() { + this.parent?.drawLayer.updateProperties(this._drawId, { + rootClass: { + moving: true + } + }); + } + _onStopDragging() { + this.parent?.drawLayer.updateProperties(this._drawId, { + rootClass: { + moving: false + } + }); + } + get _mustBeDisabledOnCommit() { + return true; + } + commit() { + super.commit(); + if (this._mustBeDisabledOnCommit) { + this.disableEditMode(); + this.disableEditing(); + } + } + disableEditing() { + super.disableEditing(); + this.div.classList.toggle("disabled", true); + } + enableEditing() { + super.enableEditing(); + this.div.classList.toggle("disabled", false); + } + getBaseTranslation() { + return [0, 0]; + } + get isResizable() { + return true; + } + onceAdded(focus) { + if (!this.annotationElementId) { + this.parent.addUndoableEditor(this); + } + this._isDraggable = true; + if (this.#mustBeCommitted) { + this.#mustBeCommitted = false; + this.commit(); + this.parent.setSelected(this); + if (focus && this.isOnScreen) { + this.div.focus(); + } + } + } + remove() { + this._uiManager.removeShouldRescale(this); + this.#cleanDrawLayer(); + super.remove(); + } + rebuild() { + if (!this.parent) { + return; + } + super.rebuild(); + if (this.div === null) { + return; + } + this.#addToDrawLayer(); + this.#updateBbox(this._drawOutlines.box); + if (!this.isAttachedToDOM) { + this.parent.add(this); + } + } + setParent(parent) { + let mustBeSelected = false; + if (this.parent && !parent) { + this._uiManager.removeShouldRescale(this); + this.#cleanDrawLayer(); + } else if (parent) { + this._uiManager.addShouldRescale(this); + this.#addToDrawLayer(parent); + mustBeSelected = !this.parent && this.div?.classList.contains("selectedEditor"); + } + super.setParent(parent); + this.#updateVisibility(); + if (mustBeSelected) { + this.select(); + } + } + #cleanDrawLayer() { + if (this._drawId === null || !this.parent) { + return; + } + const { + drawLayer + } = this.parent; + drawLayer.remove(this._drawId); + this._drawId = null; + if (this._focusDrawId !== null) { + drawLayer.remove(this._focusDrawId); + this._focusDrawId = null; + } + this._drawingOptions.reset(); + } + #addToDrawLayer(parent = this.parent) { + if (this._drawId !== null && this.parent === parent) { + return; + } + if (this._drawId !== null) { + const { + drawLayer + } = this.parent; + drawLayer.updateParent(this._drawId, parent.drawLayer); + if (this._focusDrawId !== null) { + drawLayer.updateParent(this._focusDrawId, parent.drawLayer); + } + return; + } + this._drawingOptions.updateAll(); + this._drawId = this.#createDrawing(this._drawOutlines, parent); + if (this._clipPathId && this.#internalDiv) { + this.#internalDiv.style.clipPath = this._clipPathId; + } + } + #convertToParentSpace([x, y, width, height]) { + const { + parentDimensions: [pW, pH], + _drawRotation: rotation + } = this; + switch (rotation) { + case 90: + return [y, 1 - x, width * (pH / pW), height * (pW / pH)]; + case 180: + return [1 - x, 1 - y, width, height]; + case 270: + return [1 - y, x, width * (pH / pW), height * (pW / pH)]; + default: + return [x, y, width, height]; + } + } + #convertToDrawSpace() { + const { + x, + y, + width, + height, + parentDimensions: [pW, pH], + _drawRotation: rotation + } = this; + switch (rotation) { + case 90: + return [1 - y, x, width * (pW / pH), height * (pH / pW)]; + case 180: + return [1 - x, 1 - y, width, height]; + case 270: + return [y, 1 - x, width * (pW / pH), height * (pH / pW)]; + default: + return [x, y, width, height]; + } + } + #updateBbox(bbox) { + [this.x, this.y, this.width, this.height] = this.#convertToParentSpace(bbox); + if (this.div) { + this.fixAndSetPosition(); + this.setDims(); + } + this._onResized(); + } + #rotateBox(parentRotation = this.parentRotation) { + const { + x, + y, + width, + height, + _drawRotation: rotation, + parentDimensions: [pW, pH] + } = this; + switch ((rotation * 4 + parentRotation) / 90) { + case 1: + return [1 - y - height, x, height, width]; + case 2: + return [1 - x - width, 1 - y - height, width, height]; + case 3: + return [y, 1 - x - width, height, width]; + case 4: + return [x, y - width * (pW / pH), height * (pH / pW), width * (pW / pH)]; + case 5: + return [1 - y, x, width * (pW / pH), height * (pH / pW)]; + case 6: + return [1 - x - height * (pH / pW), 1 - y, height * (pH / pW), width * (pW / pH)]; + case 7: + return [y - width * (pW / pH), 1 - x - height * (pH / pW), width * (pW / pH), height * (pH / pW)]; + case 8: + return [x - width, y - height, width, height]; + case 9: + return [1 - y, x - width, height, width]; + case 10: + return [1 - x, 1 - y, width, height]; + case 11: + return [y - height, 1 - x, height, width]; + case 12: + return [x - height * (pH / pW), y, height * (pH / pW), width * (pW / pH)]; + case 13: + return [1 - y - width * (pW / pH), x - height * (pH / pW), width * (pW / pH), height * (pH / pW)]; + case 14: + return [1 - x, 1 - y - width * (pW / pH), height * (pH / pW), width * (pW / pH)]; + case 15: + return [y, 1 - x, width * (pW / pH), height * (pH / pW)]; + default: + return [x, y, width, height]; + } + } + rotate(parentRotation = this.parentRotation) { + if (!this.parent || this._drawId === null) { + return; + } + const angle = (parentRotation - this._drawRotation + 360) % 360; + this.parent.drawLayer.updateProperties(this._drawId, DrawingEditor._mergeSVGProperties({ + bbox: this.#rotateBox(parentRotation) + }, this._drawOutlines.updateRotation(angle))); + this.#updateFocusOutline(angle); + } + show(visible = this._isVisible) { + super.show(visible); + this.#updateVisibility(); + } + select() { + super.select(); + this.#toggleFocusOutlineClass({ + hovered: false, + selected: true + }); + } + unselect() { + super.unselect(); + this.#toggleFocusOutlineClass({ + selected: false + }); + } + pointerover() { + if (!this.isSelected) { + this.#toggleFocusOutlineClass({ + hovered: true + }); + } + } + pointerleave() { + if (!this.isSelected) { + this.#toggleFocusOutlineClass({ + hovered: false + }); + } + } + onScaleChanging() { + if (!this.parent) { + return; + } + const bbox = this._drawOutlines.updateParentDimensions(this.parentDimensions, this.parent.scale); + if (bbox) { + this.#updateBbox(bbox); + } + } + static onScaleChangingWhenDrawing() {} + render() { + if (this.div) { + return this.div; + } + let baseX, baseY; + if (this._isCopy) { + baseX = this.x; + baseY = this.y; + } + const div = super.render(); + if (this.constructor._hasDrawClass) { + div.classList.add("draw"); + } + const drawDiv = this.#internalDiv = document.createElement("div"); + div.append(drawDiv); + drawDiv.setAttribute("aria-hidden", "true"); + drawDiv.className = "internal"; + if (this._clipPathId) { + drawDiv.style.clipPath = this._clipPathId; + } + bindEvents(this, drawDiv, ["pointerover", "pointerleave"]); + this.setDims(); + this._uiManager.addShouldRescale(this); + this.disableEditing(); + if (this._isCopy) { + this._moveAfterPaste(baseX, baseY); + } + return div; + } + static createDrawerInstance(_params) { + unreachable("Not implemented"); + } + static _getDrawingTarget(_parent, { + target + }) { + return target; + } + static _getPointerCoords({ + offsetX, + offsetY, + clientX, + clientY + }, referenceEvent = null) { + if (!referenceEvent) { + return [offsetX, offsetY]; + } + let deltaX = clientX - referenceEvent.clientX; + let deltaY = clientY - referenceEvent.clientY; + switch (this._currentParent.viewport.rotation) { + case 90: + [deltaX, deltaY] = [deltaY, -deltaX]; + break; + case 180: + [deltaX, deltaY] = [-deltaX, -deltaY]; + break; + case 270: + [deltaX, deltaY] = [-deltaY, deltaX]; + break; + } + return [referenceEvent.offsetX + deltaX, referenceEvent.offsetY + deltaY]; + } + static _addDrawingListeners(_target, _signal) {} + static _endDrawingSession(isAborted = false) { + return this._currentParent.endDrawingSession(isAborted); + } + static startDrawing(parent, uiManager, isLTR, event) { + const { + pointerId, + pointerType + } = event; + if (CurrentPointers.isInitializedAndDifferentPointerType(pointerType)) { + return; + } + const target = this._getDrawingTarget(parent, event); + const [x, y] = this._getPointerCoords(event); + const { + viewport: { + rotation + } + } = parent; + const { + x: boxX, + y: boxY, + width: parentWidth, + height: parentHeight + } = target.getBoundingClientRect(); + const ac = DrawingEditor.#currentDrawingAC = new AbortController(); + const signal = parent.combinedSignal(ac); + CurrentPointers.setPointer(pointerType, pointerId); + window.addEventListener("pointerup", e => { + if (CurrentPointers.isSamePointerIdOrRemove(e.pointerId)) { + this._endDraw(e); + } + }, { + signal + }); + window.addEventListener("pointercancel", e => { + if (CurrentPointers.isSamePointerIdOrRemove(e.pointerId)) { + this._endDrawingSession(); + } + }, { + signal + }); + window.addEventListener("pointerdown", e => { + if (!CurrentPointers.isSamePointerType(e.pointerType)) { + return; + } + CurrentPointers.initializeAndAddPointerId(e.pointerId); + if (DrawingEditor.#currentDraw.isCancellable()) { + DrawingEditor.#currentDraw.removeLastElement(); + if (DrawingEditor.#currentDraw.isEmpty()) { + this._endDrawingSession(true); + } else { + this._endDraw(null); + } + } + }, { + capture: true, + passive: false, + signal + }); + window.addEventListener("contextmenu", noContextMenu, { + signal + }); + target.addEventListener("pointermove", this._drawMove.bind(this), { + signal + }); + target.addEventListener("touchmove", e => { + if (CurrentPointers.isSameTimeStamp(e.timeStamp)) { + stopEvent(e); + } + }, { + signal + }); + this._addDrawingListeners(target, signal); + parent.toggleDrawing(); + uiManager._editorUndoBar?.hide(); + if (DrawingEditor.#currentDraw) { + parent.drawLayer.updateProperties(this._currentDrawId, DrawingEditor.#currentDraw.startNew(x, y, parentWidth, parentHeight, rotation)); + return; + } + uiManager.updateUIForDefaultProperties(this); + DrawingEditor.#currentDraw = this.createDrawerInstance({ + x, + y, + box: [boxX, boxY, parentWidth, parentHeight], + rotation, + parent, + isLTR + }); + DrawingEditor.#currentDrawingOptions = this.getDefaultDrawingOptions(); + this._currentParent = parent; + const { + id, + clipPathId + } = parent.drawLayer.draw(this._mergeSVGProperties(DrawingEditor.#currentDrawingOptions.toSVGProperties(), DrawingEditor.#currentDraw.defaultSVGProperties), true, this._hasClipPath); + this._currentDrawId = id; + DrawingEditor.#currentClipPathId = this._hasClipPath ? clipPathId : null; + } + static _drawMove(event) { + CurrentPointers.isSameTimeStamp(event.timeStamp); + if (!DrawingEditor.#currentDraw || !CurrentPointers.isSamePointerId(event.pointerId)) { + return; + } + if (CurrentPointers.isUsingMultiplePointers()) { + this._endDraw(event); + return; + } + let properties; + const coalesced = event.getCoalescedEvents?.(); + if (coalesced?.length) { + const points = []; + for (const sample of coalesced) { + points.push(...this._getPointerCoords(sample, event)); + } + properties = DrawingEditor.#currentDraw.addPoints(points); + } else { + properties = DrawingEditor.#currentDraw.add(...this._getPointerCoords(event)); + } + this._currentParent.drawLayer.updateProperties(this._currentDrawId, properties); + CurrentPointers.setTimeStamp(event.timeStamp); + stopEvent(event); + } + static _cleanup(all) { + if (all) { + this._currentDrawId = -1; + this._currentParent = null; + DrawingEditor.#currentDraw = null; + DrawingEditor.#currentDrawingOptions = null; + DrawingEditor.#currentClipPathId = null; + CurrentPointers.clearTimeStamp(); + } + if (DrawingEditor.#currentDrawingAC) { + DrawingEditor.#currentDrawingAC.abort(); + DrawingEditor.#currentDrawingAC = null; + CurrentPointers.clearPointerIds(); + } + } + static _endDraw(event) { + const parent = this._currentParent; + if (!parent) { + return; + } + parent.toggleDrawing(true); + this._cleanup(false); + parent.drawLayer.updateProperties(this._currentDrawId, event?.target === parent.div ? DrawingEditor.#currentDraw.end(...this._getPointerCoords(event)) : DrawingEditor.#currentDraw.end()); + if (this.supportMultipleDrawings) { + const draw = DrawingEditor.#currentDraw; + const drawId = this._currentDrawId; + const lastElement = draw.getLastElement(); + parent.addCommands({ + cmd: () => { + parent.drawLayer.updateProperties(drawId, draw.setLastElement(lastElement)); + }, + undo: () => { + parent.drawLayer.updateProperties(drawId, draw.removeLastElement()); + }, + mustExec: false, + type: AnnotationEditorParamsType.DRAW_STEP + }); + return; + } + this.endDrawing(false); + } + static endDrawing(isAborted) { + const parent = this._currentParent; + if (!parent) { + return null; + } + parent.toggleDrawing(true); + parent.cleanUndoStack(AnnotationEditorParamsType.DRAW_STEP); + if (!DrawingEditor.#currentDraw.isEmpty()) { + const { + pageDimensions: [pageWidth, pageHeight], + scale + } = parent; + const editor = parent.createAndAddNewEditor({ + offsetX: 0, + offsetY: 0 + }, false, { + drawId: this._currentDrawId, + clipPathId: DrawingEditor.#currentClipPathId, + drawOutlines: DrawingEditor.#currentDraw.getOutlines(pageWidth * scale, pageHeight * scale, scale, this._INNER_MARGIN), + drawingOptions: DrawingEditor.#currentDrawingOptions, + mustBeCommitted: !isAborted + }); + this._cleanup(true); + return editor; + } + parent.drawLayer.remove(this._currentDrawId); + this._cleanup(true); + return null; + } + createDrawingOptions(_data) {} + static deserializeDraw(_pageX, _pageY, _pageWidth, _pageHeight, _innerMargin, _data, _uiManager) { + unreachable("Not implemented"); + } + static async deserialize(data, parent, uiManager) { + const { + rawDims: { + pageWidth, + pageHeight, + pageX, + pageY + } + } = parent.viewport; + const drawOutlines = this.deserializeDraw(pageX, pageY, pageWidth, pageHeight, this._INNER_MARGIN, data, uiManager); + const editor = await super.deserialize(data, parent, uiManager); + editor.createDrawingOptions(data); + editor.#createDrawOutlines({ + drawOutlines + }); + editor.#addToDrawLayer(); + editor.onScaleChanging(); + editor.rotate(); + return editor; + } + serializeDraw(isForCopying) { + const [pageX, pageY] = this.pageTranslation; + const [pageWidth, pageHeight] = this.pageDimensions; + return this._drawOutlines.serialize([pageX, pageY, pageWidth, pageHeight], isForCopying); + } + renderAnnotationElement(annotation) { + annotation.updateEdited({ + rect: this.getPDFRect() + }); + return null; + } + static canCreateNewEmptyEditor() { + return false; + } +} + +;// ./src/display/editor/drawers/outline.js + + +class Outline { + static PRECISION = 1e-4; + focusOutline = null; + toSVGPath() { + unreachable("Abstract method `toSVGPath` must be implemented."); + } + get box() { + unreachable("Abstract getter `box` must be implemented."); + } + serialize(_bbox, _rotation) { + unreachable("Abstract method `serialize` must be implemented."); + } + get defaultSVGProperties() { + unreachable("Abstract getter `defaultSVGProperties` must be implemented."); + } + get defaultProperties() { + return this.defaultSVGProperties; + } + getFocusSVGProperties(_rotation) { + return null; + } + get focusMustRemoveSelfIntersections() { + return false; + } + updateProperty(_name, _value) { + return null; + } + updateParentDimensions(_dimensions, _scale) { + return null; + } + serializeQuadPoints(_pageTranslation, _pageDimensions) { + return null; + } + updateRotation(_rotation) { + return {}; + } + getPathResizingSVGProperties(_bbox) { + return {}; + } + getPathResizedSVGProperties(_bbox) { + return {}; + } + getPathTranslatedSVGProperties(_bbox, _parentDimensions) { + return {}; + } + static _rotateBox([x, y, width, height], angle) { + switch (angle) { + case 90: + return [1 - y - height, x, height, width]; + case 180: + return [1 - x - width, 1 - y - height, width, height]; + case 270: + return [y, 1 - x - width, height, width]; + } + return [x, y, width, height]; + } + static _rescale(src, tx, ty, sx, sy, dest) { + dest ||= new Float32Array(src.length); + for (let i = 0, ii = src.length; i < ii; i += 2) { + dest[i] = tx + src[i] * sx; + dest[i + 1] = ty + src[i + 1] * sy; + } + return dest; + } + static _rescaleAndSwap(src, tx, ty, sx, sy, dest) { + dest ||= new Float32Array(src.length); + for (let i = 0, ii = src.length; i < ii; i += 2) { + dest[i] = tx + src[i + 1] * sx; + dest[i + 1] = ty + src[i] * sy; + } + return dest; + } + static _translate(src, tx, ty, dest) { + dest ||= new Float32Array(src.length); + for (let i = 0, ii = src.length; i < ii; i += 2) { + dest[i] = tx + src[i]; + dest[i + 1] = ty + src[i + 1]; + } + return dest; + } + static svgRound(x) { + return Math.round(x * 10000); + } + static _normalizePoint(x, y, parentWidth, parentHeight, rotation) { + switch (rotation) { + case 90: + return [1 - y / parentWidth, x / parentHeight]; + case 180: + return [1 - x / parentWidth, 1 - y / parentHeight]; + case 270: + return [y / parentWidth, 1 - x / parentHeight]; + default: + return [x / parentWidth, y / parentHeight]; + } + } + static createBezierPoints(x1, y1, x2, y2, x3, y3) { + return [(x1 + 5 * x2) / 6, (y1 + 5 * y2) / 6, (5 * x2 + x3) / 6, (5 * y2 + y3) / 6, (x2 + x3) / 2, (y2 + y3) / 2]; + } +} + +;// ./src/display/editor/drawers/freedraw.js + + + + +class FreeDrawOutliner { + #box; + #bottom = []; + #innerMargin; + #isLTR; + #top = []; + #last = new Float32Array(18); + #lastX; + #lastY; + #min; + #min_dist; + #scaleFactor; + #thickness; + #points = []; + static #MIN_DIST = 8; + static #MIN_DIFF = 2; + static #MIN = FreeDrawOutliner.#MIN_DIST + FreeDrawOutliner.#MIN_DIFF; + constructor(x, y, box, scaleFactor, thickness, isLTR, innerMargin = 0) { + this.#box = box; + this.#thickness = thickness * scaleFactor; + this.#isLTR = isLTR; + this.#last.set([NaN, NaN, NaN, NaN, x, y], 6); + this.#innerMargin = innerMargin; + this.#min_dist = FreeDrawOutliner.#MIN_DIST * scaleFactor; + this.#min = FreeDrawOutliner.#MIN * scaleFactor; + this.#scaleFactor = scaleFactor; + this.#points.push(x, y); + } + isEmpty() { + return isNaN(this.#last[8]); + } + isCancellable() { + return this.#points.length <= 10; + } + removeLastElement() { + this.#last.fill(NaN); + this.#top.length = this.#bottom.length = this.#points.length = 0; + return { + path: { + d: "" + } + }; + } + #getLastCoords() { + const lastTop = this.#last.subarray(4, 6); + const lastBottom = this.#last.subarray(16, 18); + const [x, y, width, height] = this.#box; + return [(this.#lastX + (lastTop[0] - lastBottom[0]) / 2 - x) / width, (this.#lastY + (lastTop[1] - lastBottom[1]) / 2 - y) / height, (this.#lastX + (lastBottom[0] - lastTop[0]) / 2 - x) / width, (this.#lastY + (lastBottom[1] - lastTop[1]) / 2 - y) / height]; + } + add(x, y) { + this.#lastX = x; + this.#lastY = y; + const [layerX, layerY, layerWidth, layerHeight] = this.#box; + let [x1, y1, x2, y2] = this.#last.subarray(8, 12); + const diffX = x - x2; + const diffY = y - y2; + const d = Math.hypot(diffX, diffY); + if (d < this.#min) { + return false; + } + const diffD = d - this.#min_dist; + const K = diffD / d; + const shiftX = K * diffX; + const shiftY = K * diffY; + let x0 = x1; + let y0 = y1; + x1 = x2; + y1 = y2; + x2 += shiftX; + y2 += shiftY; + this.#points?.push(x, y); + const nX = -shiftY / diffD; + const nY = shiftX / diffD; + const thX = nX * this.#thickness; + const thY = nY * this.#thickness; + this.#last.set(this.#last.subarray(2, 8), 0); + this.#last.set([x2 + thX, y2 + thY], 4); + this.#last.set(this.#last.subarray(14, 18), 12); + this.#last.set([x2 - thX, y2 - thY], 16); + if (isNaN(this.#last[6])) { + if (this.#top.length === 0) { + this.#last.set([x1 + thX, y1 + thY], 2); + this.#top.push(NaN, NaN, NaN, NaN, (x1 + thX - layerX) / layerWidth, (y1 + thY - layerY) / layerHeight); + this.#last.set([x1 - thX, y1 - thY], 14); + this.#bottom.push(NaN, NaN, NaN, NaN, (x1 - thX - layerX) / layerWidth, (y1 - thY - layerY) / layerHeight); + } + this.#last.set([x0, y0, x1, y1, x2, y2], 6); + return !this.isEmpty(); + } + this.#last.set([x0, y0, x1, y1, x2, y2], 6); + const angle = Math.abs(Math.atan2(y0 - y1, x0 - x1) - Math.atan2(shiftY, shiftX)); + if (angle < Math.PI / 2) { + [x1, y1, x2, y2] = this.#last.subarray(2, 6); + this.#top.push(NaN, NaN, NaN, NaN, ((x1 + x2) / 2 - layerX) / layerWidth, ((y1 + y2) / 2 - layerY) / layerHeight); + [x1, y1, x0, y0] = this.#last.subarray(14, 18); + this.#bottom.push(NaN, NaN, NaN, NaN, ((x0 + x1) / 2 - layerX) / layerWidth, ((y0 + y1) / 2 - layerY) / layerHeight); + return true; + } + [x0, y0, x1, y1, x2, y2] = this.#last.subarray(0, 6); + this.#top.push(((x0 + 5 * x1) / 6 - layerX) / layerWidth, ((y0 + 5 * y1) / 6 - layerY) / layerHeight, ((5 * x1 + x2) / 6 - layerX) / layerWidth, ((5 * y1 + y2) / 6 - layerY) / layerHeight, ((x1 + x2) / 2 - layerX) / layerWidth, ((y1 + y2) / 2 - layerY) / layerHeight); + [x2, y2, x1, y1, x0, y0] = this.#last.subarray(12, 18); + this.#bottom.push(((x0 + 5 * x1) / 6 - layerX) / layerWidth, ((y0 + 5 * y1) / 6 - layerY) / layerHeight, ((5 * x1 + x2) / 6 - layerX) / layerWidth, ((5 * y1 + y2) / 6 - layerY) / layerHeight, ((x1 + x2) / 2 - layerX) / layerWidth, ((y1 + y2) / 2 - layerY) / layerHeight); + return true; + } + toSVGPath() { + if (this.isEmpty()) { + return ""; + } + const top = this.#top; + const bottom = this.#bottom; + if (isNaN(this.#last[6]) && !this.isEmpty()) { + return this.#toSVGPathTwoPoints(); + } + const buffer = []; + buffer.push(`M${top[4]} ${top[5]}`); + for (let i = 6; i < top.length; i += 6) { + if (isNaN(top[i])) { + buffer.push(`L${top[i + 4]} ${top[i + 5]}`); + } else { + buffer.push(`C${top[i]} ${top[i + 1]} ${top[i + 2]} ${top[i + 3]} ${top[i + 4]} ${top[i + 5]}`); + } + } + this.#toSVGPathEnd(buffer); + for (let i = bottom.length - 6; i >= 6; i -= 6) { + if (isNaN(bottom[i])) { + buffer.push(`L${bottom[i + 4]} ${bottom[i + 5]}`); + } else { + buffer.push(`C${bottom[i]} ${bottom[i + 1]} ${bottom[i + 2]} ${bottom[i + 3]} ${bottom[i + 4]} ${bottom[i + 5]}`); + } + } + this.#toSVGPathStart(buffer); + return buffer.join(" "); + } + #toSVGPathTwoPoints() { + const [x, y, width, height] = this.#box; + const [lastTopX, lastTopY, lastBottomX, lastBottomY] = this.#getLastCoords(); + return `M${(this.#last[2] - x) / width} ${(this.#last[3] - y) / height} L${(this.#last[4] - x) / width} ${(this.#last[5] - y) / height} L${lastTopX} ${lastTopY} L${lastBottomX} ${lastBottomY} L${(this.#last[16] - x) / width} ${(this.#last[17] - y) / height} L${(this.#last[14] - x) / width} ${(this.#last[15] - y) / height} Z`; + } + #toSVGPathStart(buffer) { + const bottom = this.#bottom; + buffer.push(`L${bottom[4]} ${bottom[5]} Z`); + } + #toSVGPathEnd(buffer) { + const [x, y, width, height] = this.#box; + const lastTop = this.#last.subarray(4, 6); + const lastBottom = this.#last.subarray(16, 18); + const [lastTopX, lastTopY, lastBottomX, lastBottomY] = this.#getLastCoords(); + buffer.push(`L${(lastTop[0] - x) / width} ${(lastTop[1] - y) / height} L${lastTopX} ${lastTopY} L${lastBottomX} ${lastBottomY} L${(lastBottom[0] - x) / width} ${(lastBottom[1] - y) / height}`); + } + newFreeDrawOutline(outline, points, box, scaleFactor, innerMargin, isLTR) { + return new FreeDrawOutline(outline, points, box, scaleFactor, innerMargin, isLTR); + } + getOutlines() { + const top = this.#top; + const bottom = this.#bottom; + const last = this.#last; + const [layerX, layerY, layerWidth, layerHeight] = this.#box; + const points = new Float32Array((this.#points?.length ?? 0) + 2); + for (let i = 0, ii = points.length - 2; i < ii; i += 2) { + points[i] = (this.#points[i] - layerX) / layerWidth; + points[i + 1] = (this.#points[i + 1] - layerY) / layerHeight; + } + points[points.length - 2] = (this.#lastX - layerX) / layerWidth; + points[points.length - 1] = (this.#lastY - layerY) / layerHeight; + if (isNaN(last[6]) && !this.isEmpty()) { + return this.#getOutlineTwoPoints(points); + } + const outline = new Float32Array(this.#top.length + 24 + this.#bottom.length); + let N = top.length; + for (let i = 0; i < N; i += 2) { + if (isNaN(top[i])) { + outline[i] = outline[i + 1] = NaN; + continue; + } + outline[i] = top[i]; + outline[i + 1] = top[i + 1]; + } + N = this.#getOutlineEnd(outline, N); + for (let i = bottom.length - 6; i >= 6; i -= 6) { + for (let j = 0; j < 6; j += 2) { + if (isNaN(bottom[i + j])) { + outline[N] = outline[N + 1] = NaN; + N += 2; + continue; + } + outline[N] = bottom[i + j]; + outline[N + 1] = bottom[i + j + 1]; + N += 2; + } + } + this.#getOutlineStart(outline, N); + return this.newFreeDrawOutline(outline, points, this.#box, this.#scaleFactor, this.#innerMargin, this.#isLTR); + } + #getOutlineTwoPoints(points) { + const last = this.#last; + const [layerX, layerY, layerWidth, layerHeight] = this.#box; + const [lastTopX, lastTopY, lastBottomX, lastBottomY] = this.#getLastCoords(); + const outline = new Float32Array(36); + outline.set([NaN, NaN, NaN, NaN, (last[2] - layerX) / layerWidth, (last[3] - layerY) / layerHeight, NaN, NaN, NaN, NaN, (last[4] - layerX) / layerWidth, (last[5] - layerY) / layerHeight, NaN, NaN, NaN, NaN, lastTopX, lastTopY, NaN, NaN, NaN, NaN, lastBottomX, lastBottomY, NaN, NaN, NaN, NaN, (last[16] - layerX) / layerWidth, (last[17] - layerY) / layerHeight, NaN, NaN, NaN, NaN, (last[14] - layerX) / layerWidth, (last[15] - layerY) / layerHeight], 0); + return this.newFreeDrawOutline(outline, points, this.#box, this.#scaleFactor, this.#innerMargin, this.#isLTR); + } + #getOutlineStart(outline, pos) { + const bottom = this.#bottom; + outline.set([NaN, NaN, NaN, NaN, bottom[4], bottom[5]], pos); + return pos += 6; + } + #getOutlineEnd(outline, pos) { + const lastTop = this.#last.subarray(4, 6); + const lastBottom = this.#last.subarray(16, 18); + const [layerX, layerY, layerWidth, layerHeight] = this.#box; + const [lastTopX, lastTopY, lastBottomX, lastBottomY] = this.#getLastCoords(); + outline.set([NaN, NaN, NaN, NaN, (lastTop[0] - layerX) / layerWidth, (lastTop[1] - layerY) / layerHeight, NaN, NaN, NaN, NaN, lastTopX, lastTopY, NaN, NaN, NaN, NaN, lastBottomX, lastBottomY, NaN, NaN, NaN, NaN, (lastBottom[0] - layerX) / layerWidth, (lastBottom[1] - layerY) / layerHeight], pos); + return pos += 24; + } +} +class FreeDrawOutline extends Outline { + #box; + #bbox = new Float32Array(4); + #innerMargin; + #isLTR; + #points; + #scaleFactor; + #outline; + constructor(outline, points, box, scaleFactor, innerMargin, isLTR) { + super(); + this.#outline = outline; + this.#points = points; + this.#box = box; + this.#scaleFactor = scaleFactor; + this.#innerMargin = innerMargin; + this.#isLTR = isLTR; + this.firstPoint = [NaN, NaN]; + this.lastPoint = [NaN, NaN]; + this.#computeMinMax(isLTR); + const [x, y, width, height] = this.#bbox; + for (let i = 0, ii = outline.length; i < ii; i += 2) { + outline[i] = (outline[i] - x) / width; + outline[i + 1] = (outline[i + 1] - y) / height; + } + for (let i = 0, ii = points.length; i < ii; i += 2) { + points[i] = (points[i] - x) / width; + points[i + 1] = (points[i + 1] - y) / height; + } + } + toSVGPath() { + const buffer = [`M${this.#outline[4]} ${this.#outline[5]}`]; + for (let i = 6, ii = this.#outline.length; i < ii; i += 6) { + if (isNaN(this.#outline[i])) { + buffer.push(`L${this.#outline[i + 4]} ${this.#outline[i + 5]}`); + continue; + } + buffer.push(`C${this.#outline[i]} ${this.#outline[i + 1]} ${this.#outline[i + 2]} ${this.#outline[i + 3]} ${this.#outline[i + 4]} ${this.#outline[i + 5]}`); + } + buffer.push("Z"); + return buffer.join(" "); + } + serialize([blX, blY, trX, trY], rotation) { + const width = trX - blX; + const height = trY - blY; + let outline; + let points; + switch (rotation) { + case 0: + outline = Outline._rescale(this.#outline, blX, trY, width, -height); + points = Outline._rescale(this.#points, blX, trY, width, -height); + break; + case 90: + outline = Outline._rescaleAndSwap(this.#outline, blX, blY, width, height); + points = Outline._rescaleAndSwap(this.#points, blX, blY, width, height); + break; + case 180: + outline = Outline._rescale(this.#outline, trX, blY, -width, height); + points = Outline._rescale(this.#points, trX, blY, -width, height); + break; + case 270: + outline = Outline._rescaleAndSwap(this.#outline, trX, trY, -width, -height); + points = Outline._rescaleAndSwap(this.#points, trX, trY, -width, -height); + break; + } + return { + outline: Array.from(outline), + points: [Array.from(points)] + }; + } + #computeMinMax(isLTR) { + const outline = this.#outline; + let lastX = outline[4]; + let lastY = outline[5]; + const minMax = [lastX, lastY, lastX, lastY]; + let firstPointX = lastX; + let firstPointY = lastY; + let lastPointX = lastX; + let lastPointY = lastY; + const ltrCallback = isLTR ? Math.max : Math.min; + const bezierBbox = new Float32Array(4); + for (let i = 6, ii = outline.length; i < ii; i += 6) { + const x = outline[i + 4], + y = outline[i + 5]; + if (isNaN(outline[i])) { + Util.pointBoundingBox(x, y, minMax); + if (firstPointY > y) { + firstPointX = x; + firstPointY = y; + } else if (firstPointY === y) { + firstPointX = ltrCallback(firstPointX, x); + } + if (lastPointY < y) { + lastPointX = x; + lastPointY = y; + } else if (lastPointY === y) { + lastPointX = ltrCallback(lastPointX, x); + } + } else { + bezierBbox.set(BBOX_INIT, 0); + Util.bezierBoundingBox(lastX, lastY, ...outline.slice(i, i + 6), bezierBbox); + Util.rectBoundingBox(...bezierBbox, minMax); + if (firstPointY > bezierBbox[1]) { + firstPointX = bezierBbox[0]; + firstPointY = bezierBbox[1]; + } else if (firstPointY === bezierBbox[1]) { + firstPointX = ltrCallback(firstPointX, bezierBbox[0]); + } + if (lastPointY < bezierBbox[3]) { + lastPointX = bezierBbox[2]; + lastPointY = bezierBbox[3]; + } else if (lastPointY === bezierBbox[3]) { + lastPointX = ltrCallback(lastPointX, bezierBbox[2]); + } + } + lastX = x; + lastY = y; + } + const bbox = this.#bbox; + bbox[0] = minMax[0] - this.#innerMargin; + bbox[1] = minMax[1] - this.#innerMargin; + bbox[2] = minMax[2] - minMax[0] + 2 * this.#innerMargin; + bbox[3] = minMax[3] - minMax[1] + 2 * this.#innerMargin; + this.firstPoint = [firstPointX, firstPointY]; + this.lastPoint = [lastPointX, lastPointY]; + } + get box() { + return this.#bbox; + } + newOutliner(x, y, box, scaleFactor, thickness, isLTR, innerMargin = 0) { + return new FreeDrawOutliner(x, y, box, scaleFactor, thickness, isLTR, innerMargin); + } + updateThickness(thickness) { + const outline = this.getNewOutline(thickness); + this.#outline = outline.#outline; + this.#points = outline.#points; + this.#bbox.set(outline.#bbox); + this.firstPoint = outline.firstPoint; + this.lastPoint = outline.lastPoint; + return this.#bbox; + } + getNewOutline(thickness, innerMargin) { + const [x, y, width, height] = this.#bbox; + const [layerX, layerY, layerWidth, layerHeight] = this.#box; + const sx = width * layerWidth; + const sy = height * layerHeight; + const tx = x * layerWidth + layerX; + const ty = y * layerHeight + layerY; + const points = this.#points; + const outliner = this.newOutliner(points[0] * sx + tx, points[1] * sy + ty, this.#box, this.#scaleFactor, thickness, this.#isLTR, innerMargin ?? this.#innerMargin); + for (let i = 2, ii = points.length; i < ii; i += 2) { + outliner.add(points[i] * sx + tx, points[i + 1] * sy + ty); + } + return outliner.getOutlines(); + } +} + +;// ./src/display/editor/drawers/highlight.js + + + + + + + + + + + + +function getHighlightSVGProperties(outline) { + return { + bbox: outline.box, + root: { + viewBox: "0 0 1 1" + }, + rootClass: { + highlight: true, + free: outline.isFree + }, + path: { + d: outline.toSVGPath() + } + }; +} +function getHighlightFocusSVGProperties(outline, rotation) { + const { + focusOutline + } = outline; + return { + bbox: Outline._rotateBox(focusOutline.box, rotation), + root: { + "data-main-rotation": rotation + }, + rootClass: { + highlightOutline: true, + free: outline.isFree + }, + path: { + d: focusOutline.toSVGPath() + } + }; +} +class HighlightOutliner { + #box; + #firstPoint; + #lastPoint; + #verticalEdges = []; + #intervals = []; + constructor(boxes, borderWidth = 0, innerMargin = 0, isLTR = true) { + const minMax = BBOX_INIT.slice(); + const NUMBER_OF_DIGITS = 4; + const EPSILON = 10 ** -NUMBER_OF_DIGITS; + for (const { + x, + y, + width, + height + } of boxes) { + const x1 = Math.floor((x - borderWidth) / EPSILON) * EPSILON; + const x2 = Math.ceil((x + width + borderWidth) / EPSILON) * EPSILON; + const y1 = Math.floor((y - borderWidth) / EPSILON) * EPSILON; + const y2 = Math.ceil((y + height + borderWidth) / EPSILON) * EPSILON; + const left = [x1, y1, y2, true]; + const right = [x2, y1, y2, false]; + this.#verticalEdges.push(left, right); + Util.rectBoundingBox(x1, y1, x2, y2, minMax); + } + const bboxWidth = minMax[2] - minMax[0] + 2 * innerMargin; + const bboxHeight = minMax[3] - minMax[1] + 2 * innerMargin; + const shiftedMinX = minMax[0] - innerMargin; + const shiftedMinY = minMax[1] - innerMargin; + let firstPointX = isLTR ? -Infinity : Infinity; + let firstPointY = Infinity; + const lastEdge = this.#verticalEdges.at(isLTR ? -1 : -2); + const lastPoint = [lastEdge[0], lastEdge[2]]; + for (const edge of this.#verticalEdges) { + const [x, y1, y2, left] = edge; + if (!left && isLTR) { + if (y1 < firstPointY) { + firstPointY = y1; + firstPointX = x; + } else if (y1 === firstPointY) { + firstPointX = Math.max(firstPointX, x); + } + } else if (left && !isLTR) { + if (y1 < firstPointY) { + firstPointY = y1; + firstPointX = x; + } else if (y1 === firstPointY) { + firstPointX = Math.min(firstPointX, x); + } + } + edge[0] = (x - shiftedMinX) / bboxWidth; + edge[1] = (y1 - shiftedMinY) / bboxHeight; + edge[2] = (y2 - shiftedMinY) / bboxHeight; + } + this.#box = new Float32Array([shiftedMinX, shiftedMinY, bboxWidth, bboxHeight]); + this.#firstPoint = [firstPointX, firstPointY]; + this.#lastPoint = lastPoint; + } + getOutlines() { + this.#verticalEdges.sort((a, b) => a[0] - b[0] || a[1] - b[1] || a[2] - b[2]); + const outlineVerticalEdges = []; + for (const edge of this.#verticalEdges) { + if (edge[3]) { + outlineVerticalEdges.push(...this.#breakEdge(edge)); + this.#insert(edge); + } else { + this.#remove(edge); + outlineVerticalEdges.push(...this.#breakEdge(edge)); + } + } + return this.#getOutlines(outlineVerticalEdges); + } + #getOutlines(outlineVerticalEdges) { + const edges = []; + const allEdges = new Set(); + for (const edge of outlineVerticalEdges) { + const [x, y1, y2] = edge; + edges.push([x, y1, edge], [x, y2, edge]); + } + edges.sort((a, b) => a[1] - b[1] || a[0] - b[0]); + for (let i = 0, ii = edges.length; i < ii; i += 2) { + const edge1 = edges[i][2]; + const edge2 = edges[i + 1][2]; + edge1.push(edge2); + edge2.push(edge1); + allEdges.add(edge1); + allEdges.add(edge2); + } + const outlines = []; + while (allEdges.size > 0) { + const edge = allEdges.values().next().value; + let [x, y1, y2, edge1, edge2] = edge; + allEdges.delete(edge); + let lastPointX = x; + let lastPointY = y1; + const outline = [x, y2]; + outlines.push(outline); + while (true) { + let e; + if (allEdges.has(edge1)) { + e = edge1; + } else if (allEdges.has(edge2)) { + e = edge2; + } else { + break; + } + allEdges.delete(e); + [x, y1, y2, edge1, edge2] = e; + if (lastPointX !== x) { + outline.push(lastPointX, lastPointY, x, lastPointY === y1 ? y1 : y2); + lastPointX = x; + } + lastPointY = lastPointY === y1 ? y2 : y1; + } + outline.push(lastPointX, lastPointY); + } + return new HighlightOutline(outlines, this.#box, this.#firstPoint, this.#lastPoint); + } + #binarySearch(y) { + const array = this.#intervals; + let start = 0; + let end = array.length - 1; + while (start <= end) { + const middle = start + end >> 1; + const y1 = array[middle][0]; + if (y1 === y) { + return middle; + } + if (y1 < y) { + start = middle + 1; + } else { + end = middle - 1; + } + } + return end + 1; + } + #insert([, y1, y2]) { + const index = this.#binarySearch(y1); + this.#intervals.splice(index, 0, [y1, y2]); + } + #remove([, y1, y2]) { + const index = this.#binarySearch(y1); + for (let i = index; i < this.#intervals.length; i++) { + const [start, end] = this.#intervals[i]; + if (start !== y1) { + break; + } + if (start === y1 && end === y2) { + this.#intervals.splice(i, 1); + return; + } + } + for (let i = index - 1; i >= 0; i--) { + const [start, end] = this.#intervals[i]; + if (start !== y1) { + break; + } + if (start === y1 && end === y2) { + this.#intervals.splice(i, 1); + return; + } + } + } + #breakEdge(edge) { + const [x, y1, y2] = edge; + const results = [[x, y1, y2]]; + const index = this.#binarySearch(y2); + for (let i = 0; i < index; i++) { + const [start, end] = this.#intervals[i]; + for (let j = 0, jj = results.length; j < jj; j++) { + const [, y3, y4] = results[j]; + if (end <= y3 || y4 <= start) { + continue; + } + if (y3 >= start) { + if (y4 > end) { + results[j][1] = end; + } else { + if (jj === 1) { + return []; + } + results.splice(j, 1); + j--; + jj--; + } + continue; + } + results[j][2] = start; + if (y4 > end) { + results.push([x, end, y4]); + } + } + } + return results; + } +} +class HighlightOutline extends Outline { + #box; + #boxes = null; + #outlines; + constructor(outlines, box, firstPoint, lastPoint) { + super(); + this.#outlines = outlines; + this.#box = box; + this.firstPoint = firstPoint; + this.lastPoint = lastPoint; + } + static build(boxes, isLTR) { + const outline = new HighlightOutliner(boxes, 0.001).getOutlines(); + outline.#boxes = boxes; + outline.focusOutline = new HighlightOutliner(boxes, 0.0025, 0.001, isLTR).getOutlines(); + return outline; + } + get isFree() { + return false; + } + get defaultSVGProperties() { + return getHighlightSVGProperties(this); + } + getFocusSVGProperties(rotation) { + return getHighlightFocusSVGProperties(this, rotation); + } + updateRotation(rotation) { + return { + root: { + "data-main-rotation": rotation + } + }; + } + serializeQuadPoints([pageX, pageY], [pageWidth, pageHeight]) { + const boxes = this.#boxes; + const quadPoints = new Float32Array(boxes.length * 8); + let i = 0; + for (const { + x, + y, + width, + height + } of boxes) { + const sx = x * pageWidth + pageX; + const sy = (1 - y) * pageHeight + pageY; + quadPoints[i] = quadPoints[i + 4] = sx; + quadPoints[i + 1] = quadPoints[i + 3] = sy; + quadPoints[i + 2] = quadPoints[i + 6] = sx + width * pageWidth; + quadPoints[i + 5] = quadPoints[i + 7] = sy - height * pageHeight; + i += 8; + } + return quadPoints; + } + toSVGPath() { + const buffer = []; + for (const polygon of this.#outlines) { + let [prevX, prevY] = polygon; + buffer.push(`M${prevX} ${prevY}`); + for (let i = 2; i < polygon.length; i += 2) { + const x = polygon[i]; + const y = polygon[i + 1]; + if (x === prevX) { + buffer.push(`V${y}`); + prevY = y; + } else if (y === prevY) { + buffer.push(`H${x}`); + prevX = x; + } + } + buffer.push("Z"); + } + return buffer.join(" "); + } + serialize([blX, blY, trX, trY], _rotation) { + const outlines = []; + const width = trX - blX; + const height = trY - blY; + for (const outline of this.#outlines) { + const points = new Array(outline.length); + for (let i = 0; i < outline.length; i += 2) { + points[i] = blX + outline[i] * width; + points[i + 1] = trY - outline[i + 1] * height; + } + outlines.push(points); + } + return outlines; + } + get box() { + return this.#box; + } +} +class FreeHighlightOutliner extends FreeDrawOutliner { + newFreeDrawOutline(outline, points, box, scaleFactor, innerMargin, isLTR) { + return new FreeHighlightOutline(outline, points, box, scaleFactor, innerMargin, isLTR); + } +} +class FreeHighlightDrawer { + #outliner; + #thickness; + constructor(x, y, box, scaleFactor, thickness, isLTR, innerMargin) { + this.#outliner = new FreeHighlightOutliner(x, y, box, scaleFactor, thickness, isLTR, innerMargin); + this.#thickness = thickness; + } + add(x, y) { + return this.#outliner.add(x, y) ? { + path: { + d: this.#outliner.toSVGPath() + } + } : null; + } + addPoints(points) { + let hasChanged = false; + for (let i = 0, ii = points.length; i < ii; i += 2) { + hasChanged = this.#outliner.add(points[i], points[i + 1]) || hasChanged; + } + return hasChanged ? { + path: { + d: this.#outliner.toSVGPath() + } + } : null; + } + end(x, y) { + return x === undefined ? null : this.add(x, y); + } + isEmpty() { + return this.#outliner.isEmpty(); + } + isCancellable() { + return this.#outliner.isCancellable(); + } + removeLastElement() { + return this.#outliner.removeLastElement(); + } + updateProperty(_name, _value) { + return null; + } + getOutlines() { + const outlines = this.#outliner.getOutlines(); + outlines.buildFocusOutline(2 * this.#thickness); + return outlines; + } + get defaultSVGProperties() { + return { + bbox: [0, 0, 1, 1], + root: { + viewBox: "0 0 1 1" + }, + rootClass: { + highlight: true, + free: true + }, + path: { + d: this.#outliner.toSVGPath() + } + }; + } +} +class FreeHighlightOutline extends FreeDrawOutline { + static #EXTRA_THICKNESS = 1.5; + newOutliner(x, y, box, scaleFactor, thickness, isLTR, innerMargin = 0) { + return new FreeHighlightOutliner(x, y, box, scaleFactor, thickness, isLTR, innerMargin); + } + get isFree() { + return true; + } + buildFocusOutline(thickness) { + this.focusOutline = this.getNewOutline(thickness / 2 + FreeHighlightOutline.#EXTRA_THICKNESS, 0.0025); + } + get defaultSVGProperties() { + return getHighlightSVGProperties(this); + } + getFocusSVGProperties(rotation) { + return getHighlightFocusSVGProperties(this, rotation); + } + get focusMustRemoveSelfIntersections() { + return true; + } + updateRotation(rotation) { + return { + root: { + "data-main-rotation": rotation + } + }; + } + updateProperty(name, value) { + if (name !== "thickness") { + return null; + } + const bbox = this.updateThickness(value / 2); + this.buildFocusOutline(value); + return bbox; + } + getPathResizedSVGProperties() { + return { + path: { + d: this.toSVGPath() + } + }; + } +} + +;// ./src/display/editor/highlight.js + + + + + + + + + + + + + +class HighlightDrawingOptions extends DrawingOptions { + constructor(properties = null) { + super(); + super.updateProperties(properties); + } + updateSVGProperty(name, value) { + if (name !== "thickness") { + super.updateSVGProperty(name, value); + } + } + clone() { + const clone = new HighlightDrawingOptions(); + clone.updateAll(this); + return clone; + } +} +class HighlightEditor extends DrawingEditor { + #anchorNode = null; + #anchorOffset = 0; + #focusNode = null; + #focusOffset = 0; + #methodOfCreation = ""; + #text = ""; + static _DEFAULT_OPACITY = 1; + static _DEFAULT_THICKNESS = 12; + static _defaultDrawingOptions = null; + static _type = "highlight"; + static _editorType = AnnotationEditorType.HIGHLIGHT; + static get _keyboardManager() { + const proto = HighlightEditor.prototype; + return util_shadow(this, "_keyboardManager", new KeyboardManager([[["ArrowLeft"], proto._moveCaret, { + args: [0] + }], [["ArrowRight"], proto._moveCaret, { + args: [1] + }], [["ArrowUp"], proto._moveCaret, { + args: [2] + }], [["ArrowDown"], proto._moveCaret, { + args: [3] + }]])); + } + constructor(params) { + super({ + ...params, + name: "highlightEditor" + }); + this.#anchorNode = params.anchorNode || null; + this.#anchorOffset = params.anchorOffset || 0; + this.#focusNode = params.focusNode || null; + this.#focusOffset = params.focusOffset || 0; + this.#methodOfCreation = params.methodOfCreation || (this._drawOutlines?.isFree ? "main_toolbar" : ""); + this.#text = params.text || ""; + this._isDraggable = false; + this.defaultL10nId = "pdfjs-editor-highlight-editor"; + this.rotate(); + } + static initialize(l10n, uiManager) { + AnnotationEditor.initialize(l10n, uiManager); + this._defaultDrawingOptions ||= new HighlightDrawingOptions({ + fill: uiManager.highlightColors?.values().next().value || "#fff066", + "fill-opacity": HighlightEditor._DEFAULT_OPACITY, + thickness: HighlightEditor._DEFAULT_THICKNESS + }); + } + static getDefaultDrawingOptions(options) { + const clone = this._defaultDrawingOptions.clone(); + clone.updateProperties(options); + return clone; + } + static get typesMap() { + return util_shadow(this, "typesMap", new Map([[AnnotationEditorParamsType.HIGHLIGHT_COLOR, "fill"], [AnnotationEditorParamsType.HIGHLIGHT_THICKNESS, "thickness"]])); + } + static get isDrawer() { + return false; + } + static get _hasClipPath() { + return true; + } + static get _hasDrawClass() { + return false; + } + _addOutlines(params) { + const { + boxes, + drawOutlines + } = params; + if (!boxes && !drawOutlines) { + return; + } + this._drawingOptions ||= params.drawingOptions || HighlightEditor.getDefaultDrawingOptions(); + if (boxes) { + params = { + ...params, + drawOutlines: HighlightOutline.build(boxes, this._uiManager.direction === "ltr") + }; + } + super._addOutlines(params); + } + get colorType() { + return AnnotationEditorParamsType.HIGHLIGHT_COLOR; + } + get color() { + return this._drawingOptions.fill; + } + get opacity() { + return this._drawingOptions["fill-opacity"]; + } + get _opacityName() { + return "fill-opacity"; + } + get _drawRotation() { + return this._drawOutlines?.isFree ? this.rotation : 0; + } + get isResizable() { + return false; + } + get _mustBeDisabledOnCommit() { + return false; + } + get _mustFixPosition() { + return !this._drawOutlines?.isFree; + } + get telemetryInitialData() { + return { + action: "added", + type: this._drawOutlines.isFree ? "free_highlight" : "highlight", + color: this._uiManager.getNonHCMColorName(this.color), + thickness: this._drawingOptions.thickness, + methodOfCreation: this.#methodOfCreation + }; + } + get telemetryFinalData() { + return { + type: "highlight", + color: this._uiManager.getNonHCMColorName(this.color) + }; + } + static computeTelemetryFinalData(data) { + return { + numberOfColors: data.get("color").size + }; + } + translateInPage(x, y) {} + get toolbarPosition() { + return this.#relativeToBox(this._drawOutlines.focusOutline.lastPoint); + } + get commentButtonPosition() { + return this.#relativeToBox(this._drawOutlines.firstPoint); + } + #relativeToBox([pointX, pointY]) { + const [x, y, width, height] = this._drawOutlines.box; + return [(pointX - x) / width, (pointY - y) / height]; + } + updateParams(type, value) { + switch (type) { + case AnnotationEditorParamsType.HIGHLIGHT_COLOR: + this._updateColorAndOpacity(value, HighlightEditor._DEFAULT_OPACITY, type); + this._reportTelemetry({ + action: "color_changed", + color: this._uiManager.getNonHCMColorName(value) + }, true); + break; + case AnnotationEditorParamsType.HIGHLIGHT_THICKNESS: + super.updateParams(type, value); + this._reportTelemetry({ + action: "thickness_changed", + thickness: value + }, true); + break; + } + } + get propertiesToUpdate() { + const properties = super.propertiesToUpdate; + properties.push([AnnotationEditorParamsType.HIGHLIGHT_FREE, this._drawOutlines.isFree]); + return properties; + } + get toolbarButtons() { + if (this._uiManager.highlightColors) { + this._colorPicker = new ColorPicker({ + editor: this + }); + return [["colorPicker", this._colorPicker]]; + } + return super.toolbarButtons; + } + fixAndSetPosition() { + return super.fixAndSetPosition(this._drawRotation); + } + getRect(tx, ty) { + return super.getRect(tx, ty, this._drawRotation); + } + onceAdded(focus) { + if (!this.annotationElementId) { + this.parent.addUndoableEditor(this); + } + if (focus) { + this.div.focus(); + } + } + remove() { + this._reportTelemetry({ + action: "deleted" + }); + super.remove(); + } + render() { + if (this.div) { + return this.div; + } + const div = super.render(); + if (this.#text) { + div.setAttribute("aria-label", this.#text); + div.setAttribute("role", "mark"); + } + if (this._drawOutlines.isFree) { + div.classList.add("free"); + } else { + div.addEventListener("keydown", this.#keydown.bind(this), { + signal: this._uiManager._signal + }); + } + this.enableEditing(); + return div; + } + #keydown(event) { + HighlightEditor._keyboardManager.exec(this, event); + } + _moveCaret(direction) { + this.parent.unselect(this); + switch (direction) { + case 0: + case 2: + this.#setCaret(true); + break; + case 1: + case 3: + this.#setCaret(false); + break; + } + } + #setCaret(start) { + if (!this.#anchorNode) { + return; + } + const selection = window.getSelection(); + if (start) { + selection.setPosition(this.#anchorNode, this.#anchorOffset); + } else { + selection.setPosition(this.#focusNode, this.#focusOffset); + } + } + unselect() { + super.unselect(); + if (!this._drawOutlines.isFree) { + this.#setCaret(false); + } + } + static createDrawerInstance({ + x, + y, + box, + parent, + isLTR + }) { + return new FreeHighlightDrawer(x, y, box, parent.scale, this._defaultDrawingOptions.thickness / 2, isLTR, 0.001); + } + static _getDrawingTarget(parent, { + target + }) { + return target.closest(".textLayer"); + } + static _getPointerCoords({ + x, + y + }) { + return [x, y]; + } + static _addDrawingListeners(target, signal) { + target.classList.add("free"); + signal.addEventListener("abort", () => target.classList.remove("free"), { + once: true + }); + window.addEventListener("blur", () => this._endDraw(null), { + signal + }); + window.addEventListener("pointerdown", stopEvent, { + capture: true, + passive: false, + signal + }); + } + static _endDrawingSession(isAborted = false) { + return this.endDrawing(isAborted); + } + createDrawingOptions({ + color, + opacity, + thickness + }) { + const { + _defaultDrawingOptions: defaults, + _DEFAULT_OPACITY + } = HighlightEditor; + this._drawingOptions = HighlightEditor.getDefaultDrawingOptions({ + fill: Util.makeHexColor(...color), + "fill-opacity": opacity || _DEFAULT_OPACITY, + thickness: thickness || defaults.thickness + }); + } + static deserializeDraw(pageX, pageY, pageWidth, pageHeight, _innerMargin, data, uiManager) { + const { + quadPoints + } = data; + if (quadPoints) { + const boxes = []; + for (let i = 0, ii = quadPoints.length; i < ii; i += 8) { + boxes.push({ + x: (quadPoints[i] - pageX) / pageWidth, + y: 1 - (quadPoints[i + 1] - pageY) / pageHeight, + width: (quadPoints[i + 2] - quadPoints[i]) / pageWidth, + height: (quadPoints[i + 1] - quadPoints[i + 5]) / pageHeight + }); + } + return HighlightOutline.build(boxes, uiManager.direction === "ltr"); + } + const thickness = data.thickness || this._defaultDrawingOptions.thickness; + const points = (data.inkLists || data.outlines.points)[0]; + const outliner = new FreeHighlightOutliner(points[0] - pageX, pageHeight - (points[1] - pageY), [0, 0, pageWidth, pageHeight], 1, thickness / 2, true, 0.001); + for (let i = 0, ii = points.length; i < ii; i += 2) { + outliner.add(points[i] - pageX, pageHeight - (points[i + 1] - pageY)); + } + const outlines = outliner.getOutlines(); + outlines.buildFocusOutline(thickness); + return outlines; + } + static async deserialize(data, parent, uiManager) { + let initialData = null; + if (data instanceof HighlightAnnotationElement) { + const { + data: { + quadPoints, + rect, + rotation, + id, + color, + opacity, + popupRef, + richText, + contentsObj, + creationDate, + modificationDate + }, + parent: { + page: { + pageNumber + } + } + } = data; + initialData = data = { + annotationType: AnnotationEditorType.HIGHLIGHT, + color: Array.from(color), + opacity, + quadPoints, + pageIndex: pageNumber - 1, + rect: rect.slice(0), + rotation, + annotationElementId: id, + id, + deleted: false, + popupRef, + richText, + comment: contentsObj?.str || null, + creationDate, + modificationDate + }; + } else if (data instanceof InkAnnotationElement) { + const { + data: { + inkLists, + rect, + rotation, + id, + color, + borderStyle: { + rawWidth: thickness + }, + popupRef, + richText, + contentsObj, + creationDate, + modificationDate + }, + parent: { + page: { + pageNumber + } + } + } = data; + initialData = data = { + annotationType: AnnotationEditorType.HIGHLIGHT, + color: Array.from(color), + thickness, + inkLists, + pageIndex: pageNumber - 1, + rect: rect.slice(0), + rotation, + annotationElementId: id, + id, + deleted: false, + popupRef, + richText, + comment: contentsObj?.str || null, + creationDate, + modificationDate + }; + } + const editor = await super.deserialize(data, parent, uiManager); + editor._initialData = initialData; + if (data.comment) { + editor.setCommentData(data); + } + return editor; + } + serialize(isForCopying = false) { + if (this.isEmpty() || isForCopying) { + return null; + } + if (this.deleted) { + return this.serializeDeleted(); + } + const serialized = super.serialize(isForCopying); + Object.assign(serialized, { + color: AnnotationEditor._colorManager.convert(this._uiManager.getNonHCMColor(this.color)), + opacity: this.opacity, + thickness: this._drawingOptions.thickness, + quadPoints: this._drawOutlines.serializeQuadPoints(this.pageTranslation, this.pageDimensions), + outlines: this._drawOutlines.serialize(serialized.rect, this._drawRotation) + }); + this.addComment(serialized); + if (this.annotationElementId && !this.#hasElementChanged(serialized)) { + return null; + } + serialized.id = this.annotationElementId; + return serialized; + } + #hasElementChanged(serialized) { + const { + color + } = this._initialData; + return this.hasEditedComment || serialized.color.some((c, i) => c !== color[i]); + } + renderAnnotationElement(annotation) { + if (this.deleted) { + annotation.hide(); + return null; + } + annotation.updateEdited({ + rect: this.getPDFRect(), + popup: this.comment + }); + return null; + } +} + +;// ./src/display/editor/drawers/inkdraw.js + + + + + + + +class InkDrawOutliner { + #last = new Float64Array(6); + #tip = new Float64Array(2); + #line; + #lines; + #rotation; + #thickness; + #points; + #lastSVGPath = ""; + #lastIndex = 0; + #outlines = new InkDrawOutline(); + #parentWidth; + #parentHeight; + constructor(x, y, parentWidth, parentHeight, rotation, thickness) { + this.#parentWidth = parentWidth; + this.#parentHeight = parentHeight; + this.#rotation = rotation; + this.#thickness = thickness; + [x, y] = this.#normalizePoint(x, y); + const line = this.#line = [NaN, NaN, NaN, NaN, x, y]; + this.#points = [x, y]; + this.#lines = [{ + line, + points: this.#points + }]; + this.#last.set(line, 0); + this.#tip.set([x, y], 0); + } + updateProperty(name, value) { + if (name === "stroke-width") { + this.#thickness = value; + } + } + #normalizePoint(x, y) { + return Outline._normalizePoint(x, y, this.#parentWidth, this.#parentHeight, this.#rotation); + } + isEmpty() { + return !this.#lines?.length; + } + isCancellable() { + return this.#points.length <= 10; + } + add(x, y) { + if (this.#add(x, y)) { + this.toSVGPath(); + } + return { + path: { + d: this.#toSVGPathWithTip() + } + }; + } + addPoints(points) { + let needsPathUpdate = false; + for (let i = 0, ii = points.length; i < ii; i += 2) { + if (!this.#add(points[i], points[i + 1])) { + continue; + } + needsPathUpdate = true; + if (this.#points.length <= 6) { + this.toSVGPath(); + needsPathUpdate = false; + } + } + if (needsPathUpdate) { + this.toSVGPath(); + } + return { + path: { + d: this.#toSVGPathWithTip() + } + }; + } + #add(x, y) { + [x, y] = this.#normalizePoint(x, y); + this.#tip.set([x, y], 0); + const [x1, y1, x2, y2] = this.#last.subarray(2, 6); + const diffX = x - x2; + const diffY = y - y2; + const d = Math.hypot(this.#parentWidth * diffX, this.#parentHeight * diffY); + if (d <= 2) { + return false; + } + this.#points.push(x, y); + if (isNaN(x1)) { + this.#last.set([x2, y2, x, y], 2); + this.#line.push(NaN, NaN, NaN, NaN, x, y); + return true; + } + if (isNaN(this.#last[0])) { + this.#line.splice(6, 6); + } + this.#last.set([x1, y1, x2, y2, x, y], 0); + this.#line.push(...Outline.createBezierPoints(x1, y1, x2, y2, x, y)); + return true; + } + end(x, y) { + if (x !== undefined && this.#add(x, y)) { + return { + path: { + d: this.toSVGPath() + } + }; + } + if (this.#points.length === 2) { + return { + path: { + d: this.toSVGPath() + } + }; + } + return { + path: { + d: this.#lastSVGPath + } + }; + } + startNew(x, y, parentWidth, parentHeight, rotation) { + this.#parentWidth = parentWidth; + this.#parentHeight = parentHeight; + this.#rotation = rotation; + [x, y] = this.#normalizePoint(x, y); + const line = this.#line = [NaN, NaN, NaN, NaN, x, y]; + this.#points = [x, y]; + this.#tip.set([x, y], 0); + const last = this.#lines.at(-1); + if (last) { + last.line = new Float32Array(last.line); + last.points = new Float32Array(last.points); + } + this.#lines.push({ + line, + points: this.#points + }); + this.#last.set(line, 0); + this.#lastIndex = 0; + this.toSVGPath(); + return null; + } + getLastElement() { + return this.#lines.at(-1); + } + setLastElement(element) { + if (!this.#lines) { + return this.#outlines.setLastElement(element); + } + this.#lines.push(element); + this.#line = element.line; + this.#points = element.points; + this.#lastIndex = 0; + return { + path: { + d: this.toSVGPath() + } + }; + } + removeLastElement() { + if (!this.#lines) { + return this.#outlines.removeLastElement(); + } + this.#lines.pop(); + this.#lastSVGPath = ""; + for (let i = 0, ii = this.#lines.length; i < ii; i++) { + const { + line, + points + } = this.#lines[i]; + this.#line = line; + this.#points = points; + this.#lastIndex = 0; + this.toSVGPath(); + } + return { + path: { + d: this.#lastSVGPath + } + }; + } + #toSVGPathWithTip() { + const tipX = Outline.svgRound(this.#tip[0]); + const tipY = Outline.svgRound(this.#tip[1]); + if (this.#points.length === 2) { + const firstX = Outline.svgRound(this.#line[4]); + const firstY = Outline.svgRound(this.#line[5]); + return `${this.#lastSVGPath} M ${firstX} ${firstY} L ${tipX} ${tipY}`; + } + return `${this.#lastSVGPath} L ${tipX} ${tipY}`; + } + toSVGPath() { + const firstX = Outline.svgRound(this.#line[4]); + const firstY = Outline.svgRound(this.#line[5]); + if (this.#points.length === 2) { + this.#lastSVGPath = `${this.#lastSVGPath} M ${firstX} ${firstY} Z`; + return this.#lastSVGPath; + } + if (this.#points.length <= 6) { + const i = this.#lastSVGPath.lastIndexOf("M"); + this.#lastSVGPath = `${this.#lastSVGPath.slice(0, i)} M ${firstX} ${firstY}`; + this.#lastIndex = 6; + } + if (this.#points.length === 4) { + const secondX = Outline.svgRound(this.#line[10]); + const secondY = Outline.svgRound(this.#line[11]); + this.#lastSVGPath = `${this.#lastSVGPath} L ${secondX} ${secondY}`; + this.#lastIndex = 12; + return this.#lastSVGPath; + } + const buffer = []; + if (this.#lastIndex === 0) { + buffer.push(`M ${firstX} ${firstY}`); + this.#lastIndex = 6; + } + for (let i = this.#lastIndex, ii = this.#line.length; i < ii; i += 6) { + const [c1x, c1y, c2x, c2y, x, y] = this.#line.slice(i, i + 6).map(Outline.svgRound); + buffer.push(`C${c1x} ${c1y} ${c2x} ${c2y} ${x} ${y}`); + } + this.#lastSVGPath += buffer.join(" "); + this.#lastIndex = this.#line.length; + return this.#lastSVGPath; + } + getOutlines(parentWidth, parentHeight, scale, innerMargin) { + const last = this.#lines.at(-1); + last.line = new Float32Array(last.line); + last.points = new Float32Array(last.points); + this.#outlines.build(this.#lines, parentWidth, parentHeight, scale, this.#rotation, this.#thickness, innerMargin); + this.#last = null; + this.#line = null; + this.#lines = null; + this.#lastSVGPath = null; + return this.#outlines; + } + get defaultSVGProperties() { + return { + root: { + viewBox: "0 0 10000 10000" + }, + rootClass: { + draw: true + }, + bbox: [0, 0, 1, 1] + }; + } +} +class InkDrawOutline extends Outline { + #bbox; + #currentRotation = 0; + #innerMargin; + #lines; + #parentWidth; + #parentHeight; + #parentScale; + #rotation; + #thickness; + build(lines, parentWidth, parentHeight, parentScale, rotation, thickness, innerMargin) { + this.#parentWidth = parentWidth; + this.#parentHeight = parentHeight; + this.#parentScale = parentScale; + this.#rotation = rotation; + this.#thickness = thickness; + this.#innerMargin = innerMargin ?? 0; + this.#lines = lines; + this.#computeBbox(); + } + get thickness() { + return this.#thickness; + } + setLastElement(element) { + this.#lines.push(element); + return { + path: { + d: this.toSVGPath() + } + }; + } + removeLastElement() { + this.#lines.pop(); + return { + path: { + d: this.toSVGPath() + } + }; + } + toSVGPath() { + const buffer = []; + for (const { + line + } of this.#lines) { + buffer.push(`M${Outline.svgRound(line[4])} ${Outline.svgRound(line[5])}`); + if (line.length === 6) { + buffer.push("Z"); + continue; + } + if (line.length === 12 && isNaN(line[6])) { + buffer.push(`L${Outline.svgRound(line[10])} ${Outline.svgRound(line[11])}`); + continue; + } + for (let i = 6, ii = line.length; i < ii; i += 6) { + const [c1x, c1y, c2x, c2y, x, y] = line.subarray(i, i + 6).map(Outline.svgRound); + buffer.push(`C${c1x} ${c1y} ${c2x} ${c2y} ${x} ${y}`); + } + } + return buffer.join(""); + } + serialize([pageX, pageY, pageWidth, pageHeight], isForCopying) { + const serializedLines = []; + const serializedPoints = []; + const [x, y, width, height] = this.#getBBoxWithNoMargin(); + let tx, ty, sx, sy, x1, y1, x2, y2, rescaleFn; + switch (this.#rotation) { + case 0: + rescaleFn = Outline._rescale; + tx = pageX; + ty = pageY + pageHeight; + sx = pageWidth; + sy = -pageHeight; + x1 = pageX + x * pageWidth; + y1 = pageY + (1 - y - height) * pageHeight; + x2 = pageX + (x + width) * pageWidth; + y2 = pageY + (1 - y) * pageHeight; + break; + case 90: + rescaleFn = Outline._rescaleAndSwap; + tx = pageX; + ty = pageY; + sx = pageWidth; + sy = pageHeight; + x1 = pageX + y * pageWidth; + y1 = pageY + x * pageHeight; + x2 = pageX + (y + height) * pageWidth; + y2 = pageY + (x + width) * pageHeight; + break; + case 180: + rescaleFn = Outline._rescale; + tx = pageX + pageWidth; + ty = pageY; + sx = -pageWidth; + sy = pageHeight; + x1 = pageX + (1 - x - width) * pageWidth; + y1 = pageY + y * pageHeight; + x2 = pageX + (1 - x) * pageWidth; + y2 = pageY + (y + height) * pageHeight; + break; + case 270: + rescaleFn = Outline._rescaleAndSwap; + tx = pageX + pageWidth; + ty = pageY + pageHeight; + sx = -pageWidth; + sy = -pageHeight; + x1 = pageX + (1 - y - height) * pageWidth; + y1 = pageY + (1 - x - width) * pageHeight; + x2 = pageX + (1 - y) * pageWidth; + y2 = pageY + (1 - x) * pageHeight; + break; + } + for (const { + line, + points + } of this.#lines) { + serializedLines.push(rescaleFn(line, tx, ty, sx, sy, isForCopying ? new Array(line.length) : null)); + serializedPoints.push(rescaleFn(points, tx, ty, sx, sy, isForCopying ? new Array(points.length) : null)); + } + return { + lines: serializedLines, + points: serializedPoints, + rect: [x1, y1, x2, y2] + }; + } + static deserialize(pageX, pageY, pageWidth, pageHeight, innerMargin, { + paths: { + lines, + points + }, + rotation, + thickness + }) { + const newLines = []; + let tx, ty, sx, sy, rescaleFn; + switch (rotation) { + case 0: + rescaleFn = Outline._rescale; + tx = -pageX / pageWidth; + ty = pageY / pageHeight + 1; + sx = 1 / pageWidth; + sy = -1 / pageHeight; + break; + case 90: + rescaleFn = Outline._rescaleAndSwap; + tx = -pageY / pageHeight; + ty = -pageX / pageWidth; + sx = 1 / pageHeight; + sy = 1 / pageWidth; + break; + case 180: + rescaleFn = Outline._rescale; + tx = pageX / pageWidth + 1; + ty = -pageY / pageHeight; + sx = -1 / pageWidth; + sy = 1 / pageHeight; + break; + case 270: + rescaleFn = Outline._rescaleAndSwap; + tx = pageY / pageHeight + 1; + ty = pageX / pageWidth + 1; + sx = -1 / pageHeight; + sy = -1 / pageWidth; + break; + } + if (!lines) { + lines = []; + for (const point of points) { + const len = point.length; + if (len === 2) { + lines.push(new Float32Array([NaN, NaN, NaN, NaN, point[0], point[1]])); + continue; + } + if (len === 4) { + lines.push(new Float32Array([NaN, NaN, NaN, NaN, point[0], point[1], NaN, NaN, NaN, NaN, point[2], point[3]])); + continue; + } + const line = new Float32Array(3 * (len - 2)); + lines.push(line); + let [x1, y1, x2, y2] = point.subarray(0, 4); + line.set([NaN, NaN, NaN, NaN, x1, y1], 0); + for (let i = 4; i < len; i += 2) { + const x = point[i]; + const y = point[i + 1]; + line.set(Outline.createBezierPoints(x1, y1, x2, y2, x, y), (i - 2) * 3); + [x1, y1, x2, y2] = [x2, y2, x, y]; + } + } + } + for (let i = 0, ii = lines.length; i < ii; i++) { + newLines.push({ + line: rescaleFn(lines[i].map(x => x ?? NaN), tx, ty, sx, sy), + points: rescaleFn(points[i].map(x => x ?? NaN), tx, ty, sx, sy) + }); + } + const outlines = new this.prototype.constructor(); + outlines.build(newLines, pageWidth, pageHeight, 1, rotation, thickness, innerMargin); + return outlines; + } + #getMarginComponents(thickness = this.#thickness) { + const margin = this.#innerMargin + thickness / 2 * this.#parentScale; + return this.#rotation % 180 === 0 ? [margin / this.#parentWidth, margin / this.#parentHeight] : [margin / this.#parentHeight, margin / this.#parentWidth]; + } + #getBBoxWithNoMargin() { + const [x, y, width, height] = this.#bbox; + const [marginX, marginY] = this.#getMarginComponents(0); + return [x + marginX, y + marginY, width - 2 * marginX, height - 2 * marginY]; + } + #computeBbox() { + const bbox = this.#bbox = F32_BBOX_INIT.slice(); + for (const { + line + } of this.#lines) { + if (line.length <= 12) { + for (let i = 4, ii = line.length; i < ii; i += 6) { + Util.pointBoundingBox(line[i], line[i + 1], bbox); + } + continue; + } + let lastX = line[4], + lastY = line[5]; + for (let i = 6, ii = line.length; i < ii; i += 6) { + const [c1x, c1y, c2x, c2y, x, y] = line.subarray(i, i + 6); + Util.bezierBoundingBox(lastX, lastY, c1x, c1y, c2x, c2y, x, y, bbox); + lastX = x; + lastY = y; + } + } + const [marginX, marginY] = this.#getMarginComponents(); + bbox[0] = MathClamp(bbox[0] - marginX, 0, 1); + bbox[1] = MathClamp(bbox[1] - marginY, 0, 1); + bbox[2] = MathClamp(bbox[2] + marginX, 0, 1); + bbox[3] = MathClamp(bbox[3] + marginY, 0, 1); + bbox[2] -= bbox[0]; + bbox[3] -= bbox[1]; + } + get box() { + return this.#bbox; + } + updateProperty(name, value) { + return name === "stroke-width" ? this.#updateThickness(value) : null; + } + #updateThickness(thickness) { + const [oldMarginX, oldMarginY] = this.#getMarginComponents(); + this.#thickness = thickness; + const [newMarginX, newMarginY] = this.#getMarginComponents(); + const [diffMarginX, diffMarginY] = [newMarginX - oldMarginX, newMarginY - oldMarginY]; + const bbox = this.#bbox; + bbox[0] -= diffMarginX; + bbox[1] -= diffMarginY; + bbox[2] += 2 * diffMarginX; + bbox[3] += 2 * diffMarginY; + return bbox; + } + updateParentDimensions([width, height], scale) { + const [oldMarginX, oldMarginY] = this.#getMarginComponents(); + this.#parentWidth = width; + this.#parentHeight = height; + this.#parentScale = scale; + const [newMarginX, newMarginY] = this.#getMarginComponents(); + const diffMarginX = newMarginX - oldMarginX; + const diffMarginY = newMarginY - oldMarginY; + const bbox = this.#bbox; + bbox[0] -= diffMarginX; + bbox[1] -= diffMarginY; + bbox[2] += 2 * diffMarginX; + bbox[3] += 2 * diffMarginY; + return bbox; + } + updateRotation(rotation) { + this.#currentRotation = rotation; + return { + path: { + transform: this.rotationTransform + } + }; + } + get viewBox() { + return this.#bbox.map(Outline.svgRound).join(" "); + } + get defaultProperties() { + const [x, y] = this.#bbox; + return { + root: { + viewBox: this.viewBox + }, + path: { + "transform-origin": `${Outline.svgRound(x)} ${Outline.svgRound(y)}` + } + }; + } + get rotationTransform() { + const [,, width, height] = this.#bbox; + let a = 0, + b = 0, + c = 0, + d = 0, + e = 0, + f = 0; + switch (this.#currentRotation) { + case 90: + b = height / width; + c = -width / height; + e = width; + break; + case 180: + a = -1; + d = -1; + e = width; + f = height; + break; + case 270: + b = -height / width; + c = width / height; + f = height; + break; + default: + return ""; + } + return `matrix(${a} ${b} ${c} ${d} ${Outline.svgRound(e)} ${Outline.svgRound(f)})`; + } + getPathResizingSVGProperties([newX, newY, newWidth, newHeight]) { + const [marginX, marginY] = this.#getMarginComponents(); + const [x, y, width, height] = this.#bbox; + if (Math.abs(width - marginX) <= Outline.PRECISION || Math.abs(height - marginY) <= Outline.PRECISION) { + const tx = newX + newWidth / 2 - (x + width / 2); + const ty = newY + newHeight / 2 - (y + height / 2); + return { + path: { + "transform-origin": `${Outline.svgRound(newX)} ${Outline.svgRound(newY)}`, + transform: `${this.rotationTransform} translate(${tx} ${ty})` + } + }; + } + const s1x = (newWidth - 2 * marginX) / (width - 2 * marginX); + const s1y = (newHeight - 2 * marginY) / (height - 2 * marginY); + const s2x = width / newWidth; + const s2y = height / newHeight; + return { + path: { + "transform-origin": `${Outline.svgRound(x)} ${Outline.svgRound(y)}`, + transform: `${this.rotationTransform} scale(${s2x} ${s2y}) ` + `translate(${Outline.svgRound(marginX)} ${Outline.svgRound(marginY)}) scale(${s1x} ${s1y}) ` + `translate(${Outline.svgRound(-marginX)} ${Outline.svgRound(-marginY)})` + } + }; + } + getPathResizedSVGProperties([newX, newY, newWidth, newHeight]) { + const [marginX, marginY] = this.#getMarginComponents(); + const bbox = this.#bbox; + const [x, y, width, height] = bbox; + bbox[0] = newX; + bbox[1] = newY; + bbox[2] = newWidth; + bbox[3] = newHeight; + if (Math.abs(width - marginX) <= Outline.PRECISION || Math.abs(height - marginY) <= Outline.PRECISION) { + const tx = newX + newWidth / 2 - (x + width / 2); + const ty = newY + newHeight / 2 - (y + height / 2); + for (const { + line, + points + } of this.#lines) { + Outline._translate(line, tx, ty, line); + Outline._translate(points, tx, ty, points); + } + return { + root: { + viewBox: this.viewBox + }, + path: { + "transform-origin": `${Outline.svgRound(newX)} ${Outline.svgRound(newY)}`, + transform: this.rotationTransform || null, + d: this.toSVGPath() + } + }; + } + const s1x = (newWidth - 2 * marginX) / (width - 2 * marginX); + const s1y = (newHeight - 2 * marginY) / (height - 2 * marginY); + const tx = -s1x * (x + marginX) + newX + marginX; + const ty = -s1y * (y + marginY) + newY + marginY; + if (s1x !== 1 || s1y !== 1 || tx !== 0 || ty !== 0) { + for (const { + line, + points + } of this.#lines) { + Outline._rescale(line, tx, ty, s1x, s1y, line); + Outline._rescale(points, tx, ty, s1x, s1y, points); + } + } + return { + root: { + viewBox: this.viewBox + }, + path: { + "transform-origin": `${Outline.svgRound(newX)} ${Outline.svgRound(newY)}`, + transform: this.rotationTransform || null, + d: this.toSVGPath() + } + }; + } + getPathTranslatedSVGProperties([newX, newY], parentDimensions) { + const [newParentWidth, newParentHeight] = parentDimensions; + const bbox = this.#bbox; + const tx = newX - bbox[0]; + const ty = newY - bbox[1]; + if (this.#parentWidth === newParentWidth && this.#parentHeight === newParentHeight) { + for (const { + line, + points + } of this.#lines) { + Outline._translate(line, tx, ty, line); + Outline._translate(points, tx, ty, points); + } + } else { + const sx = this.#parentWidth / newParentWidth; + const sy = this.#parentHeight / newParentHeight; + this.#parentWidth = newParentWidth; + this.#parentHeight = newParentHeight; + for (const { + line, + points + } of this.#lines) { + Outline._rescale(line, tx, ty, sx, sy, line); + Outline._rescale(points, tx, ty, sx, sy, points); + } + bbox[2] *= sx; + bbox[3] *= sy; + } + bbox[0] = newX; + bbox[1] = newY; + return { + root: { + viewBox: this.viewBox + }, + path: { + d: this.toSVGPath(), + "transform-origin": `${Outline.svgRound(newX)} ${Outline.svgRound(newY)}` + } + }; + } + get defaultSVGProperties() { + const bbox = this.#bbox; + return { + root: { + viewBox: this.viewBox + }, + rootClass: { + draw: true + }, + path: { + d: this.toSVGPath(), + "transform-origin": `${Outline.svgRound(bbox[0])} ${Outline.svgRound(bbox[1])}`, + transform: this.rotationTransform || null + }, + bbox + }; + } +} + +;// ./src/display/editor/ink.js + + + + + + + + + + +class InkDrawingOptions extends DrawingOptions { + constructor(viewerParameters) { + super(); + this._viewParameters = viewerParameters; + super.updateProperties({ + fill: "none", + stroke: AnnotationEditor._defaultLineColor, + "stroke-opacity": 1, + "stroke-width": 1, + "stroke-linecap": "round", + "stroke-linejoin": "round", + "stroke-miterlimit": 10 + }); + } + updateSVGProperty(name, value) { + if (name === "stroke-width") { + value ??= this["stroke-width"]; + value *= this._viewParameters.realScale; + } + super.updateSVGProperty(name, value); + } + clone() { + const clone = new InkDrawingOptions(this._viewParameters); + clone.updateAll(this); + return clone; + } +} +class InkEditor extends DrawingEditor { + static _type = "ink"; + static _editorType = AnnotationEditorType.INK; + static _defaultDrawingOptions = null; + constructor(params) { + super({ + ...params, + name: "inkEditor" + }); + this._willKeepAspectRatio = true; + this.defaultL10nId = "pdfjs-editor-ink-editor"; + } + static initialize(l10n, uiManager) { + AnnotationEditor.initialize(l10n, uiManager); + this._defaultDrawingOptions = new InkDrawingOptions(uiManager.viewParameters); + } + static getDefaultDrawingOptions(options) { + const clone = this._defaultDrawingOptions.clone(); + clone.updateProperties(options); + return clone; + } + static get supportMultipleDrawings() { + return true; + } + static get typesMap() { + return util_shadow(this, "typesMap", new Map([[AnnotationEditorParamsType.INK_THICKNESS, "stroke-width"], [AnnotationEditorParamsType.INK_COLOR, "stroke"], [AnnotationEditorParamsType.INK_OPACITY, "stroke-opacity"]])); + } + static createDrawerInstance({ + x, + y, + box: [,, width, height], + rotation + }) { + return new InkDrawOutliner(x, y, width, height, rotation, this._defaultDrawingOptions["stroke-width"]); + } + static deserializeDraw(pageX, pageY, pageWidth, pageHeight, innerMargin, data) { + return InkDrawOutline.deserialize(pageX, pageY, pageWidth, pageHeight, innerMargin, data); + } + static async deserialize(data, parent, uiManager) { + let initialData = null; + if (data instanceof InkAnnotationElement) { + const { + data: { + inkLists, + rect, + rotation, + id, + color, + opacity, + borderStyle: { + rawWidth: thickness + }, + popupRef, + richText, + contentsObj, + creationDate, + modificationDate + }, + parent: { + page: { + pageNumber + } + } + } = data; + initialData = data = { + annotationType: AnnotationEditorType.INK, + color: Array.from(color), + thickness, + opacity, + paths: { + points: inkLists + }, + boxes: null, + pageIndex: pageNumber - 1, + rect: rect.slice(0), + rotation, + annotationElementId: id, + id, + deleted: false, + popupRef, + richText, + comment: contentsObj?.str || null, + creationDate, + modificationDate + }; + } + const editor = await super.deserialize(data, parent, uiManager); + editor._initialData = initialData; + if (data.comment) { + editor.setCommentData(data); + } + return editor; + } + get toolbarButtons() { + this._colorPicker ||= new BasicColorPicker(this); + return [["colorPicker", this._colorPicker]]; + } + get colorType() { + return AnnotationEditorParamsType.INK_COLOR; + } + get colorAndOpacityType() { + return AnnotationEditorParamsType.INK_COLOR_AND_OPACITY; + } + get opacityType() { + return AnnotationEditorParamsType.INK_OPACITY; + } + updateParams(type, value) { + if (type === AnnotationEditorParamsType.INK_COLOR_AND_OPACITY) { + this._updateColorAndOpacity(value.color, value.opacity); + return; + } + super.updateParams(type, value); + } + static updateDefaultParams(type, value) { + if (type === AnnotationEditorParamsType.INK_COLOR_AND_OPACITY) { + super.updateDefaultParams(AnnotationEditorParamsType.INK_COLOR, value.color); + super.updateDefaultParams(AnnotationEditorParamsType.INK_OPACITY, value.opacity); + return; + } + super.updateDefaultParams(type, value); + } + get color() { + return this._drawingOptions.stroke; + } + get opacity() { + return this._drawingOptions["stroke-opacity"]; + } + onScaleChanging() { + if (!this.parent) { + return; + } + super.onScaleChanging(); + const { + _drawId, + _drawingOptions, + parent + } = this; + _drawingOptions.updateSVGProperty("stroke-width"); + parent.drawLayer.updateProperties(_drawId, _drawingOptions.toSVGProperties()); + } + static onScaleChangingWhenDrawing() { + const parent = this._currentParent; + if (!parent) { + return; + } + super.onScaleChangingWhenDrawing(); + this._defaultDrawingOptions.updateSVGProperty("stroke-width"); + parent.drawLayer.updateProperties(this._currentDrawId, this._defaultDrawingOptions.toSVGProperties()); + } + createDrawingOptions({ + color, + thickness, + opacity + }) { + this._drawingOptions = InkEditor.getDefaultDrawingOptions({ + stroke: Util.makeHexColor(...color), + "stroke-width": thickness, + "stroke-opacity": opacity + }); + } + serialize(isForCopying = false) { + if (this.isEmpty()) { + return null; + } + if (this.deleted) { + return this.serializeDeleted(); + } + const { + lines, + points + } = this.serializeDraw(isForCopying); + const { + _drawingOptions: { + stroke, + "stroke-opacity": opacity, + "stroke-width": thickness + } + } = this; + const serialized = Object.assign(super.serialize(isForCopying), { + color: AnnotationEditor._colorManager.convert(stroke), + opacity, + thickness, + paths: { + lines, + points + } + }); + this.addComment(serialized); + if (isForCopying) { + serialized.isCopy = true; + return serialized; + } + if (this.annotationElementId && !this.#hasElementChanged(serialized)) { + return null; + } + serialized.id = this.annotationElementId; + return serialized; + } + #hasElementChanged(serialized) { + const { + color, + thickness, + opacity, + pageIndex + } = this._initialData; + return this.hasEditedComment || this._hasBeenMoved || this._hasBeenResized || serialized.color.some((c, i) => c !== color[i]) || serialized.thickness !== thickness || serialized.opacity !== opacity || serialized.pageIndex !== pageIndex; + } + renderAnnotationElement(annotation) { + if (this.deleted) { + annotation.hide(); + return null; + } + const { + points, + rect + } = this.serializeDraw(false); + annotation.updateEdited({ + rect, + thickness: this._drawingOptions["stroke-width"], + points, + popup: this.comment + }); + return null; + } +} + +;// ./src/display/editor/drawers/contour.js + +class ContourDrawOutline extends InkDrawOutline { + toSVGPath() { + let path = super.toSVGPath(); + if (!path.endsWith("Z")) { + path += "Z"; + } + return path; + } +} + +;// ./node_modules/core-js/modules/es.uint8-array.from-base64.js +es_uint8_array_from_base64_namespaceFn(); + +;// ./src/display/editor/drawers/signaturedraw.js + + + + + + + + + + + + + +const BASE_HEADER_LENGTH = 8; +const POINTS_PROPERTIES_NUMBER = 3; +class SignatureExtractor { + static #PARAMETERS = { + maxDim: 512, + sigmaSFactor: 0.02, + sigmaR: 25, + kernelSize: 16 + }; + static #neighborIndexToId(i0, j0, i, j) { + i -= i0; + j -= j0; + if (i === 0) { + return j > 0 ? 0 : 4; + } + return i === 1 ? j + 6 : 2 - j; + } + static #neighborIdToIndex = new Int32Array([0, 1, -1, 1, -1, 0, -1, -1, 0, -1, 1, -1, 1, 0, 1, 1]); + static #clockwiseNonZero(buf, width, i0, j0, i, j, offset) { + const id = this.#neighborIndexToId(i0, j0, i, j); + for (let k = 0; k < 8; k++) { + const kk = (-k + id - offset + 16) % 8; + const shiftI = this.#neighborIdToIndex[2 * kk]; + const shiftJ = this.#neighborIdToIndex[2 * kk + 1]; + if (buf[(i0 + shiftI) * width + (j0 + shiftJ)] !== 0) { + return kk; + } + } + return -1; + } + static #counterClockwiseNonZero(buf, width, i0, j0, i, j, offset) { + const id = this.#neighborIndexToId(i0, j0, i, j); + for (let k = 0; k < 8; k++) { + const kk = (k + id + offset + 16) % 8; + const shiftI = this.#neighborIdToIndex[2 * kk]; + const shiftJ = this.#neighborIdToIndex[2 * kk + 1]; + if (buf[(i0 + shiftI) * width + (j0 + shiftJ)] !== 0) { + return kk; + } + } + return -1; + } + static #findContours(buf, width, height, threshold) { + const N = buf.length; + const types = new Int32Array(N); + for (let i = 0; i < N; i++) { + types[i] = buf[i] <= threshold ? 1 : 0; + } + for (let i = 1; i < height - 1; i++) { + types[i * width] = types[i * width + width - 1] = 0; + } + for (let i = 0; i < width; i++) { + types[i] = types[width * height - 1 - i] = 0; + } + let nbd = 1; + let lnbd; + const contours = []; + for (let i = 1; i < height - 1; i++) { + lnbd = 1; + for (let j = 1; j < width - 1; j++) { + const ij = i * width + j; + const pix = types[ij]; + if (pix === 0) { + continue; + } + let i2 = i; + let j2 = j; + if (pix === 1 && types[ij - 1] === 0) { + nbd += 1; + j2 -= 1; + } else if (pix >= 1 && types[ij + 1] === 0) { + nbd += 1; + j2 += 1; + if (pix > 1) { + lnbd = pix; + } + } else { + if (pix !== 1) { + lnbd = Math.abs(pix); + } + continue; + } + const points = [j, i]; + const isHole = j2 === j + 1; + const contour = { + isHole, + points, + id: nbd, + parent: 0 + }; + contours.push(contour); + let contour0; + for (const c of contours) { + if (c.id === lnbd) { + contour0 = c; + break; + } + } + if (!contour0) { + contour.parent = isHole ? lnbd : 0; + } else if (contour0.isHole) { + contour.parent = isHole ? contour0.parent : lnbd; + } else { + contour.parent = isHole ? lnbd : contour0.parent; + } + const k = this.#clockwiseNonZero(types, width, i, j, i2, j2, 0); + if (k === -1) { + types[ij] = -nbd; + if (types[ij] !== 1) { + lnbd = Math.abs(types[ij]); + } + continue; + } + let shiftI = this.#neighborIdToIndex[2 * k]; + let shiftJ = this.#neighborIdToIndex[2 * k + 1]; + const i1 = i + shiftI; + const j1 = j + shiftJ; + i2 = i1; + j2 = j1; + let i3 = i; + let j3 = j; + while (true) { + const kk = this.#counterClockwiseNonZero(types, width, i3, j3, i2, j2, 1); + shiftI = this.#neighborIdToIndex[2 * kk]; + shiftJ = this.#neighborIdToIndex[2 * kk + 1]; + const i4 = i3 + shiftI; + const j4 = j3 + shiftJ; + points.push(j4, i4); + const ij3 = i3 * width + j3; + if (types[ij3 + 1] === 0) { + types[ij3] = -nbd; + } else if (types[ij3] === 1) { + types[ij3] = nbd; + } + if (i4 === i && j4 === j && i3 === i1 && j3 === j1) { + if (types[ij] !== 1) { + lnbd = Math.abs(types[ij]); + } + break; + } else { + i2 = i3; + j2 = j3; + i3 = i4; + j3 = j4; + } + } + } + } + return contours; + } + static #douglasPeuckerHelper(points, start, end, output) { + if (end - start <= 4) { + for (let i = start; i < end - 2; i += 2) { + output.push(points[i], points[i + 1]); + } + return; + } + const ax = points[start]; + const ay = points[start + 1]; + const abx = points[end - 4] - ax; + const aby = points[end - 3] - ay; + const dist = Math.hypot(abx, aby); + const nabx = abx / dist; + const naby = aby / dist; + const aa = nabx * ay - naby * ax; + const m = aby / abx; + const invS = 1 / dist; + const phi = Math.atan(m); + const cosPhi = Math.cos(phi); + const sinPhi = Math.sin(phi); + const tmax = invS * (Math.abs(cosPhi) + Math.abs(sinPhi)); + const poly = invS * (1 - tmax + tmax ** 2); + const partialPhi = Math.max(Math.atan(Math.abs(sinPhi + cosPhi) * poly), Math.atan(Math.abs(sinPhi - cosPhi) * poly)); + let dmax = 0; + let index = start; + for (let i = start + 2; i < end - 2; i += 2) { + const d = Math.abs(aa - nabx * points[i + 1] + naby * points[i]); + if (d > dmax) { + index = i; + dmax = d; + } + } + if (dmax > (dist * partialPhi) ** 2) { + this.#douglasPeuckerHelper(points, start, index + 2, output); + this.#douglasPeuckerHelper(points, index, end, output); + } else { + output.push(ax, ay); + } + } + static #douglasPeucker(points) { + const output = []; + const len = points.length; + this.#douglasPeuckerHelper(points, 0, len, output); + output.push(points[len - 2], points[len - 1]); + return output.length <= 4 ? null : output; + } + static #bilateralFilter(buf, width, height, sigmaS, sigmaR, kernelSize) { + const kernel = new Float32Array(kernelSize ** 2); + const sigmaS2 = -2 * sigmaS ** 2; + const halfSize = kernelSize >> 1; + for (let i = 0; i < kernelSize; i++) { + const x = (i - halfSize) ** 2; + for (let j = 0; j < kernelSize; j++) { + kernel[i * kernelSize + j] = Math.exp((x + (j - halfSize) ** 2) / sigmaS2); + } + } + const rangeValues = new Float32Array(256); + const sigmaR2 = -2 * sigmaR ** 2; + for (let i = 0; i < 256; i++) { + rangeValues[i] = Math.exp(i ** 2 / sigmaR2); + } + const N = buf.length; + const out = new Uint8Array(N); + const histogram = new Uint32Array(256); + for (let i = 0; i < height; i++) { + for (let j = 0; j < width; j++) { + const ij = i * width + j; + const center = buf[ij]; + let sum = 0; + let norm = 0; + for (let k = 0; k < kernelSize; k++) { + const y = i + k - halfSize; + if (y < 0 || y >= height) { + continue; + } + for (let l = 0; l < kernelSize; l++) { + const x = j + l - halfSize; + if (x < 0 || x >= width) { + continue; + } + const neighbour = buf[y * width + x]; + const w = kernel[k * kernelSize + l] * rangeValues[Math.abs(neighbour - center)]; + sum += neighbour * w; + norm += w; + } + } + const pix = out[ij] = Math.round(sum / norm); + histogram[pix]++; + } + } + return [out, histogram]; + } + static #getHistogram(buf) { + const histogram = new Uint32Array(256); + for (const g of buf) { + histogram[g]++; + } + return histogram; + } + static #toUint8(buf) { + const N = buf.length; + const out = new Uint8ClampedArray(N >> 2); + let max = -Infinity; + let min = Infinity; + for (let i = 0, ii = out.length; i < ii; i++) { + const pix = out[i] = buf[i << 2]; + max = Math.max(max, pix); + min = Math.min(min, pix); + } + const ratio = 255 / (max - min); + for (let i = 0, ii = out.length; i < ii; i++) { + out[i] = (out[i] - min) * ratio; + } + return out; + } + static #guessThreshold(histogram) { + let i; + let M = -Infinity; + let L = -Infinity; + const min = histogram.findIndex(v => v !== 0); + let pos = min; + let spos = min; + for (i = min; i < 256; i++) { + const v = histogram[i]; + if (v > M) { + if (i - pos > L) { + L = i - pos; + spos = i - 1; + } + M = v; + pos = i; + } + } + for (i = spos - 1; i >= 0; i--) { + if (histogram[i] > histogram[i + 1]) { + break; + } + } + return i; + } + static #getGrayPixels(bitmap) { + const originalBitmap = bitmap; + const { + width, + height + } = bitmap; + const { + maxDim + } = this.#PARAMETERS; + let newWidth = width; + let newHeight = height; + if (width > maxDim || height > maxDim) { + let prevWidth = width; + let prevHeight = height; + let steps = Math.log2(Math.max(width, height) / maxDim); + const isteps = Math.floor(steps); + steps = steps === isteps ? isteps - 1 : isteps; + for (let i = 0; i < steps; i++) { + newWidth = Math.ceil(prevWidth / 2); + newHeight = Math.ceil(prevHeight / 2); + const offscreen = new OffscreenCanvas(newWidth, newHeight); + const ctx = offscreen.getContext("2d"); + ctx.drawImage(bitmap, 0, 0, prevWidth, prevHeight, 0, 0, newWidth, newHeight); + prevWidth = newWidth; + prevHeight = newHeight; + if (bitmap !== originalBitmap) { + bitmap.close(); + } + bitmap = offscreen.transferToImageBitmap(); + } + const ratio = Math.min(maxDim / newWidth, maxDim / newHeight); + newWidth = Math.round(newWidth * ratio); + newHeight = Math.round(newHeight * ratio); + } + const offscreen = new OffscreenCanvas(newWidth, newHeight); + const ctx = offscreen.getContext("2d", { + willReadFrequently: true + }); + ctx.fillStyle = "white"; + ctx.fillRect(0, 0, newWidth, newHeight); + ctx.filter = "grayscale(1)"; + ctx.drawImage(bitmap, 0, 0, bitmap.width, bitmap.height, 0, 0, newWidth, newHeight); + const grayImage = ctx.getImageData(0, 0, newWidth, newHeight).data; + const uint8Buf = this.#toUint8(grayImage); + return [uint8Buf, newWidth, newHeight]; + } + static extractContoursFromText(text, { + fontFamily, + fontStyle, + fontWeight + }, pageWidth, pageHeight, rotation, innerMargin) { + let canvas = new OffscreenCanvas(1, 1); + let ctx = canvas.getContext("2d", { + alpha: false + }); + const fontSize = 200; + const font = ctx.font = `${fontStyle} ${fontWeight} ${fontSize}px ${fontFamily}`; + const { + actualBoundingBoxLeft, + actualBoundingBoxRight, + actualBoundingBoxAscent, + actualBoundingBoxDescent, + fontBoundingBoxAscent, + fontBoundingBoxDescent, + width + } = ctx.measureText(text); + const SCALE = 1.5; + const canvasWidth = Math.ceil(Math.max(Math.abs(actualBoundingBoxLeft) + Math.abs(actualBoundingBoxRight) || 0, width) * SCALE); + const canvasHeight = Math.ceil(Math.max(Math.abs(actualBoundingBoxAscent) + Math.abs(actualBoundingBoxDescent) || fontSize, Math.abs(fontBoundingBoxAscent) + Math.abs(fontBoundingBoxDescent) || fontSize) * SCALE); + canvas = new OffscreenCanvas(canvasWidth, canvasHeight); + ctx = canvas.getContext("2d", { + alpha: true, + willReadFrequently: true + }); + ctx.font = font; + ctx.filter = "grayscale(1)"; + ctx.fillStyle = "white"; + ctx.fillRect(0, 0, canvasWidth, canvasHeight); + ctx.fillStyle = "black"; + ctx.fillText(text, canvasWidth * (SCALE - 1) / 2, canvasHeight * (3 - SCALE) / 2); + const uint8Buf = this.#toUint8(ctx.getImageData(0, 0, canvasWidth, canvasHeight).data); + const histogram = this.#getHistogram(uint8Buf); + const threshold = this.#guessThreshold(histogram); + const contourList = this.#findContours(uint8Buf, canvasWidth, canvasHeight, threshold); + return this.processDrawnLines({ + lines: { + curves: contourList, + width: canvasWidth, + height: canvasHeight + }, + pageWidth, + pageHeight, + rotation, + innerMargin, + mustSmooth: true, + areContours: true + }); + } + static process(bitmap, pageWidth, pageHeight, rotation, innerMargin) { + const [uint8Buf, width, height] = this.#getGrayPixels(bitmap); + const [buffer, histogram] = this.#bilateralFilter(uint8Buf, width, height, Math.hypot(width, height) * this.#PARAMETERS.sigmaSFactor, this.#PARAMETERS.sigmaR, this.#PARAMETERS.kernelSize); + const threshold = this.#guessThreshold(histogram); + const contourList = this.#findContours(buffer, width, height, threshold); + return this.processDrawnLines({ + lines: { + curves: contourList, + width, + height + }, + pageWidth, + pageHeight, + rotation, + innerMargin, + mustSmooth: true, + areContours: true + }); + } + static processDrawnLines({ + lines, + pageWidth, + pageHeight, + rotation, + innerMargin, + mustSmooth, + areContours + }) { + if (rotation % 180 !== 0) { + [pageWidth, pageHeight] = [pageHeight, pageWidth]; + } + const { + curves, + width, + height + } = lines; + const thickness = lines.thickness ?? 0; + const linesAndPoints = []; + const ratio = Math.min(pageWidth / width, pageHeight / height); + const xScale = ratio / pageWidth; + const yScale = ratio / pageHeight; + const newCurves = []; + for (const { + points + } of curves) { + const reducedPoints = mustSmooth ? this.#douglasPeucker(points) : points; + if (!reducedPoints) { + continue; + } + newCurves.push(reducedPoints); + const len = reducedPoints.length; + const newPoints = new Float32Array(len); + const line = new Float32Array(3 * (len === 2 ? 2 : len - 2)); + linesAndPoints.push({ + line, + points: newPoints + }); + if (len === 2) { + newPoints[0] = reducedPoints[0] * xScale; + newPoints[1] = reducedPoints[1] * yScale; + line.set([NaN, NaN, NaN, NaN, newPoints[0], newPoints[1]], 0); + continue; + } + let [x1, y1, x2, y2] = reducedPoints; + x1 *= xScale; + y1 *= yScale; + x2 *= xScale; + y2 *= yScale; + newPoints.set([x1, y1, x2, y2], 0); + line.set([NaN, NaN, NaN, NaN, x1, y1], 0); + for (let i = 4; i < len; i += 2) { + const x = newPoints[i] = reducedPoints[i] * xScale; + const y = newPoints[i + 1] = reducedPoints[i + 1] * yScale; + line.set(Outline.createBezierPoints(x1, y1, x2, y2, x, y), (i - 2) * 3); + [x1, y1, x2, y2] = [x2, y2, x, y]; + } + } + if (linesAndPoints.length === 0) { + return null; + } + const outline = areContours ? new ContourDrawOutline() : new InkDrawOutline(); + outline.build(linesAndPoints, pageWidth, pageHeight, 1, rotation, areContours ? 0 : thickness, innerMargin); + return { + outline, + newCurves, + areContours, + thickness, + width, + height + }; + } + static async compressSignature({ + outlines, + areContours, + thickness, + width, + height + }) { + let minDiff = Infinity; + let maxDiff = -Infinity; + let outlinesLength = 0; + for (const points of outlines) { + outlinesLength += points.length; + for (let i = 2, ii = points.length; i < ii; i++) { + const dx = points[i] - points[i - 2]; + minDiff = Math.min(minDiff, dx); + maxDiff = Math.max(maxDiff, dx); + } + } + let bufferType; + if (minDiff >= -128 && maxDiff <= 127) { + bufferType = Int8Array; + } else if (minDiff >= -32768 && maxDiff <= 32767) { + bufferType = Int16Array; + } else { + bufferType = Int32Array; + } + const len = outlines.length; + const headerLength = BASE_HEADER_LENGTH + POINTS_PROPERTIES_NUMBER * len; + const header = new Uint32Array(headerLength); + let offset = 0; + header[offset++] = headerLength * Uint32Array.BYTES_PER_ELEMENT + (outlinesLength - 2 * len) * bufferType.BYTES_PER_ELEMENT; + header[offset++] = 0; + header[offset++] = width; + header[offset++] = height; + header[offset++] = areContours ? 0 : 1; + header[offset++] = Math.max(0, Math.floor(thickness ?? 0)); + header[offset++] = len; + header[offset++] = bufferType.BYTES_PER_ELEMENT; + for (const points of outlines) { + header[offset++] = points.length - 2; + header[offset++] = points[0]; + header[offset++] = points[1]; + } + const cs = new CompressionStream("deflate-raw"); + const writer = cs.writable.getWriter(); + await writer.ready; + writer.write(header); + const BufferCtor = bufferType.prototype.constructor; + for (const points of outlines) { + const diffs = new BufferCtor(points.length - 2); + for (let i = 2, ii = points.length; i < ii; i++) { + diffs[i - 2] = points[i] - points[i - 2]; + } + writer.write(diffs); + } + writer.close(); + const bytes = await new Response(cs.readable).bytes(); + return bytes.toBase64(); + } + static async decompressSignature(signatureData) { + try { + const bytes = Uint8Array.fromBase64(signatureData); + const { + readable, + writable + } = new DecompressionStream("deflate-raw"); + const writer = writable.getWriter(); + await writer.ready; + writer.write(bytes).then(async () => { + await writer.ready; + await writer.close(); + }).catch(() => {}); + let data = null; + let offset = 0; + for await (const chunk of readable) { + data ||= new Uint8Array(new Uint32Array(chunk.buffer, 0, 4)[0]); + data.set(chunk, offset); + offset += chunk.length; + } + const header = new Uint32Array(data.buffer, 0, data.length >> 2); + const version = header[1]; + if (version !== 0) { + throw new Error(`Invalid version: ${version}`); + } + const width = header[2]; + const height = header[3]; + const areContours = header[4] === 0; + const thickness = header[5]; + const numberOfDrawings = header[6]; + const bufferType = header[7]; + const outlines = []; + const diffsOffset = (BASE_HEADER_LENGTH + POINTS_PROPERTIES_NUMBER * numberOfDrawings) * Uint32Array.BYTES_PER_ELEMENT; + let diffs; + switch (bufferType) { + case Int8Array.BYTES_PER_ELEMENT: + diffs = new Int8Array(data.buffer, diffsOffset); + break; + case Int16Array.BYTES_PER_ELEMENT: + diffs = new Int16Array(data.buffer, diffsOffset); + break; + case Int32Array.BYTES_PER_ELEMENT: + diffs = new Int32Array(data.buffer, diffsOffset); + break; + } + offset = 0; + for (let i = 0; i < numberOfDrawings; i++) { + const len = header[POINTS_PROPERTIES_NUMBER * i + BASE_HEADER_LENGTH]; + const points = new Float32Array(len + 2); + outlines.push(points); + for (let j = 0; j < POINTS_PROPERTIES_NUMBER - 1; j++) { + points[j] = header[POINTS_PROPERTIES_NUMBER * i + BASE_HEADER_LENGTH + j + 1]; + } + for (let j = 0; j < len; j++) { + points[j + 2] = points[j] + diffs[offset++]; + } + } + return { + areContours, + thickness, + outlines, + width, + height + }; + } catch (e) { + warn(`decompressSignature: ${e}`); + return null; + } + } +} + +;// ./src/display/editor/signature.js + + + + + + + + + + + + +class SignatureOptions extends DrawingOptions { + constructor() { + super(); + super.updateProperties({ + fill: AnnotationEditor._defaultLineColor, + "stroke-width": 0 + }); + } + clone() { + const clone = new SignatureOptions(); + clone.updateAll(this); + return clone; + } +} +class DrawnSignatureOptions extends InkDrawingOptions { + constructor(viewerParameters) { + super(viewerParameters); + super.updateProperties({ + stroke: AnnotationEditor._defaultLineColor, + "stroke-width": 1 + }); + } + clone() { + const clone = new DrawnSignatureOptions(this._viewParameters); + clone.updateAll(this); + return clone; + } +} +class SignatureEditor extends DrawingEditor { + #isExtracted = false; + #description = null; + #signatureData = null; + #signatureUUID = null; + static _type = "signature"; + static _editorType = AnnotationEditorType.SIGNATURE; + static _defaultDrawingOptions = null; + constructor(params) { + super({ + ...params, + mustBeCommitted: true, + name: "signatureEditor" + }); + this._willKeepAspectRatio = true; + this.#signatureData = params.signatureData || null; + this.#description = null; + this.defaultL10nId = "pdfjs-editor-signature-editor1"; + } + static initialize(l10n, uiManager) { + AnnotationEditor.initialize(l10n, uiManager); + this._defaultDrawingOptions = new SignatureOptions(); + this._defaultDrawnSignatureOptions = new DrawnSignatureOptions(uiManager.viewParameters); + } + static getDefaultDrawingOptions(options) { + const clone = this._defaultDrawingOptions.clone(); + clone.updateProperties(options); + return clone; + } + static get supportMultipleDrawings() { + return false; + } + static get typesMap() { + return util_shadow(this, "typesMap", new Map()); + } + static get isDrawer() { + return false; + } + get telemetryFinalData() { + return { + type: "signature", + hasDescription: !!this.#description + }; + } + static computeTelemetryFinalData(data) { + const hasDescriptionStats = data.get("hasDescription"); + return { + hasAltText: hasDescriptionStats.get(true) ?? 0, + hasNoAltText: hasDescriptionStats.get(false) ?? 0 + }; + } + get isResizable() { + return true; + } + onScaleChanging() { + if (this._drawId === null) { + return; + } + super.onScaleChanging(); + } + render() { + if (this.div) { + return this.div; + } + let baseX, baseY; + const { + _isCopy + } = this; + if (_isCopy) { + this._isCopy = false; + baseX = this.x; + baseY = this.y; + } + super.render(); + if (this._drawId === null) { + if (this.#signatureData) { + const { + lines, + mustSmooth, + areContours, + description, + uuid, + heightInPage + } = this.#signatureData; + const { + rawDims: { + pageWidth, + pageHeight + }, + rotation + } = this.parent.viewport; + const outline = SignatureExtractor.processDrawnLines({ + lines, + pageWidth, + pageHeight, + rotation, + innerMargin: SignatureEditor._INNER_MARGIN, + mustSmooth, + areContours + }); + this.addSignature(outline, heightInPage, description, uuid); + } else { + this.div.setAttribute("data-l10n-args", JSON.stringify({ + description: "" + })); + this.div.hidden = true; + this._uiManager.getSignature(this); + } + } else { + this.div.setAttribute("data-l10n-args", JSON.stringify({ + description: this.#description || "" + })); + } + if (_isCopy) { + this._isCopy = true; + this._moveAfterPaste(baseX, baseY); + } + return this.div; + } + setUuid(uuid) { + this.#signatureUUID = uuid; + this.addEditToolbar(); + } + getUuid() { + return this.#signatureUUID; + } + get description() { + return this.#description; + } + set description(description) { + this.#description = description; + if (!this.div) { + return; + } + this.div.setAttribute("data-l10n-args", JSON.stringify({ + description + })); + super.addEditToolbar().then(toolbar => { + toolbar?.updateEditSignatureButton(description); + }); + } + getSignaturePreview() { + const { + newCurves, + areContours, + thickness, + width, + height + } = this.#signatureData; + const maxDim = Math.max(width, height); + const outlineData = SignatureExtractor.processDrawnLines({ + lines: { + curves: newCurves.map(points => ({ + points + })), + thickness, + width, + height + }, + pageWidth: maxDim, + pageHeight: maxDim, + rotation: 0, + innerMargin: 0, + mustSmooth: false, + areContours + }); + return { + areContours, + outline: outlineData.outline + }; + } + get toolbarButtons() { + return this._uiManager.signatureManager ? [["editSignature", this._uiManager.signatureManager]] : super.toolbarButtons; + } + addSignature(data, heightInPage, description, uuid) { + const { + x: savedX, + y: savedY + } = this; + const { + outline + } = this.#signatureData = data; + this.#isExtracted = outline instanceof ContourDrawOutline; + this.description = description; + let drawingOptions; + if (this.#isExtracted) { + drawingOptions = SignatureEditor.getDefaultDrawingOptions(); + } else { + drawingOptions = SignatureEditor._defaultDrawnSignatureOptions.clone(); + drawingOptions.updateProperties({ + "stroke-width": outline.thickness + }); + } + this._addOutlines({ + drawOutlines: outline, + drawingOptions + }); + const [, pageHeight] = this.pageDimensions; + let newHeight = heightInPage / pageHeight; + newHeight = newHeight >= 1 ? 0.5 : newHeight; + this.width *= newHeight / this.height; + if (this.width >= 1) { + newHeight *= 0.9 / this.width; + this.width = 0.9; + } + this.height = newHeight; + this.setDims(); + this.x = savedX; + this.y = savedY; + this.center(); + this._onResized(); + this.onScaleChanging(); + this.rotate(); + this._uiManager.addToAnnotationStorage(this); + this.setUuid(uuid); + this._reportTelemetry({ + action: "pdfjs.signature.inserted", + data: { + hasBeenSaved: !!uuid, + hasDescription: !!description + } + }); + this.div.hidden = false; + } + getFromImage(bitmap) { + const { + rawDims: { + pageWidth, + pageHeight + }, + rotation + } = this.parent.viewport; + return SignatureExtractor.process(bitmap, pageWidth, pageHeight, rotation, SignatureEditor._INNER_MARGIN); + } + getFromText(text, fontInfo) { + const { + rawDims: { + pageWidth, + pageHeight + }, + rotation + } = this.parent.viewport; + return SignatureExtractor.extractContoursFromText(text, fontInfo, pageWidth, pageHeight, rotation, SignatureEditor._INNER_MARGIN); + } + getDrawnSignature(curves) { + const { + rawDims: { + pageWidth, + pageHeight + }, + rotation + } = this.parent.viewport; + return SignatureExtractor.processDrawnLines({ + lines: curves, + pageWidth, + pageHeight, + rotation, + innerMargin: SignatureEditor._INNER_MARGIN, + mustSmooth: false, + areContours: false + }); + } + createDrawingOptions({ + areContours, + thickness + }) { + if (areContours) { + this._drawingOptions = SignatureEditor.getDefaultDrawingOptions(); + } else { + this._drawingOptions = SignatureEditor._defaultDrawnSignatureOptions.clone(); + this._drawingOptions.updateProperties({ + "stroke-width": thickness + }); + } + } + serialize(isForCopying = false) { + if (this.isEmpty()) { + return null; + } + const { + lines, + points + } = this.serializeDraw(isForCopying); + const { + _drawingOptions: { + "stroke-width": thickness + } + } = this; + const serialized = Object.assign(super.serialize(isForCopying), { + isSignature: true, + areContours: this.#isExtracted, + color: [0, 0, 0], + thickness: this.#isExtracted ? 0 : thickness + }); + this.addComment(serialized); + if (isForCopying) { + serialized.paths = { + lines, + points + }; + serialized.uuid = this.#signatureUUID; + serialized.isCopy = true; + } else { + serialized.lines = lines; + } + if (this.#description) { + serialized.accessibilityData = { + type: "Figure", + alt: this.#description + }; + } + return serialized; + } + static deserializeDraw(pageX, pageY, pageWidth, pageHeight, innerMargin, data) { + if (data.areContours) { + return ContourDrawOutline.deserialize(pageX, pageY, pageWidth, pageHeight, innerMargin, data); + } + return InkDrawOutline.deserialize(pageX, pageY, pageWidth, pageHeight, innerMargin, data); + } + static async deserialize(data, parent, uiManager) { + const editor = await super.deserialize(data, parent, uiManager); + editor.#isExtracted = data.areContours; + editor.description = data.accessibilityData?.alt || ""; + editor.#signatureUUID = data.uuid; + return editor; + } +} + +;// ./src/display/editor/stamp.js + + + + + + + + + +class StampEditor extends AnnotationEditor { + #bitmap = null; + #bitmapId = null; + #bitmapPromise = null; + #bitmapUrl = null; + #bitmapFile = null; + #bitmapFileName = ""; + #canvas = null; + #missingCanvas = false; + #resizeTimeoutId = null; + #isSvg = false; + #hasBeenAddedInUndoStack = false; + static _type = "stamp"; + static _editorType = AnnotationEditorType.STAMP; + constructor(params) { + super({ + ...params, + name: "stampEditor" + }); + this.#bitmapUrl = params.bitmapUrl; + this.#bitmapFile = params.bitmapFile; + this.defaultL10nId = "pdfjs-editor-stamp-editor"; + } + static initialize(l10n, uiManager) { + AnnotationEditor.initialize(l10n, uiManager); + } + static isHandlingMimeForPasting(mime) { + return SupportedImageMimeTypes.has(mime); + } + static paste(item, parent) { + parent.pasteEditor({ + mode: AnnotationEditorType.STAMP + }, { + bitmapFile: item.getAsFile() + }); + } + altTextFinish() { + if (this._uiManager.useNewAltTextFlow) { + this.div.hidden = false; + } + super.altTextFinish(); + } + get telemetryFinalData() { + return { + type: "stamp", + hasAltText: !!this.altTextData?.altText + }; + } + static computeTelemetryFinalData(data) { + const hasAltTextStats = data.get("hasAltText"); + return { + hasAltText: hasAltTextStats.get(true) ?? 0, + hasNoAltText: hasAltTextStats.get(false) ?? 0 + }; + } + #getBitmapFetched(data, fromId = false) { + if (!data) { + this.remove(); + return; + } + this.#bitmap = data.bitmap; + if (!fromId) { + this.#bitmapId = data.id; + this.#isSvg = data.isSvg; + } + if (data.file) { + this.#bitmapFileName = data.file.name; + } + this.#createCanvas(); + } + #getBitmapDone() { + this.#bitmapPromise = null; + this._uiManager.enableWaiting(false); + if (!this.#canvas) { + return; + } + if (this._uiManager.useNewAltTextWhenAddingImage && this._uiManager.useNewAltTextFlow && this.#bitmap) { + this.addEditToolbar().then(() => { + this._editToolbar.hide(); + this._uiManager.editAltText(this, true); + }); + return; + } + if (!this._uiManager.useNewAltTextWhenAddingImage && this._uiManager.useNewAltTextFlow && this.#bitmap) { + this._reportTelemetry({ + action: "pdfjs.image.image_added", + data: { + alt_text_modal: false, + alt_text_type: "empty" + } + }); + try { + this.mlGuessAltText(); + } catch {} + } + this.div.focus(); + } + async mlGuessAltText(imageData = null, updateAltTextData = true) { + if (this.hasAltTextData()) { + return null; + } + const { + mlManager + } = this._uiManager; + if (!mlManager) { + throw new Error("No ML."); + } + if (!(await mlManager.isEnabledFor("altText"))) { + throw new Error("ML isn't enabled for alt text."); + } + const { + data, + width, + height + } = imageData || this.copyCanvas(null, null, true).imageData; + const response = await mlManager.guess({ + name: "altText", + request: { + data, + width, + height, + channels: data.length / (width * height) + } + }); + if (!response) { + throw new Error("No response from the AI service."); + } + if (response.error) { + throw new Error("Error from the AI service."); + } + if (response.cancel) { + return null; + } + if (!response.output) { + throw new Error("No valid response from the AI service."); + } + const altText = response.output; + await this.setGuessedAltText(altText); + if (updateAltTextData && !this.hasAltTextData()) { + this.altTextData = { + alt: altText, + decorative: false + }; + } + return altText; + } + #getBitmap() { + if (this.#bitmapId) { + this._uiManager.enableWaiting(true); + this._uiManager.imageManager.getFromId(this.#bitmapId).then(data => this.#getBitmapFetched(data, true)).finally(() => this.#getBitmapDone()); + return; + } + if (this.#bitmapUrl) { + const url = this.#bitmapUrl; + this.#bitmapUrl = null; + this._uiManager.enableWaiting(true); + this.#bitmapPromise = this._uiManager.imageManager.getFromUrl(url).then(data => this.#getBitmapFetched(data)).finally(() => this.#getBitmapDone()); + return; + } + if (this.#bitmapFile) { + const file = this.#bitmapFile; + this.#bitmapFile = null; + this._uiManager.enableWaiting(true); + this.#bitmapPromise = this._uiManager.imageManager.getFromFile(file).then(data => this.#getBitmapFetched(data)).finally(() => this.#getBitmapDone()); + return; + } + const input = document.createElement("input"); + input.type = "file"; + input.accept = SupportedImageMimeTypes.keys().join(","); + const signal = this._uiManager._signal; + this.#bitmapPromise = new Promise(resolve => { + input.addEventListener("change", async () => { + if (!input.files || input.files.length === 0) { + this.remove(); + } else { + this._uiManager.enableWaiting(true); + const data = await this._uiManager.imageManager.getFromFile(input.files[0]); + this._reportTelemetry({ + action: "pdfjs.image.image_selected", + data: { + alt_text_modal: this._uiManager.useNewAltTextFlow + } + }); + this.#getBitmapFetched(data); + } + resolve(); + }, { + signal + }); + input.addEventListener("cancel", () => { + this.remove(); + resolve(); + }, { + signal + }); + }).finally(() => this.#getBitmapDone()); + input.click(); + } + remove() { + if (this.#bitmapId) { + this.#bitmap = null; + this._uiManager.imageManager.deleteId(this.#bitmapId); + this.#canvas?.remove(); + this.#canvas = null; + if (this.#resizeTimeoutId) { + clearTimeout(this.#resizeTimeoutId); + this.#resizeTimeoutId = null; + } + } + super.remove(); + } + rebuild() { + if (!this.parent) { + if (this.#bitmapId) { + this.#getBitmap(); + } + return; + } + super.rebuild(); + if (this.div === null) { + return; + } + if (this.#bitmapId && this.#canvas === null) { + this.#getBitmap(); + } + if (!this.isAttachedToDOM) { + this.parent.add(this); + } + } + onceAdded(focus) { + this._isDraggable = true; + if (focus) { + this.div.focus(); + } + } + isEmpty() { + return !(this.#bitmapPromise || this.#bitmap || this.#bitmapUrl || this.#bitmapFile || this.#bitmapId || this.#missingCanvas); + } + get toolbarButtons() { + return [["altText", this.createAltText()]]; + } + get isResizable() { + return true; + } + render() { + if (this.div) { + return this.div; + } + let baseX, baseY; + if (this._isCopy) { + baseX = this.x; + baseY = this.y; + } + super.render(); + this.div.hidden = true; + this.createAltText(); + if (!this.#missingCanvas) { + if (this.#bitmap) { + this.#createCanvas(); + } else { + this.#getBitmap(); + } + } + if (this._isCopy) { + this._moveAfterPaste(baseX, baseY); + } + this._uiManager.addShouldRescale(this); + return this.div; + } + setCanvas(annotationElementId, canvas) { + const { + id: bitmapId, + bitmap + } = this._uiManager.imageManager.getFromCanvas(annotationElementId, canvas); + canvas.remove(); + if (bitmapId && this._uiManager.imageManager.isValidId(bitmapId)) { + this.#bitmapId = bitmapId; + if (bitmap) { + this.#bitmap = bitmap; + } + this.#missingCanvas = false; + this.#createCanvas(); + } + } + _onResized() { + this.onScaleChanging(); + } + onScaleChanging() { + if (!this.parent) { + return; + } + if (this.#resizeTimeoutId !== null) { + clearTimeout(this.#resizeTimeoutId); + } + const TIME_TO_WAIT = 200; + this.#resizeTimeoutId = setTimeout(() => { + this.#resizeTimeoutId = null; + this.#drawBitmap(); + }, TIME_TO_WAIT); + } + #createCanvas() { + const { + div + } = this; + let { + width, + height + } = this.#bitmap; + const [pageWidth, pageHeight] = this.pageDimensions; + const MAX_RATIO = 0.75; + if (this.width) { + width = this.width * pageWidth; + height = this.height * pageHeight; + } else if (width > MAX_RATIO * pageWidth || height > MAX_RATIO * pageHeight) { + const factor = Math.min(MAX_RATIO * pageWidth / width, MAX_RATIO * pageHeight / height); + width *= factor; + height *= factor; + } + this._uiManager.enableWaiting(false); + const canvas = this.#canvas = document.createElement("canvas"); + canvas.setAttribute("role", "img"); + this.addContainer(canvas); + this.width = width / pageWidth; + this.height = height / pageHeight; + this.setDims(); + if (this._initialOptions?.isCentered) { + this.center(); + } else { + this.fixAndSetPosition(); + } + this._initialOptions = null; + if (!this._uiManager.useNewAltTextWhenAddingImage || !this._uiManager.useNewAltTextFlow || this.annotationElementId) { + div.hidden = false; + } + this.#drawBitmap(); + if (!this.#hasBeenAddedInUndoStack) { + this.parent.addUndoableEditor(this); + this.#hasBeenAddedInUndoStack = true; + } + this._reportTelemetry({ + action: "inserted_image" + }); + if (this.#bitmapFileName) { + this.div.setAttribute("aria-description", this.#bitmapFileName); + } + if (!this.annotationElementId) { + this._uiManager.a11yAlert(AnnotationEditor._l10nAlert.stamp); + } + } + copyCanvas(maxDataDimension, maxPreviewDimension, createImageData = false) { + maxDataDimension ||= 224; + const { + width: bitmapWidth, + height: bitmapHeight + } = this.#bitmap; + const outputScale = new OutputScale(); + let bitmap = this.#bitmap; + let width = bitmapWidth, + height = bitmapHeight; + let canvas = null; + if (maxPreviewDimension) { + if (bitmapWidth > maxPreviewDimension || bitmapHeight > maxPreviewDimension) { + const ratio = Math.min(maxPreviewDimension / bitmapWidth, maxPreviewDimension / bitmapHeight); + width = Math.floor(bitmapWidth * ratio); + height = Math.floor(bitmapHeight * ratio); + } + canvas = document.createElement("canvas"); + const scaledWidth = canvas.width = Math.ceil(width * outputScale.sx); + const scaledHeight = canvas.height = Math.ceil(height * outputScale.sy); + if (!this.#isSvg) { + bitmap = this.#scaleBitmap(scaledWidth, scaledHeight); + } + const ctx = canvas.getContext("2d"); + ctx.filter = this._uiManager.hcmFilter; + let white = "white", + black = "#cfcfd8"; + if (this._uiManager.hcmFilter !== "none") { + black = "black"; + } else if (ColorScheme.isDarkMode) { + white = "#8f8f9d"; + black = "#42414d"; + } + const boxDim = 15; + const boxDimWidth = boxDim * outputScale.sx; + const boxDimHeight = boxDim * outputScale.sy; + const pattern = new OffscreenCanvas(boxDimWidth * 2, boxDimHeight * 2); + const patternCtx = pattern.getContext("2d"); + patternCtx.fillStyle = white; + patternCtx.fillRect(0, 0, boxDimWidth * 2, boxDimHeight * 2); + patternCtx.fillStyle = black; + patternCtx.fillRect(0, 0, boxDimWidth, boxDimHeight); + patternCtx.fillRect(boxDimWidth, boxDimHeight, boxDimWidth, boxDimHeight); + ctx.fillStyle = ctx.createPattern(pattern, "repeat"); + ctx.fillRect(0, 0, scaledWidth, scaledHeight); + ctx.drawImage(bitmap, 0, 0, bitmap.width, bitmap.height, 0, 0, scaledWidth, scaledHeight); + } + let imageData = null; + if (createImageData) { + let dataWidth, dataHeight; + if (outputScale.symmetric && bitmap.width < maxDataDimension && bitmap.height < maxDataDimension) { + dataWidth = bitmap.width; + dataHeight = bitmap.height; + } else { + bitmap = this.#bitmap; + if (bitmapWidth > maxDataDimension || bitmapHeight > maxDataDimension) { + const ratio = Math.min(maxDataDimension / bitmapWidth, maxDataDimension / bitmapHeight); + dataWidth = Math.floor(bitmapWidth * ratio); + dataHeight = Math.floor(bitmapHeight * ratio); + if (!this.#isSvg) { + bitmap = this.#scaleBitmap(dataWidth, dataHeight); + } + } + } + const offscreen = new OffscreenCanvas(dataWidth, dataHeight); + const offscreenCtx = offscreen.getContext("2d", { + willReadFrequently: true + }); + offscreenCtx.drawImage(bitmap, 0, 0, bitmap.width, bitmap.height, 0, 0, dataWidth, dataHeight); + imageData = { + width: dataWidth, + height: dataHeight, + data: offscreenCtx.getImageData(0, 0, dataWidth, dataHeight).data + }; + } + return { + canvas, + width, + height, + imageData + }; + } + #scaleBitmap(width, height) { + const { + width: bitmapWidth, + height: bitmapHeight + } = this.#bitmap; + let newWidth = bitmapWidth; + let newHeight = bitmapHeight; + let bitmap = this.#bitmap; + while (newWidth > 2 * width || newHeight > 2 * height) { + const prevWidth = newWidth; + const prevHeight = newHeight; + if (newWidth > 2 * width) { + newWidth = Math.ceil(newWidth / 2); + } + if (newHeight > 2 * height) { + newHeight = Math.ceil(newHeight / 2); + } + const offscreen = new OffscreenCanvas(newWidth, newHeight); + const ctx = offscreen.getContext("2d"); + ctx.drawImage(bitmap, 0, 0, prevWidth, prevHeight, 0, 0, newWidth, newHeight); + bitmap = offscreen.transferToImageBitmap(); + } + return bitmap; + } + #drawBitmap() { + const [parentWidth, parentHeight] = this.parentDimensions; + const { + width, + height + } = this; + const outputScale = new OutputScale(); + const scaledWidth = Math.ceil(width * parentWidth * outputScale.sx); + const scaledHeight = Math.ceil(height * parentHeight * outputScale.sy); + const canvas = this.#canvas; + if (!canvas || canvas.width === scaledWidth && canvas.height === scaledHeight) { + return; + } + canvas.width = scaledWidth; + canvas.height = scaledHeight; + const bitmap = this.#isSvg ? this.#bitmap : this.#scaleBitmap(scaledWidth, scaledHeight); + const ctx = canvas.getContext("2d"); + ctx.filter = this._uiManager.hcmFilter; + ctx.drawImage(bitmap, 0, 0, bitmap.width, bitmap.height, 0, 0, scaledWidth, scaledHeight); + } + #serializeBitmap(toUrl) { + if (toUrl) { + if (this.#isSvg) { + const url = this._uiManager.imageManager.getSvgUrl(this.#bitmapId); + if (url) { + return url; + } + } + const canvas = document.createElement("canvas"); + ({ + width: canvas.width, + height: canvas.height + } = this.#bitmap); + const ctx = canvas.getContext("2d"); + ctx.drawImage(this.#bitmap, 0, 0); + return canvas.toDataURL(); + } + if (this.#isSvg) { + const [pageWidth, pageHeight] = this.pageDimensions; + const width = Math.round(this.width * pageWidth * PixelsPerInch.PDF_TO_CSS_UNITS); + const height = Math.round(this.height * pageHeight * PixelsPerInch.PDF_TO_CSS_UNITS); + const offscreen = new OffscreenCanvas(width, height); + const ctx = offscreen.getContext("2d"); + ctx.drawImage(this.#bitmap, 0, 0, this.#bitmap.width, this.#bitmap.height, 0, 0, width, height); + return offscreen.transferToImageBitmap(); + } + return structuredClone(this.#bitmap); + } + static async deserialize(data, parent, uiManager) { + let initialData = null; + let missingCanvas = false; + if (data instanceof StampAnnotationElement) { + const { + data: { + rect, + rotation, + id, + structParent, + popupRef, + richText, + contentsObj, + creationDate, + modificationDate + }, + container, + parent: { + page: { + pageNumber + } + }, + canvas + } = data; + let bitmapId, bitmap; + if (canvas) { + delete data.canvas; + ({ + id: bitmapId, + bitmap + } = uiManager.imageManager.getFromCanvas(container.id, canvas)); + canvas.remove(); + } else { + missingCanvas = true; + data._hasNoCanvas = true; + } + const altText = (await parent._structTree.getAriaAttributes(`${AnnotationPrefix}${id}`))?.get("aria-label") || ""; + initialData = data = { + annotationType: AnnotationEditorType.STAMP, + bitmapId, + bitmap, + pageIndex: pageNumber - 1, + rect: rect.slice(0), + rotation, + annotationElementId: id, + id, + deleted: false, + accessibilityData: { + decorative: false, + altText + }, + isSvg: false, + structParent, + popupRef, + richText, + comment: contentsObj?.str || null, + creationDate, + modificationDate + }; + } + const editor = await super.deserialize(data, parent, uiManager); + const { + rect, + bitmap, + bitmapUrl, + bitmapId, + isSvg, + accessibilityData + } = data; + if (missingCanvas) { + uiManager.addMissingCanvas(data.id, editor); + editor.#missingCanvas = true; + } else if (bitmapId && uiManager.imageManager.isValidId(bitmapId)) { + editor.#bitmapId = bitmapId; + if (bitmap) { + editor.#bitmap = bitmap; + } + } else { + editor.#bitmapUrl = bitmapUrl; + } + editor.#isSvg = isSvg; + const [parentWidth, parentHeight] = editor.pageDimensions; + editor.width = (rect[2] - rect[0]) / parentWidth; + editor.height = (rect[3] - rect[1]) / parentHeight; + if (accessibilityData) { + editor.altTextData = accessibilityData; + } + editor._initialData = initialData; + if (data.comment) { + editor.setCommentData(data); + } + editor.#hasBeenAddedInUndoStack = !!initialData; + return editor; + } + serialize(isForCopying = false, context = null) { + if (this.isEmpty()) { + return null; + } + if (this.deleted) { + return this.serializeDeleted(); + } + const serialized = Object.assign(super.serialize(isForCopying), { + bitmapId: this.#bitmapId, + isSvg: this.#isSvg + }); + this.addComment(serialized); + if (isForCopying) { + serialized.bitmapUrl = this.#serializeBitmap(true); + serialized.accessibilityData = this.serializeAltText(true); + serialized.isCopy = true; + return serialized; + } + const { + decorative, + altText + } = this.serializeAltText(false); + if (!decorative && altText) { + serialized.accessibilityData = { + type: "Figure", + alt: altText + }; + } + if (this.annotationElementId) { + const changes = this.#hasElementChanged(serialized); + if (changes.isSame) { + return null; + } + if (changes.isSameAltText) { + delete serialized.accessibilityData; + } else { + serialized.accessibilityData.structParent = this._initialData.structParent ?? -1; + } + serialized.id = this.annotationElementId; + delete serialized.bitmapId; + return serialized; + } + if (context === null) { + return serialized; + } + context.stamps ||= new Map(); + const area = this.#isSvg ? (serialized.rect[2] - serialized.rect[0]) * (serialized.rect[3] - serialized.rect[1]) : null; + if (!context.stamps.has(this.#bitmapId)) { + context.stamps.set(this.#bitmapId, { + area, + serialized + }); + serialized.bitmap = this.#serializeBitmap(false); + } else if (this.#isSvg) { + const prevData = context.stamps.get(this.#bitmapId); + if (area > prevData.area) { + prevData.area = area; + prevData.serialized.bitmap.close(); + prevData.serialized.bitmap = this.#serializeBitmap(false); + } + } + return serialized; + } + #hasElementChanged(serialized) { + const { + pageIndex, + accessibilityData: { + altText + } + } = this._initialData; + const isSamePageIndex = serialized.pageIndex === pageIndex; + const isSameAltText = (serialized.accessibilityData?.alt || "") === altText; + return { + isSame: !this.hasEditedComment && !this._hasBeenMoved && !this._hasBeenResized && isSamePageIndex && isSameAltText, + isSameAltText + }; + } + renderAnnotationElement(annotation) { + if (this.deleted) { + annotation.hide(); + return null; + } + annotation.updateEdited({ + rect: this.getPDFRect(), + popup: this.comment + }); + return null; + } +} + +;// ./src/display/editor/annotation_editor_layer.js + + + + + + + + + + + + + + + + + + +class AnnotationEditorLayer { + #accessibilityManager; + #allowClick = false; + #annotationLayer = null; + #clickAC = null; + #editorFocusTimeoutId = null; + #editors = new Map(); + #hadPointerDown = false; + #isDisabling = false; + #isEnabling = false; + #drawingAC = null; + #focusedElement = null; + #textLayer = null; + #textSelectionAC = null; + #textLayerDblClickAC = null; + #lastPointerDownTimestamp = -1; + #uiManager; + static _initialized = false; + static #editorTypes = new Map([FreeTextEditor, InkEditor, StampEditor, HighlightEditor, SignatureEditor].map(type => [type._editorType, type])); + constructor({ + uiManager, + pageIndex, + div, + structTreeLayer, + accessibilityManager, + annotationLayer, + drawLayer, + textLayer, + viewport, + l10n + }) { + const editorTypes = [...AnnotationEditorLayer.#editorTypes.values()]; + if (!AnnotationEditorLayer._initialized) { + AnnotationEditorLayer._initialized = true; + for (const editorType of editorTypes) { + editorType.initialize(l10n, uiManager); + } + } + uiManager.registerEditorTypes(editorTypes); + this.#uiManager = uiManager; + this.pageIndex = pageIndex; + this.div = div; + this.#accessibilityManager = accessibilityManager; + this.#annotationLayer = annotationLayer; + this.viewport = viewport; + this.#textLayer = textLayer; + this.drawLayer = drawLayer; + this._structTree = structTreeLayer; + this.#uiManager.addLayer(this); + } + get isEmpty() { + return this.#editors.size === 0; + } + get isInvisible() { + return this.isEmpty && this.#uiManager.getMode() === AnnotationEditorType.NONE; + } + updateToolbar(options) { + this.#uiManager.updateToolbar(options); + } + updateMode(mode = this.#uiManager.getMode()) { + this.#cleanup(); + switch (mode) { + case AnnotationEditorType.NONE: + this.div.classList.toggle("nonEditing", true); + this.disableTextSelection(); + this.togglePointerEvents(false); + this.toggleAnnotationLayerPointerEvents(true); + this.disableClick(); + return; + case AnnotationEditorType.INK: + this.disableTextSelection(); + this.togglePointerEvents(true); + this.enableClick(); + break; + case AnnotationEditorType.HIGHLIGHT: + this.enableTextSelection(); + this.togglePointerEvents(false); + this.disableClick(); + break; + default: + this.disableTextSelection(); + this.togglePointerEvents(true); + this.enableClick(); + } + this.toggleAnnotationLayerPointerEvents(false); + const { + classList + } = this.div; + classList.toggle("nonEditing", false); + if (mode === AnnotationEditorType.POPUP) { + classList.toggle("commentEditing", true); + } else { + classList.toggle("commentEditing", false); + for (const editorType of AnnotationEditorLayer.#editorTypes.values()) { + classList.toggle(`${editorType._type}Editing`, mode === editorType._editorType); + } + } + this.div.hidden = false; + } + hasTextLayer(textLayer) { + return textLayer === this.#textLayer?.div; + } + setEditingState(isEditing) { + this.#uiManager.setEditingState(isEditing); + } + addCommands(params) { + this.#uiManager.addCommands(params); + } + cleanUndoStack(type) { + this.#uiManager.cleanUndoStack(type); + } + toggleDrawing(enabled = false) { + this.div.classList.toggle("drawing", !enabled); + } + togglePointerEvents(enabled = false) { + this.div.classList.toggle("disabled", !enabled); + } + toggleAnnotationLayerPointerEvents(enabled = false) { + this.#annotationLayer?.togglePointerEvents(enabled); + } + get #allEditorsIterator() { + return this.#editors.size !== 0 ? this.#editors.values() : this.#uiManager.getEditors(this.pageIndex); + } + async enable() { + this.#isEnabling = true; + this.div.tabIndex = 0; + this.togglePointerEvents(true); + this.div.classList.toggle("nonEditing", false); + this.#textLayerDblClickAC?.abort(); + this.#textLayerDblClickAC = null; + const annotationElementIds = new Set(); + for (const editor of this.#allEditorsIterator) { + editor.enableEditing(); + editor.show(true); + if (editor.annotationElementId) { + this.#uiManager.removeChangedExistingAnnotation(editor); + annotationElementIds.add(editor.annotationElementId); + } + } + const annotationLayer = this.#annotationLayer; + if (annotationLayer) { + for (const editable of annotationLayer.getEditableAnnotations()) { + editable.hide(); + if (this.#uiManager.isDeletedAnnotationElement(editable.data.id) || annotationElementIds.has(editable.data.id)) { + continue; + } + const editor = await this.deserialize(editable); + if (!editor) { + continue; + } + this.addOrRebuild(editor); + editor.enableEditing(); + } + } + this.#isEnabling = false; + this.#uiManager._eventBus.dispatch("editorsrendered", { + source: this, + pageNumber: this.pageIndex + 1 + }); + } + disable() { + this.#isDisabling = true; + this.div.tabIndex = -1; + this.togglePointerEvents(false); + this.div.classList.toggle("nonEditing", true); + if (this.#textLayer && !this.#textLayerDblClickAC) { + this.#textLayerDblClickAC = new AbortController(); + const signal = this.#uiManager.combinedSignal(this.#textLayerDblClickAC); + this.#textLayer.div.addEventListener("pointerdown", e => { + const DBL_CLICK_THRESHOLD = 500; + const { + clientX, + clientY, + timeStamp + } = e; + const lastPointerDownTimestamp = this.#lastPointerDownTimestamp; + if (timeStamp - lastPointerDownTimestamp > DBL_CLICK_THRESHOLD) { + this.#lastPointerDownTimestamp = timeStamp; + return; + } + this.#lastPointerDownTimestamp = -1; + const { + classList + } = this.div; + classList.toggle("getElements", true); + const elements = document.elementsFromPoint(clientX, clientY); + classList.toggle("getElements", false); + if (!this.div.contains(elements[0])) { + return; + } + let id; + const regex = new RegExp(`^${AnnotationEditorPrefix}[0-9]+$`); + for (const element of elements) { + if (regex.test(element.id)) { + id = element.id; + break; + } + } + if (!id) { + return; + } + const editor = this.#editors.get(id); + if (editor?.annotationElementId === null) { + stopEvent(e); + editor.dblclick(e); + } + }, { + signal, + capture: true + }); + } + const annotationLayer = this.#annotationLayer; + const needFakeAnnotation = []; + if (annotationLayer) { + const changedAnnotations = new Map(); + const resetAnnotations = new Map(); + for (const editor of this.#allEditorsIterator) { + editor.disableEditing(); + if (!editor.annotationElementId) { + needFakeAnnotation.push(editor); + continue; + } + if (editor.serialize() !== null) { + changedAnnotations.set(editor.annotationElementId, editor); + continue; + } else { + resetAnnotations.set(editor.annotationElementId, editor); + } + this.getEditableAnnotation(editor.annotationElementId)?.show(); + editor.remove(); + } + for (const editable of annotationLayer.getEditableAnnotations()) { + const { + id + } = editable.data; + if (this.#uiManager.isDeletedAnnotationElement(id)) { + editable.updateEdited({ + deleted: true + }); + continue; + } + let editor = resetAnnotations.get(id); + if (editor) { + editor.resetAnnotationElement(editable); + editor.show(false); + editable.show(); + continue; + } + editor = changedAnnotations.get(id); + if (editor) { + this.#uiManager.addChangedExistingAnnotation(editor); + if (editor.renderAnnotationElement(editable)) { + editor.show(false); + } + } + editable.show(); + } + } + this.#cleanup(); + if (this.isEmpty) { + this.div.hidden = true; + } + const { + classList + } = this.div; + for (const editorType of AnnotationEditorLayer.#editorTypes.values()) { + classList.remove(`${editorType._type}Editing`); + } + this.disableTextSelection(); + this.toggleAnnotationLayerPointerEvents(true); + annotationLayer?.updateFakeAnnotations(needFakeAnnotation); + this.#isDisabling = false; + } + getEditableAnnotation(id) { + return this.#annotationLayer?.getEditableAnnotation(id) || null; + } + setActiveEditor(editor) { + const currentActive = this.#uiManager.getActive(); + if (currentActive === editor) { + return; + } + this.#uiManager.setActiveEditor(editor); + } + enableTextSelection() { + this.div.tabIndex = -1; + if (this.#textLayer?.div && !this.#textSelectionAC) { + this.#textSelectionAC = new AbortController(); + const signal = this.#uiManager.combinedSignal(this.#textSelectionAC); + this.#textLayer.div.addEventListener("pointerdown", this.#textLayerPointerDown.bind(this), { + signal + }); + this.#textLayer.div.classList.add("highlighting"); + } + } + disableTextSelection() { + this.div.tabIndex = 0; + if (this.#textLayer?.div && this.#textSelectionAC) { + this.#textSelectionAC.abort(); + this.#textSelectionAC = null; + this.#textLayer.div.classList.remove("highlighting"); + } + } + #textLayerPointerDown(event) { + this.#uiManager.unselectAll(); + const { + target + } = event; + if (target === this.#textLayer.div || (target.getAttribute("role") === "img" || target.classList.contains("endOfContent") || target.classList.contains("textLayerImages") || target.classList.contains("textLayerImagePlaceholder")) && this.#textLayer.div.contains(target)) { + const { + isMac + } = FeatureTest.platform; + if (event.button !== 0 || event.ctrlKey && isMac) { + return; + } + this.#uiManager.showAllEditors("highlight", true, true); + HighlightEditor.startDrawing(this, this.#uiManager, this.#uiManager.direction === "ltr", event); + event.preventDefault(); + } + } + enableClick() { + if (this.#clickAC) { + return; + } + this.#clickAC = new AbortController(); + const signal = this.#uiManager.combinedSignal(this.#clickAC); + this.div.addEventListener("pointerdown", this.pointerdown.bind(this), { + signal + }); + const pointerup = this.pointerup.bind(this); + this.div.addEventListener("pointerup", pointerup, { + signal + }); + this.div.addEventListener("pointercancel", pointerup, { + signal + }); + } + disableClick() { + this.#clickAC?.abort(); + this.#clickAC = null; + } + attach(editor) { + this.#editors.set(editor.id, editor); + const { + annotationElementId + } = editor; + if (annotationElementId && this.#uiManager.isDeletedAnnotationElement(annotationElementId)) { + this.#uiManager.removeDeletedAnnotationElement(editor); + } + } + detach(editor) { + this.#editors.delete(editor.id); + this.#accessibilityManager?.removePointerInTextLayer(editor.contentDiv); + if (!this.#isDisabling && editor.annotationElementId) { + this.#uiManager.addDeletedAnnotationElement(editor); + } + } + remove(editor) { + this.detach(editor); + this.#uiManager.removeEditor(editor); + editor.div.remove(); + editor.isAttachedToDOM = false; + } + changeParent(editor) { + if (editor.parent === this) { + return; + } + if (editor.parent && editor.annotationElementId) { + this.#uiManager.addDeletedAnnotationElement(editor); + AnnotationEditor.deleteAnnotationElement(editor); + editor.annotationElementId = null; + } + this.attach(editor); + editor.parent?.detach(editor); + editor.setParent(this); + if (editor.div && editor.isAttachedToDOM) { + editor.div.remove(); + this.div.append(editor.div); + } + } + add(editor) { + if (editor.parent === this && editor.isAttachedToDOM) { + return; + } + this.changeParent(editor); + this.#uiManager.addEditor(editor); + this.attach(editor); + if (!editor.isAttachedToDOM) { + const div = editor.render(); + this.div.append(div); + editor.isAttachedToDOM = true; + } + editor.fixAndSetPosition(); + editor.onceAdded(!this.#isEnabling); + this.#uiManager.addToAnnotationStorage(editor); + editor._reportTelemetry(editor.telemetryInitialData); + } + moveEditorInDOM(editor) { + if (!editor.isAttachedToDOM) { + return; + } + const { + activeElement + } = document; + if (editor.div.contains(activeElement) && !this.#editorFocusTimeoutId) { + editor._focusEventsAllowed = false; + this.#editorFocusTimeoutId = setTimeout(() => { + this.#editorFocusTimeoutId = null; + if (!editor.div.contains(document.activeElement)) { + editor.div.addEventListener("focusin", () => { + editor._focusEventsAllowed = true; + }, { + once: true, + signal: this.#uiManager._signal + }); + activeElement.focus(); + } else { + editor._focusEventsAllowed = true; + } + }, 0); + } + editor._structTreeParentId = this.#accessibilityManager?.moveElementInDOM(this.div, editor.div, editor.contentDiv, true); + } + addOrRebuild(editor) { + if (editor.needsToBeRebuilt()) { + editor.parent ||= this; + editor.rebuild(); + editor.show(); + } else { + this.add(editor); + } + } + addUndoableEditor(editor) { + const cmd = () => editor._uiManager.rebuild(editor); + const undo = () => { + editor.remove(); + }; + this.addCommands({ + cmd, + undo, + mustExec: false + }); + } + getEditorByUID(uid) { + for (const editor of this.#editors.values()) { + if (editor.uid === uid) { + return editor; + } + } + return null; + } + get #currentEditorType() { + return AnnotationEditorLayer.#editorTypes.get(this.#uiManager.getMode()); + } + combinedSignal(ac) { + return this.#uiManager.combinedSignal(ac); + } + #createNewEditor(params) { + const editorType = this.#currentEditorType; + return editorType ? new editorType.prototype.constructor(params) : null; + } + canCreateNewEmptyEditor() { + return this.#currentEditorType?.canCreateNewEmptyEditor(); + } + async pasteEditor(options, params) { + this.updateToolbar(options); + await this.#uiManager.updateMode(options.mode); + const { + offsetX, + offsetY + } = this.#getCenterPoint(); + const id = this.#uiManager.getId(); + const editor = this.#createNewEditor({ + parent: this, + id, + x: offsetX, + y: offsetY, + uiManager: this.#uiManager, + isCentered: true, + ...params + }); + if (editor) { + this.add(editor); + } + } + async deserialize(data) { + return (await AnnotationEditorLayer.#editorTypes.get(data.annotationType ?? data.annotationEditorType)?.deserialize(data, this, this.#uiManager)) || null; + } + createAndAddNewEditor(event, isCentered, data = {}) { + const id = this.#uiManager.getId(); + const editor = this.#createNewEditor({ + parent: this, + id, + x: event.offsetX, + y: event.offsetY, + uiManager: this.#uiManager, + isCentered, + ...data + }); + if (editor) { + this.add(editor); + } + return editor; + } + get boundingClientRect() { + return this.div.getBoundingClientRect(); + } + #getCenterPoint() { + const { + x, + y, + width, + height + } = this.boundingClientRect; + const tlX = Math.max(0, x); + const tlY = Math.max(0, y); + const brX = Math.min(window.innerWidth, x + width); + const brY = Math.min(window.innerHeight, y + height); + const centerX = (tlX + brX) / 2 - x; + const centerY = (tlY + brY) / 2 - y; + const [offsetX, offsetY] = this.viewport.rotation % 180 === 0 ? [centerX, centerY] : [centerY, centerX]; + return { + offsetX, + offsetY + }; + } + addNewEditor(data = {}) { + this.createAndAddNewEditor(this.#getCenterPoint(), true, data); + } + setSelected(editor) { + this.#uiManager.setSelected(editor); + } + toggleSelected(editor) { + this.#uiManager.toggleSelected(editor); + } + unselect(editor) { + this.#uiManager.unselect(editor); + } + pointerup(event) { + const { + isMac + } = FeatureTest.platform; + if (event.button !== 0 || event.ctrlKey && isMac) { + return; + } + if (event.target !== this.div) { + return; + } + if (!this.#hadPointerDown) { + return; + } + this.#hadPointerDown = false; + if (this.#currentEditorType?.isDrawer && this.#currentEditorType.supportMultipleDrawings) { + return; + } + if (!this.#allowClick) { + this.#allowClick = true; + return; + } + const currentMode = this.#uiManager.getMode(); + if (currentMode === AnnotationEditorType.STAMP || currentMode === AnnotationEditorType.POPUP || currentMode === AnnotationEditorType.SIGNATURE) { + this.#uiManager.unselectAll(); + return; + } + this.createAndAddNewEditor(event, false); + } + pointerdown(event) { + if (this.#uiManager.getMode() === AnnotationEditorType.HIGHLIGHT) { + this.enableTextSelection(); + } + if (this.#hadPointerDown) { + this.#hadPointerDown = false; + return; + } + const { + isMac + } = FeatureTest.platform; + if (event.button !== 0 || event.ctrlKey && isMac) { + return; + } + if (event.target !== this.div) { + return; + } + this.#hadPointerDown = true; + if (this.#currentEditorType?.isDrawer) { + this.startDrawingSession(event); + return; + } + const editor = this.#uiManager.getActive(); + this.#allowClick = !editor || editor.isEmpty(); + } + startDrawingSession(event) { + this.div.focus({ + preventScroll: true + }); + if (this.#drawingAC) { + this.#currentEditorType.startDrawing(this, this.#uiManager, false, event); + return; + } + this.#uiManager.setCurrentDrawingSession(this); + this.#drawingAC = new AbortController(); + const signal = this.#uiManager.combinedSignal(this.#drawingAC); + this.div.addEventListener("blur", ({ + relatedTarget + }) => { + if (relatedTarget && !this.div.contains(relatedTarget)) { + this.#focusedElement = null; + this.commitOrRemove(); + } + }, { + signal + }); + this.#currentEditorType.startDrawing(this, this.#uiManager, false, event); + } + pause(on) { + if (on) { + const { + activeElement + } = document; + if (this.div.contains(activeElement)) { + this.#focusedElement = activeElement; + } + return; + } + if (this.#focusedElement) { + setTimeout(() => { + this.#focusedElement?.focus(); + this.#focusedElement = null; + }, 0); + } + } + endDrawingSession(isAborted = false) { + if (!this.#drawingAC) { + return null; + } + this.#uiManager.setCurrentDrawingSession(null); + this.#drawingAC.abort(); + this.#drawingAC = null; + this.#focusedElement = null; + return this.#currentEditorType.endDrawing(isAborted); + } + findNewParent(editor, x, y) { + const layer = this.#uiManager.findParent(x, y); + if (layer === null || layer === this) { + return false; + } + layer.changeParent(editor); + return true; + } + commitOrRemove() { + if (this.#drawingAC) { + this.endDrawingSession(); + return true; + } + return false; + } + onScaleChanging() { + if (!this.#drawingAC) { + return; + } + this.#currentEditorType.onScaleChangingWhenDrawing(this); + } + destroy() { + this.commitOrRemove(); + if (this.#uiManager.getActive()?.parent === this) { + this.#uiManager.commitOrRemove(); + this.#uiManager.setActiveEditor(null); + } + if (this.#editorFocusTimeoutId) { + clearTimeout(this.#editorFocusTimeoutId); + this.#editorFocusTimeoutId = null; + } + for (const editor of this.#editors.values()) { + this.#accessibilityManager?.removePointerInTextLayer(editor.contentDiv); + editor.setParent(null); + editor.isAttachedToDOM = false; + editor.div.remove(); + } + this.div = null; + this.#editors.clear(); + this.#uiManager.removeLayer(this); + } + #cleanup() { + for (const editor of this.#editors.values()) { + if (editor.isEmpty()) { + editor.remove(); + } + } + } + async render({ + viewport + }) { + this.viewport = viewport; + setLayerDimensions(this.div, viewport); + for (const editor of this.#uiManager.getEditors(this.pageIndex)) { + this.add(editor); + editor.rebuild(); + } + await this.#uiManager.findClonesForPage(this); + this.div.hidden = this.isEmpty; + this.updateMode(); + } + update({ + viewport + }) { + this.#uiManager.commitOrRemove(); + this.#cleanup(); + const oldRotation = this.viewport.rotation; + const rotation = viewport.rotation; + this.viewport = viewport; + setLayerDimensions(this.div, { + rotation + }); + if (oldRotation !== rotation) { + for (const editor of this.#editors.values()) { + editor.rotate(rotation); + } + } + } + get pageDimensions() { + const { + pageWidth, + pageHeight + } = this.viewport.rawDims; + return [pageWidth, pageHeight]; + } + get scale() { + return this.#uiManager.viewParameters.realScale; + } +} + +;// ./node_modules/core-js/modules/es.iterator.to-array.js +es_iterator_to_array_namespaceFn(); + +;// ./src/display/draw_layer.js + + + + + + + + + + + + + + + + + + +function compareTextLayers(a, b) { + if (a === b) { + return 0; + } + return a.compareDocumentPosition(b) & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1; +} +function getTextLayer(node) { + if (!node) { + return null; + } + return node.nodeType === Node.ELEMENT_NODE ? node.closest(".textLayer") : node.parentElement?.closest(".textLayer") || null; +} +function isPointBefore(nodeA, offsetA, nodeB, offsetB) { + if (nodeA === nodeB) { + return offsetA <= offsetB; + } + const relation = nodeA.compareDocumentPosition(nodeB); + if (relation & Node.DOCUMENT_POSITION_FOLLOWING) { + return true; + } + if (relation & Node.DOCUMENT_POSITION_PRECEDING) { + return false; + } + return null; +} +function normalizeEdgeBoundary(container, offset, textLayer) { + if (container.nodeType !== Node.ELEMENT_NODE || !container.classList.contains("textLayer") || offset !== container.childNodes.length) { + return { + container, + offset + }; + } + let lastNode = container.lastChild; + if (lastNode?.nodeType === Node.ELEMENT_NODE && lastNode.classList.contains("endOfContent")) { + lastNode = lastNode.previousSibling; + } + if (!lastNode || !textLayer.contains(lastNode)) { + return null; + } + return lastNode.nodeType === Node.TEXT_NODE ? { + container: lastNode, + offset: lastNode.textContent.length + } : { + container: lastNode, + offset: lastNode.childNodes.length + }; +} +class DrawLayer { + #parent = null; + #mapping = new Map(); + #textLayer = null; + #filterFactory = null; + #pageColors = null; + #textLayerObserver = null; + #toUpdate = new Map(); + static #id = 0; + static #selectionId = 0; + static #selectionChangeAC = null; + static #selections = new Set(); + static #isSelecting = false; + static #textLayerSet = new Set(); + static #textLayers = new WeakMap(); + constructor({ + filterFactory = null, + pageColors = null, + pageIndex, + textLayer = null + }) { + this.pageIndex = pageIndex; + this.#filterFactory = filterFactory; + this.#pageColors = pageColors; + if (textLayer) { + const previousData = DrawLayer.#textLayers.get(textLayer); + if (previousData?.selectionDiv) { + previousData.selectionDiv.remove(); + DrawLayer.#selections.delete(previousData.selectionDiv); + } + DrawLayer.#textLayers.set(textLayer, { + drawLayer: this + }); + DrawLayer.#textLayerSet.add(textLayer); + this.#textLayer = textLayer; + this.#textLayerObserver = new MutationObserver(records => { + if (!this.#parent || !this.#textLayer?.isConnected || !DrawLayer.#hasSelection()) { + return; + } + for (const { + addedNodes + } of records) { + for (const node of addedNodes) { + if (node.nodeType === Node.ELEMENT_NODE && node.classList.contains("endOfContent")) { + DrawLayer.#selectionChange(); + return; + } + } + } + }); + this.#textLayerObserver.observe(textLayer, { + childList: true + }); + if (DrawLayer.#selectionChangeAC === null) { + DrawLayer.#selectionChangeAC = new AbortController(); + const { + signal + } = DrawLayer.#selectionChangeAC; + document.addEventListener("selectionchange", DrawLayer.#selectionChange.bind(DrawLayer), { + signal + }); + document.addEventListener("pointerdown", () => { + DrawLayer.#isSelecting = true; + }, { + signal + }); + document.addEventListener("pointerup", () => { + DrawLayer.#isSelecting = false; + }, { + signal + }); + window.addEventListener("blur", () => { + DrawLayer.#isSelecting = false; + }, { + signal + }); + } + } + } + setParent(parent) { + if (!this.#parent) { + this.#parent = parent; + if (this.#textLayer?.isConnected && DrawLayer.#hasSelection()) { + DrawLayer.#selectionChange(); + } + return; + } + if (this.#parent !== parent) { + if (this.#mapping.size > 0) { + for (const root of this.#mapping.values()) { + root.remove(); + parent.append(root); + } + } + this.#parent = parent; + } + } + static #cleanupTextLayerSelection(textLayer) { + const textLayerData = this.#textLayers.get(textLayer); + if (!textLayerData?.selectionDiv) { + return; + } + textLayerData.selectionDiv.remove(); + this.#selections.delete(textLayerData.selectionDiv); + textLayerData.selectionDiv = null; + textLayerData.path = null; + } + static #hasSelection() { + const selection = document.getSelection(); + return !!selection && !selection.isCollapsed; + } + static #getOrderedTextLayers() { + return this.#textLayerSet.keys().filter(textLayer => textLayer.isConnected).toArray().sort(compareTextLayers); + } + static #selectionChange() { + const selection = document.getSelection(); + if (!selection || selection.isCollapsed) { + for (const root of this.#selections) { + root.remove(); + } + this.#selections.clear(); + return; + } + const rotators = new WeakMap(); + const orderedTextLayers = this.#getOrderedTextLayers(); + const ranges = []; + for (let i = 0, ii = selection.rangeCount; i < ii; i++) { + const range = selection.getRangeAt(i); + if (range.collapsed) { + continue; + } + let { + startContainer, + startOffset, + endContainer, + endOffset + } = range; + let startTextLayer = getTextLayer(startContainer); + let endTextLayer = getTextLayer(endContainer); + const startMissing = startTextLayer === null; + const endMissing = endTextLayer === null; + if (this.#isSelecting && startMissing !== endMissing) { + return; + } + if (selection.rangeCount === 1) { + const { + anchorNode, + anchorOffset, + focusNode, + focusOffset + } = selection; + const anchorLayer = getTextLayer(anchorNode); + const focusLayer = getTextLayer(focusNode); + const anchorBeforeFocus = isPointBefore(anchorNode, anchorOffset, focusNode, focusOffset); + if (anchorLayer && focusLayer && anchorBeforeFocus !== null) { + if (anchorBeforeFocus) { + startContainer = anchorNode; + startOffset = anchorOffset; + startTextLayer = anchorLayer; + endContainer = focusNode; + endOffset = focusOffset; + endTextLayer = focusLayer; + } else { + startContainer = focusNode; + startOffset = focusOffset; + startTextLayer = focusLayer; + endContainer = anchorNode; + endOffset = anchorOffset; + endTextLayer = anchorLayer; + } + } + } + const activeTextLayers = orderedTextLayers.filter(textLayer => range.intersectsNode(textLayer)); + if (activeTextLayers.length === 0) { + continue; + } + let boundarySubstituted = false; + if (!startTextLayer) { + startTextLayer = activeTextLayers[0]; + startContainer = startTextLayer; + startOffset = 0; + boundarySubstituted = true; + } + if (!endTextLayer) { + endTextLayer = activeTextLayers.at(-1); + endContainer = endTextLayer; + endOffset = endTextLayer.childNodes.length; + boundarySubstituted = true; + } + if (endContainer.nodeType === Node.ELEMENT_NODE) { + if (endContainer.classList.contains("endOfContent")) { + const previousNode = endContainer.previousSibling; + if (!previousNode) { + continue; + } + endContainer = previousNode; + endOffset = previousNode.nodeType === Node.TEXT_NODE ? previousNode.textContent.length : previousNode.childNodes.length; + } else if (endContainer.classList.contains("textLayer") && endContainer.childNodes.length === endOffset) { + const normalizedEnd = normalizeEdgeBoundary(endContainer, endOffset, endTextLayer); + if (!normalizedEnd) { + continue; + } + endContainer = normalizedEnd.container; + endOffset = normalizedEnd.offset; + } + } + if (startContainer.nodeType === Node.ELEMENT_NODE) { + const normalizedStart = normalizeEdgeBoundary(startContainer, startOffset, startTextLayer); + if (!normalizedStart) { + continue; + } + startContainer = normalizedStart.container; + startOffset = normalizedStart.offset; + } + if (startTextLayer === endTextLayer && !boundarySubstituted && activeTextLayers.includes(startTextLayer)) { + ranges.push([range, startTextLayer]); + continue; + } + for (const textLayer of activeTextLayers) { + const firstNode = textLayer.firstChild; + if (!firstNode) { + continue; + } + const subRange = document.createRange(); + if (textLayer === startTextLayer) { + subRange.setStart(startContainer, startOffset); + } else { + subRange.setStartBefore(firstNode); + } + if (textLayer === endTextLayer) { + subRange.setEnd(endContainer, endOffset); + } else { + const lastNode = textLayer.lastChild; + if (!lastNode) { + continue; + } + if (lastNode.nodeType === Node.ELEMENT_NODE && lastNode.classList.contains("endOfContent")) { + const lastTextNode = lastNode.previousSibling; + if (!lastTextNode) { + continue; + } + subRange.setEndAfter(lastTextNode); + } else { + subRange.setEndAfter(lastNode); + } + } + if (!subRange.collapsed) { + ranges.push([subRange, textLayer]); + } + } + } + const selectedTextLayers = new Set(ranges.map(range => range[1])); + for (const textLayer of this.#textLayerSet) { + if (!selectedTextLayers.has(textLayer)) { + this.#cleanupTextLayerSelection(textLayer); + } + } + for (const [range, textLayer] of ranges) { + const textLayerData = DrawLayer.#textLayers.get(textLayer); + if (!textLayerData) { + continue; + } + let rotator = rotators.get(textLayer); + if (!rotator) { + const clientRect = textLayer.getBoundingClientRect(); + rotator = (x, y, w, h) => ({ + x: (x - clientRect.x) / clientRect.width, + y: (y - clientRect.y) / clientRect.height, + width: w / clientRect.width, + height: h / clientRect.height + }); + rotators.set(textLayer, rotator); + } + const boxes = []; + for (let { + x, + y, + width, + height + } of range.getClientRects()) { + if (width === 0 || height === 0) { + continue; + } + ({ + x, + y, + width, + height + } = rotator(x, y, width, height)); + if (width === 1 && height === 1) { + continue; + } + boxes.push(`M${x} ${y} h${width} v${height} h-${width} Z`); + } + if (boxes.length === 0) { + continue; + } + const drawLayer = textLayerData.drawLayer; + let div = textLayerData.selectionDiv; + let path = textLayerData.path; + if (!div) { + const clipPathId = `clip_selection_${DrawLayer.#selectionId++}`; + div = document.createElement("div"); + div.className = "selection"; + div.style.clipPath = `url(#${clipPathId})`; + const selectionStyle = drawLayer.#filterFactory?.createSelectionStyle(drawLayer.#pageColors); + if (selectionStyle) { + for (const [name, value] of Object.entries(selectionStyle)) { + div.style.setProperty(name, value); + } + } + const svg = DrawLayer._svgFactory.create(1, 1, true); + svg.setAttribute("aria-hidden", "true"); + svg.setAttribute("width", "100%"); + svg.setAttribute("height", "100%"); + const clipPath = DrawLayer._svgFactory.createElement("clipPath"); + clipPath.setAttribute("id", clipPathId); + clipPath.setAttribute("clipPathUnits", "objectBoundingBox"); + path = DrawLayer._svgFactory.createElement("path"); + clipPath.append(path); + svg.append(clipPath); + div.append(svg); + textLayerData.path = path; + textLayerData.selectionDiv = div; + } + if (drawLayer.#parent && div.parentNode !== drawLayer.#parent) { + drawLayer.#parent.append(div); + this.#selections.add(div); + } + path.setAttribute("d", boxes.join(" ")); + } + } + static get _svgFactory() { + return util_shadow(this, "_svgFactory", new DOMSVGFactory()); + } + static #setBox(element, [x, y, width, height]) { + const { + style + } = element; + style.top = `${100 * y}%`; + style.left = `${100 * x}%`; + style.width = `${100 * width}%`; + style.height = `${100 * height}%`; + } + #createSVG() { + const svg = DrawLayer._svgFactory.create(1, 1, true); + this.#parent.append(svg); + svg.setAttribute("aria-hidden", "true"); + return svg; + } + #createClipPath(defs, pathId) { + const clipPath = DrawLayer._svgFactory.createElement("clipPath"); + defs.append(clipPath); + const clipPathId = `clip_${pathId}`; + clipPath.setAttribute("id", clipPathId); + clipPath.setAttribute("clipPathUnits", "objectBoundingBox"); + const clipPathUse = DrawLayer._svgFactory.createElement("use"); + clipPath.append(clipPathUse); + clipPathUse.setAttribute("href", `#${pathId}`); + clipPathUse.classList.add("clip"); + return clipPathId; + } + #updateProperties(element, properties) { + for (const [key, value] of Object.entries(properties)) { + if (value === null) { + element.removeAttribute(key); + } else { + element.setAttribute(key, value); + } + } + } + draw(properties, isPathUpdatable = false, hasClip = false) { + const id = DrawLayer.#id++; + const root = this.#createSVG(); + const defs = DrawLayer._svgFactory.createElement("defs"); + root.append(defs); + const path = DrawLayer._svgFactory.createElement("path"); + defs.append(path); + const pathId = `path_${id}`; + path.setAttribute("id", pathId); + path.setAttribute("vector-effect", "non-scaling-stroke"); + if (isPathUpdatable) { + this.#toUpdate.set(id, path); + } + const clipPathId = hasClip ? this.#createClipPath(defs, pathId) : null; + const use = DrawLayer._svgFactory.createElement("use"); + root.append(use); + use.setAttribute("href", `#${pathId}`); + this.updateProperties(root, properties); + this.#mapping.set(id, root); + return { + id, + clipPathId: `url(#${clipPathId})` + }; + } + drawOutline(properties, mustRemoveSelfIntersections) { + const id = DrawLayer.#id++; + const root = this.#createSVG(); + const defs = DrawLayer._svgFactory.createElement("defs"); + root.append(defs); + const path = DrawLayer._svgFactory.createElement("path"); + defs.append(path); + const pathId = `path_${id}`; + path.setAttribute("id", pathId); + path.setAttribute("vector-effect", "non-scaling-stroke"); + let maskId; + if (mustRemoveSelfIntersections) { + const mask = DrawLayer._svgFactory.createElement("mask"); + defs.append(mask); + maskId = `mask_${id}`; + mask.setAttribute("id", maskId); + mask.setAttribute("maskUnits", "objectBoundingBox"); + const rect = DrawLayer._svgFactory.createElement("rect"); + mask.append(rect); + rect.setAttribute("width", "1"); + rect.setAttribute("height", "1"); + rect.setAttribute("fill", "white"); + const use = DrawLayer._svgFactory.createElement("use"); + mask.append(use); + use.setAttribute("href", `#${pathId}`); + use.setAttribute("stroke", "none"); + use.setAttribute("fill", "black"); + use.setAttribute("fill-rule", "nonzero"); + use.classList.add("mask"); + } + const use1 = DrawLayer._svgFactory.createElement("use"); + root.append(use1); + use1.setAttribute("href", `#${pathId}`); + if (maskId) { + use1.setAttribute("mask", `url(#${maskId})`); + } + const use2 = use1.cloneNode(); + root.append(use2); + use1.classList.add("mainOutline"); + use2.classList.add("secondaryOutline"); + this.updateProperties(root, properties); + this.#mapping.set(id, root); + return id; + } + finalizeDraw(id, properties) { + this.#toUpdate.delete(id); + this.updateProperties(id, properties); + } + updateProperties(elementOrId, properties) { + if (!properties) { + return; + } + const { + root, + bbox, + rootClass, + path + } = properties; + const element = typeof elementOrId === "number" ? this.#mapping.get(elementOrId) : elementOrId; + if (!element) { + return; + } + if (root) { + this.#updateProperties(element, root); + } + if (bbox) { + DrawLayer.#setBox(element, bbox); + } + if (rootClass) { + const { + classList + } = element; + for (const [className, value] of Object.entries(rootClass)) { + classList.toggle(className, value); + } + } + if (path) { + const defs = element.firstElementChild; + const pathElement = defs.firstElementChild; + this.#updateProperties(pathElement, path); + } + } + updateParent(id, layer) { + if (layer === this) { + return; + } + const root = this.#mapping.get(id); + if (!root) { + return; + } + layer.#parent.append(root); + this.#mapping.delete(id); + layer.#mapping.set(id, root); + } + remove(id) { + this.#toUpdate.delete(id); + if (this.#parent === null) { + return; + } + this.#mapping.get(id).remove(); + this.#mapping.delete(id); + } + destroy() { + this.#parent = null; + for (const root of this.#mapping.values()) { + root.remove(); + } + this.#mapping.clear(); + this.#toUpdate.clear(); + this.#textLayerObserver?.disconnect(); + this.#textLayerObserver = null; + if (this.#textLayer) { + const data = DrawLayer.#textLayers.get(this.#textLayer); + if (data?.drawLayer === this) { + DrawLayer.#cleanupTextLayerSelection(this.#textLayer); + DrawLayer.#textLayers.delete(this.#textLayer); + DrawLayer.#textLayerSet.delete(this.#textLayer); + if (DrawLayer.#textLayerSet.size === 0) { + DrawLayer.#selectionChangeAC?.abort(); + DrawLayer.#selectionChangeAC = null; + DrawLayer.#isSelecting = false; + } + } + this.#textLayer = null; + } + } +} + +;// ./src/display/text_layer_images.js + + + +function percentage(value) { + return `${(value * 100).toFixed(2)}%`; +} +class TextLayerImages { + #coordinates = []; + #coordinatesByElement = new Map(); + #getPageCanvas = null; + #minSize = 0; + #pageWidth = 0; + #pageHeight = 0; + static #activeImage = null; + constructor(minSize, coordinates, viewport, getPageCanvas) { + this.#minSize = minSize; + this.#coordinates = coordinates; + this.#pageWidth = viewport.rawDims.pageWidth; + this.#pageHeight = viewport.rawDims.pageHeight; + this.#getPageCanvas = getPageCanvas; + } + render() { + const container = document.createElement("div"); + container.className = "textLayerImages"; + for (let i = 0; i < this.#coordinates.length; i += 6) { + const el = this.#createImagePlaceholder(this.#coordinates.subarray(i, i + 6)); + if (el) { + container.append(el); + } + } + container.addEventListener("contextmenu", event => { + if (!(event.target instanceof HTMLCanvasElement)) { + return; + } + const imgElement = event.target; + const coords = this.#coordinatesByElement.get(imgElement); + if (!coords) { + return; + } + const activeImage = TextLayerImages.#activeImage?.deref(); + if (activeImage === imgElement) { + return; + } + if (activeImage) { + activeImage.width = 0; + activeImage.height = 0; + } + TextLayerImages.#activeImage = new WeakRef(imgElement); + const { + inverseTransform, + x1, + y1, + width, + height + } = coords; + const pageCanvas = this.#getPageCanvas(); + const imageX1 = Math.ceil(x1 * pageCanvas.width); + const imageY1 = Math.ceil(y1 * pageCanvas.height); + const imageX2 = Math.floor((x1 + width / this.#pageWidth) * pageCanvas.width); + const imageY2 = Math.floor((y1 + height / this.#pageHeight) * pageCanvas.height); + imgElement.width = imageX2 - imageX1; + imgElement.height = imageY2 - imageY1; + const ctx = imgElement.getContext("2d"); + ctx.setTransform(...inverseTransform); + ctx.translate(-imageX1, -imageY1); + ctx.drawImage(pageCanvas, 0, 0); + }); + return container; + } + #createImagePlaceholder([x1, y1, x2, y2, x3, y3]) { + const width = Math.hypot((x3 - x1) * this.#pageWidth, (y3 - y1) * this.#pageHeight); + const height = Math.hypot((x2 - x1) * this.#pageWidth, (y2 - y1) * this.#pageHeight); + if (width < this.#minSize || height < this.#minSize) { + return null; + } + const transform = [(x3 - x1) * this.#pageWidth / width, (y3 - y1) * this.#pageHeight / width, (x2 - x1) * this.#pageWidth / height, (y2 - y1) * this.#pageHeight / height, 0, 0]; + const inverseTransform = Util.inverseTransform(transform); + const imgElement = document.createElement("canvas"); + imgElement.className = "textLayerImagePlaceholder"; + imgElement.width = 0; + imgElement.height = 0; + Object.assign(imgElement.style, { + opacity: 0, + position: "absolute", + left: percentage(x1), + top: percentage(y1), + width: percentage(width / this.#pageWidth), + height: percentage(height / this.#pageHeight), + transformOrigin: "0% 0%", + transform: `matrix(${transform.join(",")})` + }); + this.#coordinatesByElement.set(imgElement, { + inverseTransform, + width, + height, + x1, + y1 + }); + return imgElement; + } +} + +;// ./src/pdf.js + + + + + + + + + + + + + + + + + + +{ + globalThis._pdfjsTestingUtils = { + HighlightOutliner: HighlightOutliner + }; +} +globalThis.pdfjsLib = { + AbortException: AbortException, + AnnotationEditorLayer: AnnotationEditorLayer, + AnnotationEditorParamsType: AnnotationEditorParamsType, + AnnotationEditorType: AnnotationEditorType, + AnnotationEditorUIManager: AnnotationEditorUIManager, + AnnotationLayer: AnnotationLayer, + AnnotationMode: AnnotationMode, + AnnotationType: AnnotationType, + applyOpacity: applyOpacity, + build: build, + ColorPicker: ColorPicker, + createValidAbsoluteUrl: createValidAbsoluteUrl, + CSSConstants: CSSConstants, + DOMSVGFactory: DOMSVGFactory, + DrawLayer: DrawLayer, + FeatureTest: FeatureTest, + fetchData: fetchData, + findContrastColor: findContrastColor, + getDocument: getDocument, + getFilenameFromUrl: getFilenameFromUrl, + getPdfFilenameFromUrl: getPdfFilenameFromUrl, + getRGB: getRGB, + getRGBA: getRGBA, + getUuid: getUuid, + GlobalWorkerOptions: GlobalWorkerOptions, + ImageKind: ImageKind, + InvalidPDFException: InvalidPDFException, + isDataScheme: isDataScheme, + isPdfFile: isPdfFile, + isValidExplicitDest: isValidExplicitDest, + makeArr: makeArr, + makeMap: makeMap, + makeObj: makeObj, + makeSet: makeSet, + MathClamp: MathClamp, + noContextMenu: noContextMenu, + normalizeUnicode: normalizeUnicode, + OPS: OPS, + OutputScale: OutputScale, + PasswordException: PasswordException, + PasswordResponses: PasswordResponses, + PDFDataRangeTransport: PDFDataRangeTransport, + PDFDateString: PDFDateString, + PDFWorker: PDFWorker, + PermissionFlag: PermissionFlag, + PixelsPerInch: PixelsPerInch, + RenderingCancelledException: RenderingCancelledException, + renderRichText: renderRichText, + ResponseException: ResponseException, + setLayerDimensions: setLayerDimensions, + shadow: util_shadow, + SignatureExtractor: SignatureExtractor, + stopEvent: stopEvent, + SupportedImageMimeTypes: SupportedImageMimeTypes, + TextLayer: TextLayer, + TextLayerImages: TextLayerImages, + TouchManager: TouchManager, + updateUrlHash: updateUrlHash, + Util: Util, + VerbosityLevel: VerbosityLevel, + version: api_version, + XfaLayer: XfaLayer +}; + +export { AbortException, AnnotationEditorLayer, AnnotationEditorParamsType, AnnotationEditorType, AnnotationEditorUIManager, AnnotationLayer, AnnotationMode, AnnotationType, CSSConstants, ColorPicker, DOMSVGFactory, DrawLayer, FeatureTest, GlobalWorkerOptions, ImageKind, InvalidPDFException, MathClamp, OPS, OutputScale, PDFDataRangeTransport, PDFDateString, PDFWorker, PasswordException, PasswordResponses, PermissionFlag, PixelsPerInch, RenderingCancelledException, ResponseException, SignatureExtractor, SupportedImageMimeTypes, TextLayer, TextLayerImages, TouchManager, Util, VerbosityLevel, XfaLayer, applyOpacity, build, createValidAbsoluteUrl, fetchData, findContrastColor, getDocument, getFilenameFromUrl, getPdfFilenameFromUrl, getRGB, getRGBA, getUuid, isDataScheme, isPdfFile, isValidExplicitDest, makeArr, makeMap, makeObj, makeSet, noContextMenu, normalizeUnicode, renderRichText, setLayerDimensions, util_shadow as shadow, stopEvent, updateUrlHash, api_version as version }; + +//# sourceMappingURL=pdf.mjs.map \ No newline at end of file diff --git a/public/assets/vendor/pdfjs-6.4.299/build/pdf.sandbox.mjs b/public/assets/vendor/pdfjs-6.4.299/build/pdf.sandbox.mjs new file mode 100644 index 000000000..fdf245b67 --- /dev/null +++ b/public/assets/vendor/pdfjs-6.4.299/build/pdf.sandbox.mjs @@ -0,0 +1,2502 @@ +/** + * @licstart The following is the entire license notice for the + * JavaScript code in this page + * + * 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * @licend The above is the entire license notice for the + * JavaScript code in this page + */ + +/** + * pdfjsVersion = 6.4.299 + * pdfjsBuild = d0991a0d5 + */ +/******/ var __webpack_modules__ = ({ + +/***/ 306 +(module, __unused_webpack_exports, __webpack_require__) { + + +var isCallable = __webpack_require__(901); +var tryToString = __webpack_require__(823); + +var $TypeError = TypeError; + +// `Assert: IsCallable(argument) is true` +module.exports = function (argument) { + if (isCallable(argument)) return argument; + throw new $TypeError(tryToString(argument) + ' is not a function'); +}; + + +/***/ }, + +/***/ 576 +(module, __unused_webpack_exports, __webpack_require__) { + + +var uncurryThis = __webpack_require__(504); + +var toString = uncurryThis({}.toString); +var stringSlice = uncurryThis(''.slice); + +module.exports = function (it) { + return stringSlice(toString(it), 8, -1); +}; + + +/***/ }, + +/***/ 837 +(module) { + + +var $TypeError = TypeError; +var MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF; // 2 ** 53 - 1 == 9007199254740991 + +module.exports = function (it) { + if (it > MAX_SAFE_INTEGER) throw new $TypeError('Maximum allowed index exceeded'); + return it; +}; + + +/***/ }, + +/***/ 39 +(module) { + + +module.exports = function (exec) { + try { + return !!exec(); + } catch (error) { + return true; + } +}; + + +/***/ }, + +/***/ 616 +(module, __unused_webpack_exports, __webpack_require__) { + + +var fails = __webpack_require__(39); + +module.exports = !fails(function () { + // eslint-disable-next-line es/no-function-prototype-bind -- safe + var test = function () { /* empty */ }.bind(); + // eslint-disable-next-line no-prototype-builtins -- safe + return typeof test != 'function' || test.hasOwnProperty('prototype'); +}); + + +/***/ }, + +/***/ 504 +(module, __unused_webpack_exports, __webpack_require__) { + + +var NATIVE_BIND = __webpack_require__(616); + +var FunctionPrototype = Function.prototype; +var call = FunctionPrototype.call; +// eslint-disable-next-line es/no-function-prototype-bind -- safe +var uncurryThisWithBind = NATIVE_BIND && FunctionPrototype.bind.bind(call, call); + +module.exports = NATIVE_BIND ? uncurryThisWithBind : function (fn) { + return function () { + return call.apply(fn, arguments); + }; +}; + + +/***/ }, + +/***/ 966 +(module, __unused_webpack_exports, __webpack_require__) { + + +var aCallable = __webpack_require__(306); +var isNullOrUndefined = __webpack_require__(117); + +// `GetMethod` abstract operation +// https://tc39.es/ecma262/#sec-getmethod +module.exports = function (V, P) { + var func = V[P]; + return isNullOrUndefined(func) ? undefined : aCallable(func); +}; + + +/***/ }, + +/***/ 55 +(module, __unused_webpack_exports, __webpack_require__) { + + +var uncurryThis = __webpack_require__(504); +var fails = __webpack_require__(39); +var classof = __webpack_require__(576); + +var $Object = Object; +var split = uncurryThis(''.split); + +// fallback for non-array-like ES3 and non-enumerable old V8 strings +module.exports = fails(function () { + // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346 + // eslint-disable-next-line no-prototype-builtins -- safe + return !$Object('z').propertyIsEnumerable(0); +}) ? function (it) { + return classof(it) === 'String' ? split(it, '') : $Object(it); +} : $Object; + + +/***/ }, + +/***/ 376 +(module, __unused_webpack_exports, __webpack_require__) { + + +var classof = __webpack_require__(576); + +// `IsArray` abstract operation +// https://tc39.es/ecma262/#sec-isarray +// eslint-disable-next-line es/no-array-isarray -- safe +module.exports = Array.isArray || function isArray(argument) { + return classof(argument) === 'Array'; +}; + + +/***/ }, + +/***/ 901 +(module) { + + +// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot +var documentAll = typeof document == 'object' && document.all; + +// `IsCallable` abstract operation +// https://tc39.es/ecma262/#sec-iscallable +// eslint-disable-next-line unicorn/no-typeof-undefined -- required for testing +module.exports = typeof documentAll == 'undefined' && documentAll !== undefined ? function (argument) { + return typeof argument == 'function' || argument === documentAll; +} : function (argument) { + return typeof argument == 'function'; +}; + + +/***/ }, + +/***/ 796 +(module, __unused_webpack_exports, __webpack_require__) { + + +var fails = __webpack_require__(39); +var isCallable = __webpack_require__(901); + +var replacement = /#|\.prototype\./; + +var isForced = function (feature, detection) { + var value = data[normalize(feature)]; + return value === POLYFILL ? true + : value === NATIVE ? false + : isCallable(detection) ? fails(detection) + : !!detection; +}; + +var normalize = isForced.normalize = function (string) { + return String(string).replace(replacement, '.').toLowerCase(); +}; + +var data = isForced.data = {}; +var NATIVE = isForced.NATIVE = 'N'; +var POLYFILL = isForced.POLYFILL = 'P'; + +module.exports = isForced; + + +/***/ }, + +/***/ 117 +(module) { + + +// we can't use just `it == null` since of `document.all` special case +// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot-aec +module.exports = function (it) { + return it === null || it === undefined; +}; + + +/***/ }, + +/***/ 395 +(module) { + + +module.exports = false; + + +/***/ }, + +/***/ 248 +(module, __unused_webpack_exports, __webpack_require__) { + + +var uncurryThis = __webpack_require__(504); + +// eslint-disable-next-line es/no-map -- safe +var MapPrototype = Map.prototype; + +module.exports = { + // eslint-disable-next-line es/no-map -- safe + Map: Map, + set: uncurryThis(MapPrototype.set), + get: uncurryThis(MapPrototype.get), + has: uncurryThis(MapPrototype.has), + remove: uncurryThis(MapPrototype['delete']), + proto: MapPrototype +}; + + +/***/ }, + +/***/ 741 +(module) { + + +var ceil = Math.ceil; +var floor = Math.floor; + +// `Math.trunc` method +// https://tc39.es/ecma262/#sec-math.trunc +// eslint-disable-next-line es/no-math-trunc -- safe +module.exports = Math.trunc || function trunc(x) { + var n = +x; + return (n > 0 ? floor : ceil)(n); +}; + + +/***/ }, + +/***/ 819 +(module, __unused_webpack_exports, __webpack_require__) { + + +/* eslint-disable es/no-json -- safe */ +var fails = __webpack_require__(39); + +module.exports = !fails(function () { + var unsafeInt = '9007199254740993'; + // eslint-disable-next-line es/no-json-rawjson -- feature detection + var raw = JSON.rawJSON(unsafeInt); + // eslint-disable-next-line es/no-json-israwjson -- feature detection + return !JSON.isRawJSON(raw) || JSON.stringify(raw) !== unsafeInt; +}); + + +/***/ }, + +/***/ 717 +(__unused_webpack_module, exports) { + + +// eslint-disable-next-line es/no-object-getownpropertysymbols -- safe +exports.f = Object.getOwnPropertySymbols; + + +/***/ }, + +/***/ 625 +(module, __unused_webpack_exports, __webpack_require__) { + + +var uncurryThis = __webpack_require__(504); + +module.exports = uncurryThis({}.isPrototypeOf); + + +/***/ }, + +/***/ 750 +(module, __unused_webpack_exports, __webpack_require__) { + + +var isNullOrUndefined = __webpack_require__(117); + +var $TypeError = TypeError; + +// `RequireObjectCoercible` abstract operation +// https://tc39.es/ecma262/#sec-requireobjectcoercible +module.exports = function (it) { + if (isNullOrUndefined(it)) throw new $TypeError("Can't call method on " + it); + return it; +}; + + +/***/ }, + +/***/ 240 +(module, __unused_webpack_exports, __webpack_require__) { + + +var uncurryThis = __webpack_require__(504); + +// `thisNumberValue` abstract operation +// https://tc39.es/ecma262/#sec-thisnumbervalue +module.exports = uncurryThis(1.1.valueOf); + + +/***/ }, + +/***/ 291 +(module, __unused_webpack_exports, __webpack_require__) { + + +var trunc = __webpack_require__(741); + +// `ToIntegerOrInfinity` abstract operation +// https://tc39.es/ecma262/#sec-tointegerorinfinity +module.exports = function (argument) { + var number = +argument; + // eslint-disable-next-line no-self-compare -- NaN check + return number !== number || number === 0 ? 0 : trunc(number); +}; + + +/***/ }, + +/***/ 14 +(module, __unused_webpack_exports, __webpack_require__) { + + +var toIntegerOrInfinity = __webpack_require__(291); + +var min = Math.min; + +// `ToLength` abstract operation +// https://tc39.es/ecma262/#sec-tolength +module.exports = function (argument) { + var len = toIntegerOrInfinity(argument); + return len > 0 ? min(len, 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991 +}; + + +/***/ }, + +/***/ 981 +(module, __unused_webpack_exports, __webpack_require__) { + + +var requireObjectCoercible = __webpack_require__(750); + +var $Object = Object; + +// `ToObject` abstract operation +// https://tc39.es/ecma262/#sec-toobject +module.exports = function (argument) { + return $Object(requireObjectCoercible(argument)); +}; + + +/***/ }, + +/***/ 823 +(module) { + + +var $String = String; + +module.exports = function (argument) { + try { + return $String(argument); + } catch (error) { + return 'Object'; + } +}; + + +/***/ }, + +/***/ 392 +(module, __unused_webpack_exports, __webpack_require__) { + + +var uncurryThis = __webpack_require__(504); + +var id = 0; +var postfix = Math.random(); +var toString = uncurryThis(1.1.toString); + +module.exports = function (key) { + return 'Symbol(' + (key === undefined ? '' : key) + ')_' + toString(++id + postfix, 36); +}; + + +/***/ } + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ const __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ const cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ const module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/concatenation wrap */ +/******/ // wrap a concatenated module body as a lazy, memoized accessor; mod is +/******/ // set before the body runs so re-entrant calls (require cycles) observe +/******/ // the partial exports like Node.js +/******/ __webpack_require__.cw = (body) => { +/******/ var mod; +/******/ return () => { +/******/ if (body) { +/******/ var fn = body; +/******/ body = 0; +/******/ mod = { exports: {} }; +/******/ fn.call(mod.exports, mod, mod.exports); +/******/ } +/******/ return mod.exports; +/******/ }; +/******/ }; +/******/ +/******/ /* webpack/runtime/define property getters */ +/******/ // define getter/value 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] }); +/******/ } +/******/ } +/******/ }; +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)); +/******/ +/************************************************************************/ + +// EXTERNAL MODULE: ./node_modules/core-js/internals/a-callable.js +var a_callable_namespaceFn = () => { + return __webpack_require__(306); +}; + +// MODULE: ./node_modules/core-js/internals/an-object.js +var an_object_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var isObject = (is_object_namespaceFn()); + +var $String = String; +var $TypeError = TypeError; + +// `Assert: Type(argument) is Object` +module.exports = function (argument) { + if (isObject(argument)) return argument; + throw new $TypeError($String(argument) + ' is not an object'); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/array-includes.js +var array_includes_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var toIndexedObject = (to_indexed_object_namespaceFn()); +var toAbsoluteIndex = (to_absolute_index_namespaceFn()); +var lengthOfArrayLike = (length_of_array_like_namespaceFn()); + +// `Array.prototype.{ indexOf, includes }` methods implementation +var createMethod = function (IS_INCLUDES) { + return function ($this, el, fromIndex) { + var O = toIndexedObject($this); + var length = lengthOfArrayLike(O); + if (length === 0) return !IS_INCLUDES && -1; + var index = toAbsoluteIndex(fromIndex, length); + var value; + // Array#includes uses SameValueZero equality algorithm + // eslint-disable-next-line no-self-compare -- NaN check + if (IS_INCLUDES && el !== el) while (length > index) { + value = O[index++]; + // eslint-disable-next-line no-self-compare -- NaN check + if (value !== value) return true; + // Array#indexOf ignores holes, Array#includes - not + } else for (;length > index; index++) { + if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0; + } return !IS_INCLUDES && -1; + }; +}; + +module.exports = { + // `Array.prototype.includes` method + // https://tc39.es/ecma262/#sec-array.prototype.includes + includes: createMethod(true), + // `Array.prototype.indexOf` method + // https://tc39.es/ecma262/#sec-array.prototype.indexof + indexOf: createMethod(false) +}; + +}); + +// MODULE: ./node_modules/core-js/internals/array-set-length.js +var array_set_length_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var DESCRIPTORS = (descriptors_namespaceFn()); +var isArray = (is_array_namespaceFn()); + +var $TypeError = TypeError; +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; + +// Safari < 13 does not throw an error in this case +var SILENT_ON_NON_WRITABLE_LENGTH_SET = DESCRIPTORS && !function () { + // makes no sense without proper strict mode support + if (this !== undefined) return true; + try { + // eslint-disable-next-line es/no-object-defineproperty -- safe + Object.defineProperty([], 'length', { writable: false }).length = 1; + } catch (error) { + return error instanceof TypeError; + } +}(); + +module.exports = SILENT_ON_NON_WRITABLE_LENGTH_SET ? function (O, length) { + if (isArray(O) && !getOwnPropertyDescriptor(O, 'length').writable) { + throw new $TypeError('Cannot set read only .length'); + } return O.length = length; +} : function (O, length) { + return O.length = length; +}; + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/classof-raw.js +var classof_raw_namespaceFn = () => { + return __webpack_require__(576); +}; + +// MODULE: ./node_modules/core-js/internals/classof.js +var classof_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var TO_STRING_TAG_SUPPORT = (to_string_tag_support_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); +var classofRaw = (classof_raw_namespaceFn()); +var wellKnownSymbol = (well_known_symbol_namespaceFn()); + +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); +var $Object = Object; + +// ES3 wrong here +var CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) === 'Arguments'; + +// fallback for IE11 Script Access Denied error +var tryGet = function (it, key) { + try { + return it[key]; + } catch (error) { /* empty */ } +}; + +// getting tag from ES6+ `Object.prototype.toString` +module.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) { + var O, tag, result; + return it === undefined ? 'Undefined' : it === null ? 'Null' + // @@toStringTag case + : typeof (tag = tryGet(O = $Object(it), TO_STRING_TAG)) == 'string' ? tag + // builtinTag case + : CORRECT_ARGUMENTS ? classofRaw(O) + // ES3 arguments fallback + : (result = classofRaw(O)) === 'Object' && isCallable(O.callee) ? 'Arguments' : result; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/copy-constructor-properties.js +var copy_constructor_properties_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var hasOwn = (has_own_property_namespaceFn()); +var ownKeys = (own_keys_namespaceFn()); +var getOwnPropertyDescriptorModule = (object_get_own_property_descriptor_namespaceFn()); +var definePropertyModule = (object_define_property_namespaceFn()); + +module.exports = function (target, source, exceptions) { + var keys = ownKeys(source); + var defineProperty = definePropertyModule.f; + var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f; + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + if (!hasOwn(target, key) && !(exceptions && hasOwn(exceptions, key))) { + defineProperty(target, key, getOwnPropertyDescriptor(source, key)); + } + } +}; + +}); + +// MODULE: ./node_modules/core-js/internals/create-non-enumerable-property.js +var create_non_enumerable_property_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var DESCRIPTORS = (descriptors_namespaceFn()); +var definePropertyModule = (object_define_property_namespaceFn()); +var createPropertyDescriptor = (create_property_descriptor_namespaceFn()); + +module.exports = DESCRIPTORS ? function (object, key, value) { + return definePropertyModule.f(object, key, createPropertyDescriptor(1, value)); +} : function (object, key, value) { + object[key] = value; + return object; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/create-property-descriptor.js +var create_property_descriptor_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +module.exports = function (bitmap, value) { + return { + enumerable: !(bitmap & 1), + configurable: !(bitmap & 2), + writable: !(bitmap & 4), + value: value + }; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/define-built-in.js +var define_built_in_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var isCallable = (is_callable_namespaceFn()); +var definePropertyModule = (object_define_property_namespaceFn()); +var makeBuiltIn = (make_built_in_namespaceFn()); +var defineGlobalProperty = (define_global_property_namespaceFn()); + +module.exports = function (O, key, value, options) { + if (!options) options = {}; + var simple = options.enumerable; + var name = options.name !== undefined ? options.name : key; + if (isCallable(value)) makeBuiltIn(value, name, options); + if (options.global) { + if (simple) O[key] = value; + else defineGlobalProperty(key, value); + } else { + try { + if (!options.unsafe) delete O[key]; + else if (O[key]) simple = true; + } catch (error) { /* empty */ } + if (simple) O[key] = value; + else definePropertyModule.f(O, key, { + value: value, + enumerable: false, + configurable: !options.nonConfigurable, + writable: !options.nonWritable + }); + } return O; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/define-global-property.js +var define_global_property_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var globalThis = (global_this_namespaceFn()); + +// eslint-disable-next-line es/no-object-defineproperty -- safe +var defineProperty = Object.defineProperty; + +module.exports = function (key, value) { + try { + defineProperty(globalThis, key, { value: value, configurable: true, writable: true }); + } catch (error) { + globalThis[key] = value; + } return value; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/descriptors.js +var descriptors_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var fails = (fails_namespaceFn()); + +// Detect IE8's incomplete defineProperty implementation +module.exports = !fails(function () { + // eslint-disable-next-line es/no-object-defineproperty -- required for testing + return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] !== 7; +}); + +}); + +// MODULE: ./node_modules/core-js/internals/document-create-element.js +var document_create_element_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var globalThis = (global_this_namespaceFn()); +var isObject = (is_object_namespaceFn()); + +var document = globalThis.document; +// typeof document.createElement is 'object' in old IE +var EXISTS = isObject(document) && isObject(document.createElement); + +module.exports = function (it) { + return EXISTS ? document.createElement(it) : {}; +}; + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/does-not-exceed-safe-integer.js +var does_not_exceed_safe_integer_namespaceFn = () => { + return __webpack_require__(837); +}; + +// MODULE: ./node_modules/core-js/internals/enum-bug-keys.js +var enum_bug_keys_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +// IE8- don't enum bug keys +module.exports = [ + 'constructor', + 'hasOwnProperty', + 'isPrototypeOf', + 'propertyIsEnumerable', + 'toLocaleString', + 'toString', + 'valueOf' +]; + +}); + +// MODULE: ./node_modules/core-js/internals/environment-user-agent.js +var environment_user_agent_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var globalThis = (global_this_namespaceFn()); + +var navigator = globalThis.navigator; +var userAgent = navigator && navigator.userAgent; + +module.exports = userAgent ? String(userAgent) : ''; + +}); + +// MODULE: ./node_modules/core-js/internals/environment-v8-version.js +var environment_v8_version_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var globalThis = (global_this_namespaceFn()); +var userAgent = (environment_user_agent_namespaceFn()); + +var process = globalThis.process; +var Deno = globalThis.Deno; +var versions = process && process.versions || Deno && Deno.version; +var v8 = versions && versions.v8; +var match, version; + +if (v8) { + match = v8.split('.'); + // in old Chrome, versions of V8 isn't V8 = Chrome / 10 + // but their correct versions are not interesting for us + version = match[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1]); +} + +// BrowserFS NodeJS `process` polyfill incorrectly set `.v8` to `0.0` +// so check `userAgent` even if `.v8` exists, but 0 +if (!version && userAgent) { + match = userAgent.match(/Edge\/(\d+)/); + if (!match || match[1] >= 74) { + match = userAgent.match(/Chrome\/(\d+)/); + if (match) version = +match[1]; + } +} + +module.exports = version; + +}); + +// MODULE: ./node_modules/core-js/internals/export.js +var export_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var globalThis = (global_this_namespaceFn()); +var getOwnPropertyDescriptor = (object_get_own_property_descriptor_namespaceFn().f); +var createNonEnumerableProperty = (create_non_enumerable_property_namespaceFn()); +var defineBuiltIn = (define_built_in_namespaceFn()); +var defineGlobalProperty = (define_global_property_namespaceFn()); +var copyConstructorProperties = (copy_constructor_properties_namespaceFn()); +var isForced = (is_forced_namespaceFn()); + +/* + options.target - name of the target object + options.global - target is the global object + options.stat - export as static methods of target + options.proto - export as prototype methods of target + options.real - real prototype method for the `pure` version + options.forced - export even if the native feature is available + options.bind - bind methods to the target, required for the `pure` version + options.wrap - wrap constructors to preventing global pollution, required for the `pure` version + options.unsafe - use the simple assignment of property instead of delete + defineProperty + options.sham - add a flag to not completely full polyfills + options.enumerable - export as enumerable property + options.dontCallGetSet - prevent calling a getter on target + options.name - the .name of the function if it does not match the key +*/ +module.exports = function (options, source) { + var TARGET = options.target; + var GLOBAL = options.global; + var STATIC = options.stat; + var FORCED, target, key, targetProperty, sourceProperty, descriptor; + if (GLOBAL) { + target = globalThis; + } else if (STATIC) { + target = globalThis[TARGET] || defineGlobalProperty(TARGET, {}); + } else { + target = globalThis[TARGET] && globalThis[TARGET].prototype; + } + if (target) for (key in source) { + sourceProperty = source[key]; + if (options.dontCallGetSet) { + descriptor = getOwnPropertyDescriptor(target, key); + targetProperty = descriptor && descriptor.value; + } else targetProperty = target[key]; + FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced); + // contained in target + if (!FORCED && targetProperty !== undefined) { + if (typeof sourceProperty == typeof targetProperty) continue; + copyConstructorProperties(sourceProperty, targetProperty); + } + // add a flag to not completely full polyfills + if (options.sham || (targetProperty && targetProperty.sham)) { + createNonEnumerableProperty(sourceProperty, 'sham', true); + } + defineBuiltIn(target, key, sourceProperty, options); + } +}; + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/fails.js +var fails_namespaceFn = () => { + return __webpack_require__(39); +}; + +// EXTERNAL MODULE: ./node_modules/core-js/internals/function-bind-native.js +var function_bind_native_namespaceFn = () => { + return __webpack_require__(616); +}; + +// MODULE: ./node_modules/core-js/internals/function-call.js +var function_call_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var NATIVE_BIND = (function_bind_native_namespaceFn()); + +var call = Function.prototype.call; +// eslint-disable-next-line es/no-function-prototype-bind -- safe +module.exports = NATIVE_BIND ? call.bind(call) : function () { + return call.apply(call, arguments); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/function-name.js +var function_name_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var DESCRIPTORS = (descriptors_namespaceFn()); +var hasOwn = (has_own_property_namespaceFn()); + +var FunctionPrototype = Function.prototype; +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var getDescriptor = DESCRIPTORS && Object.getOwnPropertyDescriptor; + +var EXISTS = hasOwn(FunctionPrototype, 'name'); +// additional protection from minified / mangled / dropped function names +var PROPER = EXISTS && function something() { /* empty */ }.name === 'something'; +var CONFIGURABLE = EXISTS && (!DESCRIPTORS || (DESCRIPTORS && getDescriptor(FunctionPrototype, 'name').configurable)); + +module.exports = { + ...(/* unused pure expression */ null && (EXISTS)), + ...(/* unused pure expression */ null && (PROPER)), + CONFIGURABLE: CONFIGURABLE +}; + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/function-uncurry-this.js +var function_uncurry_this_namespaceFn = () => { + return __webpack_require__(504); +}; + +// MODULE: ./node_modules/core-js/internals/get-built-in.js +var get_built_in_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var globalThis = (global_this_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); + +var aFunction = function (argument) { + return isCallable(argument) ? argument : undefined; +}; + +module.exports = function (namespace, method) { + return arguments.length < 2 ? aFunction(globalThis[namespace]) : globalThis[namespace] && globalThis[namespace][method]; +}; + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/get-method.js +var get_method_namespaceFn = () => { + return __webpack_require__(966); +}; + +// MODULE: ./node_modules/core-js/internals/global-this.js +var global_this_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var check = function (it) { + return it && it.Math === Math && it; +}; + +// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 +module.exports = + // eslint-disable-next-line es/no-global-this -- safe + check(typeof globalThis == 'object' && globalThis) || + check(typeof window == 'object' && window) || + // eslint-disable-next-line no-restricted-globals -- safe + check(typeof self == 'object' && self) || + check(typeof global == 'object' && global) || + check(typeof this == 'object' && this) || + // eslint-disable-next-line no-new-func -- fallback + (function () { return this; })() || Function('return this')(); + +}); + +// MODULE: ./node_modules/core-js/internals/has-own-property.js +var has_own_property_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); +var toObject = (to_object_namespaceFn()); + +var hasOwnProperty = uncurryThis({}.hasOwnProperty); + +// `HasOwnProperty` abstract operation +// https://tc39.es/ecma262/#sec-hasownproperty +// eslint-disable-next-line es/no-object-hasown -- safe +module.exports = Object.hasOwn || function hasOwn(it, key) { + return hasOwnProperty(toObject(it), key); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/hidden-keys.js +var hidden_keys_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +module.exports = {}; + +}); + +// MODULE: ./node_modules/core-js/internals/html.js +var html_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var getBuiltIn = (get_built_in_namespaceFn()); + +module.exports = getBuiltIn('document', 'documentElement'); + +}); + +// MODULE: ./node_modules/core-js/internals/ie8-dom-define.js +var ie8_dom_define_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var DESCRIPTORS = (descriptors_namespaceFn()); +var fails = (fails_namespaceFn()); +var createElement = (document_create_element_namespaceFn()); + +// Thanks to IE8 for its funny defineProperty +module.exports = !DESCRIPTORS && !fails(function () { + // eslint-disable-next-line es/no-object-defineproperty -- required for testing + return Object.defineProperty(createElement('div'), 'a', { + get: function () { return 7; } + }).a !== 7; +}); + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/indexed-object.js +var indexed_object_namespaceFn = () => { + return __webpack_require__(55); +}; + +// MODULE: ./node_modules/core-js/internals/inspect-source.js +var inspect_source_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); +var store = (shared_store_namespaceFn()); + +var functionToString = uncurryThis(Function.toString); + +// this helper broken in `core-js@3.4.1-3.4.4`, so we can't use `shared` helper +if (!isCallable(store.inspectSource)) { + store.inspectSource = function (it) { + return functionToString(it); + }; +} + +module.exports = store.inspectSource; + +}); + +// MODULE: ./node_modules/core-js/internals/internal-state.js +var internal_state_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var NATIVE_WEAK_MAP = (weak_map_basic_detection_namespaceFn()); +var globalThis = (global_this_namespaceFn()); +var isObject = (is_object_namespaceFn()); +var createNonEnumerableProperty = (create_non_enumerable_property_namespaceFn()); +var hasOwn = (has_own_property_namespaceFn()); +var shared = (shared_store_namespaceFn()); +var sharedKey = (shared_key_namespaceFn()); +var hiddenKeys = (hidden_keys_namespaceFn()); + +var OBJECT_ALREADY_INITIALIZED = 'Object already initialized'; +var TypeError = globalThis.TypeError; +var WeakMap = globalThis.WeakMap; +var set, get, has; + +var enforce = function (it) { + return has(it) ? get(it) : set(it, {}); +}; + +var getterFor = function (TYPE) { + return function (it) { + var state; + if (!isObject(it) || (state = get(it)).type !== TYPE) { + throw new TypeError('Incompatible receiver, ' + TYPE + ' required'); + } return state; + }; +}; + +if (NATIVE_WEAK_MAP || shared.state) { + var store = shared.state || (shared.state = new WeakMap()); + /* eslint-disable no-self-assign -- prototype methods protection */ + store.get = store.get; + store.has = store.has; + store.set = store.set; + /* eslint-enable no-self-assign -- prototype methods protection */ + set = function (it, metadata) { + if (store.has(it)) throw new TypeError(OBJECT_ALREADY_INITIALIZED); + metadata.facade = it; + store.set(it, metadata); + return metadata; + }; + get = function (it) { + return store.get(it) || {}; + }; + has = function (it) { + return store.has(it); + }; +} else { + var STATE = sharedKey('state'); + hiddenKeys[STATE] = true; + set = function (it, metadata) { + if (hasOwn(it, STATE)) throw new TypeError(OBJECT_ALREADY_INITIALIZED); + metadata.facade = it; + createNonEnumerableProperty(it, STATE, metadata); + return metadata; + }; + get = function (it) { + return hasOwn(it, STATE) ? it[STATE] : {}; + }; + has = function (it) { + return hasOwn(it, STATE); + }; +} + +module.exports = { + set: set, + get: get, + has: has, + enforce: enforce, + getterFor: getterFor +}; + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/is-array.js +var is_array_namespaceFn = () => { + return __webpack_require__(376); +}; + +// EXTERNAL MODULE: ./node_modules/core-js/internals/is-callable.js +var is_callable_namespaceFn = () => { + return __webpack_require__(901); +}; + +// EXTERNAL MODULE: ./node_modules/core-js/internals/is-forced.js +var is_forced_namespaceFn = () => { + return __webpack_require__(796); +}; + +// MODULE: ./node_modules/core-js/internals/is-object.js +var is_object_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var isCallable = (is_callable_namespaceFn()); + +module.exports = function (it) { + return typeof it == 'object' ? it !== null : isCallable(it); +}; + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/is-pure.js +var is_pure_namespaceFn = () => { + return __webpack_require__(395); +}; + +// MODULE: ./node_modules/core-js/internals/is-raw-json.js +var is_raw_json_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var isObject = (is_object_namespaceFn()); +var getInternalState = (internal_state_namespaceFn().get); + +module.exports = function isRawJSON(O) { + if (!isObject(O)) return false; + var state = getInternalState(O); + return !!state && state.type === 'RawJSON'; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/is-symbol.js +var is_symbol_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var getBuiltIn = (get_built_in_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); +var isPrototypeOf = (object_is_prototype_of_namespaceFn()); +var USE_SYMBOL_AS_UID = (use_symbol_as_uid_namespaceFn()); + +var $Object = Object; + +module.exports = USE_SYMBOL_AS_UID ? function (it) { + return typeof it == 'symbol'; +} : function (it) { + var $Symbol = getBuiltIn('Symbol'); + return isCallable($Symbol) && isPrototypeOf($Symbol.prototype, $Object(it)); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/length-of-array-like.js +var length_of_array_like_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var toLength = (to_length_namespaceFn()); + +// `LengthOfArrayLike` abstract operation +// https://tc39.es/ecma262/#sec-lengthofarraylike +module.exports = function (obj) { + return toLength(obj.length); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/make-built-in.js +var make_built_in_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); +var fails = (fails_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); +var hasOwn = (has_own_property_namespaceFn()); +var DESCRIPTORS = (descriptors_namespaceFn()); +var CONFIGURABLE_FUNCTION_NAME = (function_name_namespaceFn().CONFIGURABLE); +var inspectSource = (inspect_source_namespaceFn()); +var InternalStateModule = (internal_state_namespaceFn()); + +var enforceInternalState = InternalStateModule.enforce; +var getInternalState = InternalStateModule.get; +var $String = String; +// eslint-disable-next-line es/no-object-defineproperty -- safe +var defineProperty = Object.defineProperty; +var stringSlice = uncurryThis(''.slice); +var replace = uncurryThis(''.replace); +var join = uncurryThis([].join); + +var CONFIGURABLE_LENGTH = DESCRIPTORS && !fails(function () { + return defineProperty(function () { /* empty */ }, 'length', { value: 8 }).length !== 8; +}); + +var TEMPLATE = String(String).split('String'); + +var makeBuiltIn = module.exports = function (value, name, options) { + if (stringSlice($String(name), 0, 7) === 'Symbol(') { + name = '[' + replace($String(name), /^Symbol\(([^)]*)\).*$/, '$1') + ']'; + } + if (options && options.getter) name = 'get ' + name; + if (options && options.setter) name = 'set ' + name; + if (!hasOwn(value, 'name') || (CONFIGURABLE_FUNCTION_NAME && value.name !== name)) { + if (DESCRIPTORS) defineProperty(value, 'name', { value: name, configurable: true }); + else value.name = name; + } + if (CONFIGURABLE_LENGTH && options && hasOwn(options, 'arity') && value.length !== options.arity) { + defineProperty(value, 'length', { value: options.arity }); + } + try { + if (options && hasOwn(options, 'constructor') && options.constructor) { + if (DESCRIPTORS) defineProperty(value, 'prototype', { writable: false }); + // in V8 ~ Chrome 53, prototypes of some methods, like `Array.prototype.values`, are non-writable + } else if (value.prototype) value.prototype = undefined; + } catch (error) { /* empty */ } + var state = enforceInternalState(value); + if (!hasOwn(state, 'source')) { + state.source = join(TEMPLATE, typeof name == 'string' ? name : ''); + } return value; +}; + +// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative +// eslint-disable-next-line no-extend-native -- required +Function.prototype.toString = makeBuiltIn(function toString() { + return isCallable(this) && getInternalState(this).source || inspectSource(this); +}, 'toString'); + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/map-helpers.js +var map_helpers_namespaceFn = () => { + return __webpack_require__(248); +}; + +// EXTERNAL MODULE: ./node_modules/core-js/internals/native-raw-json.js +var native_raw_json_namespaceFn = () => { + return __webpack_require__(819); +}; + +// MODULE: ./node_modules/core-js/internals/object-create.js +var object_create_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +/* global ActiveXObject -- old IE, WSH */ +var anObject = (an_object_namespaceFn()); +var definePropertiesModule = (object_define_properties_namespaceFn()); +var enumBugKeys = (enum_bug_keys_namespaceFn()); +var hiddenKeys = (hidden_keys_namespaceFn()); +var html = (html_namespaceFn()); +var documentCreateElement = (document_create_element_namespaceFn()); +var sharedKey = (shared_key_namespaceFn()); + +var GT = '>'; +var LT = '<'; +var PROTOTYPE = 'prototype'; +var SCRIPT = 'script'; +var IE_PROTO = sharedKey('IE_PROTO'); + +var EmptyConstructor = function () { /* empty */ }; + +var scriptTag = function (content) { + return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT; +}; + +// Create object with fake `null` prototype: use ActiveX Object with cleared prototype +var NullProtoObjectViaActiveX = function (activeXDocument) { + activeXDocument.write(scriptTag('')); + activeXDocument.close(); + var temp = activeXDocument.parentWindow.Object; + // eslint-disable-next-line no-useless-assignment -- avoid memory leak + activeXDocument = null; + return temp; +}; + +// Create object with fake `null` prototype: use iframe Object with cleared prototype +var NullProtoObjectViaIFrame = function () { + // Thrash, waste and sodomy: IE GC bug + var iframe = documentCreateElement('iframe'); + var JS = 'java' + SCRIPT + ':'; + var iframeDocument; + iframe.style.display = 'none'; + html.appendChild(iframe); + // https://github.com/zloirock/core-js/issues/475 + iframe.src = String(JS); + iframeDocument = iframe.contentWindow.document; + iframeDocument.open(); + iframeDocument.write(scriptTag('document.F=Object')); + iframeDocument.close(); + return iframeDocument.F; +}; + +// Check for document.domain and active x support +// No need to use active x approach when document.domain is not set +// see https://github.com/es-shims/es5-shim/issues/150 +// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346 +// avoid IE GC bug +var activeXDocument; +var NullProtoObject = function () { + try { + activeXDocument = new ActiveXObject('htmlfile'); + } catch (error) { /* ignore */ } + NullProtoObject = typeof document != 'undefined' + ? document.domain && activeXDocument + ? NullProtoObjectViaActiveX(activeXDocument) // old IE + : NullProtoObjectViaIFrame() + : NullProtoObjectViaActiveX(activeXDocument); // WSH + var length = enumBugKeys.length; + while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]]; + return NullProtoObject(); +}; + +hiddenKeys[IE_PROTO] = true; + +// `Object.create` method +// https://tc39.es/ecma262/#sec-object.create +// eslint-disable-next-line es/no-object-create -- safe +module.exports = Object.create || function create(O, Properties) { + var result; + if (O !== null) { + EmptyConstructor[PROTOTYPE] = anObject(O); + result = new EmptyConstructor(); + EmptyConstructor[PROTOTYPE] = null; + // add "__proto__" for Object.getPrototypeOf polyfill + result[IE_PROTO] = O; + } else result = NullProtoObject(); + return Properties === undefined ? result : definePropertiesModule.f(result, Properties); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/object-define-properties.js +var object_define_properties_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var DESCRIPTORS = (descriptors_namespaceFn()); +var V8_PROTOTYPE_DEFINE_BUG = (v8_prototype_define_bug_namespaceFn()); +var definePropertyModule = (object_define_property_namespaceFn()); +var anObject = (an_object_namespaceFn()); +var toIndexedObject = (to_indexed_object_namespaceFn()); +var objectKeys = (object_keys_namespaceFn()); + +// `Object.defineProperties` method +// https://tc39.es/ecma262/#sec-object.defineproperties +// eslint-disable-next-line es/no-object-defineproperties -- safe +exports.f = DESCRIPTORS && !V8_PROTOTYPE_DEFINE_BUG ? Object.defineProperties : function defineProperties(O, Properties) { + anObject(O); + var props = toIndexedObject(Properties); + var keys = objectKeys(Properties); + var length = keys.length; + var index = 0; + var key; + while (length > index) definePropertyModule.f(O, key = keys[index++], props[key]); + return O; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/object-define-property.js +var object_define_property_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var DESCRIPTORS = (descriptors_namespaceFn()); +var IE8_DOM_DEFINE = (ie8_dom_define_namespaceFn()); +var V8_PROTOTYPE_DEFINE_BUG = (v8_prototype_define_bug_namespaceFn()); +var anObject = (an_object_namespaceFn()); +var toPropertyKey = (to_property_key_namespaceFn()); + +var $TypeError = TypeError; +// eslint-disable-next-line es/no-object-defineproperty -- safe +var $defineProperty = Object.defineProperty; +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; +var ENUMERABLE = 'enumerable'; +var CONFIGURABLE = 'configurable'; +var WRITABLE = 'writable'; + +// `Object.defineProperty` method +// https://tc39.es/ecma262/#sec-object.defineproperty +exports.f = DESCRIPTORS ? V8_PROTOTYPE_DEFINE_BUG ? function defineProperty(O, P, Attributes) { + anObject(O); + P = toPropertyKey(P); + anObject(Attributes); + if (typeof O === 'function' && P === 'prototype' && 'value' in Attributes && WRITABLE in Attributes && !Attributes[WRITABLE]) { + var current = $getOwnPropertyDescriptor(O, P); + if (current && current[WRITABLE]) { + O[P] = Attributes.value; + Attributes = { + configurable: CONFIGURABLE in Attributes ? Attributes[CONFIGURABLE] : current[CONFIGURABLE], + enumerable: ENUMERABLE in Attributes ? Attributes[ENUMERABLE] : current[ENUMERABLE], + writable: false + }; + } + } return $defineProperty(O, P, Attributes); +} : $defineProperty : function defineProperty(O, P, Attributes) { + anObject(O); + P = toPropertyKey(P); + anObject(Attributes); + if (IE8_DOM_DEFINE) try { + return $defineProperty(O, P, Attributes); + } catch (error) { /* empty */ } + if ('get' in Attributes || 'set' in Attributes) throw new $TypeError('Accessors not supported'); + if ('value' in Attributes) O[P] = Attributes.value; + return O; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/object-get-own-property-descriptor.js +var object_get_own_property_descriptor_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var DESCRIPTORS = (descriptors_namespaceFn()); +var call = (function_call_namespaceFn()); +var propertyIsEnumerableModule = (object_property_is_enumerable_namespaceFn()); +var createPropertyDescriptor = (create_property_descriptor_namespaceFn()); +var toIndexedObject = (to_indexed_object_namespaceFn()); +var toPropertyKey = (to_property_key_namespaceFn()); +var hasOwn = (has_own_property_namespaceFn()); +var IE8_DOM_DEFINE = (ie8_dom_define_namespaceFn()); + +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; + +// `Object.getOwnPropertyDescriptor` method +// https://tc39.es/ecma262/#sec-object.getownpropertydescriptor +exports.f = DESCRIPTORS ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) { + O = toIndexedObject(O); + P = toPropertyKey(P); + if (IE8_DOM_DEFINE) try { + return $getOwnPropertyDescriptor(O, P); + } catch (error) { /* empty */ } + if (hasOwn(O, P)) return createPropertyDescriptor(!call(propertyIsEnumerableModule.f, O, P), O[P]); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/object-get-own-property-names.js +var object_get_own_property_names_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var internalObjectKeys = (object_keys_internal_namespaceFn()); +var enumBugKeys = (enum_bug_keys_namespaceFn()); + +var hiddenKeys = enumBugKeys.concat('length', 'prototype'); + +// `Object.getOwnPropertyNames` method +// https://tc39.es/ecma262/#sec-object.getownpropertynames +// eslint-disable-next-line es/no-object-getownpropertynames -- safe +exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) { + return internalObjectKeys(O, hiddenKeys); +}; + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/object-get-own-property-symbols.js +var object_get_own_property_symbols_namespaceFn = () => { + return __webpack_require__(717); +}; + +// EXTERNAL MODULE: ./node_modules/core-js/internals/object-is-prototype-of.js +var object_is_prototype_of_namespaceFn = () => { + return __webpack_require__(625); +}; + +// MODULE: ./node_modules/core-js/internals/object-keys-internal.js +var object_keys_internal_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); +var hasOwn = (has_own_property_namespaceFn()); +var toIndexedObject = (to_indexed_object_namespaceFn()); +var indexOf = (array_includes_namespaceFn().indexOf); +var hiddenKeys = (hidden_keys_namespaceFn()); + +var push = uncurryThis([].push); + +module.exports = function (object, names) { + var O = toIndexedObject(object); + var i = 0; + var result = []; + var key; + for (key in O) !hasOwn(hiddenKeys, key) && hasOwn(O, key) && push(result, key); + // Don't enum bug & hidden keys + while (names.length > i) if (hasOwn(O, key = names[i++])) { + ~indexOf(result, key) || push(result, key); + } + return result; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/object-keys.js +var object_keys_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var internalObjectKeys = (object_keys_internal_namespaceFn()); +var enumBugKeys = (enum_bug_keys_namespaceFn()); + +// `Object.keys` method +// https://tc39.es/ecma262/#sec-object.keys +// eslint-disable-next-line es/no-object-keys -- safe +module.exports = Object.keys || function keys(O) { + return internalObjectKeys(O, enumBugKeys); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/object-property-is-enumerable.js +var object_property_is_enumerable_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $propertyIsEnumerable = {}.propertyIsEnumerable; +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; + +// Nashorn ~ JDK8 bug +var NASHORN_BUG = getOwnPropertyDescriptor && !$propertyIsEnumerable.call({ 1: 2 }, 1); + +// `Object.prototype.propertyIsEnumerable` method implementation +// https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable +exports.f = NASHORN_BUG ? function propertyIsEnumerable(V) { + var descriptor = getOwnPropertyDescriptor(this, V); + return !!descriptor && descriptor.enumerable; +} : $propertyIsEnumerable; + +}); + +// MODULE: ./node_modules/core-js/internals/ordinary-to-primitive.js +var ordinary_to_primitive_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var call = (function_call_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); +var isObject = (is_object_namespaceFn()); + +var $TypeError = TypeError; + +// `OrdinaryToPrimitive` abstract operation +// https://tc39.es/ecma262/#sec-ordinarytoprimitive +module.exports = function (input, pref) { + var fn, val; + if (pref === 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val; + if (isCallable(fn = input.valueOf) && !isObject(val = call(fn, input))) return val; + if (pref !== 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val; + throw new $TypeError("Can't convert object to primitive value"); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/own-keys.js +var own_keys_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var getBuiltIn = (get_built_in_namespaceFn()); +var uncurryThis = (function_uncurry_this_namespaceFn()); +var getOwnPropertyNamesModule = (object_get_own_property_names_namespaceFn()); +var getOwnPropertySymbolsModule = (object_get_own_property_symbols_namespaceFn()); +var anObject = (an_object_namespaceFn()); + +var concat = uncurryThis([].concat); + +// all object keys, includes non-enumerable and symbols +module.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) { + var keys = getOwnPropertyNamesModule.f(anObject(it)); + var getOwnPropertySymbols = getOwnPropertySymbolsModule.f; + return getOwnPropertySymbols ? concat(keys, getOwnPropertySymbols(it)) : keys; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/parse-json-string.js +var parse_json_string_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); +var hasOwn = (has_own_property_namespaceFn()); + +var $SyntaxError = SyntaxError; +var $parseInt = parseInt; +var fromCharCode = String.fromCharCode; +var at = uncurryThis(''.charAt); +var slice = uncurryThis(''.slice); +var exec = uncurryThis(/./.exec); + +var codePoints = { + '\\"': '"', + '\\\\': '\\', + '\\/': '/', + '\\b': '\b', + '\\f': '\f', + '\\n': '\n', + '\\r': '\r', + '\\t': '\t' +}; + +var IS_4_HEX_DIGITS = /^[\da-f]{4}$/i; +// eslint-disable-next-line regexp/no-control-character -- safe +var IS_C0_CONTROL_CODE = /^[\u0000-\u001F]$/; + +module.exports = function (source, i) { + var unterminated = true; + var value = ''; + while (i < source.length) { + var chr = at(source, i); + if (chr === '\\') { + var twoChars = slice(source, i, i + 2); + if (hasOwn(codePoints, twoChars)) { + value += codePoints[twoChars]; + i += 2; + } else if (twoChars === '\\u') { + i += 2; + var fourHexDigits = slice(source, i, i + 4); + if (!exec(IS_4_HEX_DIGITS, fourHexDigits)) throw new $SyntaxError('Bad Unicode escape at: ' + i); + value += fromCharCode($parseInt(fourHexDigits, 16)); + i += 4; + } else throw new $SyntaxError('Unknown escape sequence: "' + twoChars + '"'); + } else if (chr === '"') { + unterminated = false; + i++; + break; + } else { + if (exec(IS_C0_CONTROL_CODE, chr)) throw new $SyntaxError('Bad control character in string literal at: ' + i); + value += chr; + i++; + } + } + if (unterminated) throw new $SyntaxError('Unterminated string at: ' + i); + return { value: value, end: i }; +}; + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/require-object-coercible.js +var require_object_coercible_namespaceFn = () => { + return __webpack_require__(750); +}; + +// MODULE: ./node_modules/core-js/internals/shared-key.js +var shared_key_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var shared = (shared_namespaceFn()); +var uid = (uid_namespaceFn()); + +var keys = shared('keys'); + +module.exports = function (key) { + return keys[key] || (keys[key] = uid(key)); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/shared-store.js +var shared_store_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var IS_PURE = (is_pure_namespaceFn()); +var globalThis = (global_this_namespaceFn()); +var defineGlobalProperty = (define_global_property_namespaceFn()); + +var SHARED = '__core-js_shared__'; +var store = module.exports = globalThis[SHARED] || defineGlobalProperty(SHARED, {}); + +(store.versions || (store.versions = [])).push({ + version: '3.50.0', + mode: IS_PURE ? 'pure' : 'global', + copyright: '© 2013–2025 Denis Pushkarev (zloirock.ru), 2025–2026 CoreJS Company (core-js.io). All rights reserved.', + license: 'https://github.com/zloirock/core-js/blob/v3.50.0/LICENSE', + source: 'https://github.com/zloirock/core-js' +}); + +}); + +// MODULE: ./node_modules/core-js/internals/shared.js +var shared_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var store = (shared_store_namespaceFn()); +// eslint-disable-next-line es/no-object-create -- safe +var create = Object.create || Object; + +module.exports = function (key, value) { + return store[key] || (store[key] = value || create(null)); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/symbol-constructor-detection.js +var symbol_constructor_detection_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +/* eslint-disable es/no-symbol -- required for testing */ +var V8_VERSION = (environment_v8_version_namespaceFn()); +var fails = (fails_namespaceFn()); +var globalThis = (global_this_namespaceFn()); + +var $String = globalThis.String; + +// eslint-disable-next-line es/no-object-getownpropertysymbols -- required for testing +module.exports = !!Object.getOwnPropertySymbols && !fails(function () { + var symbol = Symbol('symbol detection'); + // Chrome 38 Symbol has incorrect toString conversion + // `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances + // nb: Do not call `String` directly to avoid this being optimized out to `symbol+''` which will, + // of course, fail. + return !$String(symbol) || !(Object(symbol) instanceof Symbol) || + // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances + !Symbol.sham && V8_VERSION && V8_VERSION < 41; +}); + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/this-number-value.js +var this_number_value_namespaceFn = () => { + return __webpack_require__(240); +}; + +// MODULE: ./node_modules/core-js/internals/to-absolute-index.js +var to_absolute_index_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var toIntegerOrInfinity = (to_integer_or_infinity_namespaceFn()); + +var max = Math.max; +var min = Math.min; + +// Helper for a popular repeating case of the spec: +// Let integer be ? ToInteger(index). +// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length). +module.exports = function (index, length) { + var integer = toIntegerOrInfinity(index); + return integer < 0 ? max(integer + length, 0) : min(integer, length); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/to-indexed-object.js +var to_indexed_object_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +// toObject with fallback for non-array-like ES3 strings +var IndexedObject = (indexed_object_namespaceFn()); +var requireObjectCoercible = (require_object_coercible_namespaceFn()); + +module.exports = function (it) { + return IndexedObject(requireObjectCoercible(it)); +}; + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/to-integer-or-infinity.js +var to_integer_or_infinity_namespaceFn = () => { + return __webpack_require__(291); +}; + +// EXTERNAL MODULE: ./node_modules/core-js/internals/to-length.js +var to_length_namespaceFn = () => { + return __webpack_require__(14); +}; + +// EXTERNAL MODULE: ./node_modules/core-js/internals/to-object.js +var to_object_namespaceFn = () => { + return __webpack_require__(981); +}; + +// MODULE: ./node_modules/core-js/internals/to-primitive.js +var to_primitive_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var call = (function_call_namespaceFn()); +var isObject = (is_object_namespaceFn()); +var isSymbol = (is_symbol_namespaceFn()); +var getMethod = (get_method_namespaceFn()); +var ordinaryToPrimitive = (ordinary_to_primitive_namespaceFn()); +var wellKnownSymbol = (well_known_symbol_namespaceFn()); + +var $TypeError = TypeError; +var TO_PRIMITIVE = wellKnownSymbol('toPrimitive'); + +// `ToPrimitive` abstract operation +// https://tc39.es/ecma262/#sec-toprimitive +module.exports = function (input, pref) { + if (!isObject(input) || isSymbol(input)) return input; + var exoticToPrim = getMethod(input, TO_PRIMITIVE); + var result; + if (exoticToPrim) { + if (pref === undefined) pref = 'default'; + result = call(exoticToPrim, input, pref); + if (!isObject(result) || isSymbol(result)) return result; + throw new $TypeError("Can't convert object to primitive value"); + } + if (pref === undefined) pref = 'number'; + return ordinaryToPrimitive(input, pref); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/to-property-key.js +var to_property_key_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var toPrimitive = (to_primitive_namespaceFn()); +var isSymbol = (is_symbol_namespaceFn()); + +// `ToPropertyKey` abstract operation +// https://tc39.es/ecma262/#sec-topropertykey +module.exports = function (argument) { + var key = toPrimitive(argument, 'string'); + return isSymbol(key) ? key : key + ''; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/to-string-tag-support.js +var to_string_tag_support_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var wellKnownSymbol = (well_known_symbol_namespaceFn()); + +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); +var test = {}; +// eslint-disable-next-line unicorn/no-immediate-mutation -- ES3 syntax limitation +test[TO_STRING_TAG] = 'z'; + +module.exports = String(test) === '[object z]'; + +}); + +// MODULE: ./node_modules/core-js/internals/to-string.js +var to_string_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var classof = (classof_namespaceFn()); + +var $String = String; + +module.exports = function (argument) { + if (classof(argument) === 'Symbol') throw new TypeError('Cannot convert a Symbol value to a string'); + return $String(argument); +}; + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/uid.js +var uid_namespaceFn = () => { + return __webpack_require__(392); +}; + +// MODULE: ./node_modules/core-js/internals/use-symbol-as-uid.js +var use_symbol_as_uid_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +/* eslint-disable es/no-symbol -- required for testing */ +var NATIVE_SYMBOL = (symbol_constructor_detection_namespaceFn()); + +module.exports = NATIVE_SYMBOL && + !Symbol.sham && + typeof Symbol.iterator == 'symbol'; + +}); + +// MODULE: ./node_modules/core-js/internals/v8-prototype-define-bug.js +var v8_prototype_define_bug_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var DESCRIPTORS = (descriptors_namespaceFn()); +var fails = (fails_namespaceFn()); + +// V8 ~ Chrome 36- +// https://bugs.chromium.org/p/v8/issues/detail?id=3334 +module.exports = DESCRIPTORS && fails(function () { + // eslint-disable-next-line es/no-object-defineproperty -- required for testing + return Object.defineProperty(function () { /* empty */ }, 'prototype', { + value: 42, + writable: false + }).prototype !== 42; +}); + +}); + +// MODULE: ./node_modules/core-js/internals/weak-map-basic-detection.js +var weak_map_basic_detection_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var globalThis = (global_this_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); + +var WeakMap = globalThis.WeakMap; + +module.exports = isCallable(WeakMap) && /native code/.test(String(WeakMap)); + +}); + +// MODULE: ./node_modules/core-js/internals/well-known-symbol.js +var well_known_symbol_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var globalThis = (global_this_namespaceFn()); +var shared = (shared_namespaceFn()); +var hasOwn = (has_own_property_namespaceFn()); +var uid = (uid_namespaceFn()); +var NATIVE_SYMBOL = (symbol_constructor_detection_namespaceFn()); +var USE_SYMBOL_AS_UID = (use_symbol_as_uid_namespaceFn()); + +var Symbol = globalThis.Symbol; +var WellKnownSymbolsStore = shared('wks'); +var createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol['for'] || Symbol : Symbol && Symbol.withoutSetter || uid; + +module.exports = function (name) { + if (!hasOwn(WellKnownSymbolsStore, name)) { + WellKnownSymbolsStore[name] = NATIVE_SYMBOL && hasOwn(Symbol, name) + ? Symbol[name] + : createWellKnownSymbol('Symbol.' + name); + } return WellKnownSymbolsStore[name]; +}; + +}); + +// MODULE: ./node_modules/core-js/modules/es.array.push.js +var es_array_push_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var toObject = (to_object_namespaceFn()); +var lengthOfArrayLike = (length_of_array_like_namespaceFn()); +var setArrayLength = (array_set_length_namespaceFn()); +var doesNotExceedSafeInteger = (does_not_exceed_safe_integer_namespaceFn()); +var fails = (fails_namespaceFn()); + +var INCORRECT_TO_LENGTH = fails(function () { + return [].push.call({ length: 0x100000000 }, 1) !== 4294967297; +}); + +// V8 <= 121 and Safari <= 15.4; FF < 23 throws InternalError +// https://bugs.chromium.org/p/v8/issues/detail?id=12681 +var properErrorOnNonWritableLength = function () { + try { + // eslint-disable-next-line es/no-object-defineproperty -- safe + Object.defineProperty([], 'length', { writable: false }).push(); + } catch (error) { + return error instanceof TypeError; + } +}; + +var FORCED = INCORRECT_TO_LENGTH || !properErrorOnNonWritableLength(); + +// `Array.prototype.push` method +// https://tc39.es/ecma262/#sec-array.prototype.push +$({ target: 'Array', proto: true, arity: 1, forced: FORCED }, { + // eslint-disable-next-line no-unused-vars -- required for `.length` + push: function push(item) { + var O = toObject(this); + var len = lengthOfArrayLike(O); + var argCount = arguments.length; + doesNotExceedSafeInteger(len + argCount); + for (var i = 0; i < argCount; i++) { + O[len] = arguments[i]; + len++; + } + setArrayLength(O, len); + return len; + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.json.stringify.js +var es_json_stringify_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var getBuiltIn = (get_built_in_namespaceFn()); +var call = (function_call_namespaceFn()); +var uncurryThis = (function_uncurry_this_namespaceFn()); +var fails = (fails_namespaceFn()); +var isArray = (is_array_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); +var isObject = (is_object_namespaceFn()); +var create = (object_create_namespaceFn()); +var isRawJSON = (is_raw_json_namespaceFn()); +var isSymbol = (is_symbol_namespaceFn()); +var classof = (classof_raw_namespaceFn()); +var thisNumberValue = (this_number_value_namespaceFn()); +var includes = (array_includes_namespaceFn().includes); +var hasOwn = (has_own_property_namespaceFn()); +var toString = (to_string_namespaceFn()); +var parseJSONString = (parse_json_string_namespaceFn()); +var uid = (uid_namespaceFn()); +var NATIVE_SYMBOL = (symbol_constructor_detection_namespaceFn()); +var NATIVE_RAW_JSON = (native_raw_json_namespaceFn()); + +var $String = String; +var $TypeError = TypeError; +var $stringify = getBuiltIn('JSON', 'stringify'); +var $BigInt = getBuiltIn('BigInt'); +var stringValueOf = uncurryThis(''.valueOf); +var booleanValueOf = uncurryThis(true.valueOf); +var bigIntValueOf = $BigInt && uncurryThis($BigInt.prototype.valueOf); +var exec = uncurryThis(/./.exec); +var charAt = uncurryThis(''.charAt); +var charCodeAt = uncurryThis(''.charCodeAt); +var replace = uncurryThis(''.replace); +var slice = uncurryThis(''.slice); +var push = uncurryThis([].push); +var pop = uncurryThis([].pop); +var numberToString = uncurryThis(1.1.toString); + +var surrogates = /[\uD800-\uDFFF]/g; +var leadingSurrogates = /^[\uD800-\uDBFF]$/; +var trailingSurrogates = /^[\uDC00-\uDFFF]$/; +var digits = /^\d+$/; + +// a placeholder of a raw JSON value +var RAW_MARK = uid(); +// a prefix of keys of a reordered object, see `createOrderedObject` +var KEY_MARK = uid(); +// the last key of a reordered object, marks the end of its serialization +var END_MARK = uid(); +var RAW_MARK_LENGTH = RAW_MARK.length; +var KEY_MARK_LENGTH = KEY_MARK.length; + +var WRONG_SYMBOLS_CONVERSION = !NATIVE_SYMBOL || fails(function () { + var symbol = getBuiltIn('Symbol')('stringify detection'); + // MS Edge converts symbol values to JSON as {} + return $stringify([symbol]) !== '[null]' + // WebKit converts symbol values to JSON as null + || $stringify({ a: symbol }) !== '{}' + // V8 throws on boxed symbols + || $stringify(Object(symbol)) !== '{}'; +}); + +// https://github.com/tc39/proposal-well-formed-stringify +var ILL_FORMED_UNICODE = fails(function () { + return $stringify('\uDF06\uD834') !== '"\\udf06\\ud834"' + || $stringify('\uDEAD') !== '"\\udead"'; +}); + +var isRawJSONValue = NATIVE_RAW_JSON ? getBuiltIn('JSON', 'isRawJSON') : isRawJSON; + +var stringifyWithProperSymbolsConversion = WRONG_SYMBOLS_CONVERSION ? function (it, replacer, space) { + return $stringify(it, function (key, value) { + var replaced = call(replacer, this, key, value); + if (!isSymbol(replaced)) return replaced; + }, space); +} : $stringify; + +var fixIllFormedJSON = function (match, offset, string) { + var prev = charAt(string, offset - 1); + var next = charAt(string, offset + 1); + if ( + (exec(leadingSurrogates, match) && !exec(trailingSurrogates, next)) || + (exec(trailingSurrogates, match) && !exec(leadingSurrogates, prev)) + ) { + return '\\u' + numberToString(charCodeAt(match, 0), 16); + } return match; +}; + +// `PropertyList` of `JSON.stringify` +// https://tc39.es/ecma262/#sec-json.stringify +var getPropertyList = function (replacer) { + if (!isArray(replacer)) return; + var rawLength = replacer.length; + var propertyList = []; + // a null prototype object is used as a set of already added keys to keep the deduplication linear + var addedKeys = create(null); + for (var i = 0; i < rawLength; i++) { + var element = replacer[i]; + var key; + if (typeof element == 'string') key = element; + else if (typeof element == 'number' || classof(element) === 'Number' || classof(element) === 'String') key = toString(element); + else continue; + if (!hasOwn(addedKeys, key)) { + addedKeys[key] = true; + push(propertyList, key); + } + } + return propertyList; +}; + +// values with such an internal slot are unwrapped by `SerializeJSONProperty` instead of being serialized as objects +var hasInternalSlot = function (valueOf, it) { + try { + valueOf(it); + return true; + } catch (error) { + return false; + } +}; + +// the slot check is expensive, so it's performed only for the kind reported by the value itself - +// a value lying about its kind via `Symbol.toStringTag` is serialized as an ordinary object +var isBoxedPrimitive = function (it) { + var kind = classof(it); + return (kind === 'Number' && hasInternalSlot(thisNumberValue, it)) + || (kind === 'String' && hasInternalSlot(stringValueOf, it)) + || (kind === 'Boolean' && hasInternalSlot(booleanValueOf, it)) + || (!!bigIntValueOf && kind === 'BigInt' && hasInternalSlot(bigIntValueOf, it)); +}; + +// only objects serialized by `SerializeJSONObject` are affected by the property list +var isSerializedAsObject = function (it) { + if (!isObject(it) || isCallable(it) || isArray(it)) return false; + try { + return !isBoxedPrimitive(it); + // `classof` reads `Symbol.toStringTag`, so a proxy could throw - it has no internal slots anyway + } catch (error) { + return true; + } +}; + +// the engine unwraps it in the same order as it would read the original property, +// so the property is read lazily and `toJSON` is called once and with the original key +var createElementHolder = function (holder, key) { + return { + toJSON: function () { + var element = holder[key]; + if (isObject(element) || typeof element == 'bigint') { + var elementToJSON = element.toJSON; + if (isCallable(elementToJSON)) element = call(elementToJSON, element, key); + } return element; + } + }; +}; + +// own keys of objects are sorted - integer-like keys are moved to the beginning, +// so such keys should be marked and restored in the serialized string +var getKeyPrefix = function (propertyList) { + for (var i = 0, length = propertyList.length; i < length; i++) { + if (exec(digits, propertyList[i])) return KEY_MARK; + } return ''; +}; + +// `SerializeJSONObject` iterates the property list, so the value is replaced with an object with keys in this order +var createOrderedObject = function (value, propertyList, keyPrefix) { + // keys are not marked if the property list has no integer-like keys, so `Object.prototype` + // with a setter, a non-writable property or `__proto__` should not intercept the assignment + var ordered = create(null); + for (var i = 0, length = propertyList.length; i < length; i++) { + var key = propertyList[i]; + ordered[keyPrefix + key] = createElementHolder(value, key); + } + ordered[END_MARK] = null; + return ordered; +}; + +// `JSON.stringify` method +// https://tc39.es/ecma262/#sec-json.stringify +// https://github.com/tc39/proposal-json-parse-with-source +if ($stringify) $({ target: 'JSON', stat: true, arity: 3, forced: WRONG_SYMBOLS_CONVERSION || ILL_FORMED_UNICODE || !NATIVE_RAW_JSON }, { + stringify: function stringify(text, replacer, space) { + var replacerFunction = isCallable(replacer) ? replacer : undefined; + var propertyList = replacerFunction ? undefined : getPropertyList(replacer); + var keyPrefix = propertyList && getKeyPrefix(propertyList); + var rawStrings = []; + var openObjects = []; + var parentOrdered = []; + var currentOrdered; + var marked = false; + var root = true; + + var json = stringifyWithProperSymbolsConversion(text, function (key, value) { + // some old implementations (like WebKit) could pass numbers as keys + key = $String(key); + + if (propertyList) { + if (key === END_MARK) { + pop(openObjects); + currentOrdered = pop(parentOrdered); + return; + } + if (root) root = false; + // the innermost reordered object already contains only keys of the property list and arrays are not + // affected by it, the rest of objects (like objects with a fake `Symbol.toStringTag`) are filtered here + else if (this !== currentOrdered && !isArray(this) && !includes(propertyList, key)) return; + } else if (replacerFunction) value = call(replacerFunction, this, key, value); + + if (isRawJSONValue(value)) { + if (NATIVE_RAW_JSON) return value; + marked = true; + return RAW_MARK + (push(rawStrings, value.rawJSON) - 1); + } + + if (propertyList && isSerializedAsObject(value)) { + // reordered objects are new each time, so cycles should be detected before the engine does it + if (includes(openObjects, value)) throw new $TypeError('Converting circular structure to JSON'); + var ordered = createOrderedObject(value, propertyList, keyPrefix); + push(openObjects, value); + push(parentOrdered, currentOrdered); + currentOrdered = ordered; + if (keyPrefix) marked = true; + return ordered; + } + + return value; + }, space); + + if (typeof json != 'string') return json; + + if (ILL_FORMED_UNICODE) json = replace(json, surrogates, fixIllFormedJSON); + + if (!marked) return json; + + var result = ''; + var length = json.length; + + for (var i = 0; i < length; i++) { + var chr = charAt(json, i); + if (chr === '"') { + var end = parseJSONString(json, ++i).end - 1; + var string = slice(json, i, end); + if (slice(string, 0, RAW_MARK_LENGTH) === RAW_MARK) result += rawStrings[slice(string, RAW_MARK_LENGTH)]; + else if (slice(string, 0, KEY_MARK_LENGTH) === KEY_MARK) result += '"' + slice(string, KEY_MARK_LENGTH) + '"'; + else result += '"' + string + '"'; + i = end; + } else result += chr; + } + + return result; + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.map.get-or-insert-computed.js +var es_map_get_or_insert_computed_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var aCallable = (a_callable_namespaceFn()); +var MapHelpers = (map_helpers_namespaceFn()); +var IS_PURE = (is_pure_namespaceFn()); + +var get = MapHelpers.get; +var has = MapHelpers.has; +var set = MapHelpers.set; + +// `Map.prototype.getOrInsertComputed` method +// https://tc39.es/ecma262/#sec-map.prototype.getorinsertcomputed +$({ target: 'Map', proto: true, real: true, forced: IS_PURE }, { + getOrInsertComputed: function getOrInsertComputed(key, callbackfn) { + var hasKey = has(this, key); + aCallable(callbackfn); + if (hasKey) return get(this, key); + // CanonicalizeKeyedCollectionKey + if (key === 0 && 1 / key === -Infinity) key = 0; + var value = callbackfn(key); + set(this, key, value); + return value; + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.map.get-or-insert.js +var es_map_get_or_insert_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var MapHelpers = (map_helpers_namespaceFn()); +var IS_PURE = (is_pure_namespaceFn()); + +var get = MapHelpers.get; +var has = MapHelpers.has; +var set = MapHelpers.set; + +// `Map.prototype.getOrInsert` method +// https://tc39.es/ecma262/#sec-map.prototype.getorinsert +$({ target: 'Map', proto: true, real: true, forced: IS_PURE }, { + getOrInsert: function getOrInsert(key, value) { + if (has(this, key)) return get(this, key); + set(this, key, value); + return value; + } +}); + +}); + +;// ./node_modules/core-js/modules/es.array.push.js +es_array_push_namespaceFn(); + +;// ./node_modules/core-js/modules/es.json.stringify.js +es_json_stringify_namespaceFn(); + +;// ./node_modules/core-js/modules/es.map.get-or-insert.js +es_map_get_or_insert_namespaceFn(); + +;// ./node_modules/core-js/modules/es.map.get-or-insert-computed.js +es_map_get_or_insert_computed_namespaceFn(); + +;// ./src/pdf.sandbox.external.js + + +class SandboxSupportBase { + constructor(win) { + this.win = win; + this.timeoutIds = new Map(); + this.commFun = null; + } + destroy() { + this.commFun = null; + for (const id of this.timeoutIds.values()) { + this.win.clearTimeout(id); + } + this.timeoutIds = null; + } + exportValueToSandbox(val) { + throw new Error("Not implemented"); + } + importValueFromSandbox(val) { + throw new Error("Not implemented"); + } + createErrorForSandbox(errorMessage) { + throw new Error("Not implemented"); + } + callSandboxFunction(name, args) { + if (!this.commFun) { + return; + } + try { + args = this.exportValueToSandbox(args); + this.commFun(name, args); + } catch (e) { + this.win.console.error(e); + } + } + createSandboxExternals() { + const externals = { + setTimeout: (callbackId, nMilliseconds) => { + if (typeof callbackId !== "number" || typeof nMilliseconds !== "number") { + return; + } + if (callbackId === 0) { + this.win.clearTimeout(this.timeoutIds.get(callbackId)); + } + const id = this.win.setTimeout(() => { + this.timeoutIds.delete(callbackId); + this.callSandboxFunction("timeoutCb", { + callbackId, + interval: false + }); + }, nMilliseconds); + this.timeoutIds.set(callbackId, id); + }, + clearTimeout: callbackId => { + this.win.clearTimeout(this.timeoutIds.get(callbackId)); + this.timeoutIds.delete(callbackId); + }, + setInterval: (callbackId, nMilliseconds) => { + if (typeof callbackId !== "number" || typeof nMilliseconds !== "number") { + return; + } + const id = this.win.setInterval(() => { + this.callSandboxFunction("timeoutCb", { + callbackId, + interval: true + }); + }, nMilliseconds); + this.timeoutIds.set(callbackId, id); + }, + clearInterval: callbackId => { + this.win.clearInterval(this.timeoutIds.get(callbackId)); + this.timeoutIds.delete(callbackId); + }, + alert: cMsg => { + if (typeof cMsg !== "string") { + return; + } + this.win.alert(cMsg); + }, + confirm: cMsg => typeof cMsg !== "string" ? false : this.win.confirm(cMsg), + prompt: (cQuestion, cDefault) => typeof cQuestion !== "string" || typeof cDefault !== "string" ? null : this.win.prompt(cQuestion, cDefault), + parseURL: cUrl => { + const url = new this.win.URL(cUrl); + const props = ["hash", "host", "hostname", "href", "origin", "password", "pathname", "port", "protocol", "search", "searchParams", "username"]; + return Object.fromEntries(props.map(name => [name, url[name].toString()])); + }, + send: data => { + if (!data) { + return; + } + const event = new this.win.CustomEvent("updatefromsandbox", { + detail: this.importValueFromSandbox(data) + }); + this.win.dispatchEvent(event); + } + }; + Object.setPrototypeOf(externals, null); + return (name, args) => { + try { + const result = externals[name](...args); + return this.exportValueToSandbox(result); + } catch (error) { + throw this.createErrorForSandbox(error?.toString() ?? ""); + } + }; + } +} +;// ./src/pdf.sandbox.js + + + + + +class SandboxSupport extends SandboxSupportBase { + exportValueToSandbox(val) { + return JSON.stringify(val, (k, v) => v instanceof Map ? Object.fromEntries(v) : v); + } + importValueFromSandbox(val) { + return val; + } + createErrorForSandbox(errorMessage) { + return new Error(errorMessage); + } +} +class Sandbox { + constructor(win, module) { + this.support = new SandboxSupport(win, this); + module.externalCall = this.support.createSandboxExternals(); + this._module = module; + this._alertOnError = 0; + } + create(data) { + const code = ["/******/ var __webpack_modules__ = ({\n\n/***/ 529\n(module) {\n\n\n// `CreateIterResultObject` abstract operation\n// https://tc39.es/ecma262/#sec-createiterresultobject\nmodule.exports = function (value, done) {\n return { value: value, done: done };\n};\n\n\n/***/ },\n\n/***/ 837\n(module) {\n\n\nvar $TypeError = TypeError;\nvar MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF; // 2 ** 53 - 1 == 9007199254740991\n\nmodule.exports = function (it) {\n if (it > MAX_SAFE_INTEGER) throw new $TypeError('Maximum allowed index exceeded');\n return it;\n};\n\n\n/***/ },\n\n/***/ 767\n(module) {\n\n\n// `GetIteratorDirect(obj)` abstract operation\n// https://tc39.es/ecma262/#sec-getiteratordirect\nmodule.exports = function (obj) {\n return {\n iterator: obj,\n next: obj.next,\n done: false\n };\n};\n\n\n/***/ },\n\n/***/ 117\n(module) {\n\n\n// we can't use just `it == null` since of `document.all` special case\n// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot-aec\nmodule.exports = function (it) {\n return it === null || it === undefined;\n};\n\n\n/***/ },\n\n/***/ 859\n(module) {\n\n\n// release references held by exhausted / closed iterator helpers to allow GC of the source chain\nmodule.exports = function (state) {\n state.iterator = state.next = state.nextHandler = state.mapper = state.predicate = state.inner =\n state.iterables = state.iters = state.openIters = state.padding = state.finishResults = state.buffer = null;\n};\n\n\n/***/ },\n\n/***/ 684\n(module) {\n\n\n// Should throw an error on invalid iterator\n// https://issues.chromium.org/issues/336839115\nmodule.exports = function (methodName, argument) {\n // eslint-disable-next-line es/no-iterator -- required for testing\n var method = typeof Iterator == 'function' && Iterator.prototype[methodName];\n if (method) try {\n method.call({ next: null }, argument).next();\n } catch (error) {\n return true;\n }\n};\n\n\n/***/ },\n\n/***/ 269\n(module) {\n\n\nmodule.exports = Object.create ? Object.create(null) : {};\n\n\n/***/ },\n\n/***/ 741\n(module) {\n\n\nvar ceil = Math.ceil;\nvar floor = Math.floor;\n\n// `Math.trunc` method\n// https://tc39.es/ecma262/#sec-math.trunc\n// eslint-disable-next-line es/no-math-trunc -- safe\nmodule.exports = Math.trunc || function trunc(x) {\n var n = +x;\n return (n > 0 ? floor : ceil)(n);\n};\n\n\n/***/ },\n\n/***/ 717\n(__unused_webpack_module, exports) {\n\n\n// eslint-disable-next-line es/no-object-getownpropertysymbols -- safe\nexports.f = Object.getOwnPropertySymbols;\n\n\n/***/ },\n\n/***/ 750\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar isNullOrUndefined = __webpack_require__(117);\n\nvar $TypeError = TypeError;\n\n// `RequireObjectCoercible` abstract operation\n// https://tc39.es/ecma262/#sec-requireobjectcoercible\nmodule.exports = function (it) {\n if (isNullOrUndefined(it)) throw new $TypeError(\"Can't call method on \" + it);\n return it;\n};\n\n\n/***/ },\n\n/***/ 835\n(module) {\n\n\n// Should get iterator record of a set-like object before cloning this\n// https://bugs.webkit.org/show_bug.cgi?id=289430\nmodule.exports = function (METHOD_NAME) {\n try {\n // eslint-disable-next-line es/no-set -- needed for test\n var baseSet = new Set();\n var setLike = {\n size: 0,\n has: function () { return true; },\n keys: function () {\n // eslint-disable-next-line es/no-object-defineproperty -- needed for test\n return Object.defineProperty({}, 'next', {\n get: function () {\n baseSet.clear();\n baseSet.add(4);\n return function () {\n return { done: true };\n };\n }\n });\n }\n };\n var result = baseSet[METHOD_NAME](setLike);\n\n return result.size === 1 && result.values().next().value === 4;\n } catch (error) {\n return false;\n }\n};\n\n\n/***/ },\n\n/***/ 291\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar trunc = __webpack_require__(741);\n\n// `ToIntegerOrInfinity` abstract operation\n// https://tc39.es/ecma262/#sec-tointegerorinfinity\nmodule.exports = function (argument) {\n var number = +argument;\n // eslint-disable-next-line no-self-compare -- NaN check\n return number !== number || number === 0 ? 0 : trunc(number);\n};\n\n\n/***/ },\n\n/***/ 14\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar toIntegerOrInfinity = __webpack_require__(291);\n\nvar min = Math.min;\n\n// `ToLength` abstract operation\n// https://tc39.es/ecma262/#sec-tolength\nmodule.exports = function (argument) {\n var len = toIntegerOrInfinity(argument);\n return len > 0 ? min(len, 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n};\n\n\n/***/ },\n\n/***/ 981\n(module, __unused_webpack_exports, __webpack_require__) {\n\n\nvar requireObjectCoercible = __webpack_require__(750);\n\nvar $Object = Object;\n\n// `ToObject` abstract operation\n// https://tc39.es/ecma262/#sec-toobject\nmodule.exports = function (argument) {\n return $Object(requireObjectCoercible(argument));\n};\n\n\n/***/ },\n\n/***/ 823\n(module) {\n\n\nvar $String = String;\n\nmodule.exports = function (argument) {\n try {\n return $String(argument);\n } catch (error) {\n return 'Object';\n }\n};\n\n\n/***/ }\n\n/******/ });\n/************************************************************************/\n/******/ // The module cache\n/******/ const __webpack_module_cache__ = {};\n/******/ \n/******/ // The require function\n/******/ function __webpack_require__(moduleId) {\n/******/ \t// Check if module is in cache\n/******/ \tconst cachedModule = __webpack_module_cache__[moduleId];\n/******/ \tif (cachedModule !== undefined) {\n/******/ \t\treturn cachedModule.exports;\n/******/ \t}\n/******/ \t// Create a new module (and put it into the cache)\n/******/ \tconst module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t// no module.id needed\n/******/ \t\t// no module.loaded needed\n/******/ \t\texports: {}\n/******/ \t};\n/******/ \n/******/ \t// Execute the module function\n/******/ \t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/ \n/******/ \t// Return the exports of the module\n/******/ \treturn module.exports;\n/******/ }\n/******/ \n/************************************************************************/\n/******/ /* webpack/runtime/concatenation wrap */\n/******/ // wrap a concatenated module body as a lazy, memoized accessor; mod is\n/******/ // set before the body runs so re-entrant calls (require cycles) observe\n/******/ // the partial exports like Node.js\n/******/ __webpack_require__.cw = (body) => {\n/******/ \tvar mod;\n/******/ \treturn () => {\n/******/ \t\tif (body) {\n/******/ \t\t\tvar fn = body;\n/******/ \t\t\tbody = 0;\n/******/ \t\t\tmod = { exports: {} };\n/******/ \t\t\tfn.call(mod.exports, mod, mod.exports);\n/******/ \t\t}\n/******/ \t\treturn mod.exports;\n/******/ \t};\n/******/ };\n/******/ \n/************************************************************************/\n\n// MODULE: ./node_modules/core-js/internals/a-callable.js\nvar a_callable_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar isCallable = (is_callable_namespaceFn());\nvar tryToString = (try_to_string_namespaceFn());\n\nvar $TypeError = TypeError;\n\n// `Assert: IsCallable(argument) is true`\nmodule.exports = function (argument) {\n if (isCallable(argument)) return argument;\n throw new $TypeError(tryToString(argument) + ' is not a function');\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/a-set.js\nvar a_set_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar has = (set_helpers_namespaceFn().has);\n\n// Perform ? RequireInternalSlot(M, [[SetData]])\nmodule.exports = function (it) {\n has(it);\n return it;\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/a-weak-key.js\nvar a_weak_key_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar WeakMapHelpers = (weak_map_helpers_namespaceFn());\n\nvar weakmap = new WeakMapHelpers.WeakMap();\nvar set = WeakMapHelpers.set;\nvar remove = WeakMapHelpers.remove;\n\nmodule.exports = function (key) {\n set(weakmap, key, 1);\n remove(weakmap, key);\n return key;\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/a-weak-map.js\nvar a_weak_map_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar has = (weak_map_helpers_namespaceFn().has);\n\n// Perform ? RequireInternalSlot(M, [[WeakMapData]])\nmodule.exports = function (it) {\n has(it);\n return it;\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/add-to-unscopables.js\nvar add_to_unscopables_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar wellKnownSymbol = (well_known_symbol_namespaceFn());\nvar create = (object_create_namespaceFn());\nvar defineProperty = (object_define_property_namespaceFn().f);\n\nvar UNSCOPABLES = wellKnownSymbol('unscopables');\nvar ArrayPrototype = Array.prototype;\n\n// Array.prototype[@@unscopables]\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\nif (ArrayPrototype[UNSCOPABLES] === undefined) {\n defineProperty(ArrayPrototype, UNSCOPABLES, {\n configurable: true,\n value: create(null)\n });\n}\n\n// add a key to Array.prototype[@@unscopables]\nmodule.exports = function (key) {\n ArrayPrototype[UNSCOPABLES][key] = true;\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/an-instance.js\nvar an_instance_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar isPrototypeOf = (object_is_prototype_of_namespaceFn());\n\nvar $TypeError = TypeError;\n\nmodule.exports = function (it, Prototype) {\n if (isPrototypeOf(Prototype, it)) return it;\n throw new $TypeError('Incorrect invocation');\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/an-object.js\nvar an_object_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar isObject = (is_object_namespaceFn());\n\nvar $String = String;\nvar $TypeError = TypeError;\n\n// `Assert: Type(argument) is Object`\nmodule.exports = function (argument) {\n if (isObject(argument)) return argument;\n throw new $TypeError($String(argument) + ' is not an object');\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/array-includes.js\nvar array_includes_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar toIndexedObject = (to_indexed_object_namespaceFn());\nvar toAbsoluteIndex = (to_absolute_index_namespaceFn());\nvar lengthOfArrayLike = (length_of_array_like_namespaceFn());\n\n// `Array.prototype.{ indexOf, includes }` methods implementation\nvar createMethod = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIndexedObject($this);\n var length = lengthOfArrayLike(O);\n if (length === 0) return !IS_INCLUDES && -1;\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare -- NaN check\n if (IS_INCLUDES && el !== el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare -- NaN check\n if (value !== value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) {\n if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.includes` method\n // https://tc39.es/ecma262/#sec-array.prototype.includes\n includes: createMethod(true),\n // `Array.prototype.indexOf` method\n // https://tc39.es/ecma262/#sec-array.prototype.indexof\n indexOf: createMethod(false)\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/array-set-length.js\nvar array_set_length_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar DESCRIPTORS = (descriptors_namespaceFn());\nvar isArray = (is_array_namespaceFn());\n\nvar $TypeError = TypeError;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Safari < 13 does not throw an error in this case\nvar SILENT_ON_NON_WRITABLE_LENGTH_SET = DESCRIPTORS && !function () {\n // makes no sense without proper strict mode support\n if (this !== undefined) return true;\n try {\n // eslint-disable-next-line es/no-object-defineproperty -- safe\n Object.defineProperty([], 'length', { writable: false }).length = 1;\n } catch (error) {\n return error instanceof TypeError;\n }\n}();\n\nmodule.exports = SILENT_ON_NON_WRITABLE_LENGTH_SET ? function (O, length) {\n if (isArray(O) && !getOwnPropertyDescriptor(O, 'length').writable) {\n throw new $TypeError('Cannot set read only .length');\n } return O.length = length;\n} : function (O, length) {\n return O.length = length;\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/call-with-safe-iteration-closing.js\nvar call_with_safe_iteration_closing_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar anObject = (an_object_namespaceFn());\nvar iteratorClose = (iterator_close_namespaceFn());\n\n// call something on iterator step with safe closing on error\nmodule.exports = function (iterator, fn, value, ENTRIES) {\n try {\n return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value);\n } catch (error) {\n iteratorClose(iterator, 'throw', error);\n }\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/classof-raw.js\nvar classof_raw_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar uncurryThis = (function_uncurry_this_namespaceFn());\n\nvar toString = uncurryThis({}.toString);\nvar stringSlice = uncurryThis(''.slice);\n\nmodule.exports = function (it) {\n return stringSlice(toString(it), 8, -1);\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/classof.js\nvar classof_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar TO_STRING_TAG_SUPPORT = (to_string_tag_support_namespaceFn());\nvar isCallable = (is_callable_namespaceFn());\nvar classofRaw = (classof_raw_namespaceFn());\nvar wellKnownSymbol = (well_known_symbol_namespaceFn());\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar $Object = Object;\n\n// ES3 wrong here\nvar CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) === 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (error) { /* empty */ }\n};\n\n// getting tag from ES6+ `Object.prototype.toString`\nmodule.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) {\n var O, tag, result;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (tag = tryGet(O = $Object(it), TO_STRING_TAG)) == 'string' ? tag\n // builtinTag case\n : CORRECT_ARGUMENTS ? classofRaw(O)\n // ES3 arguments fallback\n : (result = classofRaw(O)) === 'Object' && isCallable(O.callee) ? 'Arguments' : result;\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/copy-constructor-properties.js\nvar copy_constructor_properties_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar hasOwn = (has_own_property_namespaceFn());\nvar ownKeys = (own_keys_namespaceFn());\nvar getOwnPropertyDescriptorModule = (object_get_own_property_descriptor_namespaceFn());\nvar definePropertyModule = (object_define_property_namespaceFn());\n\nmodule.exports = function (target, source, exceptions) {\n var keys = ownKeys(source);\n var defineProperty = definePropertyModule.f;\n var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n if (!hasOwn(target, key) && !(exceptions && hasOwn(exceptions, key))) {\n defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n }\n }\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/correct-prototype-getter.js\nvar correct_prototype_getter_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar fails = (fails_namespaceFn());\n\nmodule.exports = !fails(function () {\n function F() { /* empty */ }\n F.prototype.constructor = null;\n // eslint-disable-next-line es/no-object-getprototypeof -- required for testing\n return Object.getPrototypeOf(new F()) !== F.prototype;\n});\n\n});\n\n// EXTERNAL MODULE: ./node_modules/core-js/internals/create-iter-result-object.js\nvar create_iter_result_object_namespaceFn = () => {\n\treturn __webpack_require__(529);\n};\n\n// MODULE: ./node_modules/core-js/internals/create-non-enumerable-property.js\nvar create_non_enumerable_property_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar DESCRIPTORS = (descriptors_namespaceFn());\nvar definePropertyModule = (object_define_property_namespaceFn());\nvar createPropertyDescriptor = (create_property_descriptor_namespaceFn());\n\nmodule.exports = DESCRIPTORS ? function (object, key, value) {\n return definePropertyModule.f(object, key, createPropertyDescriptor(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/create-property-descriptor.js\nvar create_property_descriptor_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nmodule.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/create-property.js\nvar create_property_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar DESCRIPTORS = (descriptors_namespaceFn());\nvar definePropertyModule = (object_define_property_namespaceFn());\nvar createPropertyDescriptor = (create_property_descriptor_namespaceFn());\n\nmodule.exports = function (object, key, value) {\n if (DESCRIPTORS) definePropertyModule.f(object, key, createPropertyDescriptor(0, value));\n else object[key] = value;\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/define-built-in-accessor.js\nvar define_built_in_accessor_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar makeBuiltIn = (make_built_in_namespaceFn());\nvar defineProperty = (object_define_property_namespaceFn());\n\nmodule.exports = function (target, name, descriptor) {\n if (descriptor.get) makeBuiltIn(descriptor.get, name, { getter: true });\n if (descriptor.set) makeBuiltIn(descriptor.set, name, { setter: true });\n return defineProperty.f(target, name, descriptor);\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/define-built-in.js\nvar define_built_in_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar isCallable = (is_callable_namespaceFn());\nvar definePropertyModule = (object_define_property_namespaceFn());\nvar makeBuiltIn = (make_built_in_namespaceFn());\nvar defineGlobalProperty = (define_global_property_namespaceFn());\n\nmodule.exports = function (O, key, value, options) {\n if (!options) options = {};\n var simple = options.enumerable;\n var name = options.name !== undefined ? options.name : key;\n if (isCallable(value)) makeBuiltIn(value, name, options);\n if (options.global) {\n if (simple) O[key] = value;\n else defineGlobalProperty(key, value);\n } else {\n try {\n if (!options.unsafe) delete O[key];\n else if (O[key]) simple = true;\n } catch (error) { /* empty */ }\n if (simple) O[key] = value;\n else definePropertyModule.f(O, key, {\n value: value,\n enumerable: false,\n configurable: !options.nonConfigurable,\n writable: !options.nonWritable\n });\n } return O;\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/define-built-ins.js\nvar define_built_ins_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar defineBuiltIn = (define_built_in_namespaceFn());\n\nmodule.exports = function (target, src, options) {\n for (var key in src) defineBuiltIn(target, key, src[key], options);\n return target;\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/define-global-property.js\nvar define_global_property_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar globalThis = (global_this_namespaceFn());\n\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar defineProperty = Object.defineProperty;\n\nmodule.exports = function (key, value) {\n try {\n defineProperty(globalThis, key, { value: value, configurable: true, writable: true });\n } catch (error) {\n globalThis[key] = value;\n } return value;\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/descriptors.js\nvar descriptors_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar fails = (fails_namespaceFn());\n\n// Detect IE8's incomplete defineProperty implementation\nmodule.exports = !fails(function () {\n // eslint-disable-next-line es/no-object-defineproperty -- required for testing\n return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] !== 7;\n});\n\n});\n\n// MODULE: ./node_modules/core-js/internals/document-create-element.js\nvar document_create_element_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar globalThis = (global_this_namespaceFn());\nvar isObject = (is_object_namespaceFn());\n\nvar document = globalThis.document;\n// typeof document.createElement is 'object' in old IE\nvar EXISTS = isObject(document) && isObject(document.createElement);\n\nmodule.exports = function (it) {\n return EXISTS ? document.createElement(it) : {};\n};\n\n});\n\n// EXTERNAL MODULE: ./node_modules/core-js/internals/does-not-exceed-safe-integer.js\nvar does_not_exceed_safe_integer_namespaceFn = () => {\n\treturn __webpack_require__(837);\n};\n\n// MODULE: ./node_modules/core-js/internals/enum-bug-keys.js\nvar enum_bug_keys_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\n// IE8- don't enum bug keys\nmodule.exports = [\n 'constructor',\n 'hasOwnProperty',\n 'isPrototypeOf',\n 'propertyIsEnumerable',\n 'toLocaleString',\n 'toString',\n 'valueOf'\n];\n\n});\n\n// MODULE: ./node_modules/core-js/internals/environment-user-agent.js\nvar environment_user_agent_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar globalThis = (global_this_namespaceFn());\n\nvar navigator = globalThis.navigator;\nvar userAgent = navigator && navigator.userAgent;\n\nmodule.exports = userAgent ? String(userAgent) : '';\n\n});\n\n// MODULE: ./node_modules/core-js/internals/environment-v8-version.js\nvar environment_v8_version_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar globalThis = (global_this_namespaceFn());\nvar userAgent = (environment_user_agent_namespaceFn());\n\nvar process = globalThis.process;\nvar Deno = globalThis.Deno;\nvar versions = process && process.versions || Deno && Deno.version;\nvar v8 = versions && versions.v8;\nvar match, version;\n\nif (v8) {\n match = v8.split('.');\n // in old Chrome, versions of V8 isn't V8 = Chrome / 10\n // but their correct versions are not interesting for us\n version = match[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1]);\n}\n\n// BrowserFS NodeJS `process` polyfill incorrectly set `.v8` to `0.0`\n// so check `userAgent` even if `.v8` exists, but 0\nif (!version && userAgent) {\n match = userAgent.match(/Edge\\/(\\d+)/);\n if (!match || match[1] >= 74) {\n match = userAgent.match(/Chrome\\/(\\d+)/);\n if (match) version = +match[1];\n }\n}\n\nmodule.exports = version;\n\n});\n\n// MODULE: ./node_modules/core-js/internals/export.js\nvar export_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar globalThis = (global_this_namespaceFn());\nvar getOwnPropertyDescriptor = (object_get_own_property_descriptor_namespaceFn().f);\nvar createNonEnumerableProperty = (create_non_enumerable_property_namespaceFn());\nvar defineBuiltIn = (define_built_in_namespaceFn());\nvar defineGlobalProperty = (define_global_property_namespaceFn());\nvar copyConstructorProperties = (copy_constructor_properties_namespaceFn());\nvar isForced = (is_forced_namespaceFn());\n\n/*\n options.target - name of the target object\n options.global - target is the global object\n options.stat - export as static methods of target\n options.proto - export as prototype methods of target\n options.real - real prototype method for the `pure` version\n options.forced - export even if the native feature is available\n options.bind - bind methods to the target, required for the `pure` version\n options.wrap - wrap constructors to preventing global pollution, required for the `pure` version\n options.unsafe - use the simple assignment of property instead of delete + defineProperty\n options.sham - add a flag to not completely full polyfills\n options.enumerable - export as enumerable property\n options.dontCallGetSet - prevent calling a getter on target\n options.name - the .name of the function if it does not match the key\n*/\nmodule.exports = function (options, source) {\n var TARGET = options.target;\n var GLOBAL = options.global;\n var STATIC = options.stat;\n var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n if (GLOBAL) {\n target = globalThis;\n } else if (STATIC) {\n target = globalThis[TARGET] || defineGlobalProperty(TARGET, {});\n } else {\n target = globalThis[TARGET] && globalThis[TARGET].prototype;\n }\n if (target) for (key in source) {\n sourceProperty = source[key];\n if (options.dontCallGetSet) {\n descriptor = getOwnPropertyDescriptor(target, key);\n targetProperty = descriptor && descriptor.value;\n } else targetProperty = target[key];\n FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n // contained in target\n if (!FORCED && targetProperty !== undefined) {\n if (typeof sourceProperty == typeof targetProperty) continue;\n copyConstructorProperties(sourceProperty, targetProperty);\n }\n // add a flag to not completely full polyfills\n if (options.sham || (targetProperty && targetProperty.sham)) {\n createNonEnumerableProperty(sourceProperty, 'sham', true);\n }\n defineBuiltIn(target, key, sourceProperty, options);\n }\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/fails.js\nvar fails_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nmodule.exports = function (exec) {\n try {\n return !!exec();\n } catch (error) {\n return true;\n }\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/function-apply.js\nvar function_apply_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar NATIVE_BIND = (function_bind_native_namespaceFn());\n\nvar FunctionPrototype = Function.prototype;\nvar apply = FunctionPrototype.apply;\nvar call = FunctionPrototype.call;\n\n// eslint-disable-next-line es/no-function-prototype-bind, es/no-reflect -- safe\nmodule.exports = typeof Reflect == 'object' && Reflect.apply || (NATIVE_BIND ? call.bind(apply) : function () {\n return call.apply(apply, arguments);\n});\n\n});\n\n// MODULE: ./node_modules/core-js/internals/function-bind-context.js\nvar function_bind_context_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar uncurryThis = (function_uncurry_this_clause_namespaceFn());\nvar aCallable = (a_callable_namespaceFn());\nvar NATIVE_BIND = (function_bind_native_namespaceFn());\n\nvar bind = uncurryThis(uncurryThis.bind);\n\n// optional / simple context binding\nmodule.exports = function (fn, that) {\n aCallable(fn);\n return that === undefined ? fn : NATIVE_BIND ? bind(fn, that) : function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/function-bind-native.js\nvar function_bind_native_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar fails = (fails_namespaceFn());\n\nmodule.exports = !fails(function () {\n // eslint-disable-next-line es/no-function-prototype-bind -- safe\n var test = function () { /* empty */ }.bind();\n // eslint-disable-next-line no-prototype-builtins -- safe\n return typeof test != 'function' || test.hasOwnProperty('prototype');\n});\n\n});\n\n// MODULE: ./node_modules/core-js/internals/function-call.js\nvar function_call_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar NATIVE_BIND = (function_bind_native_namespaceFn());\n\nvar call = Function.prototype.call;\n// eslint-disable-next-line es/no-function-prototype-bind -- safe\nmodule.exports = NATIVE_BIND ? call.bind(call) : function () {\n return call.apply(call, arguments);\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/function-name.js\nvar function_name_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar DESCRIPTORS = (descriptors_namespaceFn());\nvar hasOwn = (has_own_property_namespaceFn());\n\nvar FunctionPrototype = Function.prototype;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar getDescriptor = DESCRIPTORS && Object.getOwnPropertyDescriptor;\n\nvar EXISTS = hasOwn(FunctionPrototype, 'name');\n// additional protection from minified / mangled / dropped function names\nvar PROPER = EXISTS && function something() { /* empty */ }.name === 'something';\nvar CONFIGURABLE = EXISTS && (!DESCRIPTORS || (DESCRIPTORS && getDescriptor(FunctionPrototype, 'name').configurable));\n\nmodule.exports = {\n ...(/* unused pure expression */ null && (EXISTS)),\n ...(/* unused pure expression */ null && (PROPER)),\n CONFIGURABLE: CONFIGURABLE\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/function-uncurry-this-accessor.js\nvar function_uncurry_this_accessor_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar uncurryThis = (function_uncurry_this_namespaceFn());\nvar aCallable = (a_callable_namespaceFn());\n\nmodule.exports = function (object, key, method) {\n try {\n // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\n return uncurryThis(aCallable(Object.getOwnPropertyDescriptor(object, key)[method]));\n } catch (error) { /* empty */ }\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/function-uncurry-this-clause.js\nvar function_uncurry_this_clause_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar classofRaw = (classof_raw_namespaceFn());\nvar uncurryThis = (function_uncurry_this_namespaceFn());\n\nmodule.exports = function (fn) {\n // Nashorn bug:\n // https://github.com/zloirock/core-js/issues/1128\n // https://github.com/zloirock/core-js/issues/1130\n if (classofRaw(fn) === 'Function') return uncurryThis(fn);\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/function-uncurry-this.js\nvar function_uncurry_this_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar NATIVE_BIND = (function_bind_native_namespaceFn());\n\nvar FunctionPrototype = Function.prototype;\nvar call = FunctionPrototype.call;\n// eslint-disable-next-line es/no-function-prototype-bind -- safe\nvar uncurryThisWithBind = NATIVE_BIND && FunctionPrototype.bind.bind(call, call);\n\nmodule.exports = NATIVE_BIND ? uncurryThisWithBind : function (fn) {\n return function () {\n return call.apply(fn, arguments);\n };\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/get-built-in.js\nvar get_built_in_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar globalThis = (global_this_namespaceFn());\nvar isCallable = (is_callable_namespaceFn());\n\nvar aFunction = function (argument) {\n return isCallable(argument) ? argument : undefined;\n};\n\nmodule.exports = function (namespace, method) {\n return arguments.length < 2 ? aFunction(globalThis[namespace]) : globalThis[namespace] && globalThis[namespace][method];\n};\n\n});\n\n// EXTERNAL MODULE: ./node_modules/core-js/internals/get-iterator-direct.js\nvar get_iterator_direct_namespaceFn = () => {\n\treturn __webpack_require__(767);\n};\n\n// MODULE: ./node_modules/core-js/internals/get-iterator-internal.js\nvar get_iterator_internal_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar call = (function_call_namespaceFn());\nvar isCallable = (is_callable_namespaceFn());\nvar anObject = (an_object_namespaceFn());\nvar tryToString = (try_to_string_namespaceFn());\nvar getIteratorMethod = (get_iterator_method_internal_namespaceFn());\n\nvar $TypeError = TypeError;\n\nmodule.exports = function (argument, usingIterator) {\n var iteratorMethod = arguments.length < 2 ? getIteratorMethod(argument) : usingIterator;\n if (isCallable(iteratorMethod)) return anObject(call(iteratorMethod, argument));\n throw new $TypeError(tryToString(argument) + ' is not iterable');\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/get-iterator-method-internal.js\nvar get_iterator_method_internal_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar classof = (classof_raw_namespaceFn());\nvar isNullOrUndefined = (is_null_or_undefined_namespaceFn());\nvar getMethod = (get_method_namespaceFn());\nvar wellKnownSymbol = (well_known_symbol_namespaceFn());\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar ArrayPrototype = Array.prototype;\n\nmodule.exports = function (it) {\n if (!isNullOrUndefined(it)) return getMethod(it, ITERATOR)\n || getMethod(it, '@@iterator')\n || (classof(it) === 'Arguments' ? ArrayPrototype[ITERATOR] : undefined);\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/get-method.js\nvar get_method_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar aCallable = (a_callable_namespaceFn());\nvar isNullOrUndefined = (is_null_or_undefined_namespaceFn());\n\n// `GetMethod` abstract operation\n// https://tc39.es/ecma262/#sec-getmethod\nmodule.exports = function (V, P) {\n var func = V[P];\n return isNullOrUndefined(func) ? undefined : aCallable(func);\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/get-set-record.js\nvar get_set_record_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar aCallable = (a_callable_namespaceFn());\nvar anObject = (an_object_namespaceFn());\nvar call = (function_call_namespaceFn());\nvar toIntegerOrInfinity = (to_integer_or_infinity_namespaceFn());\nvar getIteratorDirect = (get_iterator_direct_namespaceFn());\n\nvar INVALID_SIZE = 'Invalid size';\nvar $RangeError = RangeError;\nvar $TypeError = TypeError;\nvar max = Math.max;\n\nvar SetRecord = function (set, intSize) {\n this.set = set;\n this.size = max(intSize, 0);\n this.has = aCallable(set.has);\n this.keys = aCallable(set.keys);\n};\n\nSetRecord.prototype = {\n getIterator: function () {\n return getIteratorDirect(anObject(call(this.keys, this.set)));\n },\n includes: function (it) {\n return call(this.has, this.set, it);\n }\n};\n\n// `GetSetRecord` abstract operation\n// https://tc39.es/proposal-set-methods/#sec-getsetrecord\nmodule.exports = function (obj) {\n anObject(obj);\n var numSize = +obj.size;\n // NOTE: If size is undefined, then numSize will be NaN\n // eslint-disable-next-line no-self-compare -- NaN check\n if (numSize !== numSize) throw new $TypeError(INVALID_SIZE);\n var intSize = toIntegerOrInfinity(numSize);\n if (intSize < 0) throw new $RangeError(INVALID_SIZE);\n return new SetRecord(obj, intSize);\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/global-this.js\nvar global_this_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar check = function (it) {\n return it && it.Math === Math && it;\n};\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nmodule.exports =\n // eslint-disable-next-line es/no-global-this -- safe\n check(typeof globalThis == 'object' && globalThis) ||\n check(typeof window == 'object' && window) ||\n // eslint-disable-next-line no-restricted-globals -- safe\n check(typeof self == 'object' && self) ||\n check(typeof global == 'object' && global) ||\n check(typeof this == 'object' && this) ||\n // eslint-disable-next-line no-new-func -- fallback\n (function () { return this; })() || Function('return this')();\n\n});\n\n// MODULE: ./node_modules/core-js/internals/has-own-property.js\nvar has_own_property_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar uncurryThis = (function_uncurry_this_namespaceFn());\nvar toObject = (to_object_namespaceFn());\n\nvar hasOwnProperty = uncurryThis({}.hasOwnProperty);\n\n// `HasOwnProperty` abstract operation\n// https://tc39.es/ecma262/#sec-hasownproperty\n// eslint-disable-next-line es/no-object-hasown -- safe\nmodule.exports = Object.hasOwn || function hasOwn(it, key) {\n return hasOwnProperty(toObject(it), key);\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/hidden-keys.js\nvar hidden_keys_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nmodule.exports = {};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/html.js\nvar html_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar getBuiltIn = (get_built_in_namespaceFn());\n\nmodule.exports = getBuiltIn('document', 'documentElement');\n\n});\n\n// MODULE: ./node_modules/core-js/internals/ie8-dom-define.js\nvar ie8_dom_define_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar DESCRIPTORS = (descriptors_namespaceFn());\nvar fails = (fails_namespaceFn());\nvar createElement = (document_create_element_namespaceFn());\n\n// Thanks to IE8 for its funny defineProperty\nmodule.exports = !DESCRIPTORS && !fails(function () {\n // eslint-disable-next-line es/no-object-defineproperty -- required for testing\n return Object.defineProperty(createElement('div'), 'a', {\n get: function () { return 7; }\n }).a !== 7;\n});\n\n});\n\n// MODULE: ./node_modules/core-js/internals/indexed-object.js\nvar indexed_object_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar uncurryThis = (function_uncurry_this_namespaceFn());\nvar fails = (fails_namespaceFn());\nvar classof = (classof_raw_namespaceFn());\n\nvar $Object = Object;\nvar split = uncurryThis(''.split);\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nmodule.exports = fails(function () {\n // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n // eslint-disable-next-line no-prototype-builtins -- safe\n return !$Object('z').propertyIsEnumerable(0);\n}) ? function (it) {\n return classof(it) === 'String' ? split(it, '') : $Object(it);\n} : $Object;\n\n});\n\n// MODULE: ./node_modules/core-js/internals/inspect-source.js\nvar inspect_source_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar uncurryThis = (function_uncurry_this_namespaceFn());\nvar isCallable = (is_callable_namespaceFn());\nvar store = (shared_store_namespaceFn());\n\nvar functionToString = uncurryThis(Function.toString);\n\n// this helper broken in `core-js@3.4.1-3.4.4`, so we can't use `shared` helper\nif (!isCallable(store.inspectSource)) {\n store.inspectSource = function (it) {\n return functionToString(it);\n };\n}\n\nmodule.exports = store.inspectSource;\n\n});\n\n// MODULE: ./node_modules/core-js/internals/internal-state.js\nvar internal_state_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar NATIVE_WEAK_MAP = (weak_map_basic_detection_namespaceFn());\nvar globalThis = (global_this_namespaceFn());\nvar isObject = (is_object_namespaceFn());\nvar createNonEnumerableProperty = (create_non_enumerable_property_namespaceFn());\nvar hasOwn = (has_own_property_namespaceFn());\nvar shared = (shared_store_namespaceFn());\nvar sharedKey = (shared_key_namespaceFn());\nvar hiddenKeys = (hidden_keys_namespaceFn());\n\nvar OBJECT_ALREADY_INITIALIZED = 'Object already initialized';\nvar TypeError = globalThis.TypeError;\nvar WeakMap = globalThis.WeakMap;\nvar set, get, has;\n\nvar enforce = function (it) {\n return has(it) ? get(it) : set(it, {});\n};\n\nvar getterFor = function (TYPE) {\n return function (it) {\n var state;\n if (!isObject(it) || (state = get(it)).type !== TYPE) {\n throw new TypeError('Incompatible receiver, ' + TYPE + ' required');\n } return state;\n };\n};\n\nif (NATIVE_WEAK_MAP || shared.state) {\n var store = shared.state || (shared.state = new WeakMap());\n /* eslint-disable no-self-assign -- prototype methods protection */\n store.get = store.get;\n store.has = store.has;\n store.set = store.set;\n /* eslint-enable no-self-assign -- prototype methods protection */\n set = function (it, metadata) {\n if (store.has(it)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);\n metadata.facade = it;\n store.set(it, metadata);\n return metadata;\n };\n get = function (it) {\n return store.get(it) || {};\n };\n has = function (it) {\n return store.has(it);\n };\n} else {\n var STATE = sharedKey('state');\n hiddenKeys[STATE] = true;\n set = function (it, metadata) {\n if (hasOwn(it, STATE)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);\n metadata.facade = it;\n createNonEnumerableProperty(it, STATE, metadata);\n return metadata;\n };\n get = function (it) {\n return hasOwn(it, STATE) ? it[STATE] : {};\n };\n has = function (it) {\n return hasOwn(it, STATE);\n };\n}\n\nmodule.exports = {\n set: set,\n get: get,\n has: has,\n enforce: enforce,\n getterFor: getterFor\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/is-array-iterator-method.js\nvar is_array_iterator_method_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar wellKnownSymbol = (well_known_symbol_namespaceFn());\nvar Iterators = (iterators_namespaceFn());\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar ArrayPrototype = Array.prototype;\n\n// check on default Array iterator\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it);\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/is-array.js\nvar is_array_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar classof = (classof_raw_namespaceFn());\n\n// `IsArray` abstract operation\n// https://tc39.es/ecma262/#sec-isarray\n// eslint-disable-next-line es/no-array-isarray -- safe\nmodule.exports = Array.isArray || function isArray(argument) {\n return classof(argument) === 'Array';\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/is-callable.js\nvar is_callable_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\n// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot\nvar documentAll = typeof document == 'object' && document.all;\n\n// `IsCallable` abstract operation\n// https://tc39.es/ecma262/#sec-iscallable\n// eslint-disable-next-line unicorn/no-typeof-undefined -- required for testing\nmodule.exports = typeof documentAll == 'undefined' && documentAll !== undefined ? function (argument) {\n return typeof argument == 'function' || argument === documentAll;\n} : function (argument) {\n return typeof argument == 'function';\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/is-forced.js\nvar is_forced_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar fails = (fails_namespaceFn());\nvar isCallable = (is_callable_namespaceFn());\n\nvar replacement = /#|\\.prototype\\./;\n\nvar isForced = function (feature, detection) {\n var value = data[normalize(feature)];\n return value === POLYFILL ? true\n : value === NATIVE ? false\n : isCallable(detection) ? fails(detection)\n : !!detection;\n};\n\nvar normalize = isForced.normalize = function (string) {\n return String(string).replace(replacement, '.').toLowerCase();\n};\n\nvar data = isForced.data = {};\nvar NATIVE = isForced.NATIVE = 'N';\nvar POLYFILL = isForced.POLYFILL = 'P';\n\nmodule.exports = isForced;\n\n});\n\n// EXTERNAL MODULE: ./node_modules/core-js/internals/is-null-or-undefined.js\nvar is_null_or_undefined_namespaceFn = () => {\n\treturn __webpack_require__(117);\n};\n\n// MODULE: ./node_modules/core-js/internals/is-object.js\nvar is_object_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar isCallable = (is_callable_namespaceFn());\n\nmodule.exports = function (it) {\n return typeof it == 'object' ? it !== null : isCallable(it);\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/is-pure.js\nvar is_pure_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nmodule.exports = false;\n\n});\n\n// MODULE: ./node_modules/core-js/internals/is-raw-json.js\nvar is_raw_json_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar isObject = (is_object_namespaceFn());\nvar getInternalState = (internal_state_namespaceFn().get);\n\nmodule.exports = function isRawJSON(O) {\n if (!isObject(O)) return false;\n var state = getInternalState(O);\n return !!state && state.type === 'RawJSON';\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/is-symbol.js\nvar is_symbol_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar getBuiltIn = (get_built_in_namespaceFn());\nvar isCallable = (is_callable_namespaceFn());\nvar isPrototypeOf = (object_is_prototype_of_namespaceFn());\nvar USE_SYMBOL_AS_UID = (use_symbol_as_uid_namespaceFn());\n\nvar $Object = Object;\n\nmodule.exports = USE_SYMBOL_AS_UID ? function (it) {\n return typeof it == 'symbol';\n} : function (it) {\n var $Symbol = getBuiltIn('Symbol');\n return isCallable($Symbol) && isPrototypeOf($Symbol.prototype, $Object(it));\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/iterate-simple.js\nvar iterate_simple_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar call = (function_call_namespaceFn());\n\nmodule.exports = function (record, fn, ITERATOR_INSTEAD_OF_RECORD) {\n var iterator = ITERATOR_INSTEAD_OF_RECORD ? record : record.iterator;\n var next = record.next;\n var step, result;\n while (!(step = call(next, iterator)).done) {\n result = fn(step.value);\n if (result !== undefined) return result;\n }\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/iterate.js\nvar iterate_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar bind = (function_bind_context_namespaceFn());\nvar call = (function_call_namespaceFn());\nvar anObject = (an_object_namespaceFn());\nvar tryToString = (try_to_string_namespaceFn());\nvar isArrayIteratorMethod = (is_array_iterator_method_namespaceFn());\nvar lengthOfArrayLike = (length_of_array_like_namespaceFn());\nvar isPrototypeOf = (object_is_prototype_of_namespaceFn());\nvar getIterator = (get_iterator_internal_namespaceFn());\nvar getIteratorMethod = (get_iterator_method_internal_namespaceFn());\nvar iteratorClose = (iterator_close_namespaceFn());\n\nvar $TypeError = TypeError;\n\nvar Result = function (stopped, result) {\n this.stopped = stopped;\n this.result = result;\n};\n\nvar ResultPrototype = Result.prototype;\n\nmodule.exports = function (iterable, unboundFunction, options) {\n var that = options && options.that;\n var AS_ENTRIES = !!(options && options.AS_ENTRIES);\n var IS_RECORD = !!(options && options.IS_RECORD);\n var IS_ITERATOR = !!(options && options.IS_ITERATOR);\n var INTERRUPTED = !!(options && options.INTERRUPTED);\n var fn = bind(unboundFunction, that);\n var iterator, iterFn, index, length, result, next, step;\n\n var stop = function (condition) {\n var $iterator = iterator;\n iterator = undefined;\n if ($iterator) iteratorClose($iterator, 'normal');\n return new Result(true, condition);\n };\n\n var callFn = function (value) {\n if (AS_ENTRIES) {\n anObject(value);\n return INTERRUPTED ? fn(value[0], value[1], stop) : fn(value[0], value[1]);\n } return INTERRUPTED ? fn(value, stop) : fn(value);\n };\n\n if (IS_RECORD) {\n iterator = iterable.iterator;\n } else if (IS_ITERATOR) {\n iterator = iterable;\n } else {\n iterFn = getIteratorMethod(iterable);\n if (!iterFn) throw new $TypeError(tryToString(iterable) + ' is not iterable');\n // optimisation for array iterators\n if (isArrayIteratorMethod(iterFn)) {\n for (index = 0, length = lengthOfArrayLike(iterable); length > index; index++) {\n result = callFn(iterable[index]);\n if (result && isPrototypeOf(ResultPrototype, result)) return result;\n } return new Result(false);\n }\n iterator = getIterator(iterable, iterFn);\n }\n\n next = IS_RECORD ? iterable.next : iterator.next;\n while (!(step = call(next, iterator)).done) {\n // `IteratorValue` errors should propagate without closing the iterator\n var value = step.value;\n try {\n result = callFn(value);\n } catch (error) {\n if (iterator) iteratorClose(iterator, 'throw', error);\n else throw error;\n }\n if (typeof result == 'object' && result && isPrototypeOf(ResultPrototype, result)) return result;\n } return new Result(false);\n};\n\n});\n\n// EXTERNAL MODULE: ./node_modules/core-js/internals/iterator-cleanup-state.js\nvar iterator_cleanup_state_namespaceFn = () => {\n\treturn __webpack_require__(859);\n};\n\n// MODULE: ./node_modules/core-js/internals/iterator-close-all.js\nvar iterator_close_all_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar iteratorClose = (iterator_close_namespaceFn());\n\nmodule.exports = function (iters, kind, value) {\n for (var i = iters.length - 1; i >= 0; i--) {\n if (iters[i] === undefined) continue;\n try {\n value = iteratorClose(iters[i].iterator, kind, value);\n } catch (error) {\n kind = 'throw';\n value = error;\n }\n }\n if (kind === 'throw') throw value;\n return value;\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/iterator-close.js\nvar iterator_close_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar call = (function_call_namespaceFn());\nvar anObject = (an_object_namespaceFn());\nvar getMethod = (get_method_namespaceFn());\n\nmodule.exports = function (iterator, kind, value) {\n var innerResult, innerError;\n anObject(iterator);\n try {\n innerResult = getMethod(iterator, 'return');\n if (!innerResult) {\n if (kind === 'throw') throw value;\n return value;\n }\n innerResult = call(innerResult, iterator);\n } catch (error) {\n innerError = true;\n innerResult = error;\n }\n if (kind === 'throw') throw value;\n if (innerError) throw innerResult;\n anObject(innerResult);\n return value;\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/iterator-create-proxy.js\nvar iterator_create_proxy_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar call = (function_call_namespaceFn());\nvar create = (object_create_namespaceFn());\nvar createNonEnumerableProperty = (create_non_enumerable_property_namespaceFn());\nvar defineBuiltIns = (define_built_ins_namespaceFn());\nvar wellKnownSymbol = (well_known_symbol_namespaceFn());\nvar InternalStateModule = (internal_state_namespaceFn());\nvar getMethod = (get_method_namespaceFn());\nvar IteratorPrototype = (iterators_core_namespaceFn().IteratorPrototype);\nvar createIterResultObject = (create_iter_result_object_namespaceFn());\nvar iteratorClose = (iterator_close_namespaceFn());\nvar iteratorCloseAll = (iterator_close_all_namespaceFn());\nvar cleanupState = (iterator_cleanup_state_namespaceFn());\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar ITERATOR_HELPER = 'IteratorHelper';\nvar WRAP_FOR_VALID_ITERATOR = 'WrapForValidIterator';\nvar NORMAL = 'normal';\nvar THROW = 'throw';\nvar setInternalState = InternalStateModule.set;\n\nvar createIteratorProxyPrototype = function (IS_ITERATOR) {\n var getInternalState = InternalStateModule.getterFor(IS_ITERATOR ? WRAP_FOR_VALID_ITERATOR : ITERATOR_HELPER);\n\n return defineBuiltIns(create(IteratorPrototype), {\n next: function next() {\n var state = getInternalState(this);\n // for simplification:\n // for `%WrapForValidIteratorPrototype%.next` or with `state.returnHandlerResult` our `nextHandler` returns `IterResultObject`\n // for `%IteratorHelperPrototype%.next` - just a value\n if (IS_ITERATOR) return state.nextHandler();\n if (state.done) return createIterResultObject(undefined, true);\n try {\n var result = state.nextHandler();\n if (state.done) cleanupState(state);\n return state.returnHandlerResult ? result : createIterResultObject(result, state.done);\n } catch (error) {\n state.done = true;\n cleanupState(state);\n throw error;\n }\n },\n 'return': function () {\n var state = getInternalState(this);\n var iterator = state.iterator;\n var inner = state.inner;\n var openIters = state.openIters;\n var done = state.done;\n state.done = true;\n if (IS_ITERATOR) {\n var returnMethod = getMethod(iterator, 'return');\n return returnMethod ? call(returnMethod, iterator) : createIterResultObject(undefined, true);\n }\n cleanupState(state);\n if (done) return createIterResultObject(undefined, true);\n if (inner) try {\n iteratorClose(inner.iterator, NORMAL);\n } catch (error) {\n return iteratorClose(iterator, THROW, error);\n }\n if (openIters) try {\n iteratorCloseAll(openIters, NORMAL);\n } catch (error) {\n if (iterator) return iteratorClose(iterator, THROW, error);\n throw error;\n }\n if (iterator) iteratorClose(iterator, NORMAL);\n return createIterResultObject(undefined, true);\n }\n });\n};\n\nvar WrapForValidIteratorPrototype = createIteratorProxyPrototype(true);\nvar IteratorHelperPrototype = createIteratorProxyPrototype(false);\n\ncreateNonEnumerableProperty(IteratorHelperPrototype, TO_STRING_TAG, 'Iterator Helper');\n\nmodule.exports = function (nextHandler, IS_ITERATOR, RETURN_HANDLER_RESULT) {\n var IteratorProxy = function Iterator(record, state) {\n if (state) {\n state.iterator = record.iterator;\n state.next = record.next;\n } else state = record;\n state.type = IS_ITERATOR ? WRAP_FOR_VALID_ITERATOR : ITERATOR_HELPER;\n state.returnHandlerResult = !!RETURN_HANDLER_RESULT;\n state.nextHandler = nextHandler;\n state.counter = 0;\n state.done = false;\n setInternalState(this, state);\n };\n\n IteratorProxy.prototype = IS_ITERATOR ? WrapForValidIteratorPrototype : IteratorHelperPrototype;\n\n return IteratorProxy;\n};\n\n});\n\n// EXTERNAL MODULE: ./node_modules/core-js/internals/iterator-helper-throws-on-invalid-iterator.js\nvar iterator_helper_throws_on_invalid_iterator_namespaceFn = () => {\n\treturn __webpack_require__(684);\n};\n\n// MODULE: ./node_modules/core-js/internals/iterator-helper-without-closing-on-early-error.js\nvar iterator_helper_without_closing_on_early_error_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar globalThis = (global_this_namespaceFn());\n\n// https://github.com/tc39/ecma262/pull/3467\nmodule.exports = function (METHOD_NAME, ExpectedError) {\n var Iterator = globalThis.Iterator;\n var IteratorPrototype = Iterator && Iterator.prototype;\n var method = IteratorPrototype && IteratorPrototype[METHOD_NAME];\n\n var CLOSED = false;\n\n if (method) try {\n method.call({\n next: function () { return { done: true }; },\n 'return': function () { CLOSED = true; }\n }, -1);\n } catch (error) {\n // https://bugs.webkit.org/show_bug.cgi?id=291195\n if (!(error instanceof ExpectedError)) CLOSED = false;\n }\n\n if (!CLOSED) return method;\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/iterators-core.js\nvar iterators_core_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar fails = (fails_namespaceFn());\nvar isCallable = (is_callable_namespaceFn());\nvar isObject = (is_object_namespaceFn());\nvar create = (object_create_namespaceFn());\nvar getPrototypeOf = (object_get_prototype_of_namespaceFn());\nvar defineBuiltIn = (define_built_in_namespaceFn());\nvar wellKnownSymbol = (well_known_symbol_namespaceFn());\nvar IS_PURE = (is_pure_namespaceFn());\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar BUGGY_SAFARI_ITERATORS = false;\n\n// `%IteratorPrototype%` object\n// https://tc39.es/ecma262/#sec-%iteratorprototype%-object\nvar IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;\n\n/* eslint-disable es/no-array-prototype-keys -- safe */\nif ([].keys) {\n arrayIterator = [].keys();\n // Safari 8 has buggy iterators w/o `next`\n if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;\n else {\n PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator));\n if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype;\n }\n}\n\nvar NEW_ITERATOR_PROTOTYPE = !isObject(IteratorPrototype) || fails(function () {\n var test = {};\n // FF44- legacy iterators case\n return IteratorPrototype[ITERATOR].call(test) !== test;\n});\n\nif (NEW_ITERATOR_PROTOTYPE) IteratorPrototype = {};\nelse if (IS_PURE) IteratorPrototype = create(IteratorPrototype);\n\n// `%IteratorPrototype%[@@iterator]()` method\n// https://tc39.es/ecma262/#sec-%iteratorprototype%-@@iterator\nif (!isCallable(IteratorPrototype[ITERATOR])) {\n defineBuiltIn(IteratorPrototype, ITERATOR, function () {\n return this;\n });\n}\n\nmodule.exports = {\n IteratorPrototype: IteratorPrototype,\n ...(/* unused pure expression */ null && (BUGGY_SAFARI_ITERATORS))\n};\n\n});\n\n// EXTERNAL MODULE: ./node_modules/core-js/internals/iterators.js\nvar iterators_namespaceFn = () => {\n\treturn __webpack_require__(269);\n};\n\n// MODULE: ./node_modules/core-js/internals/length-of-array-like.js\nvar length_of_array_like_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar toLength = (to_length_namespaceFn());\n\n// `LengthOfArrayLike` abstract operation\n// https://tc39.es/ecma262/#sec-lengthofarraylike\nmodule.exports = function (obj) {\n return toLength(obj.length);\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/make-built-in.js\nvar make_built_in_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar uncurryThis = (function_uncurry_this_namespaceFn());\nvar fails = (fails_namespaceFn());\nvar isCallable = (is_callable_namespaceFn());\nvar hasOwn = (has_own_property_namespaceFn());\nvar DESCRIPTORS = (descriptors_namespaceFn());\nvar CONFIGURABLE_FUNCTION_NAME = (function_name_namespaceFn().CONFIGURABLE);\nvar inspectSource = (inspect_source_namespaceFn());\nvar InternalStateModule = (internal_state_namespaceFn());\n\nvar enforceInternalState = InternalStateModule.enforce;\nvar getInternalState = InternalStateModule.get;\nvar $String = String;\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar defineProperty = Object.defineProperty;\nvar stringSlice = uncurryThis(''.slice);\nvar replace = uncurryThis(''.replace);\nvar join = uncurryThis([].join);\n\nvar CONFIGURABLE_LENGTH = DESCRIPTORS && !fails(function () {\n return defineProperty(function () { /* empty */ }, 'length', { value: 8 }).length !== 8;\n});\n\nvar TEMPLATE = String(String).split('String');\n\nvar makeBuiltIn = module.exports = function (value, name, options) {\n if (stringSlice($String(name), 0, 7) === 'Symbol(') {\n name = '[' + replace($String(name), /^Symbol\\(([^)]*)\\).*$/, '$1') + ']';\n }\n if (options && options.getter) name = 'get ' + name;\n if (options && options.setter) name = 'set ' + name;\n if (!hasOwn(value, 'name') || (CONFIGURABLE_FUNCTION_NAME && value.name !== name)) {\n if (DESCRIPTORS) defineProperty(value, 'name', { value: name, configurable: true });\n else value.name = name;\n }\n if (CONFIGURABLE_LENGTH && options && hasOwn(options, 'arity') && value.length !== options.arity) {\n defineProperty(value, 'length', { value: options.arity });\n }\n try {\n if (options && hasOwn(options, 'constructor') && options.constructor) {\n if (DESCRIPTORS) defineProperty(value, 'prototype', { writable: false });\n // in V8 ~ Chrome 53, prototypes of some methods, like `Array.prototype.values`, are non-writable\n } else if (value.prototype) value.prototype = undefined;\n } catch (error) { /* empty */ }\n var state = enforceInternalState(value);\n if (!hasOwn(state, 'source')) {\n state.source = join(TEMPLATE, typeof name == 'string' ? name : '');\n } return value;\n};\n\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n// eslint-disable-next-line no-extend-native -- required\nFunction.prototype.toString = makeBuiltIn(function toString() {\n return isCallable(this) && getInternalState(this).source || inspectSource(this);\n}, 'toString');\n\n});\n\n// MODULE: ./node_modules/core-js/internals/map-helpers.js\nvar map_helpers_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar uncurryThis = (function_uncurry_this_namespaceFn());\n\n// eslint-disable-next-line es/no-map -- safe\nvar MapPrototype = Map.prototype;\n\nmodule.exports = {\n // eslint-disable-next-line es/no-map -- safe\n Map: Map,\n set: uncurryThis(MapPrototype.set),\n get: uncurryThis(MapPrototype.get),\n has: uncurryThis(MapPrototype.has),\n remove: uncurryThis(MapPrototype['delete']),\n proto: MapPrototype\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/native-raw-json.js\nvar native_raw_json_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\n/* eslint-disable es/no-json -- safe */\nvar fails = (fails_namespaceFn());\n\nmodule.exports = !fails(function () {\n var unsafeInt = '9007199254740993';\n // eslint-disable-next-line es/no-json-rawjson -- feature detection\n var raw = JSON.rawJSON(unsafeInt);\n // eslint-disable-next-line es/no-json-israwjson -- feature detection\n return !JSON.isRawJSON(raw) || JSON.stringify(raw) !== unsafeInt;\n});\n\n});\n\n// MODULE: ./node_modules/core-js/internals/object-create.js\nvar object_create_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\n/* global ActiveXObject -- old IE, WSH */\nvar anObject = (an_object_namespaceFn());\nvar definePropertiesModule = (object_define_properties_namespaceFn());\nvar enumBugKeys = (enum_bug_keys_namespaceFn());\nvar hiddenKeys = (hidden_keys_namespaceFn());\nvar html = (html_namespaceFn());\nvar documentCreateElement = (document_create_element_namespaceFn());\nvar sharedKey = (shared_key_namespaceFn());\n\nvar GT = '>';\nvar LT = '<';\nvar PROTOTYPE = 'prototype';\nvar SCRIPT = 'script';\nvar IE_PROTO = sharedKey('IE_PROTO');\n\nvar EmptyConstructor = function () { /* empty */ };\n\nvar scriptTag = function (content) {\n return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;\n};\n\n// Create object with fake `null` prototype: use ActiveX Object with cleared prototype\nvar NullProtoObjectViaActiveX = function (activeXDocument) {\n activeXDocument.write(scriptTag(''));\n activeXDocument.close();\n var temp = activeXDocument.parentWindow.Object;\n // eslint-disable-next-line no-useless-assignment -- avoid memory leak\n activeXDocument = null;\n return temp;\n};\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar NullProtoObjectViaIFrame = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = documentCreateElement('iframe');\n var JS = 'java' + SCRIPT + ':';\n var iframeDocument;\n iframe.style.display = 'none';\n html.appendChild(iframe);\n // https://github.com/zloirock/core-js/issues/475\n iframe.src = String(JS);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(scriptTag('document.F=Object'));\n iframeDocument.close();\n return iframeDocument.F;\n};\n\n// Check for document.domain and active x support\n// No need to use active x approach when document.domain is not set\n// see https://github.com/es-shims/es5-shim/issues/150\n// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346\n// avoid IE GC bug\nvar activeXDocument;\nvar NullProtoObject = function () {\n try {\n activeXDocument = new ActiveXObject('htmlfile');\n } catch (error) { /* ignore */ }\n NullProtoObject = typeof document != 'undefined'\n ? document.domain && activeXDocument\n ? NullProtoObjectViaActiveX(activeXDocument) // old IE\n : NullProtoObjectViaIFrame()\n : NullProtoObjectViaActiveX(activeXDocument); // WSH\n var length = enumBugKeys.length;\n while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];\n return NullProtoObject();\n};\n\nhiddenKeys[IE_PROTO] = true;\n\n// `Object.create` method\n// https://tc39.es/ecma262/#sec-object.create\n// eslint-disable-next-line es/no-object-create -- safe\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n EmptyConstructor[PROTOTYPE] = anObject(O);\n result = new EmptyConstructor();\n EmptyConstructor[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = NullProtoObject();\n return Properties === undefined ? result : definePropertiesModule.f(result, Properties);\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/object-define-properties.js\nvar object_define_properties_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar DESCRIPTORS = (descriptors_namespaceFn());\nvar V8_PROTOTYPE_DEFINE_BUG = (v8_prototype_define_bug_namespaceFn());\nvar definePropertyModule = (object_define_property_namespaceFn());\nvar anObject = (an_object_namespaceFn());\nvar toIndexedObject = (to_indexed_object_namespaceFn());\nvar objectKeys = (object_keys_namespaceFn());\n\n// `Object.defineProperties` method\n// https://tc39.es/ecma262/#sec-object.defineproperties\n// eslint-disable-next-line es/no-object-defineproperties -- safe\nexports.f = DESCRIPTORS && !V8_PROTOTYPE_DEFINE_BUG ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var props = toIndexedObject(Properties);\n var keys = objectKeys(Properties);\n var length = keys.length;\n var index = 0;\n var key;\n while (length > index) definePropertyModule.f(O, key = keys[index++], props[key]);\n return O;\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/object-define-property.js\nvar object_define_property_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar DESCRIPTORS = (descriptors_namespaceFn());\nvar IE8_DOM_DEFINE = (ie8_dom_define_namespaceFn());\nvar V8_PROTOTYPE_DEFINE_BUG = (v8_prototype_define_bug_namespaceFn());\nvar anObject = (an_object_namespaceFn());\nvar toPropertyKey = (to_property_key_namespaceFn());\n\nvar $TypeError = TypeError;\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar $defineProperty = Object.defineProperty;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\nvar ENUMERABLE = 'enumerable';\nvar CONFIGURABLE = 'configurable';\nvar WRITABLE = 'writable';\n\n// `Object.defineProperty` method\n// https://tc39.es/ecma262/#sec-object.defineproperty\nexports.f = DESCRIPTORS ? V8_PROTOTYPE_DEFINE_BUG ? function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPropertyKey(P);\n anObject(Attributes);\n if (typeof O === 'function' && P === 'prototype' && 'value' in Attributes && WRITABLE in Attributes && !Attributes[WRITABLE]) {\n var current = $getOwnPropertyDescriptor(O, P);\n if (current && current[WRITABLE]) {\n O[P] = Attributes.value;\n Attributes = {\n configurable: CONFIGURABLE in Attributes ? Attributes[CONFIGURABLE] : current[CONFIGURABLE],\n enumerable: ENUMERABLE in Attributes ? Attributes[ENUMERABLE] : current[ENUMERABLE],\n writable: false\n };\n }\n } return $defineProperty(O, P, Attributes);\n} : $defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPropertyKey(P);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return $defineProperty(O, P, Attributes);\n } catch (error) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw new $TypeError('Accessors not supported');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/object-get-own-property-descriptor.js\nvar object_get_own_property_descriptor_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar DESCRIPTORS = (descriptors_namespaceFn());\nvar call = (function_call_namespaceFn());\nvar propertyIsEnumerableModule = (object_property_is_enumerable_namespaceFn());\nvar createPropertyDescriptor = (create_property_descriptor_namespaceFn());\nvar toIndexedObject = (to_indexed_object_namespaceFn());\nvar toPropertyKey = (to_property_key_namespaceFn());\nvar hasOwn = (has_own_property_namespaceFn());\nvar IE8_DOM_DEFINE = (ie8_dom_define_namespaceFn());\n\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.es/ecma262/#sec-object.getownpropertydescriptor\nexports.f = DESCRIPTORS ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n O = toIndexedObject(O);\n P = toPropertyKey(P);\n if (IE8_DOM_DEFINE) try {\n return $getOwnPropertyDescriptor(O, P);\n } catch (error) { /* empty */ }\n if (hasOwn(O, P)) return createPropertyDescriptor(!call(propertyIsEnumerableModule.f, O, P), O[P]);\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/object-get-own-property-names.js\nvar object_get_own_property_names_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar internalObjectKeys = (object_keys_internal_namespaceFn());\nvar enumBugKeys = (enum_bug_keys_namespaceFn());\n\nvar hiddenKeys = enumBugKeys.concat('length', 'prototype');\n\n// `Object.getOwnPropertyNames` method\n// https://tc39.es/ecma262/#sec-object.getownpropertynames\n// eslint-disable-next-line es/no-object-getownpropertynames -- safe\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return internalObjectKeys(O, hiddenKeys);\n};\n\n});\n\n// EXTERNAL MODULE: ./node_modules/core-js/internals/object-get-own-property-symbols.js\nvar object_get_own_property_symbols_namespaceFn = () => {\n\treturn __webpack_require__(717);\n};\n\n// MODULE: ./node_modules/core-js/internals/object-get-prototype-of.js\nvar object_get_prototype_of_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar hasOwn = (has_own_property_namespaceFn());\nvar isCallable = (is_callable_namespaceFn());\nvar toObject = (to_object_namespaceFn());\nvar sharedKey = (shared_key_namespaceFn());\nvar CORRECT_PROTOTYPE_GETTER = (correct_prototype_getter_namespaceFn());\n\nvar IE_PROTO = sharedKey('IE_PROTO');\nvar $Object = Object;\nvar ObjectPrototype = $Object.prototype;\n\n// `Object.getPrototypeOf` method\n// https://tc39.es/ecma262/#sec-object.getprototypeof\n// eslint-disable-next-line es/no-object-getprototypeof -- safe\nmodule.exports = CORRECT_PROTOTYPE_GETTER ? $Object.getPrototypeOf : function (O) {\n var object = toObject(O);\n if (hasOwn(object, IE_PROTO)) return object[IE_PROTO];\n var constructor = object.constructor;\n if (isCallable(constructor) && object instanceof constructor) {\n return constructor.prototype;\n } return object instanceof $Object ? ObjectPrototype : null;\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/object-is-prototype-of.js\nvar object_is_prototype_of_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar uncurryThis = (function_uncurry_this_namespaceFn());\n\nmodule.exports = uncurryThis({}.isPrototypeOf);\n\n});\n\n// MODULE: ./node_modules/core-js/internals/object-keys-internal.js\nvar object_keys_internal_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar uncurryThis = (function_uncurry_this_namespaceFn());\nvar hasOwn = (has_own_property_namespaceFn());\nvar toIndexedObject = (to_indexed_object_namespaceFn());\nvar indexOf = (array_includes_namespaceFn().indexOf);\nvar hiddenKeys = (hidden_keys_namespaceFn());\n\nvar push = uncurryThis([].push);\n\nmodule.exports = function (object, names) {\n var O = toIndexedObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) !hasOwn(hiddenKeys, key) && hasOwn(O, key) && push(result, key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (hasOwn(O, key = names[i++])) {\n ~indexOf(result, key) || push(result, key);\n }\n return result;\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/object-keys.js\nvar object_keys_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar internalObjectKeys = (object_keys_internal_namespaceFn());\nvar enumBugKeys = (enum_bug_keys_namespaceFn());\n\n// `Object.keys` method\n// https://tc39.es/ecma262/#sec-object.keys\n// eslint-disable-next-line es/no-object-keys -- safe\nmodule.exports = Object.keys || function keys(O) {\n return internalObjectKeys(O, enumBugKeys);\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/object-property-is-enumerable.js\nvar object_property_is_enumerable_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar $propertyIsEnumerable = {}.propertyIsEnumerable;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Nashorn ~ JDK8 bug\nvar NASHORN_BUG = getOwnPropertyDescriptor && !$propertyIsEnumerable.call({ 1: 2 }, 1);\n\n// `Object.prototype.propertyIsEnumerable` method implementation\n// https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable\nexports.f = NASHORN_BUG ? function propertyIsEnumerable(V) {\n var descriptor = getOwnPropertyDescriptor(this, V);\n return !!descriptor && descriptor.enumerable;\n} : $propertyIsEnumerable;\n\n});\n\n// MODULE: ./node_modules/core-js/internals/ordinary-to-primitive.js\nvar ordinary_to_primitive_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar call = (function_call_namespaceFn());\nvar isCallable = (is_callable_namespaceFn());\nvar isObject = (is_object_namespaceFn());\n\nvar $TypeError = TypeError;\n\n// `OrdinaryToPrimitive` abstract operation\n// https://tc39.es/ecma262/#sec-ordinarytoprimitive\nmodule.exports = function (input, pref) {\n var fn, val;\n if (pref === 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val;\n if (isCallable(fn = input.valueOf) && !isObject(val = call(fn, input))) return val;\n if (pref !== 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val;\n throw new $TypeError(\"Can't convert object to primitive value\");\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/own-keys.js\nvar own_keys_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar getBuiltIn = (get_built_in_namespaceFn());\nvar uncurryThis = (function_uncurry_this_namespaceFn());\nvar getOwnPropertyNamesModule = (object_get_own_property_names_namespaceFn());\nvar getOwnPropertySymbolsModule = (object_get_own_property_symbols_namespaceFn());\nvar anObject = (an_object_namespaceFn());\n\nvar concat = uncurryThis([].concat);\n\n// all object keys, includes non-enumerable and symbols\nmodule.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {\n var keys = getOwnPropertyNamesModule.f(anObject(it));\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n return getOwnPropertySymbols ? concat(keys, getOwnPropertySymbols(it)) : keys;\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/parse-json-string.js\nvar parse_json_string_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar uncurryThis = (function_uncurry_this_namespaceFn());\nvar hasOwn = (has_own_property_namespaceFn());\n\nvar $SyntaxError = SyntaxError;\nvar $parseInt = parseInt;\nvar fromCharCode = String.fromCharCode;\nvar at = uncurryThis(''.charAt);\nvar slice = uncurryThis(''.slice);\nvar exec = uncurryThis(/./.exec);\n\nvar codePoints = {\n '\\\\\"': '\"',\n '\\\\\\\\': '\\\\',\n '\\\\/': '/',\n '\\\\b': '\\b',\n '\\\\f': '\\f',\n '\\\\n': '\\n',\n '\\\\r': '\\r',\n '\\\\t': '\\t'\n};\n\nvar IS_4_HEX_DIGITS = /^[\\da-f]{4}$/i;\n// eslint-disable-next-line regexp/no-control-character -- safe\nvar IS_C0_CONTROL_CODE = /^[\\u0000-\\u001F]$/;\n\nmodule.exports = function (source, i) {\n var unterminated = true;\n var value = '';\n while (i < source.length) {\n var chr = at(source, i);\n if (chr === '\\\\') {\n var twoChars = slice(source, i, i + 2);\n if (hasOwn(codePoints, twoChars)) {\n value += codePoints[twoChars];\n i += 2;\n } else if (twoChars === '\\\\u') {\n i += 2;\n var fourHexDigits = slice(source, i, i + 4);\n if (!exec(IS_4_HEX_DIGITS, fourHexDigits)) throw new $SyntaxError('Bad Unicode escape at: ' + i);\n value += fromCharCode($parseInt(fourHexDigits, 16));\n i += 4;\n } else throw new $SyntaxError('Unknown escape sequence: \"' + twoChars + '\"');\n } else if (chr === '\"') {\n unterminated = false;\n i++;\n break;\n } else {\n if (exec(IS_C0_CONTROL_CODE, chr)) throw new $SyntaxError('Bad control character in string literal at: ' + i);\n value += chr;\n i++;\n }\n }\n if (unterminated) throw new $SyntaxError('Unterminated string at: ' + i);\n return { value: value, end: i };\n};\n\n});\n\n// EXTERNAL MODULE: ./node_modules/core-js/internals/require-object-coercible.js\nvar require_object_coercible_namespaceFn = () => {\n\treturn __webpack_require__(750);\n};\n\n// MODULE: ./node_modules/core-js/internals/set-clone.js\nvar set_clone_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar SetHelpers = (set_helpers_namespaceFn());\nvar iterate = (set_iterate_namespaceFn());\n\nvar Set = SetHelpers.Set;\nvar add = SetHelpers.add;\n\nmodule.exports = function (set) {\n var result = new Set();\n iterate(set, function (it) {\n add(result, it);\n });\n return result;\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/set-difference.js\nvar set_difference_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar aSet = (a_set_namespaceFn());\nvar SetHelpers = (set_helpers_namespaceFn());\nvar clone = (set_clone_namespaceFn());\nvar size = (set_size_namespaceFn());\nvar getSetRecord = (get_set_record_namespaceFn());\nvar iterateSet = (set_iterate_namespaceFn());\nvar iterateSimple = (iterate_simple_namespaceFn());\n\nvar has = SetHelpers.has;\nvar remove = SetHelpers.remove;\n\n// `Set.prototype.difference` method\n// https://tc39.es/ecma262/#sec-set.prototype.difference\nmodule.exports = function difference(other) {\n var O = aSet(this);\n var otherRec = getSetRecord(other);\n var result = clone(O);\n if (size(result) <= otherRec.size) iterateSet(result, function (e) {\n if (otherRec.includes(e)) remove(result, e);\n });\n else iterateSimple(otherRec.getIterator(), function (e) {\n if (has(result, e)) remove(result, e);\n });\n return result;\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/set-helpers.js\nvar set_helpers_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar uncurryThis = (function_uncurry_this_namespaceFn());\n\n// eslint-disable-next-line es/no-set -- safe\nvar SetPrototype = Set.prototype;\n\nmodule.exports = {\n // eslint-disable-next-line es/no-set -- safe\n Set: Set,\n add: uncurryThis(SetPrototype.add),\n has: uncurryThis(SetPrototype.has),\n remove: uncurryThis(SetPrototype['delete']),\n proto: SetPrototype\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/set-intersection.js\nvar set_intersection_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar aSet = (a_set_namespaceFn());\nvar SetHelpers = (set_helpers_namespaceFn());\nvar size = (set_size_namespaceFn());\nvar getSetRecord = (get_set_record_namespaceFn());\nvar iterateSet = (set_iterate_namespaceFn());\nvar iterateSimple = (iterate_simple_namespaceFn());\n\nvar Set = SetHelpers.Set;\nvar add = SetHelpers.add;\nvar has = SetHelpers.has;\n\n// `Set.prototype.intersection` method\n// https://tc39.es/ecma262/#sec-set.prototype.intersection\nmodule.exports = function intersection(other) {\n var O = aSet(this);\n var otherRec = getSetRecord(other);\n var result = new Set();\n\n if (size(O) > otherRec.size) {\n iterateSimple(otherRec.getIterator(), function (e) {\n if (has(O, e)) add(result, e);\n });\n } else {\n iterateSet(O, function (e) {\n if (otherRec.includes(e)) add(result, e);\n });\n }\n\n return result;\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/set-is-disjoint-from.js\nvar set_is_disjoint_from_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar aSet = (a_set_namespaceFn());\nvar has = (set_helpers_namespaceFn().has);\nvar size = (set_size_namespaceFn());\nvar getSetRecord = (get_set_record_namespaceFn());\nvar iterateSet = (set_iterate_namespaceFn());\nvar iterateSimple = (iterate_simple_namespaceFn());\nvar iteratorClose = (iterator_close_namespaceFn());\n\n// `Set.prototype.isDisjointFrom` method\n// https://tc39.es/ecma262/#sec-set.prototype.isdisjointfrom\nmodule.exports = function isDisjointFrom(other) {\n var O = aSet(this);\n var otherRec = getSetRecord(other);\n if (size(O) <= otherRec.size) return iterateSet(O, function (e) {\n if (otherRec.includes(e)) return false;\n }, true) !== false;\n var iterator = otherRec.getIterator();\n return iterateSimple(iterator, function (e) {\n if (has(O, e)) return iteratorClose(iterator.iterator, 'normal', false);\n }) !== false;\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/set-is-subset-of.js\nvar set_is_subset_of_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar aSet = (a_set_namespaceFn());\nvar size = (set_size_namespaceFn());\nvar iterate = (set_iterate_namespaceFn());\nvar getSetRecord = (get_set_record_namespaceFn());\n\n// `Set.prototype.isSubsetOf` method\n// https://tc39.es/ecma262/#sec-set.prototype.issubsetof\nmodule.exports = function isSubsetOf(other) {\n var O = aSet(this);\n var otherRec = getSetRecord(other);\n if (size(O) > otherRec.size) return false;\n return iterate(O, function (e) {\n if (!otherRec.includes(e)) return false;\n }, true) !== false;\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/set-is-superset-of.js\nvar set_is_superset_of_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar aSet = (a_set_namespaceFn());\nvar has = (set_helpers_namespaceFn().has);\nvar size = (set_size_namespaceFn());\nvar getSetRecord = (get_set_record_namespaceFn());\nvar iterateSimple = (iterate_simple_namespaceFn());\nvar iteratorClose = (iterator_close_namespaceFn());\n\n// `Set.prototype.isSupersetOf` method\n// https://tc39.es/ecma262/#sec-set.prototype.issupersetof\nmodule.exports = function isSupersetOf(other) {\n var O = aSet(this);\n var otherRec = getSetRecord(other);\n if (size(O) < otherRec.size) return false;\n var iterator = otherRec.getIterator();\n return iterateSimple(iterator, function (e) {\n if (!has(O, e)) return iteratorClose(iterator.iterator, 'normal', false);\n }) !== false;\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/set-iterate.js\nvar set_iterate_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar uncurryThis = (function_uncurry_this_namespaceFn());\nvar iterateSimple = (iterate_simple_namespaceFn());\nvar SetHelpers = (set_helpers_namespaceFn());\n\nvar Set = SetHelpers.Set;\nvar SetPrototype = SetHelpers.proto;\nvar forEach = uncurryThis(SetPrototype.forEach);\nvar keys = uncurryThis(SetPrototype.keys);\nvar next = keys(new Set()).next;\n\nmodule.exports = function (set, fn, interruptible) {\n return interruptible ? iterateSimple({ iterator: keys(set), next: next }, fn) : forEach(set, fn);\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/set-method-accept-set-like.js\nvar set_method_accept_set_like_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar getBuiltIn = (get_built_in_namespaceFn());\n\nvar createSetLike = function (size) {\n return {\n size: size,\n has: function () {\n return false;\n },\n keys: function () {\n return {\n next: function () {\n return { done: true };\n }\n };\n }\n };\n};\n\nvar createSetLikeWithInfinitySize = function (size) {\n return {\n size: size,\n has: function () {\n return true;\n },\n keys: function () {\n throw new Error('e');\n }\n };\n};\n\nmodule.exports = function (name, callback) {\n var Set = getBuiltIn('Set');\n try {\n new Set()[name](createSetLike(0));\n try {\n // late spec change, early WebKit ~ Safari 17 implementation does not pass it\n // https://github.com/tc39/proposal-set-methods/pull/88\n // also covered engines with\n // https://bugs.webkit.org/show_bug.cgi?id=272679\n new Set()[name](createSetLike(-1));\n return false;\n } catch (error2) {\n if (!callback) return true;\n // early V8 implementation bug\n // https://issues.chromium.org/issues/351332634\n try {\n new Set()[name](createSetLikeWithInfinitySize(-Infinity));\n return false;\n } catch (error) {\n var set = new Set([1, 2]);\n return callback(set[name](createSetLikeWithInfinitySize(Infinity)));\n }\n }\n } catch (error) {\n return false;\n }\n};\n\n});\n\n// EXTERNAL MODULE: ./node_modules/core-js/internals/set-method-get-keys-before-cloning-detection.js\nvar set_method_get_keys_before_cloning_detection_namespaceFn = () => {\n\treturn __webpack_require__(835);\n};\n\n// MODULE: ./node_modules/core-js/internals/set-size.js\nvar set_size_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar uncurryThisAccessor = (function_uncurry_this_accessor_namespaceFn());\nvar SetHelpers = (set_helpers_namespaceFn());\n\nmodule.exports = uncurryThisAccessor(SetHelpers.proto, 'size', 'get') || function (set) {\n return set.size;\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/set-symmetric-difference.js\nvar set_symmetric_difference_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar aSet = (a_set_namespaceFn());\nvar SetHelpers = (set_helpers_namespaceFn());\nvar clone = (set_clone_namespaceFn());\nvar getSetRecord = (get_set_record_namespaceFn());\nvar iterateSimple = (iterate_simple_namespaceFn());\n\nvar add = SetHelpers.add;\nvar has = SetHelpers.has;\nvar remove = SetHelpers.remove;\n\n// `Set.prototype.symmetricDifference` method\n// https://tc39.es/ecma262/#sec-set.prototype.symmetricdifference\nmodule.exports = function symmetricDifference(other) {\n var O = aSet(this);\n var keysIter = getSetRecord(other).getIterator();\n var result = clone(O);\n iterateSimple(keysIter, function (e) {\n if (has(O, e)) remove(result, e);\n else add(result, e);\n });\n return result;\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/set-union.js\nvar set_union_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar aSet = (a_set_namespaceFn());\nvar add = (set_helpers_namespaceFn().add);\nvar clone = (set_clone_namespaceFn());\nvar getSetRecord = (get_set_record_namespaceFn());\nvar iterateSimple = (iterate_simple_namespaceFn());\n\n// `Set.prototype.union` method\n// https://tc39.es/ecma262/#sec-set.prototype.union\nmodule.exports = function union(other) {\n var O = aSet(this);\n var keysIter = getSetRecord(other).getIterator();\n var result = clone(O);\n iterateSimple(keysIter, function (it) {\n add(result, it);\n });\n return result;\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/shared-key.js\nvar shared_key_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar shared = (shared_namespaceFn());\nvar uid = (uid_namespaceFn());\n\nvar keys = shared('keys');\n\nmodule.exports = function (key) {\n return keys[key] || (keys[key] = uid(key));\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/shared-store.js\nvar shared_store_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar IS_PURE = (is_pure_namespaceFn());\nvar globalThis = (global_this_namespaceFn());\nvar defineGlobalProperty = (define_global_property_namespaceFn());\n\nvar SHARED = '__core-js_shared__';\nvar store = module.exports = globalThis[SHARED] || defineGlobalProperty(SHARED, {});\n\n(store.versions || (store.versions = [])).push({\n version: '3.50.0',\n mode: IS_PURE ? 'pure' : 'global',\n copyright: '© 2013–2025 Denis Pushkarev (zloirock.ru), 2025–2026 CoreJS Company (core-js.io). All rights reserved.',\n license: 'https://github.com/zloirock/core-js/blob/v3.50.0/LICENSE',\n source: 'https://github.com/zloirock/core-js'\n});\n\n});\n\n// MODULE: ./node_modules/core-js/internals/shared.js\nvar shared_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar store = (shared_store_namespaceFn());\n// eslint-disable-next-line es/no-object-create -- safe\nvar create = Object.create || Object;\n\nmodule.exports = function (key, value) {\n return store[key] || (store[key] = value || create(null));\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/symbol-constructor-detection.js\nvar symbol_constructor_detection_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\n/* eslint-disable es/no-symbol -- required for testing */\nvar V8_VERSION = (environment_v8_version_namespaceFn());\nvar fails = (fails_namespaceFn());\nvar globalThis = (global_this_namespaceFn());\n\nvar $String = globalThis.String;\n\n// eslint-disable-next-line es/no-object-getownpropertysymbols -- required for testing\nmodule.exports = !!Object.getOwnPropertySymbols && !fails(function () {\n var symbol = Symbol('symbol detection');\n // Chrome 38 Symbol has incorrect toString conversion\n // `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances\n // nb: Do not call `String` directly to avoid this being optimized out to `symbol+''` which will,\n // of course, fail.\n return !$String(symbol) || !(Object(symbol) instanceof Symbol) ||\n // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances\n !Symbol.sham && V8_VERSION && V8_VERSION < 41;\n});\n\n});\n\n// MODULE: ./node_modules/core-js/internals/this-number-value.js\nvar this_number_value_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar uncurryThis = (function_uncurry_this_namespaceFn());\n\n// `thisNumberValue` abstract operation\n// https://tc39.es/ecma262/#sec-thisnumbervalue\nmodule.exports = uncurryThis(1.1.valueOf);\n\n});\n\n// MODULE: ./node_modules/core-js/internals/to-absolute-index.js\nvar to_absolute_index_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar toIntegerOrInfinity = (to_integer_or_infinity_namespaceFn());\n\nvar max = Math.max;\nvar min = Math.min;\n\n// Helper for a popular repeating case of the spec:\n// Let integer be ? ToInteger(index).\n// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).\nmodule.exports = function (index, length) {\n var integer = toIntegerOrInfinity(index);\n return integer < 0 ? max(integer + length, 0) : min(integer, length);\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/to-indexed-object.js\nvar to_indexed_object_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\n// toObject with fallback for non-array-like ES3 strings\nvar IndexedObject = (indexed_object_namespaceFn());\nvar requireObjectCoercible = (require_object_coercible_namespaceFn());\n\nmodule.exports = function (it) {\n return IndexedObject(requireObjectCoercible(it));\n};\n\n});\n\n// EXTERNAL MODULE: ./node_modules/core-js/internals/to-integer-or-infinity.js\nvar to_integer_or_infinity_namespaceFn = () => {\n\treturn __webpack_require__(291);\n};\n\n// EXTERNAL MODULE: ./node_modules/core-js/internals/to-length.js\nvar to_length_namespaceFn = () => {\n\treturn __webpack_require__(14);\n};\n\n// EXTERNAL MODULE: ./node_modules/core-js/internals/to-object.js\nvar to_object_namespaceFn = () => {\n\treturn __webpack_require__(981);\n};\n\n// MODULE: ./node_modules/core-js/internals/to-primitive.js\nvar to_primitive_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar call = (function_call_namespaceFn());\nvar isObject = (is_object_namespaceFn());\nvar isSymbol = (is_symbol_namespaceFn());\nvar getMethod = (get_method_namespaceFn());\nvar ordinaryToPrimitive = (ordinary_to_primitive_namespaceFn());\nvar wellKnownSymbol = (well_known_symbol_namespaceFn());\n\nvar $TypeError = TypeError;\nvar TO_PRIMITIVE = wellKnownSymbol('toPrimitive');\n\n// `ToPrimitive` abstract operation\n// https://tc39.es/ecma262/#sec-toprimitive\nmodule.exports = function (input, pref) {\n if (!isObject(input) || isSymbol(input)) return input;\n var exoticToPrim = getMethod(input, TO_PRIMITIVE);\n var result;\n if (exoticToPrim) {\n if (pref === undefined) pref = 'default';\n result = call(exoticToPrim, input, pref);\n if (!isObject(result) || isSymbol(result)) return result;\n throw new $TypeError(\"Can't convert object to primitive value\");\n }\n if (pref === undefined) pref = 'number';\n return ordinaryToPrimitive(input, pref);\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/to-property-key.js\nvar to_property_key_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar toPrimitive = (to_primitive_namespaceFn());\nvar isSymbol = (is_symbol_namespaceFn());\n\n// `ToPropertyKey` abstract operation\n// https://tc39.es/ecma262/#sec-topropertykey\nmodule.exports = function (argument) {\n var key = toPrimitive(argument, 'string');\n return isSymbol(key) ? key : key + '';\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/to-string-tag-support.js\nvar to_string_tag_support_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar wellKnownSymbol = (well_known_symbol_namespaceFn());\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar test = {};\n// eslint-disable-next-line unicorn/no-immediate-mutation -- ES3 syntax limitation\ntest[TO_STRING_TAG] = 'z';\n\nmodule.exports = String(test) === '[object z]';\n\n});\n\n// MODULE: ./node_modules/core-js/internals/to-string.js\nvar to_string_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar classof = (classof_namespaceFn());\n\nvar $String = String;\n\nmodule.exports = function (argument) {\n if (classof(argument) === 'Symbol') throw new TypeError('Cannot convert a Symbol value to a string');\n return $String(argument);\n};\n\n});\n\n// EXTERNAL MODULE: ./node_modules/core-js/internals/try-to-string.js\nvar try_to_string_namespaceFn = () => {\n\treturn __webpack_require__(823);\n};\n\n// MODULE: ./node_modules/core-js/internals/uid.js\nvar uid_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar uncurryThis = (function_uncurry_this_namespaceFn());\n\nvar id = 0;\nvar postfix = Math.random();\nvar toString = uncurryThis(1.1.toString);\n\nmodule.exports = function (key) {\n return 'Symbol(' + (key === undefined ? '' : key) + ')_' + toString(++id + postfix, 36);\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/use-symbol-as-uid.js\nvar use_symbol_as_uid_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\n/* eslint-disable es/no-symbol -- required for testing */\nvar NATIVE_SYMBOL = (symbol_constructor_detection_namespaceFn());\n\nmodule.exports = NATIVE_SYMBOL &&\n !Symbol.sham &&\n typeof Symbol.iterator == 'symbol';\n\n});\n\n// MODULE: ./node_modules/core-js/internals/v8-prototype-define-bug.js\nvar v8_prototype_define_bug_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar DESCRIPTORS = (descriptors_namespaceFn());\nvar fails = (fails_namespaceFn());\n\n// V8 ~ Chrome 36-\n// https://bugs.chromium.org/p/v8/issues/detail?id=3334\nmodule.exports = DESCRIPTORS && fails(function () {\n // eslint-disable-next-line es/no-object-defineproperty -- required for testing\n return Object.defineProperty(function () { /* empty */ }, 'prototype', {\n value: 42,\n writable: false\n }).prototype !== 42;\n});\n\n});\n\n// MODULE: ./node_modules/core-js/internals/weak-map-basic-detection.js\nvar weak_map_basic_detection_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar globalThis = (global_this_namespaceFn());\nvar isCallable = (is_callable_namespaceFn());\n\nvar WeakMap = globalThis.WeakMap;\n\nmodule.exports = isCallable(WeakMap) && /native code/.test(String(WeakMap));\n\n});\n\n// MODULE: ./node_modules/core-js/internals/weak-map-helpers.js\nvar weak_map_helpers_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar uncurryThis = (function_uncurry_this_namespaceFn());\n\n// eslint-disable-next-line es/no-weak-map -- safe\nvar WeakMapPrototype = WeakMap.prototype;\n\nmodule.exports = {\n // eslint-disable-next-line es/no-weak-map -- safe\n WeakMap: WeakMap,\n set: uncurryThis(WeakMapPrototype.set),\n get: uncurryThis(WeakMapPrototype.get),\n has: uncurryThis(WeakMapPrototype.has),\n remove: uncurryThis(WeakMapPrototype['delete'])\n};\n\n});\n\n// MODULE: ./node_modules/core-js/internals/well-known-symbol.js\nvar well_known_symbol_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar globalThis = (global_this_namespaceFn());\nvar shared = (shared_namespaceFn());\nvar hasOwn = (has_own_property_namespaceFn());\nvar uid = (uid_namespaceFn());\nvar NATIVE_SYMBOL = (symbol_constructor_detection_namespaceFn());\nvar USE_SYMBOL_AS_UID = (use_symbol_as_uid_namespaceFn());\n\nvar Symbol = globalThis.Symbol;\nvar WellKnownSymbolsStore = shared('wks');\nvar createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol['for'] || Symbol : Symbol && Symbol.withoutSetter || uid;\n\nmodule.exports = function (name) {\n if (!hasOwn(WellKnownSymbolsStore, name)) {\n WellKnownSymbolsStore[name] = NATIVE_SYMBOL && hasOwn(Symbol, name)\n ? Symbol[name]\n : createWellKnownSymbol('Symbol.' + name);\n } return WellKnownSymbolsStore[name];\n};\n\n});\n\n// MODULE: ./node_modules/core-js/modules/es.array.includes.js\nvar es_array_includes_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar $ = (export_namespaceFn());\nvar $includes = (array_includes_namespaceFn().includes);\nvar fails = (fails_namespaceFn());\nvar addToUnscopables = (add_to_unscopables_namespaceFn());\n\n// FF99+ bug\nvar BROKEN_ON_SPARSE = fails(function () {\n // eslint-disable-next-line es/no-array-prototype-includes -- detection\n return !Array(1).includes();\n});\n\n// Safari 26.4- bug\nvar BROKEN_ON_SPARSE_WITH_FROM_INDEX = fails(function () {\n // eslint-disable-next-line no-sparse-arrays, es/no-array-prototype-includes -- detection\n return [, 1].includes(undefined, 1);\n});\n\n// `Array.prototype.includes` method\n// https://tc39.es/ecma262/#sec-array.prototype.includes\n$({ target: 'Array', proto: true, forced: BROKEN_ON_SPARSE || BROKEN_ON_SPARSE_WITH_FROM_INDEX }, {\n includes: function includes(el /* , fromIndex = 0 */) {\n return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('includes');\n\n});\n\n// MODULE: ./node_modules/core-js/modules/es.array.push.js\nvar es_array_push_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar $ = (export_namespaceFn());\nvar toObject = (to_object_namespaceFn());\nvar lengthOfArrayLike = (length_of_array_like_namespaceFn());\nvar setArrayLength = (array_set_length_namespaceFn());\nvar doesNotExceedSafeInteger = (does_not_exceed_safe_integer_namespaceFn());\nvar fails = (fails_namespaceFn());\n\nvar INCORRECT_TO_LENGTH = fails(function () {\n return [].push.call({ length: 0x100000000 }, 1) !== 4294967297;\n});\n\n// V8 <= 121 and Safari <= 15.4; FF < 23 throws InternalError\n// https://bugs.chromium.org/p/v8/issues/detail?id=12681\nvar properErrorOnNonWritableLength = function () {\n try {\n // eslint-disable-next-line es/no-object-defineproperty -- safe\n Object.defineProperty([], 'length', { writable: false }).push();\n } catch (error) {\n return error instanceof TypeError;\n }\n};\n\nvar FORCED = INCORRECT_TO_LENGTH || !properErrorOnNonWritableLength();\n\n// `Array.prototype.push` method\n// https://tc39.es/ecma262/#sec-array.prototype.push\n$({ target: 'Array', proto: true, arity: 1, forced: FORCED }, {\n // eslint-disable-next-line no-unused-vars -- required for `.length`\n push: function push(item) {\n var O = toObject(this);\n var len = lengthOfArrayLike(O);\n var argCount = arguments.length;\n doesNotExceedSafeInteger(len + argCount);\n for (var i = 0; i < argCount; i++) {\n O[len] = arguments[i];\n len++;\n }\n setArrayLength(O, len);\n return len;\n }\n});\n\n});\n\n// MODULE: ./node_modules/core-js/modules/es.iterator.constructor.js\nvar es_iterator_constructor_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar $ = (export_namespaceFn());\nvar globalThis = (global_this_namespaceFn());\nvar anInstance = (an_instance_namespaceFn());\nvar anObject = (an_object_namespaceFn());\nvar isCallable = (is_callable_namespaceFn());\nvar getPrototypeOf = (object_get_prototype_of_namespaceFn());\nvar defineBuiltInAccessor = (define_built_in_accessor_namespaceFn());\nvar createProperty = (create_property_namespaceFn());\nvar fails = (fails_namespaceFn());\nvar hasOwn = (has_own_property_namespaceFn());\nvar wellKnownSymbol = (well_known_symbol_namespaceFn());\nvar IteratorPrototype = (iterators_core_namespaceFn().IteratorPrototype);\nvar DESCRIPTORS = (descriptors_namespaceFn());\nvar IS_PURE = (is_pure_namespaceFn());\n\nvar CONSTRUCTOR = 'constructor';\nvar ITERATOR = 'Iterator';\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n\nvar $TypeError = TypeError;\nvar NativeIterator = globalThis[ITERATOR];\n\n// FF56- have non-standard global helper `Iterator`\nvar FORCED = IS_PURE\n || !isCallable(NativeIterator)\n || NativeIterator.prototype !== IteratorPrototype\n // FF44- non-standard `Iterator` passes previous tests\n || !fails(function () { NativeIterator({}); });\n\nvar IteratorConstructor = function Iterator() {\n anInstance(this, IteratorPrototype);\n if (getPrototypeOf(this) === IteratorPrototype) throw new $TypeError('Abstract class Iterator not directly constructable');\n};\n\nvar defineIteratorPrototypeAccessor = function (key, value) {\n if (DESCRIPTORS) {\n defineBuiltInAccessor(IteratorPrototype, key, {\n configurable: true,\n get: function () {\n return value;\n },\n set: function (replacement) {\n anObject(this);\n if (this === IteratorPrototype) throw new $TypeError(\"You can't redefine this property\");\n if (hasOwn(this, key)) this[key] = replacement;\n else createProperty(this, key, replacement);\n }\n });\n } else IteratorPrototype[key] = value;\n};\n\nif (!hasOwn(IteratorPrototype, TO_STRING_TAG)) defineIteratorPrototypeAccessor(TO_STRING_TAG, ITERATOR);\n\nif (FORCED || !hasOwn(IteratorPrototype, CONSTRUCTOR) || IteratorPrototype[CONSTRUCTOR] === Object) {\n defineIteratorPrototypeAccessor(CONSTRUCTOR, IteratorConstructor);\n}\n\nIteratorConstructor.prototype = IteratorPrototype;\n\n// `Iterator` constructor\n// https://tc39.es/ecma262/#sec-iterator\n$({ global: true, constructor: true, forced: FORCED }, {\n Iterator: IteratorConstructor\n});\n\n});\n\n// MODULE: ./node_modules/core-js/modules/es.iterator.every.js\nvar es_iterator_every_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar $ = (export_namespaceFn());\nvar call = (function_call_namespaceFn());\nvar iterate = (iterate_namespaceFn());\nvar aCallable = (a_callable_namespaceFn());\nvar anObject = (an_object_namespaceFn());\nvar getIteratorDirect = (get_iterator_direct_namespaceFn());\nvar iteratorClose = (iterator_close_namespaceFn());\nvar iteratorHelperWithoutClosingOnEarlyError = (iterator_helper_without_closing_on_early_error_namespaceFn());\n\nvar everyWithoutClosingOnEarlyError = iteratorHelperWithoutClosingOnEarlyError('every', TypeError);\n\n// `Iterator.prototype.every` method\n// https://tc39.es/ecma262/#sec-iterator.prototype.every\n$({ target: 'Iterator', proto: true, real: true, forced: everyWithoutClosingOnEarlyError }, {\n every: function every(predicate) {\n anObject(this);\n try {\n aCallable(predicate);\n } catch (error) {\n iteratorClose(this, 'throw', error);\n }\n\n if (everyWithoutClosingOnEarlyError) return call(everyWithoutClosingOnEarlyError, this, predicate);\n\n var record = getIteratorDirect(this);\n var counter = 0;\n return !iterate(record, function (value, stop) {\n if (!predicate(value, counter++)) return stop();\n }, { IS_RECORD: true, INTERRUPTED: true }).stopped;\n }\n});\n\n});\n\n// MODULE: ./node_modules/core-js/modules/es.iterator.filter.js\nvar es_iterator_filter_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar $ = (export_namespaceFn());\nvar call = (function_call_namespaceFn());\nvar aCallable = (a_callable_namespaceFn());\nvar anObject = (an_object_namespaceFn());\nvar getIteratorDirect = (get_iterator_direct_namespaceFn());\nvar createIteratorProxy = (iterator_create_proxy_namespaceFn());\nvar callWithSafeIterationClosing = (call_with_safe_iteration_closing_namespaceFn());\nvar IS_PURE = (is_pure_namespaceFn());\nvar iteratorClose = (iterator_close_namespaceFn());\nvar iteratorHelperThrowsOnInvalidIterator = (iterator_helper_throws_on_invalid_iterator_namespaceFn());\nvar iteratorHelperWithoutClosingOnEarlyError = (iterator_helper_without_closing_on_early_error_namespaceFn());\n\nvar FILTER_WITHOUT_THROWING_ON_INVALID_ITERATOR = !IS_PURE && !iteratorHelperThrowsOnInvalidIterator('filter', function () { /* empty */ });\nvar filterWithoutClosingOnEarlyError = !IS_PURE && !FILTER_WITHOUT_THROWING_ON_INVALID_ITERATOR\n && iteratorHelperWithoutClosingOnEarlyError('filter', TypeError);\n\nvar FORCED = IS_PURE || FILTER_WITHOUT_THROWING_ON_INVALID_ITERATOR || filterWithoutClosingOnEarlyError;\n\nvar IteratorProxy = createIteratorProxy(function () {\n var iterator = this.iterator;\n var predicate = this.predicate;\n var next = this.next;\n var result, done, value;\n while (true) {\n result = anObject(call(next, iterator));\n done = this.done = !!result.done;\n if (done) return;\n value = result.value;\n if (callWithSafeIterationClosing(iterator, predicate, [value, this.counter++], true)) return value;\n }\n});\n\n// `Iterator.prototype.filter` method\n// https://tc39.es/ecma262/#sec-iterator.prototype.filter\n$({ target: 'Iterator', proto: true, real: true, forced: FORCED }, {\n filter: function filter(predicate) {\n anObject(this);\n try {\n aCallable(predicate);\n } catch (error) {\n iteratorClose(this, 'throw', error);\n }\n\n if (filterWithoutClosingOnEarlyError) return call(filterWithoutClosingOnEarlyError, this, predicate);\n\n return new IteratorProxy(getIteratorDirect(this), {\n predicate: predicate\n });\n }\n});\n\n});\n\n// MODULE: ./node_modules/core-js/modules/es.iterator.for-each.js\nvar es_iterator_for_each_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar $ = (export_namespaceFn());\nvar call = (function_call_namespaceFn());\nvar iterate = (iterate_namespaceFn());\nvar aCallable = (a_callable_namespaceFn());\nvar anObject = (an_object_namespaceFn());\nvar getIteratorDirect = (get_iterator_direct_namespaceFn());\nvar iteratorClose = (iterator_close_namespaceFn());\nvar iteratorHelperWithoutClosingOnEarlyError = (iterator_helper_without_closing_on_early_error_namespaceFn());\n\nvar forEachWithoutClosingOnEarlyError = iteratorHelperWithoutClosingOnEarlyError('forEach', TypeError);\n\n// `Iterator.prototype.forEach` method\n// https://tc39.es/ecma262/#sec-iterator.prototype.foreach\n$({ target: 'Iterator', proto: true, real: true, forced: forEachWithoutClosingOnEarlyError }, {\n forEach: function forEach(fn) {\n anObject(this);\n try {\n aCallable(fn);\n } catch (error) {\n iteratorClose(this, 'throw', error);\n }\n\n if (forEachWithoutClosingOnEarlyError) return call(forEachWithoutClosingOnEarlyError, this, fn);\n\n var record = getIteratorDirect(this);\n var counter = 0;\n iterate(record, function (value) {\n fn(value, counter++);\n }, { IS_RECORD: true });\n }\n});\n\n});\n\n// MODULE: ./node_modules/core-js/modules/es.iterator.map.js\nvar es_iterator_map_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar $ = (export_namespaceFn());\nvar call = (function_call_namespaceFn());\nvar aCallable = (a_callable_namespaceFn());\nvar anObject = (an_object_namespaceFn());\nvar getIteratorDirect = (get_iterator_direct_namespaceFn());\nvar createIteratorProxy = (iterator_create_proxy_namespaceFn());\nvar callWithSafeIterationClosing = (call_with_safe_iteration_closing_namespaceFn());\nvar iteratorClose = (iterator_close_namespaceFn());\nvar iteratorHelperThrowsOnInvalidIterator = (iterator_helper_throws_on_invalid_iterator_namespaceFn());\nvar iteratorHelperWithoutClosingOnEarlyError = (iterator_helper_without_closing_on_early_error_namespaceFn());\nvar IS_PURE = (is_pure_namespaceFn());\n\nvar MAP_WITHOUT_THROWING_ON_INVALID_ITERATOR = !IS_PURE && !iteratorHelperThrowsOnInvalidIterator('map', function () { /* empty */ });\nvar mapWithoutClosingOnEarlyError = !IS_PURE && !MAP_WITHOUT_THROWING_ON_INVALID_ITERATOR\n && iteratorHelperWithoutClosingOnEarlyError('map', TypeError);\n\nvar FORCED = IS_PURE || MAP_WITHOUT_THROWING_ON_INVALID_ITERATOR || mapWithoutClosingOnEarlyError;\n\nvar IteratorProxy = createIteratorProxy(function () {\n var iterator = this.iterator;\n var result = anObject(call(this.next, iterator));\n var done = this.done = !!result.done;\n if (!done) return callWithSafeIterationClosing(iterator, this.mapper, [result.value, this.counter++], true);\n});\n\n// `Iterator.prototype.map` method\n// https://tc39.es/ecma262/#sec-iterator.prototype.map\n$({ target: 'Iterator', proto: true, real: true, forced: FORCED }, {\n map: function map(mapper) {\n anObject(this);\n try {\n aCallable(mapper);\n } catch (error) {\n iteratorClose(this, 'throw', error);\n }\n\n if (mapWithoutClosingOnEarlyError) return call(mapWithoutClosingOnEarlyError, this, mapper);\n\n return new IteratorProxy(getIteratorDirect(this), {\n mapper: mapper\n });\n }\n});\n\n});\n\n// MODULE: ./node_modules/core-js/modules/es.iterator.reduce.js\nvar es_iterator_reduce_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar $ = (export_namespaceFn());\nvar iterate = (iterate_namespaceFn());\nvar aCallable = (a_callable_namespaceFn());\nvar anObject = (an_object_namespaceFn());\nvar getIteratorDirect = (get_iterator_direct_namespaceFn());\nvar iteratorClose = (iterator_close_namespaceFn());\nvar iteratorHelperWithoutClosingOnEarlyError = (iterator_helper_without_closing_on_early_error_namespaceFn());\nvar apply = (function_apply_namespaceFn());\nvar fails = (fails_namespaceFn());\n\nvar $TypeError = TypeError;\n\n// https://bugs.webkit.org/show_bug.cgi?id=291651\nvar FAILS_ON_INITIAL_UNDEFINED = fails(function () {\n // eslint-disable-next-line es/no-iterator-prototype-reduce, es/no-array-prototype-keys, array-callback-return -- required for testing\n [].keys().reduce(function () { /* empty */ }, undefined);\n});\n\nvar reduceWithoutClosingOnEarlyError = !FAILS_ON_INITIAL_UNDEFINED && iteratorHelperWithoutClosingOnEarlyError('reduce', $TypeError);\n\n// `Iterator.prototype.reduce` method\n// https://tc39.es/ecma262/#sec-iterator.prototype.reduce\n$({ target: 'Iterator', proto: true, real: true, forced: FAILS_ON_INITIAL_UNDEFINED || reduceWithoutClosingOnEarlyError }, {\n reduce: function reduce(reducer /* , initialValue */) {\n anObject(this);\n try {\n aCallable(reducer);\n } catch (error) {\n iteratorClose(this, 'throw', error);\n }\n\n var noInitial = arguments.length < 2;\n var accumulator = noInitial ? undefined : arguments[1];\n if (reduceWithoutClosingOnEarlyError) {\n return apply(reduceWithoutClosingOnEarlyError, this, noInitial ? [reducer] : [reducer, accumulator]);\n }\n var record = getIteratorDirect(this);\n var counter = 0;\n iterate(record, function (value) {\n if (noInitial) {\n noInitial = false;\n accumulator = value;\n } else {\n accumulator = reducer(accumulator, value, counter);\n }\n counter++;\n }, { IS_RECORD: true });\n if (noInitial) throw new $TypeError('Reduce of empty iterator with no initial value');\n return accumulator;\n }\n});\n\n});\n\n// MODULE: ./node_modules/core-js/modules/es.iterator.some.js\nvar es_iterator_some_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar $ = (export_namespaceFn());\nvar call = (function_call_namespaceFn());\nvar iterate = (iterate_namespaceFn());\nvar aCallable = (a_callable_namespaceFn());\nvar anObject = (an_object_namespaceFn());\nvar getIteratorDirect = (get_iterator_direct_namespaceFn());\nvar iteratorClose = (iterator_close_namespaceFn());\nvar iteratorHelperWithoutClosingOnEarlyError = (iterator_helper_without_closing_on_early_error_namespaceFn());\n\nvar someWithoutClosingOnEarlyError = iteratorHelperWithoutClosingOnEarlyError('some', TypeError);\n\n// `Iterator.prototype.some` method\n// https://tc39.es/ecma262/#sec-iterator.prototype.some\n$({ target: 'Iterator', proto: true, real: true, forced: someWithoutClosingOnEarlyError }, {\n some: function some(predicate) {\n anObject(this);\n try {\n aCallable(predicate);\n } catch (error) {\n iteratorClose(this, 'throw', error);\n }\n\n if (someWithoutClosingOnEarlyError) return call(someWithoutClosingOnEarlyError, this, predicate);\n\n var record = getIteratorDirect(this);\n var counter = 0;\n return iterate(record, function (value, stop) {\n if (predicate(value, counter++)) return stop();\n }, { IS_RECORD: true, INTERRUPTED: true }).stopped;\n }\n});\n\n});\n\n// MODULE: ./node_modules/core-js/modules/es.json.stringify.js\nvar es_json_stringify_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar $ = (export_namespaceFn());\nvar getBuiltIn = (get_built_in_namespaceFn());\nvar call = (function_call_namespaceFn());\nvar uncurryThis = (function_uncurry_this_namespaceFn());\nvar fails = (fails_namespaceFn());\nvar isArray = (is_array_namespaceFn());\nvar isCallable = (is_callable_namespaceFn());\nvar isObject = (is_object_namespaceFn());\nvar create = (object_create_namespaceFn());\nvar isRawJSON = (is_raw_json_namespaceFn());\nvar isSymbol = (is_symbol_namespaceFn());\nvar classof = (classof_raw_namespaceFn());\nvar thisNumberValue = (this_number_value_namespaceFn());\nvar includes = (array_includes_namespaceFn().includes);\nvar hasOwn = (has_own_property_namespaceFn());\nvar toString = (to_string_namespaceFn());\nvar parseJSONString = (parse_json_string_namespaceFn());\nvar uid = (uid_namespaceFn());\nvar NATIVE_SYMBOL = (symbol_constructor_detection_namespaceFn());\nvar NATIVE_RAW_JSON = (native_raw_json_namespaceFn());\n\nvar $String = String;\nvar $TypeError = TypeError;\nvar $stringify = getBuiltIn('JSON', 'stringify');\nvar $BigInt = getBuiltIn('BigInt');\nvar stringValueOf = uncurryThis(''.valueOf);\nvar booleanValueOf = uncurryThis(true.valueOf);\nvar bigIntValueOf = $BigInt && uncurryThis($BigInt.prototype.valueOf);\nvar exec = uncurryThis(/./.exec);\nvar charAt = uncurryThis(''.charAt);\nvar charCodeAt = uncurryThis(''.charCodeAt);\nvar replace = uncurryThis(''.replace);\nvar slice = uncurryThis(''.slice);\nvar push = uncurryThis([].push);\nvar pop = uncurryThis([].pop);\nvar numberToString = uncurryThis(1.1.toString);\n\nvar surrogates = /[\\uD800-\\uDFFF]/g;\nvar leadingSurrogates = /^[\\uD800-\\uDBFF]$/;\nvar trailingSurrogates = /^[\\uDC00-\\uDFFF]$/;\nvar digits = /^\\d+$/;\n\n// a placeholder of a raw JSON value\nvar RAW_MARK = uid();\n// a prefix of keys of a reordered object, see `createOrderedObject`\nvar KEY_MARK = uid();\n// the last key of a reordered object, marks the end of its serialization\nvar END_MARK = uid();\nvar RAW_MARK_LENGTH = RAW_MARK.length;\nvar KEY_MARK_LENGTH = KEY_MARK.length;\n\nvar WRONG_SYMBOLS_CONVERSION = !NATIVE_SYMBOL || fails(function () {\n var symbol = getBuiltIn('Symbol')('stringify detection');\n // MS Edge converts symbol values to JSON as {}\n return $stringify([symbol]) !== '[null]'\n // WebKit converts symbol values to JSON as null\n || $stringify({ a: symbol }) !== '{}'\n // V8 throws on boxed symbols\n || $stringify(Object(symbol)) !== '{}';\n});\n\n// https://github.com/tc39/proposal-well-formed-stringify\nvar ILL_FORMED_UNICODE = fails(function () {\n return $stringify('\\uDF06\\uD834') !== '\"\\\\udf06\\\\ud834\"'\n || $stringify('\\uDEAD') !== '\"\\\\udead\"';\n});\n\nvar isRawJSONValue = NATIVE_RAW_JSON ? getBuiltIn('JSON', 'isRawJSON') : isRawJSON;\n\nvar stringifyWithProperSymbolsConversion = WRONG_SYMBOLS_CONVERSION ? function (it, replacer, space) {\n return $stringify(it, function (key, value) {\n var replaced = call(replacer, this, key, value);\n if (!isSymbol(replaced)) return replaced;\n }, space);\n} : $stringify;\n\nvar fixIllFormedJSON = function (match, offset, string) {\n var prev = charAt(string, offset - 1);\n var next = charAt(string, offset + 1);\n if (\n (exec(leadingSurrogates, match) && !exec(trailingSurrogates, next)) ||\n (exec(trailingSurrogates, match) && !exec(leadingSurrogates, prev))\n ) {\n return '\\\\u' + numberToString(charCodeAt(match, 0), 16);\n } return match;\n};\n\n// `PropertyList` of `JSON.stringify`\n// https://tc39.es/ecma262/#sec-json.stringify\nvar getPropertyList = function (replacer) {\n if (!isArray(replacer)) return;\n var rawLength = replacer.length;\n var propertyList = [];\n // a null prototype object is used as a set of already added keys to keep the deduplication linear\n var addedKeys = create(null);\n for (var i = 0; i < rawLength; i++) {\n var element = replacer[i];\n var key;\n if (typeof element == 'string') key = element;\n else if (typeof element == 'number' || classof(element) === 'Number' || classof(element) === 'String') key = toString(element);\n else continue;\n if (!hasOwn(addedKeys, key)) {\n addedKeys[key] = true;\n push(propertyList, key);\n }\n }\n return propertyList;\n};\n\n// values with such an internal slot are unwrapped by `SerializeJSONProperty` instead of being serialized as objects\nvar hasInternalSlot = function (valueOf, it) {\n try {\n valueOf(it);\n return true;\n } catch (error) {\n return false;\n }\n};\n\n// the slot check is expensive, so it's performed only for the kind reported by the value itself -\n// a value lying about its kind via `Symbol.toStringTag` is serialized as an ordinary object\nvar isBoxedPrimitive = function (it) {\n var kind = classof(it);\n return (kind === 'Number' && hasInternalSlot(thisNumberValue, it))\n || (kind === 'String' && hasInternalSlot(stringValueOf, it))\n || (kind === 'Boolean' && hasInternalSlot(booleanValueOf, it))\n || (!!bigIntValueOf && kind === 'BigInt' && hasInternalSlot(bigIntValueOf, it));\n};\n\n// only objects serialized by `SerializeJSONObject` are affected by the property list\nvar isSerializedAsObject = function (it) {\n if (!isObject(it) || isCallable(it) || isArray(it)) return false;\n try {\n return !isBoxedPrimitive(it);\n // `classof` reads `Symbol.toStringTag`, so a proxy could throw - it has no internal slots anyway\n } catch (error) {\n return true;\n }\n};\n\n// the engine unwraps it in the same order as it would read the original property,\n// so the property is read lazily and `toJSON` is called once and with the original key\nvar createElementHolder = function (holder, key) {\n return {\n toJSON: function () {\n var element = holder[key];\n if (isObject(element) || typeof element == 'bigint') {\n var elementToJSON = element.toJSON;\n if (isCallable(elementToJSON)) element = call(elementToJSON, element, key);\n } return element;\n }\n };\n};\n\n// own keys of objects are sorted - integer-like keys are moved to the beginning,\n// so such keys should be marked and restored in the serialized string\nvar getKeyPrefix = function (propertyList) {\n for (var i = 0, length = propertyList.length; i < length; i++) {\n if (exec(digits, propertyList[i])) return KEY_MARK;\n } return '';\n};\n\n// `SerializeJSONObject` iterates the property list, so the value is replaced with an object with keys in this order\nvar createOrderedObject = function (value, propertyList, keyPrefix) {\n // keys are not marked if the property list has no integer-like keys, so `Object.prototype`\n // with a setter, a non-writable property or `__proto__` should not intercept the assignment\n var ordered = create(null);\n for (var i = 0, length = propertyList.length; i < length; i++) {\n var key = propertyList[i];\n ordered[keyPrefix + key] = createElementHolder(value, key);\n }\n ordered[END_MARK] = null;\n return ordered;\n};\n\n// `JSON.stringify` method\n// https://tc39.es/ecma262/#sec-json.stringify\n// https://github.com/tc39/proposal-json-parse-with-source\nif ($stringify) $({ target: 'JSON', stat: true, arity: 3, forced: WRONG_SYMBOLS_CONVERSION || ILL_FORMED_UNICODE || !NATIVE_RAW_JSON }, {\n stringify: function stringify(text, replacer, space) {\n var replacerFunction = isCallable(replacer) ? replacer : undefined;\n var propertyList = replacerFunction ? undefined : getPropertyList(replacer);\n var keyPrefix = propertyList && getKeyPrefix(propertyList);\n var rawStrings = [];\n var openObjects = [];\n var parentOrdered = [];\n var currentOrdered;\n var marked = false;\n var root = true;\n\n var json = stringifyWithProperSymbolsConversion(text, function (key, value) {\n // some old implementations (like WebKit) could pass numbers as keys\n key = $String(key);\n\n if (propertyList) {\n if (key === END_MARK) {\n pop(openObjects);\n currentOrdered = pop(parentOrdered);\n return;\n }\n if (root) root = false;\n // the innermost reordered object already contains only keys of the property list and arrays are not\n // affected by it, the rest of objects (like objects with a fake `Symbol.toStringTag`) are filtered here\n else if (this !== currentOrdered && !isArray(this) && !includes(propertyList, key)) return;\n } else if (replacerFunction) value = call(replacerFunction, this, key, value);\n\n if (isRawJSONValue(value)) {\n if (NATIVE_RAW_JSON) return value;\n marked = true;\n return RAW_MARK + (push(rawStrings, value.rawJSON) - 1);\n }\n\n if (propertyList && isSerializedAsObject(value)) {\n // reordered objects are new each time, so cycles should be detected before the engine does it\n if (includes(openObjects, value)) throw new $TypeError('Converting circular structure to JSON');\n var ordered = createOrderedObject(value, propertyList, keyPrefix);\n push(openObjects, value);\n push(parentOrdered, currentOrdered);\n currentOrdered = ordered;\n if (keyPrefix) marked = true;\n return ordered;\n }\n\n return value;\n }, space);\n\n if (typeof json != 'string') return json;\n\n if (ILL_FORMED_UNICODE) json = replace(json, surrogates, fixIllFormedJSON);\n\n if (!marked) return json;\n\n var result = '';\n var length = json.length;\n\n for (var i = 0; i < length; i++) {\n var chr = charAt(json, i);\n if (chr === '\"') {\n var end = parseJSONString(json, ++i).end - 1;\n var string = slice(json, i, end);\n if (slice(string, 0, RAW_MARK_LENGTH) === RAW_MARK) result += rawStrings[slice(string, RAW_MARK_LENGTH)];\n else if (slice(string, 0, KEY_MARK_LENGTH) === KEY_MARK) result += '\"' + slice(string, KEY_MARK_LENGTH) + '\"';\n else result += '\"' + string + '\"';\n i = end;\n } else result += chr;\n }\n\n return result;\n }\n});\n\n});\n\n// MODULE: ./node_modules/core-js/modules/es.map.get-or-insert-computed.js\nvar es_map_get_or_insert_computed_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar $ = (export_namespaceFn());\nvar aCallable = (a_callable_namespaceFn());\nvar MapHelpers = (map_helpers_namespaceFn());\nvar IS_PURE = (is_pure_namespaceFn());\n\nvar get = MapHelpers.get;\nvar has = MapHelpers.has;\nvar set = MapHelpers.set;\n\n// `Map.prototype.getOrInsertComputed` method\n// https://tc39.es/ecma262/#sec-map.prototype.getorinsertcomputed\n$({ target: 'Map', proto: true, real: true, forced: IS_PURE }, {\n getOrInsertComputed: function getOrInsertComputed(key, callbackfn) {\n var hasKey = has(this, key);\n aCallable(callbackfn);\n if (hasKey) return get(this, key);\n // CanonicalizeKeyedCollectionKey\n if (key === 0 && 1 / key === -Infinity) key = 0;\n var value = callbackfn(key);\n set(this, key, value);\n return value;\n }\n});\n\n});\n\n// MODULE: ./node_modules/core-js/modules/es.map.get-or-insert.js\nvar es_map_get_or_insert_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar $ = (export_namespaceFn());\nvar MapHelpers = (map_helpers_namespaceFn());\nvar IS_PURE = (is_pure_namespaceFn());\n\nvar get = MapHelpers.get;\nvar has = MapHelpers.has;\nvar set = MapHelpers.set;\n\n// `Map.prototype.getOrInsert` method\n// https://tc39.es/ecma262/#sec-map.prototype.getorinsert\n$({ target: 'Map', proto: true, real: true, forced: IS_PURE }, {\n getOrInsert: function getOrInsert(key, value) {\n if (has(this, key)) return get(this, key);\n set(this, key, value);\n return value;\n }\n});\n\n});\n\n// MODULE: ./node_modules/core-js/modules/es.math.sum-precise.js\nvar es_math_sum_precise_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\n// based on Shewchuk's algorithm for exactly floating point addition\n// adapted from https://github.com/tc39/proposal-math-sum/blob/3513d58323a1ae25560e8700aa5294500c6c9287/polyfill/polyfill.mjs\nvar $ = (export_namespaceFn());\nvar uncurryThis = (function_uncurry_this_namespaceFn());\nvar iterate = (iterate_namespaceFn());\n\nvar $RangeError = RangeError;\nvar $TypeError = TypeError;\nvar $Infinity = Infinity;\nvar $NaN = NaN;\nvar abs = Math.abs;\nvar pow = Math.pow;\nvar push = uncurryThis([].push);\n\nvar POW_2_1023 = pow(2, 1023);\nvar MAX_SAFE_INTEGER = pow(2, 53) - 1; // 2 ** 53 - 1 === 9007199254740991\nvar MAX_DOUBLE = Number.MAX_VALUE; // 2 ** 1024 - 2 ** (1023 - 52) === 1.79769313486231570815e+308\nvar MAX_ULP = pow(2, 971); // 2 ** (1023 - 52) === 1.99584030953471981166e+292\n\nvar NOT_A_NUMBER = {};\nvar MINUS_INFINITY = {};\nvar PLUS_INFINITY = {};\nvar MINUS_ZERO = {};\nvar FINITE = {};\n\n// prerequisite: abs(x) >= abs(y)\nvar twosum = function (x, y) {\n var hi = x + y;\n var lo = y - (hi - x);\n return { hi: hi, lo: lo };\n};\n\n// `Math.sumPrecise` method\n// https://tc39.es/ecma262/#sec-math.sumprecise\n$({ target: 'Math', stat: true }, {\n // eslint-disable-next-line max-statements -- ok\n sumPrecise: function sumPrecise(items) {\n var numbers = [];\n var count = 0;\n var state = MINUS_ZERO;\n\n iterate(items, function (n) {\n if (++count > MAX_SAFE_INTEGER) throw new $RangeError('Maximum allowed index exceeded');\n if (typeof n != 'number') throw new $TypeError('Value is not a number');\n if (state !== NOT_A_NUMBER) {\n // eslint-disable-next-line no-self-compare -- NaN check\n if (n !== n) state = NOT_A_NUMBER;\n else if (n === $Infinity) state = state === MINUS_INFINITY ? NOT_A_NUMBER : PLUS_INFINITY;\n else if (n === -$Infinity) state = state === PLUS_INFINITY ? NOT_A_NUMBER : MINUS_INFINITY;\n else if ((n !== 0 || (1 / n) === $Infinity) && (state === MINUS_ZERO || state === FINITE)) {\n state = FINITE;\n push(numbers, n);\n }\n }\n });\n\n switch (state) {\n case NOT_A_NUMBER: return $NaN;\n case MINUS_INFINITY: return -$Infinity;\n case PLUS_INFINITY: return $Infinity;\n case MINUS_ZERO: return -0;\n }\n\n var partials = [];\n var overflow = 0; // conceptually 2 ** 1024 times this value; the final partial is biased by this amount\n var x, y, sum, hi, lo, tmp;\n\n for (var i = 0; i < numbers.length; i++) {\n x = numbers[i];\n var actuallyUsedPartials = 0;\n for (var j = 0; j < partials.length; j++) {\n y = partials[j];\n if (abs(x) < abs(y)) {\n tmp = x;\n x = y;\n y = tmp;\n }\n sum = twosum(x, y);\n hi = sum.hi;\n lo = sum.lo;\n if (abs(hi) === $Infinity) {\n var sign = hi === $Infinity ? 1 : -1;\n overflow += sign;\n\n x = (x - (sign * POW_2_1023)) - (sign * POW_2_1023);\n if (abs(x) < abs(y)) {\n tmp = x;\n x = y;\n y = tmp;\n }\n sum = twosum(x, y);\n hi = sum.hi;\n lo = sum.lo;\n }\n if (lo !== 0) partials[actuallyUsedPartials++] = lo;\n x = hi;\n }\n partials.length = actuallyUsedPartials;\n if (x !== 0) push(partials, x);\n }\n\n // compute the exact sum of partials, stopping once we lose precision\n var n = partials.length - 1;\n hi = 0;\n lo = 0;\n\n if (overflow !== 0) {\n var next = n >= 0 ? partials[n] : 0;\n n--;\n if (abs(overflow) > 1 || (overflow > 0 && next > 0) || (overflow < 0 && next < 0)) {\n return overflow > 0 ? $Infinity : -$Infinity;\n }\n // here we actually have to do the arithmetic\n // drop a factor of 2 so we can do it without overflow\n // assert(abs(overflow) === 1)\n sum = twosum(overflow * POW_2_1023, next / 2);\n hi = sum.hi;\n lo = sum.lo;\n lo *= 2;\n if (abs(2 * hi) === $Infinity) {\n // rounding to the maximum value\n if (hi > 0) {\n return (hi === POW_2_1023 && lo === -(MAX_ULP / 2) && n >= 0 && partials[n] < 0) ? MAX_DOUBLE : $Infinity;\n } return (hi === -POW_2_1023 && lo === (MAX_ULP / 2) && n >= 0 && partials[n] > 0) ? -MAX_DOUBLE : -$Infinity;\n }\n\n if (lo !== 0) {\n partials[++n] = lo;\n lo = 0;\n }\n\n hi *= 2;\n }\n\n while (n >= 0) {\n sum = twosum(hi, partials[n--]);\n hi = sum.hi;\n lo = sum.lo;\n if (lo !== 0) break;\n }\n\n if (n >= 0 && ((lo < 0 && partials[n] < 0) || (lo > 0 && partials[n] > 0))) {\n y = lo * 2;\n x = hi + y;\n if (y === x - hi) hi = x;\n }\n\n return hi;\n }\n});\n\n});\n\n// MODULE: ./node_modules/core-js/modules/es.set.difference.v2.js\nvar es_set_difference_v2_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar $ = (export_namespaceFn());\nvar difference = (set_difference_namespaceFn());\nvar fails = (fails_namespaceFn());\nvar setMethodAcceptSetLike = (set_method_accept_set_like_namespaceFn());\n\nvar SET_LIKE_INCORRECT_BEHAVIOR = !setMethodAcceptSetLike('difference', function (result) {\n return result.size === 0;\n});\n\nvar FORCED = SET_LIKE_INCORRECT_BEHAVIOR || fails(function () {\n // https://bugs.webkit.org/show_bug.cgi?id=288595\n var setLike = {\n size: 1,\n has: function () { return true; },\n keys: function () {\n var index = 0;\n return {\n next: function () {\n var done = index++ > 1;\n if (baseSet.has(1)) baseSet.clear();\n return { done: done, value: 2 };\n }\n };\n }\n };\n // eslint-disable-next-line es/no-set -- testing\n var baseSet = new Set([1, 2, 3, 4]);\n // eslint-disable-next-line es/no-set-prototype-difference -- testing\n return baseSet.difference(setLike).size !== 3;\n});\n\n// `Set.prototype.difference` method\n// https://tc39.es/ecma262/#sec-set.prototype.difference\n$({ target: 'Set', proto: true, real: true, forced: FORCED }, {\n difference: difference\n});\n\n});\n\n// MODULE: ./node_modules/core-js/modules/es.set.intersection.v2.js\nvar es_set_intersection_v2_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar $ = (export_namespaceFn());\nvar fails = (fails_namespaceFn());\nvar intersection = (set_intersection_namespaceFn());\nvar setMethodAcceptSetLike = (set_method_accept_set_like_namespaceFn());\n\nvar INCORRECT = !setMethodAcceptSetLike('intersection', function (result) {\n return result.size === 2 && result.has(1) && result.has(2);\n}) || fails(function () {\n // eslint-disable-next-line es/no-array-from, es/no-set, es/no-set-prototype-intersection -- testing\n return String(Array.from(new Set([1, 2, 3]).intersection(new Set([3, 2])))) !== '3,2';\n});\n\n// `Set.prototype.intersection` method\n// https://tc39.es/ecma262/#sec-set.prototype.intersection\n$({ target: 'Set', proto: true, real: true, forced: INCORRECT }, {\n intersection: intersection\n});\n\n});\n\n// MODULE: ./node_modules/core-js/modules/es.set.is-disjoint-from.v2.js\nvar es_set_is_disjoint_from_v2_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar $ = (export_namespaceFn());\nvar isDisjointFrom = (set_is_disjoint_from_namespaceFn());\nvar setMethodAcceptSetLike = (set_method_accept_set_like_namespaceFn());\n\nvar INCORRECT = !setMethodAcceptSetLike('isDisjointFrom', function (result) {\n return !result;\n});\n\n// `Set.prototype.isDisjointFrom` method\n// https://tc39.es/ecma262/#sec-set.prototype.isdisjointfrom\n$({ target: 'Set', proto: true, real: true, forced: INCORRECT }, {\n isDisjointFrom: isDisjointFrom\n});\n\n});\n\n// MODULE: ./node_modules/core-js/modules/es.set.is-subset-of.v2.js\nvar es_set_is_subset_of_v2_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar $ = (export_namespaceFn());\nvar isSubsetOf = (set_is_subset_of_namespaceFn());\nvar setMethodAcceptSetLike = (set_method_accept_set_like_namespaceFn());\n\nvar INCORRECT = !setMethodAcceptSetLike('isSubsetOf', function (result) {\n return result;\n});\n\n// `Set.prototype.isSubsetOf` method\n// https://tc39.es/ecma262/#sec-set.prototype.issubsetof\n$({ target: 'Set', proto: true, real: true, forced: INCORRECT }, {\n isSubsetOf: isSubsetOf\n});\n\n});\n\n// MODULE: ./node_modules/core-js/modules/es.set.is-superset-of.v2.js\nvar es_set_is_superset_of_v2_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar $ = (export_namespaceFn());\nvar isSupersetOf = (set_is_superset_of_namespaceFn());\nvar setMethodAcceptSetLike = (set_method_accept_set_like_namespaceFn());\n\nvar INCORRECT = !setMethodAcceptSetLike('isSupersetOf', function (result) {\n return !result;\n});\n\n// `Set.prototype.isSupersetOf` method\n// https://tc39.es/ecma262/#sec-set.prototype.issupersetof\n$({ target: 'Set', proto: true, real: true, forced: INCORRECT }, {\n isSupersetOf: isSupersetOf\n});\n\n});\n\n// MODULE: ./node_modules/core-js/modules/es.set.symmetric-difference.v2.js\nvar es_set_symmetric_difference_v2_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar $ = (export_namespaceFn());\nvar symmetricDifference = (set_symmetric_difference_namespaceFn());\nvar setMethodGetKeysBeforeCloning = (set_method_get_keys_before_cloning_detection_namespaceFn());\nvar setMethodAcceptSetLike = (set_method_accept_set_like_namespaceFn());\n\nvar FORCED = !setMethodAcceptSetLike('symmetricDifference') || !setMethodGetKeysBeforeCloning('symmetricDifference');\n\n// `Set.prototype.symmetricDifference` method\n// https://tc39.es/ecma262/#sec-set.prototype.symmetricdifference\n$({ target: 'Set', proto: true, real: true, forced: FORCED }, {\n symmetricDifference: symmetricDifference\n});\n\n});\n\n// MODULE: ./node_modules/core-js/modules/es.set.union.v2.js\nvar es_set_union_v2_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar $ = (export_namespaceFn());\nvar union = (set_union_namespaceFn());\nvar setMethodGetKeysBeforeCloning = (set_method_get_keys_before_cloning_detection_namespaceFn());\nvar setMethodAcceptSetLike = (set_method_accept_set_like_namespaceFn());\n\nvar FORCED = !setMethodAcceptSetLike('union') || !setMethodGetKeysBeforeCloning('union');\n\n// `Set.prototype.union` method\n// https://tc39.es/ecma262/#sec-set.prototype.union\n$({ target: 'Set', proto: true, real: true, forced: FORCED }, {\n union: union\n});\n\n});\n\n// MODULE: ./node_modules/core-js/modules/es.weak-map.get-or-insert-computed.js\nvar es_weak_map_get_or_insert_computed_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar $ = (export_namespaceFn());\nvar aCallable = (a_callable_namespaceFn());\nvar aWeakMap = (a_weak_map_namespaceFn());\nvar aWeakKey = (a_weak_key_namespaceFn());\nvar WeakMapHelpers = (weak_map_helpers_namespaceFn());\nvar IS_PURE = (is_pure_namespaceFn());\n\nvar get = WeakMapHelpers.get;\nvar has = WeakMapHelpers.has;\nvar set = WeakMapHelpers.set;\n\nvar FORCED = IS_PURE || !function () {\n try {\n // eslint-disable-next-line es/no-weak-map, no-throw-literal -- testing\n if (WeakMap.prototype.getOrInsertComputed) new WeakMap().getOrInsertComputed(1, function () { throw 1; });\n } catch (error) {\n // FF144 Nightly - Beta 3 bug\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1988369\n return error instanceof TypeError;\n }\n}();\n\n// `WeakMap.prototype.getOrInsertComputed` method\n// https://tc39.es/ecma262/#sec-weakmap.prototype.getorinsertcomputed\n$({ target: 'WeakMap', proto: true, real: true, forced: FORCED }, {\n getOrInsertComputed: function getOrInsertComputed(key, callbackfn) {\n if (!IS_PURE) aWeakMap(this);\n aWeakKey(key);\n aCallable(callbackfn);\n if (has(this, key)) return get(this, key);\n var value = callbackfn(key);\n set(this, key, value);\n return value;\n }\n});\n\n});\n\n// MODULE: ./node_modules/core-js/modules/es.weak-map.get-or-insert.js\nvar es_weak_map_get_or_insert_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) {\n\nvar $ = (export_namespaceFn());\nvar WeakMapHelpers = (weak_map_helpers_namespaceFn());\nvar IS_PURE = (is_pure_namespaceFn());\n\nvar get = WeakMapHelpers.get;\nvar has = WeakMapHelpers.has;\nvar set = WeakMapHelpers.set;\n\n// `WeakMap.prototype.getOrInsert` method\n// https://tc39.es/ecma262/#sec-weakmap.prototype.getorinsert\n$({ target: 'WeakMap', proto: true, real: true, forced: IS_PURE }, {\n getOrInsert: function getOrInsert(key, value) {\n if (has(this, key)) return get(this, key);\n set(this, key, value);\n return value;\n }\n});\n\n});\n\n;// ./node_modules/core-js/modules/es.array.push.js\nes_array_push_namespaceFn();\n\n;// ./node_modules/core-js/modules/es.iterator.constructor.js\nes_iterator_constructor_namespaceFn();\n\n;// ./node_modules/core-js/modules/es.iterator.map.js\nes_iterator_map_namespaceFn();\n\n;// ./src/scripting_api/constants.js\nconst Border = Object.freeze({\n s: \"solid\",\n d: \"dashed\",\n b: \"beveled\",\n i: \"inset\",\n u: \"underline\"\n});\nconst Cursor = Object.freeze({\n visible: 0,\n hidden: 1,\n delay: 2\n});\nconst Display = Object.freeze({\n visible: 0,\n hidden: 1,\n noPrint: 2,\n noView: 3\n});\nconst Font = Object.freeze({\n Times: \"Times-Roman\",\n TimesB: \"Times-Bold\",\n TimesI: \"Times-Italic\",\n TimesBI: \"Times-BoldItalic\",\n Helv: \"Helvetica\",\n HelvB: \"Helvetica-Bold\",\n HelvI: \"Helvetica-Oblique\",\n HelvBI: \"Helvetica-BoldOblique\",\n Cour: \"Courier\",\n CourB: \"Courier-Bold\",\n CourI: \"Courier-Oblique\",\n CourBI: \"Courier-BoldOblique\",\n Symbol: \"Symbol\",\n ZapfD: \"ZapfDingbats\",\n KaGo: \"HeiseiKakuGo-W5-UniJIS-UCS2-H\",\n KaMi: \"HeiseiMin-W3-UniJIS-UCS2-H\"\n});\nconst Highlight = Object.freeze({\n n: \"none\",\n i: \"invert\",\n p: \"push\",\n o: \"outline\"\n});\nconst Position = Object.freeze({\n textOnly: 0,\n iconOnly: 1,\n iconTextV: 2,\n textIconV: 3,\n iconTextH: 4,\n textIconH: 5,\n overlay: 6\n});\nconst ScaleHow = Object.freeze({\n proportional: 0,\n anamorphic: 1\n});\nconst ScaleWhen = Object.freeze({\n always: 0,\n never: 1,\n tooBig: 2,\n tooSmall: 3\n});\nconst Style = Object.freeze({\n ch: \"check\",\n cr: \"cross\",\n di: \"diamond\",\n ci: \"circle\",\n st: \"star\",\n sq: \"square\"\n});\nconst Trans = Object.freeze({\n blindsH: \"BlindsHorizontal\",\n blindsV: \"BlindsVertical\",\n boxI: \"BoxIn\",\n boxO: \"BoxOut\",\n dissolve: \"Dissolve\",\n glitterD: \"GlitterDown\",\n glitterR: \"GlitterRight\",\n glitterRD: \"GlitterRightDown\",\n random: \"Random\",\n replace: \"Replace\",\n splitHI: \"SplitHorizontalIn\",\n splitHO: \"SplitHorizontalOut\",\n splitVI: \"SplitVerticalIn\",\n splitVO: \"SplitVerticalOut\",\n wipeD: \"WipeDown\",\n wipeL: \"WipeLeft\",\n wipeR: \"WipeRight\",\n wipeU: \"WipeUp\"\n});\nconst ZoomType = Object.freeze({\n none: \"NoVary\",\n fitP: \"FitPage\",\n fitW: \"FitWidth\",\n fitH: \"FitHeight\",\n fitV: \"FitVisibleWidth\",\n pref: \"Preferred\",\n refW: \"ReflowWidth\"\n});\nconst GlobalConstants = Object.freeze({\n IDS_GREATER_THAN: \"Invalid value: must be greater than or equal to % s.\",\n IDS_GT_AND_LT: \"Invalid value: must be greater than or equal to % s \" + \"and less than or equal to % s.\",\n IDS_LESS_THAN: \"Invalid value: must be less than or equal to % s.\",\n IDS_INVALID_MONTH: \"** Invalid **\",\n IDS_INVALID_DATE: \"Invalid date / time: please ensure that the date / time exists. Field\",\n IDS_INVALID_DATE2: \" should match format \",\n IDS_INVALID_VALUE: \"The value entered does not match the format of the field\",\n IDS_AM: \"am\",\n IDS_PM: \"pm\",\n IDS_MONTH_INFO: \"January[1] February[2] March[3] April[4] May[5] \" + \"June[6] July[7] August[8] September[9] October[10] \" + \"November[11] December[12] Sept[9] Jan[1] Feb[2] Mar[3] \" + \"Apr[4] Jun[6] Jul[7] Aug[8] Sep[9] Oct[10] Nov[11] Dec[12]\",\n IDS_STARTUP_CONSOLE_MSG: \"** ^ _ ^ **\",\n RE_NUMBER_ENTRY_DOT_SEP: [\"[+-]?\\\\d*\\\\.?\\\\d*\"],\n RE_NUMBER_COMMIT_DOT_SEP: [\"[+-]?\\\\d+(\\\\.\\\\d+)?\", \"[+-]?\\\\.\\\\d+\", \"[+-]?\\\\d+\\\\.\"],\n RE_NUMBER_ENTRY_COMMA_SEP: [\"[+-]?\\\\d*,?\\\\d*\"],\n RE_NUMBER_COMMIT_COMMA_SEP: [\"[+-]?\\\\d+([.,]\\\\d+)?\", \"[+-]?[.,]\\\\d+\", \"[+-]?\\\\d+[.,]\"],\n RE_ZIP_ENTRY: [\"\\\\d{0,5}\"],\n RE_ZIP_COMMIT: [\"\\\\d{5}\"],\n RE_ZIP4_ENTRY: [\"\\\\d{0,5}(\\\\.|[- ])?\\\\d{0,4}\"],\n RE_ZIP4_COMMIT: [\"\\\\d{5}(\\\\.|[- ])?\\\\d{4}\"],\n RE_PHONE_ENTRY: [\"\\\\d{0,3}(\\\\.|[- ])?\\\\d{0,3}(\\\\.|[- ])?\\\\d{0,4}\", \"\\\\(\\\\d{0,3}\", \"\\\\(\\\\d{0,3}\\\\)(\\\\.|[- ])?\\\\d{0,3}(\\\\.|[- ])?\\\\d{0,4}\", \"\\\\(\\\\d{0,3}(\\\\.|[- ])?\\\\d{0,3}(\\\\.|[- ])?\\\\d{0,4}\", \"\\\\d{0,3}\\\\)(\\\\.|[- ])?\\\\d{0,3}(\\\\.|[- ])?\\\\d{0,4}\", \"011(\\\\.|[- \\\\d])*\"],\n RE_PHONE_COMMIT: [\"\\\\d{3}(\\\\.|[- ])?\\\\d{4}\", \"\\\\d{3}(\\\\.|[- ])?\\\\d{3}(\\\\.|[- ])?\\\\d{4}\", \"\\\\(\\\\d{3}\\\\)(\\\\.|[- ])?\\\\d{3}(\\\\.|[- ])?\\\\d{4}\", \"011(\\\\.|[- \\\\d])*\"],\n RE_SSN_ENTRY: [\"\\\\d{0,3}(\\\\.|[- ])?\\\\d{0,2}(\\\\.|[- ])?\\\\d{0,4}\"],\n RE_SSN_COMMIT: [\"\\\\d{3}(\\\\.|[- ])?\\\\d{2}(\\\\.|[- ])?\\\\d{4}\"]\n});\n\n;// ./node_modules/core-js/modules/es.iterator.every.js\nes_iterator_every_namespaceFn();\n\n;// ./node_modules/core-js/modules/es.iterator.filter.js\nes_iterator_filter_namespaceFn();\n\n;// ./node_modules/core-js/modules/es.iterator.for-each.js\nes_iterator_for_each_namespaceFn();\n\n;// ./node_modules/core-js/modules/es.iterator.some.js\nes_iterator_some_namespaceFn();\n\n;// ./node_modules/core-js/modules/es.set.difference.v2.js\nes_set_difference_v2_namespaceFn();\n\n;// ./node_modules/core-js/modules/es.set.intersection.v2.js\nes_set_intersection_v2_namespaceFn();\n\n;// ./node_modules/core-js/modules/es.set.is-disjoint-from.v2.js\nes_set_is_disjoint_from_v2_namespaceFn();\n\n;// ./node_modules/core-js/modules/es.set.is-subset-of.v2.js\nes_set_is_subset_of_v2_namespaceFn();\n\n;// ./node_modules/core-js/modules/es.set.is-superset-of.v2.js\nes_set_is_superset_of_v2_namespaceFn();\n\n;// ./node_modules/core-js/modules/es.set.symmetric-difference.v2.js\nes_set_symmetric_difference_v2_namespaceFn();\n\n;// ./node_modules/core-js/modules/es.set.union.v2.js\nes_set_union_v2_namespaceFn();\n\n;// ./node_modules/core-js/modules/es.map.get-or-insert.js\nes_map_get_or_insert_namespaceFn();\n\n;// ./node_modules/core-js/modules/es.map.get-or-insert-computed.js\nes_map_get_or_insert_computed_namespaceFn();\n\n;// ./src/scripting_api/common.js\n\n\nconst FieldType = {\n none: 0,\n number: 1,\n percent: 2,\n date: 3,\n time: 4\n};\nfunction createMap(val) {\n return val instanceof Map ? val : new Map(val ? Object.entries(val) : null);\n}\nfunction getFieldType(actions) {\n let format = actions.get(\"Format\");\n if (!format) {\n return FieldType.none;\n }\n format = format[0].trim();\n if (format.startsWith(\"AFNumber_\")) {\n return FieldType.number;\n }\n if (format.startsWith(\"AFPercent_\")) {\n return FieldType.percent;\n }\n if (format.startsWith(\"AFDate_\")) {\n return FieldType.date;\n }\n return format.startsWith(\"AFTime_\") ? FieldType.time : FieldType.none;\n}\n\n;// ./src/scripting_api/app_utils.js\n\n\nconst VIEWER_TYPE = \"PDF.js\";\nconst VIEWER_VARIATION = \"Full\";\nconst VIEWER_VERSION = 21.00720099;\nconst FORMS_VERSION = 21.00720099;\nconst USERACTIVATION_CALLBACKID = 0;\nconst USERACTIVATION_MAXTIME_VALIDITY = 5000;\nfunction serializeError(error) {\n const value = `${error.toString()}\\n${error.stack}`;\n return {\n command: \"error\",\n value\n };\n}\nconst makeArr = () => [];\nconst makeMap = () => new Map();\n\n;// ./src/shared/math_clamp.js\nfunction MathClamp(v, min, max) {\n return Math.min(Math.max(v, min), max);\n}\n\n;// ./src/shared/scripting_utils.js\n\n\n\nfunction makeColorComp(n) {\n return Math.floor(MathClamp(n, 0, 1) * 255).toString(16).padStart(2, \"0\");\n}\nfunction scaleAndClamp(x) {\n return MathClamp(x, 0, 1) * 255;\n}\nclass ColorConverters {\n static CMYK_G([c, y, m, k]) {\n return [\"G\", 1 - Math.min(1, 0.3 * c + 0.59 * m + 0.11 * y + k)];\n }\n static G_CMYK([g]) {\n return [\"CMYK\", 0, 0, 0, 1 - g];\n }\n static G_RGB([g]) {\n return [\"RGB\", g, g, g];\n }\n static G_rgb([g]) {\n g = scaleAndClamp(g);\n return [g, g, g];\n }\n static G_HTML([g]) {\n const G = makeColorComp(g);\n return `#${G}${G}${G}`;\n }\n static RGB_G([r, g, b]) {\n return [\"G\", 0.3 * r + 0.59 * g + 0.11 * b];\n }\n static RGB_rgb(color) {\n return color.map(scaleAndClamp);\n }\n static RGB_HTML(color) {\n return `#${color.map(makeColorComp).join(\"\")}`;\n }\n static T_HTML() {\n return \"#00000000\";\n }\n static T_rgb() {\n return [null];\n }\n static CMYK_RGB([c, y, m, k]) {\n return [\"RGB\", 1 - Math.min(1, c + k), 1 - Math.min(1, m + k), 1 - Math.min(1, y + k)];\n }\n static CMYK_rgb([c, y, m, k]) {\n return [scaleAndClamp(1 - Math.min(1, c + k)), scaleAndClamp(1 - Math.min(1, m + k)), scaleAndClamp(1 - Math.min(1, y + k))];\n }\n static CMYK_HTML(components) {\n const rgb = this.CMYK_RGB(components).slice(1);\n return this.RGB_HTML(rgb);\n }\n static RGB_CMYK([r, g, b]) {\n const c = 1 - r;\n const m = 1 - g;\n const y = 1 - b;\n const k = Math.min(c, m, y);\n return [\"CMYK\", c, m, y, k];\n }\n}\nconst DateFormats = [\"m/d\", \"m/d/yy\", \"mm/dd/yy\", \"mm/yy\", \"d-mmm\", \"d-mmm-yy\", \"dd-mmm-yy\", \"yy-mm-dd\", \"mmm-yy\", \"mmmm-yy\", \"mmm d, yyyy\", \"mmmm d, yyyy\", \"m/d/yy h:MM tt\", \"m/d/yy HH:MM\"];\nconst TimeFormats = [\"HH:MM\", \"h:MM tt\", \"HH:MM:ss\", \"h:MM:ss tt\"];\n\n;// ./src/scripting_api/pdf_object.js\nclass PDFObject {\n constructor(data) {\n this._expandos = Object.create(null);\n this._send = data.send || null;\n this._id = data.id || null;\n }\n}\n\n;// ./src/scripting_api/color.js\n\n\n\n\nclass Color extends PDFObject {\n transparent = [\"T\"];\n black = [\"G\", 0];\n white = [\"G\", 1];\n red = [\"RGB\", 1, 0, 0];\n green = [\"RGB\", 0, 1, 0];\n blue = [\"RGB\", 0, 0, 1];\n cyan = [\"CMYK\", 1, 0, 0, 0];\n magenta = [\"CMYK\", 0, 1, 0, 0];\n yellow = [\"CMYK\", 0, 0, 1, 0];\n dkGray = [\"G\", 0.25];\n gray = [\"G\", 0.5];\n ltGray = [\"G\", 0.75];\n constructor() {\n super({});\n }\n static _isValidSpace(cColorSpace) {\n return typeof cColorSpace === \"string\" && (cColorSpace === \"T\" || cColorSpace === \"G\" || cColorSpace === \"RGB\" || cColorSpace === \"CMYK\");\n }\n static _isValidColor(colorArray) {\n if (!Array.isArray(colorArray) || colorArray.length === 0) {\n return false;\n }\n const space = colorArray[0];\n if (!Color._isValidSpace(space)) {\n return false;\n }\n switch (space) {\n case \"T\":\n if (colorArray.length !== 1) {\n return false;\n }\n break;\n case \"G\":\n if (colorArray.length !== 2) {\n return false;\n }\n break;\n case \"RGB\":\n if (colorArray.length !== 4) {\n return false;\n }\n break;\n case \"CMYK\":\n if (colorArray.length !== 5) {\n return false;\n }\n break;\n default:\n return false;\n }\n return colorArray.slice(1).every(c => typeof c === \"number\" && c >= 0 && c <= 1);\n }\n static _getCorrectColor(colorArray) {\n return Color._isValidColor(colorArray) ? colorArray : [\"G\", 0];\n }\n convert(colorArray, cColorSpace) {\n if (!Color._isValidSpace(cColorSpace)) {\n return this.black;\n }\n if (cColorSpace === \"T\") {\n return [\"T\"];\n }\n colorArray = Color._getCorrectColor(colorArray);\n if (colorArray[0] === cColorSpace) {\n return colorArray;\n }\n if (colorArray[0] === \"T\") {\n return this.convert(this.black, cColorSpace);\n }\n return ColorConverters[`${colorArray[0]}_${cColorSpace}`](colorArray.slice(1));\n }\n equal(colorArray1, colorArray2) {\n colorArray1 = Color._getCorrectColor(colorArray1);\n colorArray2 = Color._getCorrectColor(colorArray2);\n if (colorArray1[0] === \"T\" || colorArray2[0] === \"T\") {\n return colorArray1[0] === \"T\" && colorArray2[0] === \"T\";\n }\n if (colorArray1[0] !== colorArray2[0]) {\n colorArray2 = this.convert(colorArray2, colorArray1[0]);\n }\n return colorArray1.slice(1).every((c, i) => c === colorArray2[i + 1]);\n }\n}\n\n;// ./src/scripting_api/field.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass Field extends PDFObject {\n constructor(data) {\n super(data);\n this.alignment = data.alignment || \"left\";\n this.borderStyle = data.borderStyle || \"\";\n this.buttonAlignX = data.buttonAlignX || 50;\n this.buttonAlignY = data.buttonAlignY || 50;\n this.buttonFitBounds = data.buttonFitBounds;\n this.buttonPosition = data.buttonPosition;\n this.buttonScaleHow = data.buttonScaleHow;\n this.ButtonScaleWhen = data.buttonScaleWhen;\n this.calcOrderIndex = data.calcOrderIndex;\n this.comb = data.comb;\n this.commitOnSelChange = data.commitOnSelChange;\n this.currentValueIndices = data.currentValueIndices;\n this.defaultStyle = data.defaultStyle;\n this.defaultValue = data.defaultValue;\n this.doNotScroll = data.doNotScroll;\n this.doNotSpellCheck = data.doNotSpellCheck;\n this.delay = data.delay;\n this.display = data.display;\n this.doc = data.doc.wrapped;\n this.editable = data.editable;\n this.exportValues = data.exportValues;\n this.fileSelect = data.fileSelect;\n this.hidden = data.hidden;\n this.highlight = data.highlight;\n this.lineWidth = data.lineWidth;\n this.multiline = data.multiline;\n this.multipleSelection = !!data.multipleSelection;\n this.name = data.name;\n this.password = data.password;\n this.print = data.print;\n this.radiosInUnison = data.radiosInUnison;\n this.readonly = data.readonly;\n this.rect = data.rect;\n this.required = data.required;\n this.richText = data.richText;\n this.richValue = data.richValue;\n this.style = data.style;\n this.submitName = data.submitName;\n this.textFont = data.textFont;\n this.textSize = data.textSize;\n this.type = data.type;\n this.userName = data.userName;\n this._actions = createMap(data.actions);\n this._browseForFileToSubmit = data.browseForFileToSubmit || null;\n this._buttonCaption = null;\n this._buttonIcon = null;\n this._charLimit = data.charLimit;\n this._children = null;\n this._currentValueIndices = data.currentValueIndices || 0;\n this._document = data.doc;\n this._fieldPath = data.fieldPath;\n this._fillColor = data.fillColor || [\"T\"];\n this._isChoice = Array.isArray(data.items);\n this._items = data.items || [];\n this._hasValue = Object.hasOwn(data, \"value\");\n this._page = data.page || 0;\n this._strokeColor = data.strokeColor || [\"G\", 0];\n this._textColor = data.textColor || [\"G\", 0];\n this._value = null;\n this._kidIds = data.kidIds || null;\n this._fieldType = getFieldType(this._actions);\n this._siblings = data.siblings || null;\n this._rotation = data.rotation || 0;\n this._datetimeFormat = data.datetimeFormat || null;\n this._hasDateOrTime = !!data.hasDatetimeHTML;\n this._util = data.util;\n this._globalEval = data.globalEval;\n this._appObjects = data.appObjects;\n this.value = data.value || \"\";\n }\n get currentValueIndices() {\n return !this._isChoice ? 0 : this._currentValueIndices;\n }\n set currentValueIndices(indices) {\n if (!this._isChoice) {\n return;\n }\n if (!Array.isArray(indices)) {\n indices = [indices];\n }\n if (!indices.every(i => Number.isInteger(i) && i >= 0 && i < this.numItems)) {\n return;\n }\n indices.sort();\n if (this.multipleSelection) {\n this._currentValueIndices = indices;\n this._value = [];\n indices.forEach(i => {\n this._value.push(this._items[i].displayValue);\n });\n } else if (indices.length > 0) {\n indices = indices.splice(1, indices.length - 1);\n this._currentValueIndices = indices[0];\n this._value = this._items[this._currentValueIndices];\n }\n this._send({\n id: this._id,\n indices\n });\n }\n get fillColor() {\n return this._fillColor;\n }\n set fillColor(color) {\n if (Color._isValidColor(color)) {\n this._fillColor = color;\n }\n }\n get bgColor() {\n return this.fillColor;\n }\n set bgColor(color) {\n this.fillColor = color;\n }\n get charLimit() {\n return this._charLimit;\n }\n set charLimit(limit) {\n if (typeof limit !== \"number\") {\n throw new Error(\"Invalid argument value\");\n }\n this._charLimit = Math.max(0, Math.floor(limit));\n }\n get numItems() {\n if (!this._isChoice) {\n throw new Error(\"Not a choice widget\");\n }\n return this._items.length;\n }\n set numItems(_) {\n throw new Error(\"field.numItems is read-only\");\n }\n get strokeColor() {\n return this._strokeColor;\n }\n set strokeColor(color) {\n if (Color._isValidColor(color)) {\n this._strokeColor = color;\n }\n }\n get borderColor() {\n return this.strokeColor;\n }\n set borderColor(color) {\n this.strokeColor = color;\n }\n get page() {\n return this._page;\n }\n set page(_) {\n throw new Error(\"field.page is read-only\");\n }\n get rotation() {\n return this._rotation;\n }\n set rotation(angle) {\n angle = Math.floor(angle);\n if (angle % 90 !== 0) {\n throw new Error(\"Invalid rotation: must be a multiple of 90\");\n }\n angle %= 360;\n if (angle < 0) {\n angle += 360;\n }\n this._rotation = angle;\n }\n get textColor() {\n return this._textColor;\n }\n set textColor(color) {\n if (Color._isValidColor(color)) {\n this._textColor = color;\n }\n }\n get fgColor() {\n return this.textColor;\n }\n set fgColor(color) {\n this.textColor = color;\n }\n get value() {\n return this._value;\n }\n set value(value) {\n if (this._isChoice) {\n this._setChoiceValue(value);\n return;\n }\n if (this._hasDateOrTime && value) {\n const date = this._util.scand(this._datetimeFormat, value);\n if (date) {\n this._originalValue = date.valueOf();\n value = this._util.printd(this._datetimeFormat, date);\n this._value = !isNaN(value) ? parseFloat(value) : value;\n return;\n }\n }\n if (value === \"\" || typeof value !== \"string\" || this._fieldType >= FieldType.date) {\n this._originalValue = undefined;\n this._value = value;\n return;\n }\n this._originalValue = value;\n const _value = value.trim().replace(\",\", \".\");\n this._value = !isNaN(_value) ? parseFloat(_value) : value;\n }\n get _initialValue() {\n return this._hasDateOrTime && this._originalValue || null;\n }\n _getValue() {\n return this._originalValue ?? this.value;\n }\n _setChoiceValue(value) {\n if (this.multipleSelection) {\n if (!Array.isArray(value)) {\n value = [value];\n }\n const values = new Set(value);\n if (Array.isArray(this._currentValueIndices)) {\n this._currentValueIndices.length = 0;\n this._value.length = 0;\n } else {\n this._currentValueIndices = [];\n this._value = [];\n }\n this._items.forEach((item, i) => {\n if (values.has(item.exportValue)) {\n this._currentValueIndices.push(i);\n this._value.push(item.exportValue);\n }\n });\n } else {\n if (Array.isArray(value)) {\n value = value[0];\n }\n const index = this._items.findIndex(({\n exportValue\n }) => value === exportValue);\n if (index !== -1) {\n this._currentValueIndices = index;\n this._value = this._items[index].exportValue;\n }\n }\n }\n get valueAsString() {\n return (this._value ?? \"\").toString();\n }\n set valueAsString(_) {}\n browseForFileToSubmit() {\n if (this._browseForFileToSubmit) {\n this._browseForFileToSubmit();\n }\n }\n buttonGetCaption(nFace = 0) {\n return this._buttonCaption ? this._buttonCaption[nFace] : \"\";\n }\n buttonGetIcon(nFace = 0) {\n return this._buttonIcon ? this._buttonIcon[nFace] : null;\n }\n buttonImportIcon(cPath = null, nPave = 0) {}\n buttonSetCaption(cCaption, nFace = 0) {\n this._buttonCaption ??= [\"\", \"\", \"\"];\n this._buttonCaption[nFace] = cCaption;\n }\n buttonSetIcon(oIcon, nFace = 0) {\n this._buttonIcon ??= [null, null, null];\n this._buttonIcon[nFace] = oIcon;\n }\n checkThisBox(nWidget, bCheckIt = true) {}\n clearItems() {\n if (!this._isChoice) {\n throw new Error(\"Not a choice widget\");\n }\n this._items = [];\n this._send({\n id: this._id,\n clear: null\n });\n }\n deleteItemAt(nIdx = null) {\n if (!this._isChoice) {\n throw new Error(\"Not a choice widget\");\n }\n if (!this.numItems) {\n return;\n }\n if (nIdx === null) {\n nIdx = Array.isArray(this._currentValueIndices) ? this._currentValueIndices[0] : this._currentValueIndices;\n nIdx ||= 0;\n }\n if (nIdx < 0 || nIdx >= this.numItems) {\n nIdx = this.numItems - 1;\n }\n this._items.splice(nIdx, 1);\n if (Array.isArray(this._currentValueIndices)) {\n let index = this._currentValueIndices.findIndex(i => i >= nIdx);\n if (index !== -1) {\n if (this._currentValueIndices[index] === nIdx) {\n this._currentValueIndices.splice(index, 1);\n }\n for (const ii = this._currentValueIndices.length; index < ii; index++) {\n --this._currentValueIndices[index];\n }\n }\n } else if (this._currentValueIndices === nIdx) {\n this._currentValueIndices = this.numItems > 0 ? 0 : -1;\n } else if (this._currentValueIndices > nIdx) {\n --this._currentValueIndices;\n }\n this._send({\n id: this._id,\n remove: nIdx\n });\n }\n getItemAt(nIdx = -1, bExportValue = false) {\n if (!this._isChoice) {\n throw new Error(\"Not a choice widget\");\n }\n if (nIdx < 0 || nIdx >= this.numItems) {\n nIdx = this.numItems - 1;\n }\n const item = this._items[nIdx];\n return bExportValue ? item.exportValue : item.displayValue;\n }\n getArray() {\n if (this._kidIds) {\n const array = [];\n const fillArrayWithKids = kidIds => {\n for (const id of kidIds) {\n const obj = this._appObjects[id];\n if (!obj) {\n continue;\n }\n if (obj.obj._hasValue) {\n array.push(obj.wrapped);\n }\n if (obj.obj._kidIds) {\n fillArrayWithKids(obj.obj._kidIds);\n }\n }\n };\n fillArrayWithKids(this._kidIds);\n return array;\n }\n return this._children ??= this._document.obj._getTerminalChildren(this._fieldPath);\n }\n getLock() {\n return undefined;\n }\n isBoxChecked(nWidget) {\n return false;\n }\n isDefaultChecked(nWidget) {\n return false;\n }\n insertItemAt(cName, cExport = undefined, nIdx = 0) {\n if (!this._isChoice) {\n throw new Error(\"Not a choice widget\");\n }\n if (!cName) {\n return;\n }\n if (nIdx < 0 || nIdx > this.numItems) {\n nIdx = this.numItems;\n }\n if (this._items.some(({\n displayValue\n }) => displayValue === cName)) {\n return;\n }\n if (cExport === undefined) {\n cExport = cName;\n }\n const data = {\n displayValue: cName,\n exportValue: cExport\n };\n this._items.splice(nIdx, 0, data);\n if (Array.isArray(this._currentValueIndices)) {\n let index = this._currentValueIndices.findIndex(i => i >= nIdx);\n if (index !== -1) {\n for (const ii = this._currentValueIndices.length; index < ii; index++) {\n ++this._currentValueIndices[index];\n }\n }\n } else if (this._currentValueIndices >= nIdx) {\n ++this._currentValueIndices;\n }\n this._send({\n id: this._id,\n insert: {\n index: nIdx,\n ...data\n }\n });\n }\n setAction(cTrigger, cScript) {\n if (typeof cTrigger !== \"string\" || typeof cScript !== \"string\") {\n return;\n }\n this._actions.getOrInsertComputed(cTrigger, makeArr).push(cScript);\n }\n setFocus() {\n this._send({\n id: this._id,\n focus: true\n });\n }\n setItems(oArray) {\n if (!this._isChoice) {\n throw new Error(\"Not a choice widget\");\n }\n this._items.length = 0;\n for (const element of oArray) {\n let displayValue, exportValue;\n if (Array.isArray(element)) {\n displayValue = element[0]?.toString() || \"\";\n exportValue = element[1]?.toString() || \"\";\n } else {\n displayValue = exportValue = element?.toString() || \"\";\n }\n this._items.push({\n displayValue,\n exportValue\n });\n }\n this._currentValueIndices = 0;\n this._send({\n id: this._id,\n items: this._items\n });\n }\n setLock() {}\n signatureGetModifications() {}\n signatureGetSeedValue() {}\n signatureInfo() {}\n signatureSetSeedValue() {}\n signatureSign() {}\n signatureValidate() {}\n _isButton() {\n return false;\n }\n _reset() {\n this.value = this.defaultValue;\n }\n _runActions(event) {\n const eventName = event.name;\n if (!this._actions.has(eventName)) {\n return false;\n }\n const actions = this._actions.get(eventName);\n for (const action of actions) {\n try {\n this._globalEval(action);\n } catch (error) {\n const serializedError = serializeError(error);\n serializedError.value = `Error when executing \"${eventName}\" for field \"${this._id}\"\\n${serializedError.value}`;\n this._send(serializedError);\n }\n }\n return true;\n }\n}\nclass RadioButtonField extends Field {\n constructor(otherButtons, data) {\n super(data);\n this.exportValues = [this.exportValues];\n this._radioIds = [this._id];\n this._radioActions = [this._actions];\n for (const radioData of otherButtons) {\n this.exportValues.push(radioData.exportValues);\n this._radioIds.push(radioData.id);\n this._radioActions.push(createMap(radioData.actions));\n if (this._value === radioData.exportValues) {\n this._id = radioData.id;\n }\n }\n this._hasBeenInitialized = true;\n this._value = data.value || \"\";\n }\n get _siblings() {\n return this._radioIds.filter(id => id !== this._id);\n }\n set _siblings(_) {}\n get value() {\n return this._value;\n }\n set value(value) {\n if (!this._hasBeenInitialized) {\n return;\n }\n if (value === null || value === undefined) {\n this._value = \"\";\n }\n const i = this.exportValues.indexOf(value);\n if (0 <= i && i < this._radioIds.length) {\n this._id = this._radioIds[i];\n this._value = value;\n } else if (value === \"Off\" && this._radioIds.length === 2) {\n const nextI = (1 + this._radioIds.indexOf(this._id)) % 2;\n this._id = this._radioIds[nextI];\n this._value = this.exportValues[nextI];\n }\n }\n checkThisBox(nWidget, bCheckIt = true) {\n if (nWidget < 0 || nWidget >= this._radioIds.length || !bCheckIt) {\n return;\n }\n this._id = this._radioIds[nWidget];\n this._value = this.exportValues[nWidget];\n this._send({\n id: this._id,\n value: this._value\n });\n }\n isBoxChecked(nWidget) {\n return nWidget >= 0 && nWidget < this._radioIds.length && this._id === this._radioIds[nWidget];\n }\n isDefaultChecked(nWidget) {\n return nWidget >= 0 && nWidget < this.exportValues.length && this.defaultValue === this.exportValues[nWidget];\n }\n _getExportValue(state) {\n const i = this._radioIds.indexOf(this._id);\n return this.exportValues[i];\n }\n _runActions(event) {\n const i = this._radioIds.indexOf(this._id);\n this._actions = this._radioActions[i];\n return super._runActions(event);\n }\n _isButton() {\n return true;\n }\n}\nclass CheckboxField extends RadioButtonField {\n get value() {\n return this._value;\n }\n set value(value) {\n if (!value || value === \"Off\") {\n this._value = \"Off\";\n } else {\n super.value = value;\n }\n }\n _getExportValue(state) {\n return state ? super._getExportValue(state) : \"Off\";\n }\n isBoxChecked(nWidget) {\n return this._value === \"Off\" ? false : super.isBoxChecked(nWidget);\n }\n isDefaultChecked(nWidget) {\n return this.defaultValue === \"Off\" ? this._value === \"Off\" : super.isDefaultChecked(nWidget);\n }\n checkThisBox(nWidget, bCheckIt = true) {\n if (nWidget < 0 || nWidget >= this._radioIds.length) {\n return;\n }\n this._id = this._radioIds[nWidget];\n this._value = bCheckIt ? this.exportValues[nWidget] : \"Off\";\n this._send({\n id: this._id,\n value: this._value\n });\n }\n}\n\n;// ./node_modules/core-js/modules/es.iterator.reduce.js\nes_iterator_reduce_namespaceFn();\n\n;// ./node_modules/core-js/modules/es.math.sum-precise.js\nes_math_sum_precise_namespaceFn();\n\n;// ./src/scripting_api/aform.js\n\n\n\n\n\n\n\n\n\nclass AForm {\n constructor(document, app, util, color) {\n this._document = document;\n this._app = app;\n this._util = util;\n this._color = color;\n this._emailRegex = new RegExp(\"^[\\\\w.!#$%&'*+/=?^`{|}~-]+\" + \"@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\" + \"(?:\\\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$\");\n }\n _mkTargetName(event) {\n return event.target ? `[ ${event.target.name} ]` : \"\";\n }\n _parseDate(cFormat, cDate) {\n let date = null;\n try {\n date = this._util._scand(cFormat, cDate, false);\n } catch {}\n if (date) {\n return date;\n }\n date = Date.parse(cDate);\n return isNaN(date) ? null : new Date(date);\n }\n AFMergeChange(event = globalThis.event) {\n return event.willCommit ? event.value.toString() : this._app._eventDispatcher.mergeChange(event);\n }\n AFParseDateEx(cString, cOrder) {\n return this._parseDate(cOrder, cString);\n }\n AFExtractNums(str) {\n if (typeof str === \"number\") {\n return [str];\n }\n if (!str || typeof str !== \"string\") {\n return null;\n }\n const first = str.charAt(0);\n if (first === \".\" || first === \",\") {\n str = `0${str}`;\n }\n const numbers = str.match(/(\\d+)/g);\n return numbers.length === 0 ? null : numbers;\n }\n AFMakeNumber(str) {\n if (typeof str === \"number\") {\n return str;\n }\n if (typeof str !== \"string\") {\n return null;\n }\n str = str.trim().replace(\",\", \".\");\n const number = parseFloat(str);\n return isNaN(number) || !isFinite(number) ? null : number;\n }\n AFMakeArrayFromList(string) {\n return typeof string === \"string\" ? string.split(/, ?/g) : string;\n }\n AFNumber_Format(nDec, sepStyle, negStyle, currStyle, strCurrency, bCurrencyPrepend) {\n const event = globalThis.event;\n let value = this.AFMakeNumber(event.value);\n if (value === null) {\n event.value = \"\";\n return;\n }\n const sign = Math.sign(value);\n const buf = [];\n let hasParen = false;\n if (sign === -1 && bCurrencyPrepend && negStyle === 0) {\n buf.push(\"-\");\n }\n if ((negStyle === 2 || negStyle === 3) && sign === -1) {\n buf.push(\"(\");\n hasParen = true;\n }\n if (bCurrencyPrepend) {\n buf.push(strCurrency);\n }\n sepStyle = MathClamp(Math.floor(sepStyle), 0, 4);\n buf.push(\"%,\", sepStyle, \".\", nDec.toString(), \"f\");\n if (!bCurrencyPrepend) {\n buf.push(strCurrency);\n }\n if (hasParen) {\n buf.push(\")\");\n }\n if (negStyle === 1 || negStyle === 3) {\n event.target.textColor = sign === 1 ? this._color.black : this._color.red;\n }\n if ((negStyle !== 0 || bCurrencyPrepend) && sign === -1) {\n value = -value;\n }\n const formatStr = buf.join(\"\");\n event.value = this._util.printf(formatStr, value);\n }\n AFNumber_Keystroke(nDec, sepStyle, negStyle, currStyle, strCurrency, bCurrencyPrepend) {\n const event = globalThis.event;\n let value = this.AFMergeChange(event);\n if (!value) {\n return;\n }\n value = value.trim();\n let pattern;\n if (sepStyle > 1) {\n pattern = event.willCommit ? /^[+-]?(\\d+(,\\d*)?|,\\d+)$/ : /^[+-]?\\d*(?:,\\d*)?$/;\n } else {\n pattern = event.willCommit ? /^[+-]?(\\d+(\\.\\d*)?|\\.\\d+)$/ : /^[+-]?\\d*(?:\\.\\d*)?$/;\n }\n if (!pattern.test(value)) {\n if (event.willCommit) {\n const err = `${GlobalConstants.IDS_INVALID_VALUE} ${this._mkTargetName(event)}`;\n this._app.alert(err);\n }\n event.rc = false;\n }\n if (event.willCommit && sepStyle > 1) {\n event.value = parseFloat(value.replace(\",\", \".\"));\n }\n }\n AFPercent_Format(nDec, sepStyle, percentPrepend = false) {\n if (typeof nDec !== \"number\" || typeof sepStyle !== \"number\") {\n return;\n }\n if (nDec < 0) {\n throw new Error(\"Invalid nDec value in AFPercent_Format\");\n }\n const event = globalThis.event;\n if (nDec > 512) {\n event.value = \"%\";\n return;\n }\n nDec = Math.floor(nDec);\n sepStyle = MathClamp(Math.floor(sepStyle), 0, 4);\n let value = this.AFMakeNumber(event.value);\n if (value === null) {\n event.value = \"%\";\n return;\n }\n const formatStr = `%,${sepStyle}.${nDec}f`;\n value = this._util.printf(formatStr, value * 100);\n event.value = percentPrepend ? `%${value}` : `${value}%`;\n }\n AFPercent_Keystroke(nDec, sepStyle) {\n this.AFNumber_Keystroke(nDec, sepStyle, 0, 0, \"\", true);\n }\n AFDate_FormatEx(cFormat) {\n const event = globalThis.event;\n const value = event.value;\n if (!value) {\n return;\n }\n const date = this._parseDate(cFormat, value);\n if (date !== null) {\n event.value = this._util.printd(cFormat, date);\n }\n }\n AFDate_Format(pdf) {\n this.AFDate_FormatEx(DateFormats[pdf] ?? pdf);\n }\n AFDate_KeystrokeEx(cFormat) {\n const event = globalThis.event;\n if (!event.willCommit) {\n return;\n }\n const value = this.AFMergeChange(event);\n if (!value) {\n return;\n }\n if (this._parseDate(cFormat, value) === null) {\n const invalid = GlobalConstants.IDS_INVALID_DATE;\n const invalid2 = GlobalConstants.IDS_INVALID_DATE2;\n const err = `${invalid} ${this._mkTargetName(event)}${invalid2}${cFormat}`;\n this._app.alert(err);\n event.rc = false;\n }\n }\n AFDate_Keystroke(pdf) {\n if (pdf >= 0 && pdf < DateFormats.length) {\n this.AFDate_KeystrokeEx(DateFormats[pdf]);\n }\n }\n AFRange_Validate(bGreaterThan, nGreaterThan, bLessThan, nLessThan) {\n const event = globalThis.event;\n if (!event.value) {\n return;\n }\n const value = this.AFMakeNumber(event.value);\n if (value === null) {\n return;\n }\n bGreaterThan = !!bGreaterThan;\n bLessThan = !!bLessThan;\n if (bGreaterThan) {\n nGreaterThan = this.AFMakeNumber(nGreaterThan);\n if (nGreaterThan === null) {\n return;\n }\n }\n if (bLessThan) {\n nLessThan = this.AFMakeNumber(nLessThan);\n if (nLessThan === null) {\n return;\n }\n }\n let err = \"\";\n if (bGreaterThan && bLessThan) {\n if (value < nGreaterThan || value > nLessThan) {\n err = this._util.printf(GlobalConstants.IDS_GT_AND_LT, nGreaterThan, nLessThan);\n }\n } else if (bGreaterThan) {\n if (value < nGreaterThan) {\n err = this._util.printf(GlobalConstants.IDS_GREATER_THAN, nGreaterThan);\n }\n } else if (value > nLessThan) {\n err = this._util.printf(GlobalConstants.IDS_LESS_THAN, nLessThan);\n }\n if (err) {\n this._app.alert(err);\n event.rc = false;\n }\n }\n AFSimple(cFunction, nValue1, nValue2) {\n const value1 = this.AFMakeNumber(nValue1);\n if (value1 === null) {\n throw new Error(\"Invalid nValue1 in AFSimple\");\n }\n const value2 = this.AFMakeNumber(nValue2);\n if (value2 === null) {\n throw new Error(\"Invalid nValue2 in AFSimple\");\n }\n switch (cFunction) {\n case \"AVG\":\n return (value1 + value2) / 2;\n case \"SUM\":\n return value1 + value2;\n case \"PRD\":\n return value1 * value2;\n case \"MIN\":\n return Math.min(value1, value2);\n case \"MAX\":\n return Math.max(value1, value2);\n }\n throw new Error(\"Invalid cFunction in AFSimple\");\n }\n AFSimple_Calculate(cFunction, cFields) {\n const actions = {\n AVG: args => Math.sumPrecise(args) / args.length,\n SUM: args => Math.sumPrecise(args),\n PRD: args => args.reduce((acc, value) => acc * value, 1),\n MIN: args => Math.min(...args),\n MAX: args => Math.max(...args)\n };\n if (!(cFunction in actions)) {\n throw new TypeError(\"Invalid function in AFSimple_Calculate\");\n }\n const event = globalThis.event;\n const values = [];\n cFields = this.AFMakeArrayFromList(cFields);\n for (const cField of cFields) {\n const field = this._document.getField(cField);\n if (!field) {\n continue;\n }\n for (const child of field.getArray()) {\n const number = this.AFMakeNumber(child.value);\n values.push(number ?? 0);\n }\n }\n if (values.length === 0) {\n event.value = 0;\n return;\n }\n const res = actions[cFunction](values);\n event.value = Math.round(1e6 * res) / 1e6;\n }\n AFSpecial_Format(psf) {\n const event = globalThis.event;\n if (!event.value) {\n return;\n }\n psf = this.AFMakeNumber(psf);\n let formatStr;\n switch (psf) {\n case 0:\n formatStr = \"99999\";\n break;\n case 1:\n formatStr = \"99999-9999\";\n break;\n case 2:\n formatStr = this._util.printx(\"9999999999\", event.value).length >= 10 ? \"(999) 999-9999\" : \"999-9999\";\n break;\n case 3:\n formatStr = \"999-99-9999\";\n break;\n default:\n throw new Error(\"Invalid psf in AFSpecial_Format\");\n }\n event.value = this._util.printx(formatStr, event.value);\n }\n AFSpecial_KeystrokeEx(cMask) {\n const event = globalThis.event;\n const simplifiedFormatStr = cMask.replaceAll(/[^9AOX]/g, \"\");\n this.#AFSpecial_KeystrokeEx_helper(simplifiedFormatStr, null, false);\n if (event.rc) {\n return;\n }\n event.rc = true;\n this.#AFSpecial_KeystrokeEx_helper(cMask, null, true);\n }\n #AFSpecial_KeystrokeEx_helper(cMask, value, warn) {\n if (!cMask) {\n return;\n }\n const event = globalThis.event;\n value ||= this.AFMergeChange(event);\n if (!value) {\n return;\n }\n const checkers = new Map([[\"9\", char => char >= \"0\" && char <= \"9\"], [\"A\", char => \"a\" <= char && char <= \"z\" || \"A\" <= char && char <= \"Z\"], [\"O\", char => \"a\" <= char && char <= \"z\" || \"A\" <= char && char <= \"Z\" || \"0\" <= char && char <= \"9\"], [\"X\", char => true]]);\n function _checkValidity(_value, _cMask) {\n for (let i = 0, ii = _value.length; i < ii; i++) {\n const mask = _cMask.charAt(i);\n const char = _value.charAt(i);\n const checker = checkers.get(mask);\n if (checker) {\n if (!checker(char)) {\n return false;\n }\n } else if (mask !== char) {\n return false;\n }\n }\n return true;\n }\n const err = `${GlobalConstants.IDS_INVALID_VALUE} = \"${cMask}\"`;\n if (value.length > cMask.length) {\n if (warn) {\n this._app.alert(err);\n }\n event.rc = false;\n return;\n }\n if (event.willCommit) {\n if (value.length < cMask.length) {\n if (warn) {\n this._app.alert(err);\n }\n event.rc = false;\n return;\n }\n if (!_checkValidity(value, cMask)) {\n if (warn) {\n this._app.alert(err);\n }\n event.rc = false;\n return;\n }\n event.value += cMask.substring(value.length);\n return;\n }\n if (value.length < cMask.length) {\n cMask = cMask.substring(0, value.length);\n }\n if (!_checkValidity(value, cMask)) {\n if (warn) {\n this._app.alert(err);\n }\n event.rc = false;\n }\n }\n AFSpecial_Keystroke(psf) {\n const event = globalThis.event;\n psf = this.AFMakeNumber(psf);\n let value = this.AFMergeChange(event);\n let formatStr, secondFormatStr;\n switch (psf) {\n case 0:\n formatStr = \"99999\";\n break;\n case 1:\n formatStr = \"99999-9999\";\n break;\n case 2:\n formatStr = \"999-9999\";\n secondFormatStr = \"(999) 999-9999\";\n break;\n case 3:\n formatStr = \"999-99-9999\";\n break;\n default:\n throw new Error(\"Invalid psf in AFSpecial_Keystroke\");\n }\n const formats = secondFormatStr ? [formatStr, secondFormatStr] : [formatStr];\n for (const format of formats) {\n this.#AFSpecial_KeystrokeEx_helper(format, value, false);\n if (event.rc) {\n return;\n }\n event.rc = true;\n }\n const re = /[-()\\s]+/g;\n value = value.replaceAll(re, \"\");\n for (const format of formats) {\n this.#AFSpecial_KeystrokeEx_helper(format.replaceAll(re, \"\"), value, false);\n if (event.rc) {\n return;\n }\n event.rc = true;\n }\n this.AFSpecial_KeystrokeEx((secondFormatStr && value.match(/\\d/g) || []).length > 7 ? secondFormatStr : formatStr);\n }\n AFTime_FormatEx(cFormat) {\n this.AFDate_FormatEx(cFormat);\n }\n AFTime_Format(pdf) {\n this.AFDate_FormatEx(TimeFormats[pdf] ?? pdf);\n }\n AFTime_KeystrokeEx(cFormat) {\n this.AFDate_KeystrokeEx(cFormat);\n }\n AFTime_Keystroke(pdf) {\n if (pdf >= 0 && pdf < TimeFormats.length) {\n this.AFDate_KeystrokeEx(TimeFormats[pdf]);\n }\n }\n eMailValidate(str) {\n return this._emailRegex.test(str);\n }\n AFExactMatch(rePatterns, str) {\n return rePatterns instanceof RegExp ? str.match(rePatterns)?.[0] === str || 0 : rePatterns.findIndex(re => str.match(re)?.[0] === str) + 1;\n }\n}\n\n;// ./node_modules/core-js/modules/es.array.includes.js\nes_array_includes_namespaceFn();\n\n;// ./node_modules/core-js/modules/es.weak-map.get-or-insert.js\nes_weak_map_get_or_insert_namespaceFn();\n\n;// ./node_modules/core-js/modules/es.weak-map.get-or-insert-computed.js\nes_weak_map_get_or_insert_computed_namespaceFn();\n\n;// ./src/scripting_api/event.js\n\n\nclass Event {\n constructor(data) {\n this.change = data.change || \"\";\n this.changeEx = data.changeEx || null;\n this.commitKey = data.commitKey || 0;\n this.fieldFull = data.fieldFull || false;\n this.keyDown = data.keyDown || false;\n this.modifier = data.modifier || false;\n this.name = data.name;\n this.rc = true;\n this.richChange = data.richChange || [];\n this.richChangeEx = data.richChangeEx || [];\n this.richValue = data.richValue || [];\n this.selEnd = data.selEnd ?? -1;\n this.selStart = data.selStart ?? -1;\n this.shift = data.shift || false;\n this.source = data.source || null;\n this.target = data.target || null;\n this.targetName = \"\";\n this.type = \"Field\";\n this.value = data.value || \"\";\n this.willCommit = data.willCommit || false;\n }\n}\nclass EventDispatcher {\n constructor(document, calculationOrder, objects, externalCall) {\n this._document = document;\n this._calculationOrder = calculationOrder;\n this._objects = objects;\n this._externalCall = externalCall;\n this._document.obj._eventDispatcher = this;\n this._isCalculating = false;\n }\n mergeChange(event) {\n let value = event.value;\n if (Array.isArray(value)) {\n return value;\n }\n if (typeof value !== \"string\") {\n value = value.toString();\n }\n const prefix = event.selStart >= 0 ? value.substring(0, event.selStart) : \"\";\n const postfix = event.selEnd >= 0 && event.selEnd <= value.length ? value.substring(event.selEnd) : \"\";\n return `${prefix}${event.change}${postfix}`;\n }\n userActivation() {\n this._document.obj._userActivation = true;\n this._externalCall(\"setTimeout\", [(/* inlined export .USERACTIVATION_CALLBACKID */0), (/* inlined export .USERACTIVATION_MAXTIME_VALIDITY */5000)]);\n }\n dispatch(baseEvent) {\n const id = baseEvent.id;\n if (!(id in this._objects)) {\n let event;\n if (id === \"doc\" || id === \"page\") {\n event = globalThis.event = new Event(baseEvent);\n event.source = event.target = this._document.wrapped;\n event.name = baseEvent.name;\n }\n if (id === \"doc\") {\n const eventName = event.name;\n if (eventName === \"Open\") {\n this.userActivation();\n this._document.obj._initActions();\n this.formatAll();\n }\n if (![\"DidPrint\", \"DidSave\", \"WillPrint\", \"WillSave\"].includes(eventName)) {\n this.userActivation();\n }\n this._document.obj._dispatchDocEvent(event.name);\n } else if (id === \"page\") {\n this.userActivation();\n this._document.obj._dispatchPageEvent(event.name, baseEvent.actions, baseEvent.pageNumber);\n } else if (id === \"app\" && baseEvent.name === \"ResetForm\") {\n this.userActivation();\n for (const fieldId of baseEvent.ids) {\n const obj = this._objects[fieldId];\n obj?.obj._reset();\n }\n }\n return;\n }\n const name = baseEvent.name;\n const source = this._objects[id];\n const event = globalThis.event = new Event(baseEvent);\n let savedChange;\n this.userActivation();\n if (source.obj._isButton()) {\n source.obj._id = id;\n event.value = source.obj._getExportValue(event.value);\n if (name === \"Action\") {\n source.obj._value = event.value;\n }\n }\n switch (name) {\n case \"Keystroke\":\n savedChange = {\n value: event.value,\n changeEx: event.changeEx,\n change: event.change,\n selStart: event.selStart,\n selEnd: event.selEnd\n };\n break;\n case \"Blur\":\n case \"Focus\":\n Object.defineProperty(event, \"value\", {\n configurable: false,\n writable: false,\n enumerable: true,\n value: event.value\n });\n break;\n case \"Validate\":\n this.runValidation(source, event);\n return;\n case \"Action\":\n this.runActions(source, source, event, name);\n this.runCalculate(source, event);\n return;\n }\n this.runActions(source, source, event, name);\n if (name !== \"Keystroke\") {\n return;\n }\n if (event.rc) {\n if (event.willCommit) {\n this.runValidation(source, event);\n } else {\n if (source.obj._isChoice) {\n source.obj.value = savedChange.changeEx;\n source.obj._send({\n id: source.obj._id,\n siblings: source.obj._siblings,\n value: source.obj.value\n });\n return;\n }\n const value = source.obj.value = this.mergeChange(event);\n let selStart, selEnd;\n if (event.selStart !== savedChange.selStart || event.selEnd !== savedChange.selEnd) {\n selStart = event.selStart;\n selEnd = event.selEnd;\n } else {\n selEnd = selStart = savedChange.selStart + event.change.length;\n }\n source.obj._send({\n id: source.obj._id,\n siblings: source.obj._siblings,\n value,\n selRange: [selStart, selEnd]\n });\n }\n } else if (!event.willCommit) {\n source.obj._send({\n id: source.obj._id,\n siblings: source.obj._siblings,\n value: savedChange.value,\n selRange: [savedChange.selStart, savedChange.selEnd]\n });\n } else {\n source.obj._send({\n id: source.obj._id,\n siblings: source.obj._siblings,\n value: \"\",\n formattedValue: null,\n selRange: [0, 0]\n });\n }\n }\n formatAll() {\n const event = globalThis.event = new Event({});\n for (const source of Object.values(this._objects)) {\n event.value = source.obj._getValue();\n this.runActions(source, source, event, \"Format\");\n }\n }\n runValidation(source, event) {\n const didValidateRun = this.runActions(source, source, event, \"Validate\");\n if (event.rc) {\n source.obj.value = event.value;\n this.runCalculate(source, event);\n const savedValue = event.value = source.obj._getValue();\n const formattedValue = this.runActions(source, source, event, \"Format\") ? event.value?.toString?.() : null;\n source.obj._send({\n id: source.obj._id,\n siblings: source.obj._siblings,\n value: savedValue,\n formattedValue\n });\n event.value = savedValue;\n } else if (didValidateRun) {\n source.obj._send({\n id: source.obj._id,\n siblings: source.obj._siblings,\n value: \"\",\n formattedValue: null,\n selRange: [0, 0],\n focus: true\n });\n }\n }\n runActions(source, target, event, eventName) {\n event.source = source.wrapped;\n event.target = target.wrapped;\n event.name = eventName;\n event.targetName = target.obj.name;\n event.rc = true;\n return target.obj._runActions(event);\n }\n calculateNow() {\n if (!this._calculationOrder || this._isCalculating || !this._document.obj.calculate) {\n return;\n }\n this._isCalculating = true;\n const first = this._calculationOrder[0];\n const source = this._objects[first];\n globalThis.event = new Event({});\n this.runCalculate(source, globalThis.event);\n this._isCalculating = false;\n }\n runCalculate(source, event) {\n if (!this._calculationOrder || !this._document.obj.calculate) {\n return;\n }\n for (const targetId of this._calculationOrder) {\n if (!(targetId in this._objects)) {\n continue;\n }\n if (!this._document.obj.calculate) {\n break;\n }\n event.value = null;\n const target = this._objects[targetId];\n let savedValue = target.obj._getValue();\n this.runActions(source, target, event, \"Calculate\");\n if (!event.rc) {\n continue;\n }\n if (event.value !== null) {\n target.obj.value = event.value;\n } else {\n event.value = target.obj._getValue();\n }\n this.runActions(target, target, event, \"Validate\");\n if (!event.rc) {\n if (target.obj._getValue() !== savedValue) {\n target.wrapped.value = savedValue;\n }\n continue;\n }\n if (event.value === null) {\n event.value = target.obj._getValue();\n }\n savedValue = target.obj._getValue();\n const formattedValue = this.runActions(target, target, event, \"Format\") ? event.value?.toString?.() : null;\n target.obj._send({\n id: target.obj._id,\n siblings: target.obj._siblings,\n value: savedValue,\n formattedValue\n });\n }\n }\n}\n\n;// ./src/scripting_api/fullscreen.js\n\n\nclass FullScreen extends PDFObject {\n _backgroundColor = [];\n _clickAdvances = true;\n _cursor = Cursor.hidden;\n _defaultTransition = \"\";\n _escapeExits = true;\n _isFullScreen = true;\n _loop = false;\n _timeDelay = 3600;\n _usePageTiming = false;\n _useTimer = false;\n get backgroundColor() {\n return this._backgroundColor;\n }\n set backgroundColor(_) {}\n get clickAdvances() {\n return this._clickAdvances;\n }\n set clickAdvances(_) {}\n get cursor() {\n return this._cursor;\n }\n set cursor(_) {}\n get defaultTransition() {\n return this._defaultTransition;\n }\n set defaultTransition(_) {}\n get escapeExits() {\n return this._escapeExits;\n }\n set escapeExits(_) {}\n get isFullScreen() {\n return this._isFullScreen;\n }\n set isFullScreen(_) {}\n get loop() {\n return this._loop;\n }\n set loop(_) {}\n get timeDelay() {\n return this._timeDelay;\n }\n set timeDelay(_) {}\n get transitions() {\n return [\"Replace\", \"WipeRight\", \"WipeLeft\", \"WipeDown\", \"WipeUp\", \"SplitHorizontalIn\", \"SplitHorizontalOut\", \"SplitVerticalIn\", \"SplitVerticalOut\", \"BlindsHorizontal\", \"BlindsVertical\", \"BoxIn\", \"BoxOut\", \"GlitterRight\", \"GlitterDown\", \"GlitterRightDown\", \"Dissolve\", \"Random\"];\n }\n set transitions(_) {\n throw new Error(\"fullscreen.transitions is read-only\");\n }\n get usePageTiming() {\n return this._usePageTiming;\n }\n set usePageTiming(_) {}\n get useTimer() {\n return this._useTimer;\n }\n set useTimer(_) {}\n}\n\n;// ./src/scripting_api/thermometer.js\n\nclass Thermometer extends PDFObject {\n _cancelled = false;\n _duration = 100;\n _text = \"\";\n _value = 0;\n get cancelled() {\n return this._cancelled;\n }\n set cancelled(_) {\n throw new Error(\"thermometer.cancelled is read-only\");\n }\n get duration() {\n return this._duration;\n }\n set duration(val) {\n this._duration = val;\n }\n get text() {\n return this._text;\n }\n set text(val) {\n this._text = val;\n }\n get value() {\n return this._value;\n }\n set value(val) {\n this._value = val;\n }\n begin() {}\n end() {}\n}\n\n;// ./src/scripting_api/app.js\n\n\n\n\n\n\n\n\n\n\n\nclass App extends PDFObject {\n constructor(data) {\n super(data);\n this._constants = null;\n this._focusRect = true;\n this._fs = null;\n this._language = App._getLanguage(data.language);\n this._openInPlace = false;\n this._platform = App._getPlatform(data.platform);\n this._runtimeHighlight = false;\n this._runtimeHighlightColor = [\"T\"];\n this._thermometer = null;\n this._toolbar = false;\n this._document = data._document;\n this._proxyHandler = data.proxyHandler;\n this._objects = Object.create(null);\n this._eventDispatcher = new EventDispatcher(this._document, data.calculationOrder, this._objects, data.externalCall);\n this._timeoutIds = new WeakMap();\n this._timeoutIdsRegistry = new FinalizationRegistry(this._cleanTimeout.bind(this));\n this._timeoutCallbackIds = new Map();\n this._timeoutCallbackId = (/* inlined export .USERACTIVATION_CALLBACKID */0) + 1;\n this._globalEval = data.globalEval;\n this._externalCall = data.externalCall;\n }\n _dispatchEvent(pdfEvent) {\n this._eventDispatcher.dispatch(pdfEvent);\n }\n _registerTimeoutCallback(cExpr) {\n const id = this._timeoutCallbackId++;\n this._timeoutCallbackIds.set(id, cExpr);\n return id;\n }\n _unregisterTimeoutCallback(id) {\n this._timeoutCallbackIds.delete(id);\n }\n _evalCallback({\n callbackId,\n interval\n }) {\n const documentObj = this._document.obj;\n if (callbackId === (/* inlined export .USERACTIVATION_CALLBACKID */0)) {\n documentObj._userActivation = false;\n return;\n }\n const expr = this._timeoutCallbackIds.get(callbackId);\n if (!interval) {\n this._unregisterTimeoutCallback(callbackId);\n }\n if (expr) {\n const saveUserActivation = documentObj._userActivation;\n documentObj._userActivation = false;\n this._globalEval(expr);\n documentObj._userActivation = saveUserActivation;\n }\n }\n _registerTimeout(callbackId, interval) {\n const timeout = Object.create(null);\n const id = {\n callbackId,\n interval\n };\n this._timeoutIds.set(timeout, id);\n this._timeoutIdsRegistry.register(timeout, id);\n return timeout;\n }\n _unregisterTimeout(timeout) {\n this._timeoutIdsRegistry.unregister(timeout);\n const data = this._timeoutIds.get(timeout);\n if (!data) {\n return;\n }\n this._timeoutIds.delete(timeout);\n this._cleanTimeout(data);\n }\n _cleanTimeout({\n callbackId,\n interval\n }) {\n this._unregisterTimeoutCallback(callbackId);\n if (interval) {\n this._externalCall(\"clearInterval\", [callbackId]);\n } else {\n this._externalCall(\"clearTimeout\", [callbackId]);\n }\n }\n static _getPlatform(platform) {\n if (typeof platform === \"string\") {\n platform = platform.toLowerCase();\n if (platform.includes(\"win\")) {\n return \"WIN\";\n } else if (platform.includes(\"mac\")) {\n return \"MAC\";\n }\n }\n return \"UNIX\";\n }\n static _getLanguage(language) {\n const [main, sub] = language.toLowerCase().split(/[-_]/, 2);\n switch (main) {\n case \"zh\":\n return sub === \"cn\" || sub === \"sg\" ? \"CHS\" : \"CHT\";\n case \"da\":\n return \"DAN\";\n case \"de\":\n return \"DEU\";\n case \"es\":\n return \"ESP\";\n case \"fr\":\n return \"FRA\";\n case \"it\":\n return \"ITA\";\n case \"ko\":\n return \"KOR\";\n case \"ja\":\n return \"JPN\";\n case \"nl\":\n return \"NLD\";\n case \"no\":\n return \"NOR\";\n case \"pt\":\n return sub === \"br\" ? \"PTB\" : \"ENU\";\n case \"fi\":\n return \"SUO\";\n case \"SV\":\n return \"SVE\";\n default:\n return \"ENU\";\n }\n }\n get activeDocs() {\n return [this._document.wrapped];\n }\n set activeDocs(_) {\n throw new Error(\"app.activeDocs is read-only\");\n }\n get calculate() {\n return this._document.obj.calculate;\n }\n set calculate(calculate) {\n this._document.obj.calculate = calculate;\n }\n get constants() {\n return this._constants ??= Object.freeze({\n align: Object.freeze({\n left: 0,\n center: 1,\n right: 2,\n top: 3,\n bottom: 4\n })\n });\n }\n set constants(_) {\n throw new Error(\"app.constants is read-only\");\n }\n get focusRect() {\n return this._focusRect;\n }\n set focusRect(val) {\n this._focusRect = val;\n }\n get formsVersion() {\n return FORMS_VERSION;\n }\n set formsVersion(_) {\n throw new Error(\"app.formsVersion is read-only\");\n }\n get fromPDFConverters() {\n return [];\n }\n set fromPDFConverters(_) {\n throw new Error(\"app.fromPDFConverters is read-only\");\n }\n get fs() {\n return this._fs ??= new Proxy(new FullScreen({\n send: this._send\n }), this._proxyHandler);\n }\n set fs(_) {\n throw new Error(\"app.fs is read-only\");\n }\n get language() {\n return this._language;\n }\n set language(_) {\n throw new Error(\"app.language is read-only\");\n }\n get media() {\n return undefined;\n }\n set media(_) {\n throw new Error(\"app.media is read-only\");\n }\n get monitors() {\n return [];\n }\n set monitors(_) {\n throw new Error(\"app.monitors is read-only\");\n }\n get numPlugins() {\n return 0;\n }\n set numPlugins(_) {\n throw new Error(\"app.numPlugins is read-only\");\n }\n get openInPlace() {\n return this._openInPlace;\n }\n set openInPlace(val) {\n this._openInPlace = val;\n }\n get platform() {\n return this._platform;\n }\n set platform(_) {\n throw new Error(\"app.platform is read-only\");\n }\n get plugins() {\n return [];\n }\n set plugins(_) {\n throw new Error(\"app.plugins is read-only\");\n }\n get printColorProfiles() {\n return [];\n }\n set printColorProfiles(_) {\n throw new Error(\"app.printColorProfiles is read-only\");\n }\n get printerNames() {\n return [];\n }\n set printerNames(_) {\n throw new Error(\"app.printerNames is read-only\");\n }\n get runtimeHighlight() {\n return this._runtimeHighlight;\n }\n set runtimeHighlight(val) {\n this._runtimeHighlight = val;\n }\n get runtimeHighlightColor() {\n return this._runtimeHighlightColor;\n }\n set runtimeHighlightColor(val) {\n if (Color._isValidColor(val)) {\n this._runtimeHighlightColor = val;\n }\n }\n get thermometer() {\n return this._thermometer ??= new Proxy(new Thermometer({\n send: this._send\n }), this._proxyHandler);\n }\n set thermometer(_) {\n throw new Error(\"app.thermometer is read-only\");\n }\n get toolbar() {\n return this._toolbar;\n }\n set toolbar(val) {\n this._toolbar = val;\n }\n get toolbarHorizontal() {\n return this.toolbar;\n }\n set toolbarHorizontal(value) {\n this.toolbar = value;\n }\n get toolbarVertical() {\n return this.toolbar;\n }\n set toolbarVertical(value) {\n this.toolbar = value;\n }\n get viewerType() {\n return (/* inlined export .VIEWER_TYPE */\"PDF.js\");\n }\n set viewerType(_) {\n throw new Error(\"app.viewerType is read-only\");\n }\n get viewerVariation() {\n return (/* inlined export .VIEWER_VARIATION */\"Full\");\n }\n set viewerVariation(_) {\n throw new Error(\"app.viewerVariation is read-only\");\n }\n get viewerVersion() {\n return VIEWER_VERSION;\n }\n set viewerVersion(_) {\n throw new Error(\"app.viewerVersion is read-only\");\n }\n addMenuItem() {}\n addSubMenu() {}\n addToolButton() {}\n alert(cMsg, nIcon = 0, nType = 0, cTitle = \"PDF.js\", oDoc = null, oCheckbox = null) {\n if (!this._document.obj._userActivation) {\n return 0;\n }\n this._document.obj._userActivation = false;\n if (cMsg && typeof cMsg === \"object\") {\n nType = cMsg.nType;\n cMsg = cMsg.cMsg;\n }\n cMsg = (cMsg || \"\").toString();\n if (!cMsg) {\n return 0;\n }\n nType = typeof nType !== \"number\" || isNaN(nType) || nType < 0 || nType > 3 ? 0 : nType;\n if (nType >= 2) {\n return this._externalCall(\"confirm\", [cMsg]) ? 4 : 3;\n }\n this._externalCall(\"alert\", [cMsg]);\n return 1;\n }\n beep() {}\n beginPriv() {}\n browseForDoc() {}\n clearInterval(oInterval) {\n this._unregisterTimeout(oInterval);\n }\n clearTimeOut(oTime) {\n this._unregisterTimeout(oTime);\n }\n endPriv() {}\n execDialog() {}\n execMenuItem(item) {\n if (!this._document.obj._userActivation) {\n return;\n }\n this._document.obj._userActivation = false;\n switch (item) {\n case \"SaveAs\":\n if (this._document.obj._disableSaving) {\n return;\n }\n this._send({\n command: item\n });\n break;\n case \"FirstPage\":\n case \"LastPage\":\n case \"NextPage\":\n case \"PrevPage\":\n case \"ZoomViewIn\":\n case \"ZoomViewOut\":\n this._send({\n command: item\n });\n break;\n case \"FitPage\":\n this._send({\n command: \"zoom\",\n value: \"page-fit\"\n });\n break;\n case \"Print\":\n if (this._document.obj._disablePrinting) {\n return;\n }\n this._send({\n command: \"print\"\n });\n break;\n }\n }\n getNthPlugInName() {}\n getPath() {}\n goBack() {}\n goForward() {}\n hideMenuItem() {}\n hideToolbarButton() {}\n launchURL() {}\n listMenuItems() {}\n listToolbarButtons() {}\n loadPolicyFile() {}\n mailGetAddrs() {}\n mailMsg() {}\n newDoc() {}\n newCollection() {}\n newFDF() {}\n openDoc() {}\n openFDF() {}\n popUpMenu() {}\n popUpMenuEx() {}\n removeToolButton() {}\n response(cQuestion, cTitle = \"\", cDefault = \"\", bPassword = \"\", cLabel = \"\") {\n if (!this._document.obj._userActivation) {\n return null;\n }\n this._document.obj._userActivation = false;\n if (cQuestion && typeof cQuestion === \"object\") {\n cDefault = cQuestion.cDefault;\n cQuestion = cQuestion.cQuestion;\n }\n cQuestion = (cQuestion || \"\").toString();\n cDefault = (cDefault || \"\").toString();\n return this._externalCall(\"prompt\", [cQuestion, cDefault || \"\"]);\n }\n setInterval(cExpr, nMilliseconds = 0) {\n if (cExpr && typeof cExpr === \"object\") {\n nMilliseconds = cExpr.nMilliseconds || 0;\n cExpr = cExpr.cExpr;\n }\n if (typeof cExpr !== \"string\") {\n throw new TypeError(\"First argument of app.setInterval must be a string\");\n }\n if (typeof nMilliseconds !== \"number\") {\n throw new TypeError(\"Second argument of app.setInterval must be a number\");\n }\n const callbackId = this._registerTimeoutCallback(cExpr);\n this._externalCall(\"setInterval\", [callbackId, nMilliseconds]);\n return this._registerTimeout(callbackId, true);\n }\n setTimeOut(cExpr, nMilliseconds = 0) {\n if (cExpr && typeof cExpr === \"object\") {\n nMilliseconds = cExpr.nMilliseconds || 0;\n cExpr = cExpr.cExpr;\n }\n if (typeof cExpr !== \"string\") {\n throw new TypeError(\"First argument of app.setTimeOut must be a string\");\n }\n if (typeof nMilliseconds !== \"number\") {\n throw new TypeError(\"Second argument of app.setTimeOut must be a number\");\n }\n const callbackId = this._registerTimeoutCallback(cExpr);\n this._externalCall(\"setTimeout\", [callbackId, nMilliseconds]);\n return this._registerTimeout(callbackId, false);\n }\n trustedFunction() {}\n trustPropagatorFunction() {}\n}\n\n;// ./node_modules/core-js/modules/es.json.stringify.js\nes_json_stringify_namespaceFn();\n\n;// ./src/scripting_api/console.js\n\n\nclass Console extends PDFObject {\n clear() {\n this._send({\n id: \"clear\"\n });\n }\n hide() {}\n println(msg) {\n if (typeof msg !== \"string\") {\n try {\n msg = JSON.stringify(msg);\n } catch {\n msg = msg.toString?.() || \"[Unserializable object]\";\n }\n }\n this._send({\n command: \"println\",\n value: \"PDF.js Console:: \" + msg\n });\n }\n show() {}\n}\n\n;// ./src/scripting_api/print_params.js\nclass PrintParams {\n binaryOk = true;\n bitmapDPI = 150;\n booklet = {\n binding: 0,\n duplexMode: 0,\n subsetFrom: 0,\n subsetTo: -1\n };\n colorOverride = 0;\n colorProfile = \"\";\n constants = Object.freeze({\n bookletBindings: Object.freeze({\n Left: 0,\n Right: 1,\n LeftTall: 2,\n RightTall: 3\n }),\n bookletDuplexMode: Object.freeze({\n BothSides: 0,\n FrontSideOnly: 1,\n BasicSideOnly: 2\n }),\n colorOverrides: Object.freeze({\n auto: 0,\n gray: 1,\n mono: 2\n }),\n fontPolicies: Object.freeze({\n everyPage: 0,\n jobStart: 1,\n pageRange: 2\n }),\n handling: Object.freeze({\n none: 0,\n fit: 1,\n shrink: 2,\n tileAll: 3,\n tileLarge: 4,\n nUp: 5,\n booklet: 6\n }),\n interactionLevel: Object.freeze({\n automatic: 0,\n full: 1,\n silent: 2\n }),\n nUpPageOrders: Object.freeze({\n Horizontal: 0,\n HorizontalReversed: 1,\n Vertical: 2\n }),\n printContents: Object.freeze({\n doc: 0,\n docAndComments: 1,\n formFieldsOnly: 2\n }),\n flagValues: Object.freeze({\n applyOverPrint: 1,\n applySoftProofSettings: 1 << 1,\n applyWorkingColorSpaces: 1 << 2,\n emitHalftones: 1 << 3,\n emitPostScriptXObjects: 1 << 4,\n emitFormsAsPSForms: 1 << 5,\n maxJP2KRes: 1 << 6,\n setPageSize: 1 << 7,\n suppressBG: 1 << 8,\n suppressCenter: 1 << 9,\n suppressCJKFontSubst: 1 << 10,\n suppressCropClip: 1 << 11,\n suppressRotate: 1 << 12,\n suppressTransfer: 1 << 13,\n suppressUCR: 1 << 14,\n useTrapAnnots: 1 << 15,\n usePrintersMarks: 1 << 16\n }),\n rasterFlagValues: Object.freeze({\n textToOutline: 1,\n strokesToOutline: 1 << 1,\n allowComplexClip: 1 << 2,\n preserveOverprint: 1 << 3\n }),\n subsets: Object.freeze({\n all: 0,\n even: 1,\n odd: 2\n }),\n tileMarks: Object.freeze({\n none: 0,\n west: 1,\n east: 2\n }),\n usages: Object.freeze({\n auto: 0,\n use: 1,\n noUse: 2\n })\n });\n downloadFarEastFonts = false;\n fileName = \"\";\n firstPage = 0;\n flags = 0;\n fontPolicy = 0;\n gradientDPI = 150;\n interactive = 1;\n npUpAutoRotate = false;\n npUpNumPagesH = 2;\n npUpNumPagesV = 2;\n npUpPageBorder = false;\n npUpPageOrder = 0;\n pageHandling = 0;\n pageSubset = 0;\n printAsImage = false;\n printContent = 0;\n printerName = \"\";\n psLevel = 0;\n rasterFlags = 0;\n reversePages = false;\n tileLabel = false;\n tileMark = 0;\n tileOverlap = 0;\n tileScale = 1.0;\n transparencyLevel = 75;\n usePrinterCRD = 0;\n useT1Conversion = 0;\n constructor(data) {\n this.lastPage = data.lastPage;\n }\n}\n\n;// ./src/scripting_api/doc.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst DOC_EXTERNAL = false;\nclass InfoProxyHandler {\n static get(obj, prop) {\n return obj[prop.toLowerCase()];\n }\n static set(obj, prop, value) {\n throw new Error(`doc.info.${prop} is read-only`);\n }\n}\nclass Doc extends PDFObject {\n #pageActions = null;\n #otherPageActions = null;\n constructor(data) {\n super(data);\n this._expandos = globalThis;\n this._baseURL = data.baseURL || \"\";\n this._calculate = true;\n this._delay = false;\n this._dirty = false;\n this._disclosed = false;\n this._media = undefined;\n this._metadata = data.metadata || \"\";\n this._noautocomplete = undefined;\n this._nocache = undefined;\n this._spellDictionaryOrder = [];\n this._spellLanguageOrder = [];\n this._printParams = null;\n this._fields = new Map();\n this._fieldNames = [];\n this._event = null;\n this._author = data.Author || \"\";\n this._creator = data.Creator || \"\";\n this._creationDate = this._getDate(data.CreationDate) || null;\n this._docID = data.docID || [\"\", \"\"];\n this._documentFileName = data.filename || \"\";\n this._filesize = data.filesize || 0;\n this._keywords = data.Keywords || \"\";\n this._layout = data.layout || \"\";\n this._modDate = this._getDate(data.ModDate) || null;\n this._numFields = 0;\n this._numPages = data.numPages || 1;\n this._pageNum = data.pageNum || 0;\n this._producer = data.Producer || \"\";\n this._securityHandler = data.EncryptFilterName || null;\n this._subject = data.Subject || \"\";\n this._title = data.Title || \"\";\n this._URL = data.URL || \"\";\n this._info = new Proxy({\n title: this._title,\n author: this._author,\n authors: data.authors || [this._author],\n subject: this._subject,\n keywords: this._keywords,\n creator: this._creator,\n producer: this._producer,\n creationdate: this._creationDate,\n moddate: this._modDate,\n trapped: data.Trapped || \"Unknown\"\n }, InfoProxyHandler);\n this._zoomType = ZoomType.none;\n this._zoom = data.zoom || 100;\n this._actions = createMap(data.actions);\n this._globalEval = data.globalEval;\n this._userActivation = false;\n this._disablePrinting = false;\n this._disableSaving = false;\n }\n _initActions() {\n for (const {\n obj\n } of this._fields.values()) {\n const initialValue = obj._initialValue;\n if (initialValue) {\n this._send({\n id: obj._id,\n siblings: obj._siblings,\n value: initialValue,\n formattedValue: obj.value.toString()\n });\n }\n }\n const dontRun = new Set([\"WillClose\", \"WillSave\", \"DidSave\", \"WillPrint\", \"DidPrint\", \"OpenAction\"]);\n this._disableSaving = true;\n for (const actionName of this._actions.keys()) {\n if (!dontRun.has(actionName)) {\n this._runActions(actionName);\n }\n }\n this._runActions(\"OpenAction\");\n this._disableSaving = false;\n }\n _dispatchDocEvent(name) {\n switch (name) {\n case \"Open\":\n this._disableSaving = true;\n this._runActions(\"OpenAction\");\n this._disableSaving = false;\n break;\n case \"WillPrint\":\n this._disablePrinting = true;\n try {\n this._runActions(name);\n } catch (error) {\n this._send(serializeError(error));\n }\n this._send({\n command: \"WillPrintFinished\"\n });\n this._disablePrinting = false;\n break;\n case \"WillSave\":\n this._disableSaving = true;\n this._runActions(name);\n this._disableSaving = false;\n break;\n default:\n this._runActions(name);\n }\n }\n _dispatchPageEvent(name, actions, pageNumber) {\n if (name === \"PageOpen\") {\n this.#pageActions ??= new Map();\n this.#pageActions.getOrInsertComputed(pageNumber, () => createMap(actions));\n this._pageNum = pageNumber - 1;\n }\n for (const acts of [this.#pageActions, this.#otherPageActions]) {\n actions = acts?.get(pageNumber)?.get(name);\n if (actions) {\n for (const action of actions) {\n this._globalEval(action);\n }\n }\n }\n }\n _runActions(name) {\n const actions = this._actions.get(name);\n if (!actions) {\n return;\n }\n for (const action of actions) {\n try {\n this._globalEval(action);\n } catch (error) {\n const serializedError = serializeError(error);\n serializedError.value = `Error when executing \"${name}\" for document\\n${serializedError.value}`;\n this._send(serializedError);\n }\n }\n }\n _addField(name, field) {\n this._fields.set(name, field);\n this._fieldNames.push(name);\n this._numFields++;\n const po = field.obj._actions.get(\"PageOpen\");\n const pc = field.obj._actions.get(\"PageClose\");\n if (po || pc) {\n this.#otherPageActions ??= new Map();\n const actions = this.#otherPageActions.getOrInsertComputed(field.obj._page + 1, makeMap);\n if (po) {\n actions.getOrInsertComputed(\"PageOpen\", makeArr).push(...po);\n }\n if (pc) {\n actions.getOrInsertComputed(\"PageClose\", makeArr).push(...pc);\n }\n }\n }\n _getDate(date) {\n if (!date || date.length < 15 || !date.startsWith(\"D:\")) {\n return date;\n }\n date = date.substring(2);\n const year = date.substring(0, 4);\n const month = date.substring(4, 6);\n const day = date.substring(6, 8);\n const hour = date.substring(8, 10);\n const minute = date.substring(10, 12);\n const o = date.charAt(12);\n let second, offsetPos;\n if (o === \"Z\" || o === \"+\" || o === \"-\") {\n second = \"00\";\n offsetPos = 12;\n } else {\n second = date.substring(12, 14);\n offsetPos = 14;\n }\n const offset = date.substring(offsetPos).replaceAll(\"'\", \"\");\n return new Date(`${year}-${month}-${day}T${hour}:${minute}:${second}${offset}`);\n }\n get author() {\n return this._author;\n }\n set author(_) {\n throw new Error(\"doc.author is read-only\");\n }\n get baseURL() {\n return this._baseURL;\n }\n set baseURL(baseURL) {\n this._baseURL = baseURL;\n }\n get bookmarkRoot() {\n return undefined;\n }\n set bookmarkRoot(_) {\n throw new Error(\"doc.bookmarkRoot is read-only\");\n }\n get calculate() {\n return this._calculate;\n }\n set calculate(calculate) {\n this._calculate = calculate;\n }\n get creator() {\n return this._creator;\n }\n set creator(_) {\n throw new Error(\"doc.creator is read-only\");\n }\n get dataObjects() {\n return [];\n }\n set dataObjects(_) {\n throw new Error(\"doc.dataObjects is read-only\");\n }\n get delay() {\n return this._delay;\n }\n set delay(delay) {\n this._delay = delay;\n }\n get dirty() {\n return this._dirty;\n }\n set dirty(dirty) {\n this._dirty = dirty;\n }\n get disclosed() {\n return this._disclosed;\n }\n set disclosed(disclosed) {\n this._disclosed = disclosed;\n }\n get docID() {\n return this._docID;\n }\n set docID(_) {\n throw new Error(\"doc.docID is read-only\");\n }\n get documentFileName() {\n return this._documentFileName;\n }\n set documentFileName(_) {\n throw new Error(\"doc.documentFileName is read-only\");\n }\n get dynamicXFAForm() {\n return false;\n }\n set dynamicXFAForm(_) {\n throw new Error(\"doc.dynamicXFAForm is read-only\");\n }\n get external() {\n return DOC_EXTERNAL;\n }\n set external(_) {\n throw new Error(\"doc.external is read-only\");\n }\n get filesize() {\n return this._filesize;\n }\n set filesize(_) {\n throw new Error(\"doc.filesize is read-only\");\n }\n get hidden() {\n return false;\n }\n set hidden(_) {\n throw new Error(\"doc.hidden is read-only\");\n }\n get hostContainer() {\n return undefined;\n }\n set hostContainer(_) {\n throw new Error(\"doc.hostContainer is read-only\");\n }\n get icons() {\n return undefined;\n }\n set icons(_) {\n throw new Error(\"doc.icons is read-only\");\n }\n get info() {\n return this._info;\n }\n set info(_) {\n throw new Error(\"doc.info is read-only\");\n }\n get innerAppWindowRect() {\n return [0, 0, 0, 0];\n }\n set innerAppWindowRect(_) {\n throw new Error(\"doc.innerAppWindowRect is read-only\");\n }\n get innerDocWindowRect() {\n return [0, 0, 0, 0];\n }\n set innerDocWindowRect(_) {\n throw new Error(\"doc.innerDocWindowRect is read-only\");\n }\n get isModal() {\n return false;\n }\n set isModal(_) {\n throw new Error(\"doc.isModal is read-only\");\n }\n get keywords() {\n return this._keywords;\n }\n set keywords(_) {\n throw new Error(\"doc.keywords is read-only\");\n }\n get layout() {\n return this._layout;\n }\n set layout(value) {\n if (!this._userActivation) {\n return;\n }\n this._userActivation = false;\n if (typeof value !== \"string\") {\n return;\n }\n if (value !== \"SinglePage\" && value !== \"OneColumn\" && value !== \"TwoColumnLeft\" && value !== \"TwoPageLeft\" && value !== \"TwoColumnRight\" && value !== \"TwoPageRight\") {\n value = \"SinglePage\";\n }\n this._send({\n command: \"layout\",\n value\n });\n this._layout = value;\n }\n get media() {\n return this._media;\n }\n set media(media) {\n this._media = media;\n }\n get metadata() {\n return this._metadata;\n }\n set metadata(metadata) {\n this._metadata = metadata;\n }\n get modDate() {\n return this._modDate;\n }\n set modDate(_) {\n throw new Error(\"doc.modDate is read-only\");\n }\n get mouseX() {\n return 0;\n }\n set mouseX(_) {\n throw new Error(\"doc.mouseX is read-only\");\n }\n get mouseY() {\n return 0;\n }\n set mouseY(_) {\n throw new Error(\"doc.mouseY is read-only\");\n }\n get noautocomplete() {\n return this._noautocomplete;\n }\n set noautocomplete(noautocomplete) {\n this._noautocomplete = noautocomplete;\n }\n get nocache() {\n return this._nocache;\n }\n set nocache(nocache) {\n this._nocache = nocache;\n }\n get numFields() {\n return this._numFields;\n }\n set numFields(_) {\n throw new Error(\"doc.numFields is read-only\");\n }\n get numPages() {\n return this._numPages;\n }\n set numPages(_) {\n throw new Error(\"doc.numPages is read-only\");\n }\n get numTemplates() {\n return 0;\n }\n set numTemplates(_) {\n throw new Error(\"doc.numTemplates is read-only\");\n }\n get outerAppWindowRect() {\n return [0, 0, 0, 0];\n }\n set outerAppWindowRect(_) {\n throw new Error(\"doc.outerAppWindowRect is read-only\");\n }\n get outerDocWindowRect() {\n return [0, 0, 0, 0];\n }\n set outerDocWindowRect(_) {\n throw new Error(\"doc.outerDocWindowRect is read-only\");\n }\n get pageNum() {\n return this._pageNum;\n }\n set pageNum(value) {\n if (!this._userActivation) {\n return;\n }\n this._userActivation = false;\n if (typeof value !== \"number\" || value < 0 || value >= this._numPages) {\n return;\n }\n this._send({\n command: \"page-num\",\n value\n });\n this._pageNum = value;\n }\n get pageWindowRect() {\n return [0, 0, 0, 0];\n }\n set pageWindowRect(_) {\n throw new Error(\"doc.pageWindowRect is read-only\");\n }\n get path() {\n return \"\";\n }\n set path(_) {\n throw new Error(\"doc.path is read-only\");\n }\n get permStatusReady() {\n return true;\n }\n set permStatusReady(_) {\n throw new Error(\"doc.permStatusReady is read-only\");\n }\n get producer() {\n return this._producer;\n }\n set producer(_) {\n throw new Error(\"doc.producer is read-only\");\n }\n get requiresFullSave() {\n return false;\n }\n set requiresFullSave(_) {\n throw new Error(\"doc.requiresFullSave is read-only\");\n }\n get securityHandler() {\n return this._securityHandler;\n }\n set securityHandler(_) {\n throw new Error(\"doc.securityHandler is read-only\");\n }\n get selectedAnnots() {\n return [];\n }\n set selectedAnnots(_) {\n throw new Error(\"doc.selectedAnnots is read-only\");\n }\n get sounds() {\n return [];\n }\n set sounds(_) {\n throw new Error(\"doc.sounds is read-only\");\n }\n get spellDictionaryOrder() {\n return this._spellDictionaryOrder;\n }\n set spellDictionaryOrder(spellDictionaryOrder) {\n this._spellDictionaryOrder = spellDictionaryOrder;\n }\n get spellLanguageOrder() {\n return this._spellLanguageOrder;\n }\n set spellLanguageOrder(spellLanguageOrder) {\n this._spellLanguageOrder = spellLanguageOrder;\n }\n get subject() {\n return this._subject;\n }\n set subject(_) {\n throw new Error(\"doc.subject is read-only\");\n }\n get templates() {\n return [];\n }\n set templates(_) {\n throw new Error(\"doc.templates is read-only\");\n }\n get title() {\n return this._title;\n }\n set title(_) {\n throw new Error(\"doc.title is read-only\");\n }\n get URL() {\n return this._URL;\n }\n set URL(_) {\n throw new Error(\"doc.URL is read-only\");\n }\n get viewState() {\n return undefined;\n }\n set viewState(_) {\n throw new Error(\"doc.viewState is read-only\");\n }\n get xfa() {\n return this._xfa;\n }\n set xfa(_) {\n throw new Error(\"doc.xfa is read-only\");\n }\n get XFAForeground() {\n return false;\n }\n set XFAForeground(_) {\n throw new Error(\"doc.XFAForeground is read-only\");\n }\n get zoomType() {\n return this._zoomType;\n }\n set zoomType(type) {\n if (!this._userActivation) {\n return;\n }\n this._userActivation = false;\n if (typeof type !== \"string\") {\n return;\n }\n switch (type) {\n case ZoomType.none:\n this._send({\n command: \"zoom\",\n value: 1\n });\n break;\n case ZoomType.fitP:\n this._send({\n command: \"zoom\",\n value: \"page-fit\"\n });\n break;\n case ZoomType.fitW:\n this._send({\n command: \"zoom\",\n value: \"page-width\"\n });\n break;\n case ZoomType.fitH:\n this._send({\n command: \"zoom\",\n value: \"page-height\"\n });\n break;\n case ZoomType.fitV:\n this._send({\n command: \"zoom\",\n value: \"auto\"\n });\n break;\n case ZoomType.pref:\n case ZoomType.refW:\n break;\n default:\n return;\n }\n this._zoomType = type;\n }\n get zoom() {\n return this._zoom;\n }\n set zoom(value) {\n if (!this._userActivation) {\n return;\n }\n this._userActivation = false;\n if (typeof value !== \"number\" || value < 8.33 || value > 6400) {\n return;\n }\n this._send({\n command: \"zoom\",\n value: value / 100\n });\n }\n addAnnot() {}\n addField() {}\n addIcon() {}\n addLink() {}\n addRecipientListCryptFilter() {}\n addRequirement() {}\n addScript() {}\n addThumbnails() {}\n addWatermarkFromFile() {}\n addWatermarkFromText() {}\n addWeblinks() {}\n bringToFront() {}\n calculateNow() {\n this._eventDispatcher.calculateNow();\n }\n closeDoc() {}\n colorConvertPage() {}\n createDataObject() {}\n createTemplate() {}\n deletePages() {}\n deleteSound() {}\n embedDocAsDataObject() {}\n embedOutputIntent() {}\n encryptForRecipients() {}\n encryptUsingPolicy() {}\n exportAsFDF() {}\n exportAsFDFStr() {}\n exportAsText() {}\n exportAsXFDF() {}\n exportAsXFDFStr() {}\n exportDataObject() {}\n exportXFAData() {}\n extractPages() {}\n flattenPages() {}\n getAnnot() {}\n getAnnots() {}\n getAnnot3D() {}\n getAnnots3D() {}\n getColorConvertAction() {}\n getDataObject() {}\n getDataObjectContents() {}\n _getField(cName) {\n if (cName && typeof cName === \"object\") {\n cName = cName.cName;\n }\n if (typeof cName !== \"string\") {\n throw new TypeError(\"Invalid field name: must be a string\");\n }\n const searchedField = this._fields.get(cName);\n if (searchedField) {\n return searchedField;\n }\n const parts = cName.split(\"#\");\n let childIndex = NaN;\n if (parts.length === 2) {\n childIndex = Math.floor(parseFloat(parts[1]));\n cName = parts[0];\n }\n for (const [name, field] of this._fields) {\n if (name.endsWith(cName)) {\n if (!isNaN(childIndex)) {\n const children = this._getChildren(name);\n if (childIndex < 0 || childIndex >= children.length) {\n childIndex = 0;\n }\n if (childIndex < children.length) {\n this._fields.set(cName, children[childIndex]);\n return children[childIndex];\n }\n }\n this._fields.set(cName, field);\n return field;\n }\n }\n return null;\n }\n getField(cName) {\n const field = this._getField(cName);\n return !field ? null : field.wrapped;\n }\n _getChildren(fieldName) {\n const len = fieldName.length;\n const children = [];\n const pattern = /^\\.[^.]+$/;\n for (const [name, field] of this._fields) {\n if (name.startsWith(fieldName)) {\n const finalPart = name.slice(len);\n if (pattern.test(finalPart)) {\n children.push(field);\n }\n }\n }\n return children;\n }\n _getTerminalChildren(fieldName) {\n const children = [];\n const len = fieldName.length;\n for (const [name, field] of this._fields) {\n if (name.startsWith(fieldName)) {\n const finalPart = name.slice(len);\n if (field.obj._hasValue && (finalPart === \"\" || finalPart.startsWith(\".\"))) {\n children.push(field.wrapped);\n }\n }\n }\n return children;\n }\n getIcon() {}\n getLegalWarnings() {}\n getLinks() {}\n getNthFieldName(nIndex) {\n if (nIndex && typeof nIndex === \"object\") {\n nIndex = nIndex.nIndex;\n }\n if (typeof nIndex !== \"number\") {\n throw new TypeError(\"Invalid field index: must be a number\");\n }\n return nIndex >= 0 && nIndex < this.numFields ? this._fieldNames[Math.trunc(nIndex)] : null;\n }\n getNthTemplate() {\n return null;\n }\n getOCGs() {}\n getOCGOrder() {}\n getPageBox() {}\n getPageLabel() {}\n getPageNthWord() {}\n getPageNthWordQuads() {}\n getPageNumWords() {}\n getPageRotation() {}\n getPageTransition() {}\n getPrintParams() {\n return this._printParams ||= new PrintParams({\n lastPage: this._numPages - 1\n });\n }\n getSound() {}\n getTemplate() {}\n getURL() {}\n gotoNamedDest() {}\n importAnFDF() {}\n importAnXFDF() {}\n importDataObject() {}\n importIcon() {}\n importSound() {}\n importTextData() {}\n importXFAData() {}\n insertPages() {}\n mailDoc() {}\n mailForm() {}\n movePage() {}\n newPage() {}\n openDataObject() {}\n print(bUI = true, nStart = 0, nEnd = -1, bSilent = false, bShrinkToFit = false, bPrintAsImage = false, bReverse = false, bAnnotations = true, printParams = null) {\n if (this._disablePrinting || !this._userActivation) {\n return;\n }\n this._userActivation = false;\n if (bUI && typeof bUI === \"object\") {\n nStart = bUI.nStart;\n nEnd = bUI.nEnd;\n bSilent = bUI.bSilent;\n bShrinkToFit = bUI.bShrinkToFit;\n bPrintAsImage = bUI.bPrintAsImage;\n bReverse = bUI.bReverse;\n bAnnotations = bUI.bAnnotations;\n printParams = bUI.printParams;\n bUI = bUI.bUI;\n }\n if (printParams) {\n nStart = printParams.firstPage;\n nEnd = printParams.lastPage;\n }\n nStart = typeof nStart === \"number\" ? Math.max(0, Math.trunc(nStart)) : 0;\n nEnd = typeof nEnd === \"number\" ? Math.max(0, Math.trunc(nEnd)) : -1;\n this._send({\n command: \"print\",\n start: nStart,\n end: nEnd\n });\n }\n removeDataObject() {}\n removeField() {}\n removeIcon() {}\n removeLinks() {}\n removeRequirement() {}\n removeScript() {}\n removeTemplate() {}\n removeThumbnails() {}\n removeWeblinks() {}\n replacePages() {}\n resetForm(aFields = null) {\n if (aFields && typeof aFields === \"object\" && !Array.isArray(aFields)) {\n aFields = aFields.aFields;\n }\n if (aFields && !Array.isArray(aFields)) {\n aFields = [aFields];\n }\n let mustCalculate = false;\n let fieldsToReset;\n if (aFields) {\n fieldsToReset = new Set();\n for (const fieldName of aFields) {\n if (!fieldName) {\n continue;\n }\n if (typeof fieldName !== \"string\") {\n fieldsToReset = null;\n break;\n }\n const field = this._getField(fieldName);\n if (!field) {\n continue;\n }\n fieldsToReset.add(field);\n mustCalculate = true;\n }\n }\n if (fieldsToReset) {\n for (const {\n obj\n } of fieldsToReset) {\n for (const id of obj._kidIds || []) {\n const kid = obj._appObjects[id];\n if (kid) {\n fieldsToReset.add(kid);\n }\n }\n }\n } else {\n fieldsToReset = this._fields.values();\n mustCalculate = this._fields.size !== 0;\n }\n for (const field of fieldsToReset) {\n field.obj.value = field.obj.defaultValue;\n this._send({\n id: field.obj._id,\n siblings: field.obj._siblings,\n value: field.obj.defaultValue,\n formattedValue: null,\n selRange: [0, 0]\n });\n }\n if (mustCalculate) {\n this.calculateNow();\n }\n }\n saveAs() {}\n scroll() {}\n selectPageNthWord() {}\n setAction() {}\n setDataObjectContents() {}\n setOCGOrder() {}\n setPageAction() {}\n setPageBoxes() {}\n setPageLabels() {}\n setPageRotations() {}\n setPageTabOrder() {}\n setPageTransitions() {}\n spawnPageFromTemplate() {}\n submitForm() {}\n syncAnnotScan() {}\n}\n\n;// ./src/scripting_api/proxy.js\n\n\n\n\n\n\n\n\n\n\nclass ProxyHandler {\n nosend = new Set([\"delay\"]);\n get(obj, prop) {\n if (prop in obj._expandos) {\n const val = obj._expandos[prop];\n return typeof val === \"function\" ? val.bind(obj) : val;\n }\n if (typeof prop === \"string\" && !prop.startsWith(\"_\") && prop in obj) {\n const val = obj[prop];\n return typeof val === \"function\" ? val.bind(obj) : val;\n }\n return undefined;\n }\n set(obj, prop, value) {\n obj._kidIds?.forEach(id => {\n obj._appObjects[id].wrapped[prop] = value;\n });\n if (typeof prop === \"string\" && !prop.startsWith(\"_\") && prop in obj) {\n const old = obj[prop];\n obj[prop] = value;\n if (!this.nosend.has(prop) && obj._send && obj._id !== null && typeof old !== \"function\") {\n const data = {\n id: obj._id\n };\n data[prop] = prop === \"value\" ? obj._getValue() : obj[prop];\n if (!obj._siblings) {\n obj._send(data);\n } else {\n data.siblings = obj._siblings;\n obj._send(data);\n }\n }\n } else {\n obj._expandos[prop] = value;\n }\n return true;\n }\n has(obj, prop) {\n return prop in obj._expandos || typeof prop === \"string\" && !prop.startsWith(\"_\") && prop in obj;\n }\n getPrototypeOf(obj) {\n return null;\n }\n setPrototypeOf(obj, proto) {\n return false;\n }\n isExtensible(obj) {\n return true;\n }\n preventExtensions(obj) {\n return false;\n }\n getOwnPropertyDescriptor(obj, prop) {\n if (prop in obj._expandos) {\n return {\n configurable: true,\n enumerable: true,\n value: obj._expandos[prop]\n };\n }\n return typeof prop === \"string\" && !prop.startsWith(\"_\") && prop in obj ? {\n configurable: true,\n enumerable: true,\n value: obj[prop]\n } : undefined;\n }\n defineProperty(obj, key, descriptor) {\n Object.defineProperty(obj._expandos, key, descriptor);\n return true;\n }\n deleteProperty(obj, prop) {\n if (prop in obj._expandos) {\n delete obj._expandos[prop];\n }\n }\n ownKeys(obj) {\n const fromExpandos = Reflect.ownKeys(obj._expandos);\n const fromObj = Reflect.ownKeys(obj).filter(k => !k.startsWith(\"_\"));\n return fromExpandos.concat(fromObj);\n }\n}\n\n;// ./src/scripting_api/util.js\n\n\n\n\n\n\n\n\nclass Util extends PDFObject {\n #createDateActionsBound = this.#createDateActions.bind(this);\n #createScandDataBound = this.#createScandData.bind(this);\n #dateActionsCache = null;\n #scandCache = null;\n #months = [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"];\n #days = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"];\n MILLISECONDS_IN_DAY = 86400000;\n MILLISECONDS_IN_WEEK = 604800000;\n constructor(data) {\n super(data);\n this._externalCall = data.externalCall;\n }\n printf(...args) {\n if (args.length === 0) {\n throw new Error(\"Invalid number of params in printf\");\n }\n if (typeof args[0] !== \"string\") {\n throw new TypeError(\"First argument of printf must be a string\");\n }\n const pattern = /%(,[0-4])?([+ 0#]+)?(\\d+)?(\\.\\d+)?(.)/g;\n const PLUS = 1;\n const SPACE = 2;\n const ZERO = 4;\n const HASH = 8;\n let i = 0;\n return args[0].replaceAll(pattern, function (_, nDecSep, cFlags, nWidth, nPrecision, cConvChar) {\n if (cConvChar !== \"d\" && cConvChar !== \"f\" && cConvChar !== \"s\" && cConvChar !== \"x\") {\n const buf = [\"%\"];\n for (const str of [nDecSep, cFlags, nWidth, nPrecision, cConvChar]) {\n if (str) {\n buf.push(str);\n }\n }\n return buf.join(\"\");\n }\n i++;\n if (i === args.length) {\n throw new Error(\"Not enough arguments in printf\");\n }\n const arg = args[i];\n if (cConvChar === \"s\") {\n return arg.toString();\n }\n let flags = 0;\n if (cFlags) {\n for (const flag of cFlags) {\n switch (flag) {\n case \"+\":\n flags |= PLUS;\n break;\n case \" \":\n flags |= SPACE;\n break;\n case \"0\":\n flags |= ZERO;\n break;\n case \"#\":\n flags |= HASH;\n break;\n }\n }\n }\n cFlags = flags;\n nWidth &&= parseInt(nWidth);\n let intPart = Math.trunc(arg);\n if (cConvChar === \"x\") {\n let hex = Math.abs(intPart).toString(16).toUpperCase();\n if (nWidth !== undefined) {\n hex = hex.padStart(nWidth, cFlags & ZERO ? \"0\" : \" \");\n }\n if (cFlags & HASH) {\n hex = `0x${hex}`;\n }\n return hex;\n }\n nPrecision &&= parseInt(nPrecision.substring(1));\n nDecSep = nDecSep ? nDecSep.substring(1) : \"0\";\n const separators = {\n 0: [\",\", \".\"],\n 1: [\"\", \".\"],\n 2: [\".\", \",\"],\n 3: [\"\", \",\"],\n 4: [\"'\", \".\"]\n };\n const [thousandSep, decimalSep] = separators[nDecSep];\n let decPart = \"\";\n if (cConvChar === \"f\") {\n decPart = nPrecision !== undefined ? Math.abs(arg - intPart).toFixed(nPrecision) : Math.abs(arg - intPart).toString();\n if (decPart.length > 2) {\n if (/^1\\.0+$/.test(decPart)) {\n intPart += Math.sign(arg);\n decPart = `${decimalSep}${decPart.split(\".\")[1]}`;\n } else {\n decPart = `${decimalSep}${decPart.substring(2)}`;\n }\n } else {\n if (decPart === \"1\") {\n intPart += Math.sign(arg);\n }\n decPart = cFlags & HASH ? \".\" : \"\";\n }\n }\n let sign = \"\";\n if (intPart < 0) {\n sign = \"-\";\n intPart = -intPart;\n } else if (cFlags & PLUS) {\n sign = \"+\";\n } else if (cFlags & SPACE) {\n sign = \" \";\n }\n if (thousandSep && intPart >= 1000) {\n const buf = [];\n while (true) {\n buf.push((intPart % 1000).toString().padStart(3, \"0\"));\n intPart = Math.trunc(intPart / 1000);\n if (intPart < 1000) {\n buf.push(intPart.toString());\n break;\n }\n }\n intPart = buf.reverse().join(thousandSep);\n } else {\n intPart = intPart.toString();\n }\n let n = `${intPart}${decPart}`;\n if (nWidth !== undefined) {\n n = n.padStart(nWidth - sign.length, cFlags & ZERO ? \"0\" : \" \");\n }\n return `${sign}${n}`;\n });\n }\n iconStreamFromIcon() {}\n printd(cFormat, oDate) {\n switch (cFormat) {\n case 0:\n return this.printd(\"D:yyyymmddHHMMss\", oDate);\n case 1:\n return this.printd(\"yyyy.mm.dd HH:MM:ss\", oDate);\n case 2:\n return this.printd(\"m/d/yy h:MM:ss tt\", oDate);\n }\n const handlers = {\n mmmm: data => this.#months[data.month],\n mmm: data => this.#months[data.month].substring(0, 3),\n mm: data => (data.month + 1).toString().padStart(2, \"0\"),\n m: data => (data.month + 1).toString(),\n dddd: data => this.#days[data.dayOfWeek],\n ddd: data => this.#days[data.dayOfWeek].substring(0, 3),\n dd: data => data.day.toString().padStart(2, \"0\"),\n d: data => data.day.toString(),\n yyyy: data => data.year.toString().padStart(4, \"0\"),\n yy: data => (data.year % 100).toString().padStart(2, \"0\"),\n HH: data => data.hours.toString().padStart(2, \"0\"),\n H: data => data.hours.toString(),\n hh: data => (1 + (data.hours + 11) % 12).toString().padStart(2, \"0\"),\n h: data => (1 + (data.hours + 11) % 12).toString(),\n MM: data => data.minutes.toString().padStart(2, \"0\"),\n M: data => data.minutes.toString(),\n ss: data => data.seconds.toString().padStart(2, \"0\"),\n s: data => data.seconds.toString(),\n tt: data => data.hours < 12 ? \"am\" : \"pm\",\n t: data => data.hours < 12 ? \"a\" : \"p\"\n };\n const data = {\n year: oDate.getFullYear(),\n month: oDate.getMonth(),\n day: oDate.getDate(),\n dayOfWeek: oDate.getDay(),\n hours: oDate.getHours(),\n minutes: oDate.getMinutes(),\n seconds: oDate.getSeconds()\n };\n const patterns = /(mmmm|mmm|mm|m|dddd|ddd|dd|d|yyyy|yy|HH|H|hh|h|MM|M|ss|s|tt|t|\\\\.)/g;\n return cFormat.replaceAll(patterns, (_, pattern) => pattern in handlers ? handlers[pattern](data) : pattern.charAt(1));\n }\n printx(cFormat, cSource) {\n cSource = (cSource ?? \"\").toString();\n const handlers = [x => x, x => x.toUpperCase(), x => x.toLowerCase()];\n const buf = [];\n let i = 0;\n const ii = cSource.length;\n let currCase = handlers[0];\n let escaped = false;\n for (const command of cFormat) {\n if (escaped) {\n buf.push(command);\n escaped = false;\n continue;\n }\n if (i >= ii) {\n break;\n }\n switch (command) {\n case \"?\":\n buf.push(currCase(cSource.charAt(i++)));\n break;\n case \"X\":\n while (i < ii) {\n const char = cSource.charAt(i++);\n if (\"a\" <= char && char <= \"z\" || \"A\" <= char && char <= \"Z\" || \"0\" <= char && char <= \"9\") {\n buf.push(currCase(char));\n break;\n }\n }\n break;\n case \"A\":\n while (i < ii) {\n const char = cSource.charAt(i++);\n if (\"a\" <= char && char <= \"z\" || \"A\" <= char && char <= \"Z\") {\n buf.push(currCase(char));\n break;\n }\n }\n break;\n case \"9\":\n while (i < ii) {\n const char = cSource.charAt(i++);\n if (\"0\" <= char && char <= \"9\") {\n buf.push(char);\n break;\n }\n }\n break;\n case \"*\":\n while (i < ii) {\n buf.push(currCase(cSource.charAt(i++)));\n }\n break;\n case \"\\\\\":\n escaped = true;\n break;\n case \">\":\n currCase = handlers[1];\n break;\n case \"<\":\n currCase = handlers[2];\n break;\n case \"=\":\n currCase = handlers[0];\n break;\n default:\n buf.push(command);\n }\n }\n return buf.join(\"\");\n }\n #createDateActions(cFormat) {\n const actions = [];\n cFormat.replaceAll(/(d+)|(m+)|(y+)|(H+)|(M+)|(s+)/g, function (_, d, m, y, H, M, s) {\n if (d) {\n actions.push((n, data) => {\n if (n >= 1 && n <= 31) {\n data.day = n;\n return true;\n }\n return false;\n });\n } else if (m) {\n actions.push((n, data) => {\n if (n >= 1 && n <= 12) {\n data.month = n - 1;\n return true;\n }\n return false;\n });\n } else if (y) {\n actions.push((n, data) => {\n if (n < 50) {\n n += 2000;\n } else if (n < 100) {\n n += 1900;\n }\n data.year = n;\n return true;\n });\n } else if (H) {\n actions.push((n, data) => {\n if (n >= 0 && n <= 23) {\n data.hours = n;\n return true;\n }\n return false;\n });\n } else if (M) {\n actions.push((n, data) => {\n if (n >= 0 && n <= 59) {\n data.minutes = n;\n return true;\n }\n return false;\n });\n } else if (s) {\n actions.push((n, data) => {\n if (n >= 0 && n <= 59) {\n data.seconds = n;\n return true;\n }\n return false;\n });\n }\n return \"\";\n });\n return actions;\n }\n #tryToGuessDate(cFormat, cDate) {\n const actions = (this.#dateActionsCache ??= new Map()).getOrInsertComputed(cFormat, this.#createDateActionsBound);\n const number = /\\d+/g;\n let i = 0;\n let array;\n const data = {\n year: new Date().getFullYear(),\n month: 0,\n day: 1,\n hours: 12,\n minutes: 0,\n seconds: 0\n };\n while ((array = number.exec(cDate)) !== null) {\n if (i < actions.length) {\n if (!actions[i++](parseInt(array[0]), data)) {\n return null;\n }\n } else {\n break;\n }\n }\n if (i === 0) {\n return null;\n }\n return new Date(data.year, data.month, data.day, data.hours, data.minutes, data.seconds);\n }\n scand(cFormat, cDate) {\n return this._scand(cFormat, cDate);\n }\n #createScandData(cFormat) {\n const months = this.#months,\n days = this.#days;\n const handlers = {\n mmmm: {\n pattern: `(${months.join(\"|\")})`,\n action: (value, data) => {\n data.month = months.indexOf(value);\n }\n },\n mmm: {\n pattern: `(${months.map(month => month.substring(0, 3)).join(\"|\")})`,\n action: (value, data) => {\n data.month = months.findIndex(month => month.substring(0, 3) === value);\n }\n },\n mm: {\n pattern: `(\\\\d{2})`,\n action: (value, data) => {\n data.month = parseInt(value) - 1;\n }\n },\n m: {\n pattern: `(\\\\d{1,2})`,\n action: (value, data) => {\n data.month = parseInt(value) - 1;\n }\n },\n dddd: {\n pattern: `(${days.join(\"|\")})`,\n action: (value, data) => {\n data.day = days.indexOf(value);\n }\n },\n ddd: {\n pattern: `(${days.map(day => day.substring(0, 3)).join(\"|\")})`,\n action: (value, data) => {\n data.day = days.findIndex(day => day.substring(0, 3) === value);\n }\n },\n dd: {\n pattern: \"(\\\\d{2})\",\n action: (value, data) => {\n data.day = parseInt(value);\n }\n },\n d: {\n pattern: \"(\\\\d{1,2})\",\n action: (value, data) => {\n data.day = parseInt(value);\n }\n },\n yyyy: {\n pattern: \"(\\\\d{4})\",\n action: (value, data) => {\n data.year = parseInt(value);\n }\n },\n yy: {\n pattern: \"(\\\\d{2})\",\n action: (value, data) => {\n data.year = 2000 + parseInt(value);\n }\n },\n HH: {\n pattern: \"(\\\\d{2})\",\n action: (value, data) => {\n data.hours = parseInt(value);\n }\n },\n H: {\n pattern: \"(\\\\d{1,2})\",\n action: (value, data) => {\n data.hours = parseInt(value);\n }\n },\n hh: {\n pattern: \"(\\\\d{2})\",\n action: (value, data) => {\n data.hours = parseInt(value);\n }\n },\n h: {\n pattern: \"(\\\\d{1,2})\",\n action: (value, data) => {\n data.hours = parseInt(value);\n }\n },\n MM: {\n pattern: \"(\\\\d{2})\",\n action: (value, data) => {\n data.minutes = parseInt(value);\n }\n },\n M: {\n pattern: \"(\\\\d{1,2})\",\n action: (value, data) => {\n data.minutes = parseInt(value);\n }\n },\n ss: {\n pattern: \"(\\\\d{2})\",\n action: (value, data) => {\n data.seconds = parseInt(value);\n }\n },\n s: {\n pattern: \"(\\\\d{1,2})\",\n action: (value, data) => {\n data.seconds = parseInt(value);\n }\n },\n tt: {\n pattern: \"([aApP][mM])\",\n action: (value, data) => {\n const char = value.charAt(0);\n data.am = char === \"a\" || char === \"A\";\n }\n },\n t: {\n pattern: \"([aApP])\",\n action: (value, data) => {\n data.am = value === \"a\" || value === \"A\";\n }\n }\n };\n const escapedFormat = cFormat.replaceAll(/[.*+\\-?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const patterns = /(mmmm|mmm|mm|m|dddd|ddd|dd|d|yyyy|yy|HH|H|hh|h|MM|M|ss|s|tt|t)/g;\n const actions = [];\n const re = escapedFormat.replaceAll(patterns, function (_, patternElement) {\n const {\n pattern,\n action\n } = handlers[patternElement];\n actions.push(action);\n return pattern.includes(\",\") ? `(?=${pattern})\\\\${actions.length}` : pattern;\n });\n return [new RegExp(`^${re}$`, \"g\"), actions];\n }\n _scand(cFormat, cDate, strict = false) {\n if (typeof cDate !== \"string\") {\n return new Date(cDate);\n }\n if (cDate === \"\") {\n return new Date();\n }\n switch (cFormat) {\n case 0:\n return this.scand(\"D:yyyymmddHHMMss\", cDate);\n case 1:\n return this.scand(\"yyyy.mm.dd HH:MM:ss\", cDate);\n case 2:\n return this.scand(\"m/d/yy h:MM:ss tt\", cDate);\n }\n const [regex, actions] = (this.#scandCache ??= new Map()).getOrInsertComputed(cFormat, this.#createScandDataBound);\n const matches = regex.exec(cDate);\n if (!matches || matches.length !== actions.length + 1) {\n return strict ? null : this.#tryToGuessDate(cFormat, cDate);\n }\n const data = {\n year: 2000,\n month: 0,\n day: 1,\n hours: 0,\n minutes: 0,\n seconds: 0,\n am: null\n };\n actions.forEach((action, i) => action(matches[i + 1], data));\n if (data.am !== null) {\n data.hours = data.hours % 12 + (data.am ? 0 : 12);\n }\n return new Date(data.year, data.month, data.day, data.hours, data.minutes, data.seconds);\n }\n spansToXML() {}\n stringFromStream() {}\n xmlToSpans() {}\n}\n\n;// ./src/scripting_api/initialization.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction initSandbox(params) {\n delete globalThis.pdfjsScripting;\n const externalCall = globalThis.callExternalFunction;\n delete globalThis.callExternalFunction;\n const globalEval = code => globalThis.eval(code);\n const send = data => externalCall(\"send\", [data]);\n const proxyHandler = new ProxyHandler();\n const {\n data\n } = params;\n const doc = new Doc({\n send,\n globalEval,\n ...data.docInfo\n });\n const _document = {\n obj: doc,\n wrapped: new Proxy(doc, proxyHandler)\n };\n const app = new App({\n send,\n globalEval,\n externalCall,\n _document,\n calculationOrder: data.calculationOrder,\n proxyHandler,\n ...data.appInfo\n });\n const util = new Util({\n externalCall\n });\n const appObjects = app._objects;\n for (const [name, objs] of createMap(data.objects)) {\n const annotations = [];\n let container = null;\n for (const obj of objs) {\n if (obj.type !== \"\") {\n annotations.push(obj);\n } else {\n container = obj;\n }\n }\n let obj = container;\n if (annotations.length > 0) {\n obj = annotations[0];\n obj.send = send;\n }\n obj.globalEval = globalEval;\n obj.doc = _document;\n obj.fieldPath = name;\n obj.appObjects = appObjects;\n obj.util = util;\n const otherFields = annotations.slice(1);\n let field;\n switch (obj.type) {\n case \"radiobutton\":\n {\n field = new RadioButtonField(otherFields, obj);\n break;\n }\n case \"checkbox\":\n {\n field = new CheckboxField(otherFields, obj);\n break;\n }\n default:\n if (otherFields.length > 0) {\n obj.siblings = otherFields.map(x => x.id);\n }\n field = new Field(obj);\n }\n const wrapped = new Proxy(field, proxyHandler);\n const _object = {\n obj: field,\n wrapped\n };\n doc._addField(name, _object);\n for (const object of objs) {\n appObjects[object.id] = _object;\n }\n if (container) {\n appObjects[container.id] = _object;\n }\n }\n const color = new Color();\n globalThis.event = null;\n globalThis.global = Object.create(null);\n globalThis.app = new Proxy(app, proxyHandler);\n globalThis.color = new Proxy(color, proxyHandler);\n globalThis.console = new Proxy(new Console({\n send\n }), proxyHandler);\n globalThis.util = new Proxy(util, proxyHandler);\n globalThis.border = Border;\n globalThis.cursor = Cursor;\n globalThis.display = Display;\n globalThis.font = Font;\n globalThis.highlight = Highlight;\n globalThis.position = Position;\n globalThis.scaleHow = ScaleHow;\n globalThis.scaleWhen = ScaleWhen;\n globalThis.style = Style;\n globalThis.trans = Trans;\n globalThis.zoomtype = ZoomType;\n globalThis.ADBE = {\n Reader_Value_Asked: true,\n Viewer_Value_Asked: true\n };\n const aform = new AForm(doc, app, util, color);\n for (const name of Object.getOwnPropertyNames(AForm.prototype)) {\n if (name !== \"constructor\" && !name.startsWith(\"_\")) {\n globalThis[name] = aform[name].bind(aform);\n }\n }\n for (const [name, value] of Object.entries(GlobalConstants)) {\n Object.defineProperty(globalThis, name, {\n value,\n writable: false\n });\n }\n Object.defineProperties(globalThis, {\n ColorConvert: {\n value: color.convert.bind(color),\n writable: true\n },\n ColorEqual: {\n value: color.equal.bind(color),\n writable: true\n }\n });\n const properties = Object.create(null);\n for (const name of Object.getOwnPropertyNames(Doc.prototype)) {\n if (name === \"constructor\" || name.startsWith(\"_\")) {\n continue;\n }\n const descriptor = Object.getOwnPropertyDescriptor(Doc.prototype, name);\n if (descriptor.get) {\n properties[name] = {\n get: descriptor.get.bind(doc),\n set: descriptor.set.bind(doc)\n };\n } else {\n properties[name] = {\n value: Doc.prototype[name].bind(doc)\n };\n }\n }\n Object.defineProperties(globalThis, properties);\n const functions = {\n dispatchEvent: app._dispatchEvent.bind(app),\n timeoutCb: app._evalCallback.bind(app)\n };\n return (name, args) => {\n try {\n functions[name](args);\n } catch (error) {\n send(serializeError(error));\n }\n };\n}\n\n;// ./src/pdf.scripting.js\n\nglobalThis.pdfjsScripting = {\n initSandbox: initSandbox\n};\n"]; + code.push("delete dump;"); + let success = false; + let buf = 0; + try { + const sandboxData = this.support.exportValueToSandbox(data); + code.push(`pdfjsScripting.initSandbox({ data: ${sandboxData} })`); + buf = this._module.stringToNewUTF8(code.join("\n")); + success = !!this._module.ccall("init", "number", ["number", "number"], [buf, this._alertOnError]); + } catch (error) { + console.error(error); + } finally { + if (buf) { + this._module.ccall("free", "number", ["number"], [buf]); + } + } + if (success) { + this.support.commFun = this._module.cwrap("commFun", null, ["string", "string"]); + } else { + this.nukeSandbox(); + throw new Error("Cannot start sandbox"); + } + } + dispatchEvent(event) { + this.support?.callSandboxFunction("dispatchEvent", event); + } + dumpMemoryUse() { + this._module?.ccall("dumpMemoryUse", null, []); + } + nukeSandbox() { + if (this._module !== null) { + this.support.destroy(); + this.support = null; + this._module.ccall("nukeSandbox", null, []); + this._module = null; + } + } + evalForTesting(code, key) { + throw new Error("Not implemented: evalForTesting"); + } +} +async function QuickJSSandbox(wasmUrl = "../web/wasm/") { + const { + default: ModuleLoader + } = await import( + /*webpackIgnore: true*/ + /*@vite-ignore*/ + `${wasmUrl}quickjs-eval.js`); + const module = await ModuleLoader(); + return new Sandbox(window, module); +} +globalThis.pdfjsSandbox = { + QuickJSSandbox +}; + +export { QuickJSSandbox }; + +//# sourceMappingURL=pdf.sandbox.mjs.map \ No newline at end of file diff --git a/public/assets/vendor/pdfjs-6.4.299/build/pdf.worker.mjs b/public/assets/vendor/pdfjs-6.4.299/build/pdf.worker.mjs new file mode 100644 index 000000000..c9788fa9e --- /dev/null +++ b/public/assets/vendor/pdfjs-6.4.299/build/pdf.worker.mjs @@ -0,0 +1,71124 @@ +/** + * @licstart The following is the entire license notice for the + * JavaScript code in this page + * + * 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * @licend The above is the entire license notice for the + * JavaScript code in this page + */ + +/** + * pdfjsVersion = 6.4.299 + * pdfjsBuild = d0991a0d5 + */ +/******/ var __webpack_modules__ = ({ + +/***/ 463 +(module) { + + +var $TypeError = TypeError; + +module.exports = function (argument) { + if (typeof argument == 'string') return argument; + throw new $TypeError('Argument is not a string'); +}; + + +/***/ }, + +/***/ 804 +(module) { + + +var commonAlphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; +var base64Alphabet = commonAlphabet + '+/'; +var base64UrlAlphabet = commonAlphabet + '-_'; + +var inverse = function (characters) { + // TODO: use `Object.create(null)` in `core-js@4` + var result = {}; + var index = 0; + for (; index < 64; index++) result[characters.charAt(index)] = index; + return result; +}; + +module.exports = { + i2c: base64Alphabet, + c2i: inverse(base64Alphabet), + i2cUrl: base64UrlAlphabet, + c2iUrl: inverse(base64UrlAlphabet) +}; + + +/***/ }, + +/***/ 529 +(module) { + + +// `CreateIterResultObject` abstract operation +// https://tc39.es/ecma262/#sec-createiterresultobject +module.exports = function (value, done) { + return { value: value, done: done }; +}; + + +/***/ }, + +/***/ 837 +(module) { + + +var $TypeError = TypeError; +var MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF; // 2 ** 53 - 1 == 9007199254740991 + +module.exports = function (it) { + if (it > MAX_SAFE_INTEGER) throw new $TypeError('Maximum allowed index exceeded'); + return it; +}; + + +/***/ }, + +/***/ 944 +(module) { + + +var $TypeError = TypeError; + +module.exports = function (options) { + var alphabet = options && options.alphabet; + if (alphabet === undefined || alphabet === 'base64' || alphabet === 'base64url') return alphabet || 'base64'; + throw new $TypeError('Incorrect `alphabet` option'); +}; + + +/***/ }, + +/***/ 767 +(module) { + + +// `GetIteratorDirect(obj)` abstract operation +// https://tc39.es/ecma262/#sec-getiteratordirect +module.exports = function (obj) { + return { + iterator: obj, + next: obj.next, + done: false + }; +}; + + +/***/ }, + +/***/ 117 +(module) { + + +// we can't use just `it == null` since of `document.all` special case +// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot-aec +module.exports = function (it) { + return it === null || it === undefined; +}; + + +/***/ }, + +/***/ 859 +(module) { + + +// release references held by exhausted / closed iterator helpers to allow GC of the source chain +module.exports = function (state) { + state.iterator = state.next = state.nextHandler = state.mapper = state.predicate = state.inner = + state.iterables = state.iters = state.openIters = state.padding = state.finishResults = state.buffer = null; +}; + + +/***/ }, + +/***/ 684 +(module) { + + +// Should throw an error on invalid iterator +// https://issues.chromium.org/issues/336839115 +module.exports = function (methodName, argument) { + // eslint-disable-next-line es/no-iterator -- required for testing + var method = typeof Iterator == 'function' && Iterator.prototype[methodName]; + if (method) try { + method.call({ next: null }, argument).next(); + } catch (error) { + return true; + } +}; + + +/***/ }, + +/***/ 269 +(module) { + + +module.exports = Object.create ? Object.create(null) : {}; + + +/***/ }, + +/***/ 741 +(module) { + + +var ceil = Math.ceil; +var floor = Math.floor; + +// `Math.trunc` method +// https://tc39.es/ecma262/#sec-math.trunc +// eslint-disable-next-line es/no-math-trunc -- safe +module.exports = Math.trunc || function trunc(x) { + var n = +x; + return (n > 0 ? floor : ceil)(n); +}; + + +/***/ }, + +/***/ 717 +(__unused_webpack_module, exports) { + + +// eslint-disable-next-line es/no-object-getownpropertysymbols -- safe +exports.f = Object.getOwnPropertySymbols; + + +/***/ }, + +/***/ 103 +(module) { + + +module.exports = function (exec) { + try { + return { error: false, value: exec() }; + } catch (error) { + return { error: true, value: error }; + } +}; + + +/***/ }, + +/***/ 750 +(module, __unused_webpack_exports, __webpack_require__) { + + +var isNullOrUndefined = __webpack_require__(117); + +var $TypeError = TypeError; + +// `RequireObjectCoercible` abstract operation +// https://tc39.es/ecma262/#sec-requireobjectcoercible +module.exports = function (it) { + if (isNullOrUndefined(it)) throw new $TypeError("Can't call method on " + it); + return it; +}; + + +/***/ }, + +/***/ 835 +(module) { + + +// Should get iterator record of a set-like object before cloning this +// https://bugs.webkit.org/show_bug.cgi?id=289430 +module.exports = function (METHOD_NAME) { + try { + // eslint-disable-next-line es/no-set -- needed for test + var baseSet = new Set(); + var setLike = { + size: 0, + has: function () { return true; }, + keys: function () { + // eslint-disable-next-line es/no-object-defineproperty -- needed for test + return Object.defineProperty({}, 'next', { + get: function () { + baseSet.clear(); + baseSet.add(4); + return function () { + return { done: true }; + }; + } + }); + } + }; + var result = baseSet[METHOD_NAME](setLike); + + return result.size === 1 && result.values().next().value === 4; + } catch (error) { + return false; + } +}; + + +/***/ }, + +/***/ 291 +(module, __unused_webpack_exports, __webpack_require__) { + + +var trunc = __webpack_require__(741); + +// `ToIntegerOrInfinity` abstract operation +// https://tc39.es/ecma262/#sec-tointegerorinfinity +module.exports = function (argument) { + var number = +argument; + // eslint-disable-next-line no-self-compare -- NaN check + return number !== number || number === 0 ? 0 : trunc(number); +}; + + +/***/ }, + +/***/ 14 +(module, __unused_webpack_exports, __webpack_require__) { + + +var toIntegerOrInfinity = __webpack_require__(291); + +var min = Math.min; + +// `ToLength` abstract operation +// https://tc39.es/ecma262/#sec-tolength +module.exports = function (argument) { + var len = toIntegerOrInfinity(argument); + return len > 0 ? min(len, 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991 +}; + + +/***/ }, + +/***/ 981 +(module, __unused_webpack_exports, __webpack_require__) { + + +var requireObjectCoercible = __webpack_require__(750); + +var $Object = Object; + +// `ToObject` abstract operation +// https://tc39.es/ecma262/#sec-toobject +module.exports = function (argument) { + return $Object(requireObjectCoercible(argument)); +}; + + +/***/ }, + +/***/ 812 +(module) { + + +var $TypeError = TypeError; + +module.exports = function (passed, required) { + if (passed < required) throw new $TypeError('Not enough arguments'); + return passed; +}; + + +/***/ } + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ const __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ const cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ const module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/concatenation wrap */ +/******/ // wrap a concatenated module body as a lazy, memoized accessor; mod is +/******/ // set before the body runs so re-entrant calls (require cycles) observe +/******/ // the partial exports like Node.js +/******/ __webpack_require__.cw = (body) => { +/******/ var mod; +/******/ return () => { +/******/ if (body) { +/******/ var fn = body; +/******/ body = 0; +/******/ mod = { exports: {} }; +/******/ fn.call(mod.exports, mod, mod.exports); +/******/ } +/******/ return mod.exports; +/******/ }; +/******/ }; +/******/ +/******/ /* webpack/runtime/define property getters */ +/******/ // define getter/value 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] }); +/******/ } +/******/ } +/******/ }; +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)); +/******/ +/************************************************************************/ + +// MODULE: ./node_modules/core-js/internals/a-callable.js +var a_callable_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var isCallable = (is_callable_namespaceFn()); +var tryToString = (try_to_string_namespaceFn()); + +var $TypeError = TypeError; + +// `Assert: IsCallable(argument) is true` +module.exports = function (argument) { + if (isCallable(argument)) return argument; + throw new $TypeError(tryToString(argument) + ' is not a function'); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/a-possible-prototype.js +var a_possible_prototype_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var isPossiblePrototype = (is_possible_prototype_namespaceFn()); + +var $String = String; +var $TypeError = TypeError; + +module.exports = function (argument) { + if (isPossiblePrototype(argument)) return argument; + throw new $TypeError("Can't set " + $String(argument) + ' as a prototype'); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/a-set.js +var a_set_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var has = (set_helpers_namespaceFn().has); + +// Perform ? RequireInternalSlot(M, [[SetData]]) +module.exports = function (it) { + has(it); + return it; +}; + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/a-string.js +var a_string_namespaceFn = () => { + return __webpack_require__(463); +}; + +// MODULE: ./node_modules/core-js/internals/a-weak-key.js +var a_weak_key_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var WeakMapHelpers = (weak_map_helpers_namespaceFn()); + +var weakmap = new WeakMapHelpers.WeakMap(); +var set = WeakMapHelpers.set; +var remove = WeakMapHelpers.remove; + +module.exports = function (key) { + set(weakmap, key, 1); + remove(weakmap, key); + return key; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/a-weak-map.js +var a_weak_map_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var has = (weak_map_helpers_namespaceFn().has); + +// Perform ? RequireInternalSlot(M, [[WeakMapData]]) +module.exports = function (it) { + has(it); + return it; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/add-to-unscopables.js +var add_to_unscopables_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var wellKnownSymbol = (well_known_symbol_namespaceFn()); +var create = (object_create_namespaceFn()); +var defineProperty = (object_define_property_namespaceFn().f); + +var UNSCOPABLES = wellKnownSymbol('unscopables'); +var ArrayPrototype = Array.prototype; + +// Array.prototype[@@unscopables] +// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables +if (ArrayPrototype[UNSCOPABLES] === undefined) { + defineProperty(ArrayPrototype, UNSCOPABLES, { + configurable: true, + value: create(null) + }); +} + +// add a key to Array.prototype[@@unscopables] +module.exports = function (key) { + ArrayPrototype[UNSCOPABLES][key] = true; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/an-instance.js +var an_instance_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var isPrototypeOf = (object_is_prototype_of_namespaceFn()); + +var $TypeError = TypeError; + +module.exports = function (it, Prototype) { + if (isPrototypeOf(Prototype, it)) return it; + throw new $TypeError('Incorrect invocation'); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/an-object-or-undefined.js +var an_object_or_undefined_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var isObject = (is_object_namespaceFn()); + +var $String = String; +var $TypeError = TypeError; + +module.exports = function (argument) { + if (argument === undefined || isObject(argument)) return argument; + throw new $TypeError($String(argument) + ' is not an object or undefined'); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/an-object.js +var an_object_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var isObject = (is_object_namespaceFn()); + +var $String = String; +var $TypeError = TypeError; + +// `Assert: Type(argument) is Object` +module.exports = function (argument) { + if (isObject(argument)) return argument; + throw new $TypeError($String(argument) + ' is not an object'); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/an-uint8-array.js +var an_uint8_array_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var classof = (classof_namespaceFn()); + +var $TypeError = TypeError; + +// Perform ? RequireInternalSlot(argument, [[TypedArrayName]]) +// If argument.[[TypedArrayName]] is not "Uint8Array", throw a TypeError exception +module.exports = function (argument) { + if (classof(argument) === 'Uint8Array') return argument; + throw new $TypeError('Argument is not an Uint8Array'); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/array-buffer-basic-detection.js +var array_buffer_basic_detection_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +// eslint-disable-next-line es/no-typed-arrays -- safe +module.exports = typeof ArrayBuffer != 'undefined' && typeof DataView != 'undefined'; + +}); + +// MODULE: ./node_modules/core-js/internals/array-buffer-byte-length.js +var array_buffer_byte_length_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var globalThis = (global_this_namespaceFn()); +var uncurryThisAccessor = (function_uncurry_this_accessor_namespaceFn()); +var classof = (classof_raw_namespaceFn()); + +var ArrayBuffer = globalThis.ArrayBuffer; +var TypeError = globalThis.TypeError; + +// Includes +// - Perform ? RequireInternalSlot(O, [[ArrayBufferData]]). +// - If IsSharedArrayBuffer(O) is true, throw a TypeError exception. +module.exports = ArrayBuffer && uncurryThisAccessor(ArrayBuffer.prototype, 'byteLength', 'get') || function (O) { + if (classof(O) !== 'ArrayBuffer') throw new TypeError('ArrayBuffer expected'); + return O.byteLength; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/array-buffer-is-detached.js +var array_buffer_is_detached_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var globalThis = (global_this_namespaceFn()); +var NATIVE_ARRAY_BUFFER = (array_buffer_basic_detection_namespaceFn()); +var arrayBufferByteLength = (array_buffer_byte_length_namespaceFn()); + +var DataView = globalThis.DataView; + +module.exports = function (O) { + if (!NATIVE_ARRAY_BUFFER || arrayBufferByteLength(O) !== 0) return false; + try { + // eslint-disable-next-line no-new -- thrower + new DataView(O); + return false; + } catch (error) { + return true; + } +}; + +}); + +// MODULE: ./node_modules/core-js/internals/array-buffer-not-detached.js +var array_buffer_not_detached_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var isDetached = (array_buffer_is_detached_namespaceFn()); + +var $TypeError = TypeError; + +module.exports = function (it) { + if (isDetached(it)) throw new $TypeError('ArrayBuffer is detached'); + return it; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/array-buffer-view-core.js +var array_buffer_view_core_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var NATIVE_ARRAY_BUFFER = (array_buffer_basic_detection_namespaceFn()); +var DESCRIPTORS = (descriptors_namespaceFn()); +var globalThis = (global_this_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); +var isObject = (is_object_namespaceFn()); +var hasOwn = (has_own_property_namespaceFn()); +var classof = (classof_namespaceFn()); +var tryToString = (try_to_string_namespaceFn()); +var createNonEnumerableProperty = (create_non_enumerable_property_namespaceFn()); +var defineBuiltIn = (define_built_in_namespaceFn()); +var defineBuiltInAccessor = (define_built_in_accessor_namespaceFn()); +var isPrototypeOf = (object_is_prototype_of_namespaceFn()); +var getPrototypeOf = (object_get_prototype_of_namespaceFn()); +var setPrototypeOf = (object_set_prototype_of_namespaceFn()); +var wellKnownSymbol = (well_known_symbol_namespaceFn()); +var uid = (uid_namespaceFn()); +var InternalStateModule = (internal_state_namespaceFn()); + +var enforceInternalState = InternalStateModule.enforce; +var getInternalState = InternalStateModule.get; +var Int8Array = globalThis.Int8Array; +var Int8ArrayPrototype = Int8Array && Int8Array.prototype; +var Uint8ClampedArray = globalThis.Uint8ClampedArray; +var Uint8ClampedArrayPrototype = Uint8ClampedArray && Uint8ClampedArray.prototype; +var TypedArray = Int8Array && getPrototypeOf(Int8Array); +var TypedArrayPrototype = Int8ArrayPrototype && getPrototypeOf(Int8ArrayPrototype); +var ObjectPrototype = Object.prototype; +var TypeError = globalThis.TypeError; + +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); +var TYPED_ARRAY_TAG = uid('TYPED_ARRAY_TAG'); +var TYPED_ARRAY_CONSTRUCTOR = 'TypedArrayConstructor'; +// Fixing native typed arrays in Opera Presto crashes the browser, see #595 +var NATIVE_ARRAY_BUFFER_VIEWS = NATIVE_ARRAY_BUFFER && !!setPrototypeOf && classof(globalThis.opera) !== 'Opera'; +var TYPED_ARRAY_TAG_REQUIRED = false; +var NAME, Constructor, Prototype; + +var TypedArrayConstructorsList = { + Int8Array: 1, + Uint8Array: 1, + Uint8ClampedArray: 1, + Int16Array: 2, + Uint16Array: 2, + Int32Array: 4, + Uint32Array: 4, + Float32Array: 4, + Float64Array: 8 +}; + +var BigIntArrayConstructorsList = { + BigInt64Array: 8, + BigUint64Array: 8 +}; + +var isView = function isView(it) { + if (!isObject(it)) return false; + var klass = classof(it); + return klass === 'DataView' + || hasOwn(TypedArrayConstructorsList, klass) + || hasOwn(BigIntArrayConstructorsList, klass); +}; + +var getTypedArrayConstructor = function (it) { + var proto = getPrototypeOf(it); + if (!isObject(proto)) return; + var state = getInternalState(proto); + return (state && hasOwn(state, TYPED_ARRAY_CONSTRUCTOR)) ? state[TYPED_ARRAY_CONSTRUCTOR] : getTypedArrayConstructor(proto); +}; + +var isTypedArray = function (it) { + if (!isObject(it)) return false; + var klass = classof(it); + return hasOwn(TypedArrayConstructorsList, klass) + || hasOwn(BigIntArrayConstructorsList, klass); +}; + +var aTypedArray = function (it) { + if (isTypedArray(it)) return it; + throw new TypeError('Target is not a typed array'); +}; + +var aTypedArrayConstructor = function (C) { + if (isCallable(C) && (!setPrototypeOf || isPrototypeOf(TypedArray, C))) return C; + throw new TypeError(tryToString(C) + ' is not a typed array constructor'); +}; + +var exportTypedArrayMethod = function (KEY, property, forced, options) { + if (!DESCRIPTORS) return; + if (forced) for (var ARRAY in TypedArrayConstructorsList) { + var TypedArrayConstructor = globalThis[ARRAY]; + if (TypedArrayConstructor && hasOwn(TypedArrayConstructor.prototype, KEY)) try { + delete TypedArrayConstructor.prototype[KEY]; + } catch (error) { + // old WebKit bug - some methods are non-configurable + try { + TypedArrayConstructor.prototype[KEY] = property; + } catch (error2) { /* empty */ } + } + } + if (!TypedArrayPrototype[KEY] || forced) { + defineBuiltIn(TypedArrayPrototype, KEY, forced ? property + : NATIVE_ARRAY_BUFFER_VIEWS && Int8ArrayPrototype[KEY] || property, options); + } +}; + +var exportTypedArrayStaticMethod = function (KEY, property, forced) { + var ARRAY, TypedArrayConstructor; + if (!DESCRIPTORS) return; + if (setPrototypeOf) { + if (forced) for (ARRAY in TypedArrayConstructorsList) { + TypedArrayConstructor = globalThis[ARRAY]; + if (TypedArrayConstructor && hasOwn(TypedArrayConstructor, KEY)) try { + delete TypedArrayConstructor[KEY]; + } catch (error) { /* empty */ } + } + if (!TypedArray[KEY] || forced) { + // V8 ~ Chrome 49-50 `%TypedArray%` methods are non-writable non-configurable + try { + return defineBuiltIn(TypedArray, KEY, forced ? property : NATIVE_ARRAY_BUFFER_VIEWS && TypedArray[KEY] || property); + } catch (error) { /* empty */ } + } else return; + } + for (ARRAY in TypedArrayConstructorsList) { + TypedArrayConstructor = globalThis[ARRAY]; + if (TypedArrayConstructor && (!TypedArrayConstructor[KEY] || forced)) { + defineBuiltIn(TypedArrayConstructor, KEY, property); + } + } +}; + +for (NAME in TypedArrayConstructorsList) { + Constructor = globalThis[NAME]; + Prototype = Constructor && Constructor.prototype; + if (Prototype) enforceInternalState(Prototype)[TYPED_ARRAY_CONSTRUCTOR] = Constructor; + else NATIVE_ARRAY_BUFFER_VIEWS = false; +} + +for (NAME in BigIntArrayConstructorsList) { + Constructor = globalThis[NAME]; + Prototype = Constructor && Constructor.prototype; + if (Prototype) enforceInternalState(Prototype)[TYPED_ARRAY_CONSTRUCTOR] = Constructor; +} + +// WebKit bug - typed arrays constructors prototype is Object.prototype +if (!NATIVE_ARRAY_BUFFER_VIEWS || !isCallable(TypedArray) || TypedArray === Function.prototype) { + // eslint-disable-next-line no-shadow -- safe + TypedArray = function TypedArray() { + throw new TypeError('Incorrect invocation'); + }; + if (NATIVE_ARRAY_BUFFER_VIEWS) for (NAME in TypedArrayConstructorsList) { + if (globalThis[NAME]) setPrototypeOf(globalThis[NAME], TypedArray); + } +} + +if (!NATIVE_ARRAY_BUFFER_VIEWS || !TypedArrayPrototype || TypedArrayPrototype === ObjectPrototype) { + TypedArrayPrototype = TypedArray.prototype; + if (NATIVE_ARRAY_BUFFER_VIEWS) for (NAME in TypedArrayConstructorsList) { + if (globalThis[NAME]) setPrototypeOf(globalThis[NAME].prototype, TypedArrayPrototype); + } +} + +// WebKit bug - one more object in Uint8ClampedArray prototype chain +if (NATIVE_ARRAY_BUFFER_VIEWS && getPrototypeOf(Uint8ClampedArrayPrototype) !== TypedArrayPrototype) { + setPrototypeOf(Uint8ClampedArrayPrototype, TypedArrayPrototype); +} + +if (DESCRIPTORS && !hasOwn(TypedArrayPrototype, TO_STRING_TAG)) { + TYPED_ARRAY_TAG_REQUIRED = true; + defineBuiltInAccessor(TypedArrayPrototype, TO_STRING_TAG, { + configurable: true, + get: function () { + return isObject(this) ? this[TYPED_ARRAY_TAG] : undefined; + } + }); + for (NAME in TypedArrayConstructorsList) if (globalThis[NAME]) { + createNonEnumerableProperty(globalThis[NAME].prototype, TYPED_ARRAY_TAG, NAME); + } +} + +module.exports = { + NATIVE_ARRAY_BUFFER_VIEWS: NATIVE_ARRAY_BUFFER_VIEWS, + TYPED_ARRAY_TAG: TYPED_ARRAY_TAG_REQUIRED && TYPED_ARRAY_TAG, + aTypedArray: aTypedArray, + aTypedArrayConstructor: aTypedArrayConstructor, + exportTypedArrayMethod: exportTypedArrayMethod, + exportTypedArrayStaticMethod: exportTypedArrayStaticMethod, + getTypedArrayConstructor: getTypedArrayConstructor, + isView: isView, + isTypedArray: isTypedArray, + TypedArray: TypedArray, + TypedArrayPrototype: TypedArrayPrototype +}; + +}); + +// MODULE: ./node_modules/core-js/internals/array-from-constructor-and-list.js +var array_from_constructor_and_list_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var lengthOfArrayLike = (length_of_array_like_namespaceFn()); + +module.exports = function (Constructor, list, $length) { + var index = 0; + var length = arguments.length > 2 ? $length : lengthOfArrayLike(list); + var result = new Constructor(length); + while (length > index) result[index] = list[index++]; + return result; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/array-includes.js +var array_includes_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var toIndexedObject = (to_indexed_object_namespaceFn()); +var toAbsoluteIndex = (to_absolute_index_namespaceFn()); +var lengthOfArrayLike = (length_of_array_like_namespaceFn()); + +// `Array.prototype.{ indexOf, includes }` methods implementation +var createMethod = function (IS_INCLUDES) { + return function ($this, el, fromIndex) { + var O = toIndexedObject($this); + var length = lengthOfArrayLike(O); + if (length === 0) return !IS_INCLUDES && -1; + var index = toAbsoluteIndex(fromIndex, length); + var value; + // Array#includes uses SameValueZero equality algorithm + // eslint-disable-next-line no-self-compare -- NaN check + if (IS_INCLUDES && el !== el) while (length > index) { + value = O[index++]; + // eslint-disable-next-line no-self-compare -- NaN check + if (value !== value) return true; + // Array#indexOf ignores holes, Array#includes - not + } else for (;length > index; index++) { + if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0; + } return !IS_INCLUDES && -1; + }; +}; + +module.exports = { + // `Array.prototype.includes` method + // https://tc39.es/ecma262/#sec-array.prototype.includes + includes: createMethod(true), + // `Array.prototype.indexOf` method + // https://tc39.es/ecma262/#sec-array.prototype.indexof + indexOf: createMethod(false) +}; + +}); + +// MODULE: ./node_modules/core-js/internals/array-set-length.js +var array_set_length_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var DESCRIPTORS = (descriptors_namespaceFn()); +var isArray = (is_array_namespaceFn()); + +var $TypeError = TypeError; +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; + +// Safari < 13 does not throw an error in this case +var SILENT_ON_NON_WRITABLE_LENGTH_SET = DESCRIPTORS && !function () { + // makes no sense without proper strict mode support + if (this !== undefined) return true; + try { + // eslint-disable-next-line es/no-object-defineproperty -- safe + Object.defineProperty([], 'length', { writable: false }).length = 1; + } catch (error) { + return error instanceof TypeError; + } +}(); + +module.exports = SILENT_ON_NON_WRITABLE_LENGTH_SET ? function (O, length) { + if (isArray(O) && !getOwnPropertyDescriptor(O, 'length').writable) { + throw new $TypeError('Cannot set read only .length'); + } return O.length = length; +} : function (O, length) { + return O.length = length; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/array-slice.js +var array_slice_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); + +module.exports = uncurryThis([].slice); + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/base64-map.js +var base64_map_namespaceFn = () => { + return __webpack_require__(804); +}; + +// MODULE: ./node_modules/core-js/internals/call-with-safe-iteration-closing.js +var call_with_safe_iteration_closing_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var anObject = (an_object_namespaceFn()); +var iteratorClose = (iterator_close_namespaceFn()); + +// call something on iterator step with safe closing on error +module.exports = function (iterator, fn, value, ENTRIES) { + try { + return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value); + } catch (error) { + iteratorClose(iterator, 'throw', error); + } +}; + +}); + +// MODULE: ./node_modules/core-js/internals/classof-raw.js +var classof_raw_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); + +var toString = uncurryThis({}.toString); +var stringSlice = uncurryThis(''.slice); + +module.exports = function (it) { + return stringSlice(toString(it), 8, -1); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/classof.js +var classof_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var TO_STRING_TAG_SUPPORT = (to_string_tag_support_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); +var classofRaw = (classof_raw_namespaceFn()); +var wellKnownSymbol = (well_known_symbol_namespaceFn()); + +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); +var $Object = Object; + +// ES3 wrong here +var CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) === 'Arguments'; + +// fallback for IE11 Script Access Denied error +var tryGet = function (it, key) { + try { + return it[key]; + } catch (error) { /* empty */ } +}; + +// getting tag from ES6+ `Object.prototype.toString` +module.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) { + var O, tag, result; + return it === undefined ? 'Undefined' : it === null ? 'Null' + // @@toStringTag case + : typeof (tag = tryGet(O = $Object(it), TO_STRING_TAG)) == 'string' ? tag + // builtinTag case + : CORRECT_ARGUMENTS ? classofRaw(O) + // ES3 arguments fallback + : (result = classofRaw(O)) === 'Object' && isCallable(O.callee) ? 'Arguments' : result; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/copy-constructor-properties.js +var copy_constructor_properties_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var hasOwn = (has_own_property_namespaceFn()); +var ownKeys = (own_keys_namespaceFn()); +var getOwnPropertyDescriptorModule = (object_get_own_property_descriptor_namespaceFn()); +var definePropertyModule = (object_define_property_namespaceFn()); + +module.exports = function (target, source, exceptions) { + var keys = ownKeys(source); + var defineProperty = definePropertyModule.f; + var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f; + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + if (!hasOwn(target, key) && !(exceptions && hasOwn(exceptions, key))) { + defineProperty(target, key, getOwnPropertyDescriptor(source, key)); + } + } +}; + +}); + +// MODULE: ./node_modules/core-js/internals/correct-prototype-getter.js +var correct_prototype_getter_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var fails = (fails_namespaceFn()); + +module.exports = !fails(function () { + function F() { /* empty */ } + F.prototype.constructor = null; + // eslint-disable-next-line es/no-object-getprototypeof -- required for testing + return Object.getPrototypeOf(new F()) !== F.prototype; +}); + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/create-iter-result-object.js +var create_iter_result_object_namespaceFn = () => { + return __webpack_require__(529); +}; + +// MODULE: ./node_modules/core-js/internals/create-non-enumerable-property.js +var create_non_enumerable_property_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var DESCRIPTORS = (descriptors_namespaceFn()); +var definePropertyModule = (object_define_property_namespaceFn()); +var createPropertyDescriptor = (create_property_descriptor_namespaceFn()); + +module.exports = DESCRIPTORS ? function (object, key, value) { + return definePropertyModule.f(object, key, createPropertyDescriptor(1, value)); +} : function (object, key, value) { + object[key] = value; + return object; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/create-property-descriptor.js +var create_property_descriptor_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +module.exports = function (bitmap, value) { + return { + enumerable: !(bitmap & 1), + configurable: !(bitmap & 2), + writable: !(bitmap & 4), + value: value + }; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/create-property.js +var create_property_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var DESCRIPTORS = (descriptors_namespaceFn()); +var definePropertyModule = (object_define_property_namespaceFn()); +var createPropertyDescriptor = (create_property_descriptor_namespaceFn()); + +module.exports = function (object, key, value) { + if (DESCRIPTORS) definePropertyModule.f(object, key, createPropertyDescriptor(0, value)); + else object[key] = value; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/define-built-in-accessor.js +var define_built_in_accessor_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var makeBuiltIn = (make_built_in_namespaceFn()); +var defineProperty = (object_define_property_namespaceFn()); + +module.exports = function (target, name, descriptor) { + if (descriptor.get) makeBuiltIn(descriptor.get, name, { getter: true }); + if (descriptor.set) makeBuiltIn(descriptor.set, name, { setter: true }); + return defineProperty.f(target, name, descriptor); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/define-built-in.js +var define_built_in_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var isCallable = (is_callable_namespaceFn()); +var definePropertyModule = (object_define_property_namespaceFn()); +var makeBuiltIn = (make_built_in_namespaceFn()); +var defineGlobalProperty = (define_global_property_namespaceFn()); + +module.exports = function (O, key, value, options) { + if (!options) options = {}; + var simple = options.enumerable; + var name = options.name !== undefined ? options.name : key; + if (isCallable(value)) makeBuiltIn(value, name, options); + if (options.global) { + if (simple) O[key] = value; + else defineGlobalProperty(key, value); + } else { + try { + if (!options.unsafe) delete O[key]; + else if (O[key]) simple = true; + } catch (error) { /* empty */ } + if (simple) O[key] = value; + else definePropertyModule.f(O, key, { + value: value, + enumerable: false, + configurable: !options.nonConfigurable, + writable: !options.nonWritable + }); + } return O; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/define-built-ins.js +var define_built_ins_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var defineBuiltIn = (define_built_in_namespaceFn()); + +module.exports = function (target, src, options) { + for (var key in src) defineBuiltIn(target, key, src[key], options); + return target; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/define-global-property.js +var define_global_property_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var globalThis = (global_this_namespaceFn()); + +// eslint-disable-next-line es/no-object-defineproperty -- safe +var defineProperty = Object.defineProperty; + +module.exports = function (key, value) { + try { + defineProperty(globalThis, key, { value: value, configurable: true, writable: true }); + } catch (error) { + globalThis[key] = value; + } return value; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/descriptors.js +var descriptors_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var fails = (fails_namespaceFn()); + +// Detect IE8's incomplete defineProperty implementation +module.exports = !fails(function () { + // eslint-disable-next-line es/no-object-defineproperty -- required for testing + return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] !== 7; +}); + +}); + +// MODULE: ./node_modules/core-js/internals/document-create-element.js +var document_create_element_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var globalThis = (global_this_namespaceFn()); +var isObject = (is_object_namespaceFn()); + +var document = globalThis.document; +// typeof document.createElement is 'object' in old IE +var EXISTS = isObject(document) && isObject(document.createElement); + +module.exports = function (it) { + return EXISTS ? document.createElement(it) : {}; +}; + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/does-not-exceed-safe-integer.js +var does_not_exceed_safe_integer_namespaceFn = () => { + return __webpack_require__(837); +}; + +// MODULE: ./node_modules/core-js/internals/enum-bug-keys.js +var enum_bug_keys_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +// IE8- don't enum bug keys +module.exports = [ + 'constructor', + 'hasOwnProperty', + 'isPrototypeOf', + 'propertyIsEnumerable', + 'toLocaleString', + 'toString', + 'valueOf' +]; + +}); + +// MODULE: ./node_modules/core-js/internals/environment-user-agent.js +var environment_user_agent_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var globalThis = (global_this_namespaceFn()); + +var navigator = globalThis.navigator; +var userAgent = navigator && navigator.userAgent; + +module.exports = userAgent ? String(userAgent) : ''; + +}); + +// MODULE: ./node_modules/core-js/internals/environment-v8-version.js +var environment_v8_version_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var globalThis = (global_this_namespaceFn()); +var userAgent = (environment_user_agent_namespaceFn()); + +var process = globalThis.process; +var Deno = globalThis.Deno; +var versions = process && process.versions || Deno && Deno.version; +var v8 = versions && versions.v8; +var match, version; + +if (v8) { + match = v8.split('.'); + // in old Chrome, versions of V8 isn't V8 = Chrome / 10 + // but their correct versions are not interesting for us + version = match[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1]); +} + +// BrowserFS NodeJS `process` polyfill incorrectly set `.v8` to `0.0` +// so check `userAgent` even if `.v8` exists, but 0 +if (!version && userAgent) { + match = userAgent.match(/Edge\/(\d+)/); + if (!match || match[1] >= 74) { + match = userAgent.match(/Chrome\/(\d+)/); + if (match) version = +match[1]; + } +} + +module.exports = version; + +}); + +// MODULE: ./node_modules/core-js/internals/export.js +var export_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var globalThis = (global_this_namespaceFn()); +var getOwnPropertyDescriptor = (object_get_own_property_descriptor_namespaceFn().f); +var createNonEnumerableProperty = (create_non_enumerable_property_namespaceFn()); +var defineBuiltIn = (define_built_in_namespaceFn()); +var defineGlobalProperty = (define_global_property_namespaceFn()); +var copyConstructorProperties = (copy_constructor_properties_namespaceFn()); +var isForced = (is_forced_namespaceFn()); + +/* + options.target - name of the target object + options.global - target is the global object + options.stat - export as static methods of target + options.proto - export as prototype methods of target + options.real - real prototype method for the `pure` version + options.forced - export even if the native feature is available + options.bind - bind methods to the target, required for the `pure` version + options.wrap - wrap constructors to preventing global pollution, required for the `pure` version + options.unsafe - use the simple assignment of property instead of delete + defineProperty + options.sham - add a flag to not completely full polyfills + options.enumerable - export as enumerable property + options.dontCallGetSet - prevent calling a getter on target + options.name - the .name of the function if it does not match the key +*/ +module.exports = function (options, source) { + var TARGET = options.target; + var GLOBAL = options.global; + var STATIC = options.stat; + var FORCED, target, key, targetProperty, sourceProperty, descriptor; + if (GLOBAL) { + target = globalThis; + } else if (STATIC) { + target = globalThis[TARGET] || defineGlobalProperty(TARGET, {}); + } else { + target = globalThis[TARGET] && globalThis[TARGET].prototype; + } + if (target) for (key in source) { + sourceProperty = source[key]; + if (options.dontCallGetSet) { + descriptor = getOwnPropertyDescriptor(target, key); + targetProperty = descriptor && descriptor.value; + } else targetProperty = target[key]; + FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced); + // contained in target + if (!FORCED && targetProperty !== undefined) { + if (typeof sourceProperty == typeof targetProperty) continue; + copyConstructorProperties(sourceProperty, targetProperty); + } + // add a flag to not completely full polyfills + if (options.sham || (targetProperty && targetProperty.sham)) { + createNonEnumerableProperty(sourceProperty, 'sham', true); + } + defineBuiltIn(target, key, sourceProperty, options); + } +}; + +}); + +// MODULE: ./node_modules/core-js/internals/fails.js +var fails_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +module.exports = function (exec) { + try { + return !!exec(); + } catch (error) { + return true; + } +}; + +}); + +// MODULE: ./node_modules/core-js/internals/function-apply.js +var function_apply_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var NATIVE_BIND = (function_bind_native_namespaceFn()); + +var FunctionPrototype = Function.prototype; +var apply = FunctionPrototype.apply; +var call = FunctionPrototype.call; + +// eslint-disable-next-line es/no-function-prototype-bind, es/no-reflect -- safe +module.exports = typeof Reflect == 'object' && Reflect.apply || (NATIVE_BIND ? call.bind(apply) : function () { + return call.apply(apply, arguments); +}); + +}); + +// MODULE: ./node_modules/core-js/internals/function-bind-context.js +var function_bind_context_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_clause_namespaceFn()); +var aCallable = (a_callable_namespaceFn()); +var NATIVE_BIND = (function_bind_native_namespaceFn()); + +var bind = uncurryThis(uncurryThis.bind); + +// optional / simple context binding +module.exports = function (fn, that) { + aCallable(fn); + return that === undefined ? fn : NATIVE_BIND ? bind(fn, that) : function (/* ...args */) { + return fn.apply(that, arguments); + }; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/function-bind-native.js +var function_bind_native_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var fails = (fails_namespaceFn()); + +module.exports = !fails(function () { + // eslint-disable-next-line es/no-function-prototype-bind -- safe + var test = function () { /* empty */ }.bind(); + // eslint-disable-next-line no-prototype-builtins -- safe + return typeof test != 'function' || test.hasOwnProperty('prototype'); +}); + +}); + +// MODULE: ./node_modules/core-js/internals/function-call.js +var function_call_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var NATIVE_BIND = (function_bind_native_namespaceFn()); + +var call = Function.prototype.call; +// eslint-disable-next-line es/no-function-prototype-bind -- safe +module.exports = NATIVE_BIND ? call.bind(call) : function () { + return call.apply(call, arguments); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/function-name.js +var function_name_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var DESCRIPTORS = (descriptors_namespaceFn()); +var hasOwn = (has_own_property_namespaceFn()); + +var FunctionPrototype = Function.prototype; +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var getDescriptor = DESCRIPTORS && Object.getOwnPropertyDescriptor; + +var EXISTS = hasOwn(FunctionPrototype, 'name'); +// additional protection from minified / mangled / dropped function names +var PROPER = EXISTS && function something() { /* empty */ }.name === 'something'; +var CONFIGURABLE = EXISTS && (!DESCRIPTORS || (DESCRIPTORS && getDescriptor(FunctionPrototype, 'name').configurable)); + +module.exports = { + ...(/* unused pure expression */ null && (EXISTS)), + ...(/* unused pure expression */ null && (PROPER)), + CONFIGURABLE: CONFIGURABLE +}; + +}); + +// MODULE: ./node_modules/core-js/internals/function-uncurry-this-accessor.js +var function_uncurry_this_accessor_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); +var aCallable = (a_callable_namespaceFn()); + +module.exports = function (object, key, method) { + try { + // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe + return uncurryThis(aCallable(Object.getOwnPropertyDescriptor(object, key)[method])); + } catch (error) { /* empty */ } +}; + +}); + +// MODULE: ./node_modules/core-js/internals/function-uncurry-this-clause.js +var function_uncurry_this_clause_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var classofRaw = (classof_raw_namespaceFn()); +var uncurryThis = (function_uncurry_this_namespaceFn()); + +module.exports = function (fn) { + // Nashorn bug: + // https://github.com/zloirock/core-js/issues/1128 + // https://github.com/zloirock/core-js/issues/1130 + if (classofRaw(fn) === 'Function') return uncurryThis(fn); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/function-uncurry-this.js +var function_uncurry_this_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var NATIVE_BIND = (function_bind_native_namespaceFn()); + +var FunctionPrototype = Function.prototype; +var call = FunctionPrototype.call; +// eslint-disable-next-line es/no-function-prototype-bind -- safe +var uncurryThisWithBind = NATIVE_BIND && FunctionPrototype.bind.bind(call, call); + +module.exports = NATIVE_BIND ? uncurryThisWithBind : function (fn) { + return function () { + return call.apply(fn, arguments); + }; +}; + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/get-alphabet-option.js +var get_alphabet_option_namespaceFn = () => { + return __webpack_require__(944); +}; + +// MODULE: ./node_modules/core-js/internals/get-built-in.js +var get_built_in_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var globalThis = (global_this_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); + +var aFunction = function (argument) { + return isCallable(argument) ? argument : undefined; +}; + +module.exports = function (namespace, method) { + return arguments.length < 2 ? aFunction(globalThis[namespace]) : globalThis[namespace] && globalThis[namespace][method]; +}; + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/get-iterator-direct.js +var get_iterator_direct_namespaceFn = () => { + return __webpack_require__(767); +}; + +// MODULE: ./node_modules/core-js/internals/get-iterator-flattenable.js +var get_iterator_flattenable_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var call = (function_call_namespaceFn()); +var anObject = (an_object_namespaceFn()); +var getIteratorDirect = (get_iterator_direct_namespaceFn()); +var getIteratorMethod = (get_iterator_method_internal_namespaceFn()); + +module.exports = function (obj, stringHandling) { + if (!stringHandling || typeof obj !== 'string') anObject(obj); + var method = getIteratorMethod(obj); + return getIteratorDirect(anObject(method !== undefined ? call(method, obj) : obj)); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/get-iterator-internal.js +var get_iterator_internal_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var call = (function_call_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); +var anObject = (an_object_namespaceFn()); +var tryToString = (try_to_string_namespaceFn()); +var getIteratorMethod = (get_iterator_method_internal_namespaceFn()); + +var $TypeError = TypeError; + +module.exports = function (argument, usingIterator) { + var iteratorMethod = arguments.length < 2 ? getIteratorMethod(argument) : usingIterator; + if (isCallable(iteratorMethod)) return anObject(call(iteratorMethod, argument)); + throw new $TypeError(tryToString(argument) + ' is not iterable'); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/get-iterator-method-internal.js +var get_iterator_method_internal_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var classof = (classof_raw_namespaceFn()); +var isNullOrUndefined = (is_null_or_undefined_namespaceFn()); +var getMethod = (get_method_namespaceFn()); +var wellKnownSymbol = (well_known_symbol_namespaceFn()); + +var ITERATOR = wellKnownSymbol('iterator'); +var ArrayPrototype = Array.prototype; + +module.exports = function (it) { + if (!isNullOrUndefined(it)) return getMethod(it, ITERATOR) + || getMethod(it, '@@iterator') + || (classof(it) === 'Arguments' ? ArrayPrototype[ITERATOR] : undefined); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/get-method.js +var get_method_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var aCallable = (a_callable_namespaceFn()); +var isNullOrUndefined = (is_null_or_undefined_namespaceFn()); + +// `GetMethod` abstract operation +// https://tc39.es/ecma262/#sec-getmethod +module.exports = function (V, P) { + var func = V[P]; + return isNullOrUndefined(func) ? undefined : aCallable(func); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/get-set-record.js +var get_set_record_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var aCallable = (a_callable_namespaceFn()); +var anObject = (an_object_namespaceFn()); +var call = (function_call_namespaceFn()); +var toIntegerOrInfinity = (to_integer_or_infinity_namespaceFn()); +var getIteratorDirect = (get_iterator_direct_namespaceFn()); + +var INVALID_SIZE = 'Invalid size'; +var $RangeError = RangeError; +var $TypeError = TypeError; +var max = Math.max; + +var SetRecord = function (set, intSize) { + this.set = set; + this.size = max(intSize, 0); + this.has = aCallable(set.has); + this.keys = aCallable(set.keys); +}; + +SetRecord.prototype = { + getIterator: function () { + return getIteratorDirect(anObject(call(this.keys, this.set))); + }, + includes: function (it) { + return call(this.has, this.set, it); + } +}; + +// `GetSetRecord` abstract operation +// https://tc39.es/proposal-set-methods/#sec-getsetrecord +module.exports = function (obj) { + anObject(obj); + var numSize = +obj.size; + // NOTE: If size is undefined, then numSize will be NaN + // eslint-disable-next-line no-self-compare -- NaN check + if (numSize !== numSize) throw new $TypeError(INVALID_SIZE); + var intSize = toIntegerOrInfinity(numSize); + if (intSize < 0) throw new $RangeError(INVALID_SIZE); + return new SetRecord(obj, intSize); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/global-this.js +var global_this_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var check = function (it) { + return it && it.Math === Math && it; +}; + +// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 +module.exports = + // eslint-disable-next-line es/no-global-this -- safe + check(typeof globalThis == 'object' && globalThis) || + check(typeof window == 'object' && window) || + // eslint-disable-next-line no-restricted-globals -- safe + check(typeof self == 'object' && self) || + check(typeof global == 'object' && global) || + check(typeof this == 'object' && this) || + // eslint-disable-next-line no-new-func -- fallback + (function () { return this; })() || Function('return this')(); + +}); + +// MODULE: ./node_modules/core-js/internals/has-own-property.js +var has_own_property_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); +var toObject = (to_object_namespaceFn()); + +var hasOwnProperty = uncurryThis({}.hasOwnProperty); + +// `HasOwnProperty` abstract operation +// https://tc39.es/ecma262/#sec-hasownproperty +// eslint-disable-next-line es/no-object-hasown -- safe +module.exports = Object.hasOwn || function hasOwn(it, key) { + return hasOwnProperty(toObject(it), key); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/hidden-keys.js +var hidden_keys_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +module.exports = {}; + +}); + +// MODULE: ./node_modules/core-js/internals/html.js +var html_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var getBuiltIn = (get_built_in_namespaceFn()); + +module.exports = getBuiltIn('document', 'documentElement'); + +}); + +// MODULE: ./node_modules/core-js/internals/ie8-dom-define.js +var ie8_dom_define_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var DESCRIPTORS = (descriptors_namespaceFn()); +var fails = (fails_namespaceFn()); +var createElement = (document_create_element_namespaceFn()); + +// Thanks to IE8 for its funny defineProperty +module.exports = !DESCRIPTORS && !fails(function () { + // eslint-disable-next-line es/no-object-defineproperty -- required for testing + return Object.defineProperty(createElement('div'), 'a', { + get: function () { return 7; } + }).a !== 7; +}); + +}); + +// MODULE: ./node_modules/core-js/internals/indexed-object.js +var indexed_object_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); +var fails = (fails_namespaceFn()); +var classof = (classof_raw_namespaceFn()); + +var $Object = Object; +var split = uncurryThis(''.split); + +// fallback for non-array-like ES3 and non-enumerable old V8 strings +module.exports = fails(function () { + // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346 + // eslint-disable-next-line no-prototype-builtins -- safe + return !$Object('z').propertyIsEnumerable(0); +}) ? function (it) { + return classof(it) === 'String' ? split(it, '') : $Object(it); +} : $Object; + +}); + +// MODULE: ./node_modules/core-js/internals/inspect-source.js +var inspect_source_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); +var store = (shared_store_namespaceFn()); + +var functionToString = uncurryThis(Function.toString); + +// this helper broken in `core-js@3.4.1-3.4.4`, so we can't use `shared` helper +if (!isCallable(store.inspectSource)) { + store.inspectSource = function (it) { + return functionToString(it); + }; +} + +module.exports = store.inspectSource; + +}); + +// MODULE: ./node_modules/core-js/internals/internal-state.js +var internal_state_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var NATIVE_WEAK_MAP = (weak_map_basic_detection_namespaceFn()); +var globalThis = (global_this_namespaceFn()); +var isObject = (is_object_namespaceFn()); +var createNonEnumerableProperty = (create_non_enumerable_property_namespaceFn()); +var hasOwn = (has_own_property_namespaceFn()); +var shared = (shared_store_namespaceFn()); +var sharedKey = (shared_key_namespaceFn()); +var hiddenKeys = (hidden_keys_namespaceFn()); + +var OBJECT_ALREADY_INITIALIZED = 'Object already initialized'; +var TypeError = globalThis.TypeError; +var WeakMap = globalThis.WeakMap; +var set, get, has; + +var enforce = function (it) { + return has(it) ? get(it) : set(it, {}); +}; + +var getterFor = function (TYPE) { + return function (it) { + var state; + if (!isObject(it) || (state = get(it)).type !== TYPE) { + throw new TypeError('Incompatible receiver, ' + TYPE + ' required'); + } return state; + }; +}; + +if (NATIVE_WEAK_MAP || shared.state) { + var store = shared.state || (shared.state = new WeakMap()); + /* eslint-disable no-self-assign -- prototype methods protection */ + store.get = store.get; + store.has = store.has; + store.set = store.set; + /* eslint-enable no-self-assign -- prototype methods protection */ + set = function (it, metadata) { + if (store.has(it)) throw new TypeError(OBJECT_ALREADY_INITIALIZED); + metadata.facade = it; + store.set(it, metadata); + return metadata; + }; + get = function (it) { + return store.get(it) || {}; + }; + has = function (it) { + return store.has(it); + }; +} else { + var STATE = sharedKey('state'); + hiddenKeys[STATE] = true; + set = function (it, metadata) { + if (hasOwn(it, STATE)) throw new TypeError(OBJECT_ALREADY_INITIALIZED); + metadata.facade = it; + createNonEnumerableProperty(it, STATE, metadata); + return metadata; + }; + get = function (it) { + return hasOwn(it, STATE) ? it[STATE] : {}; + }; + has = function (it) { + return hasOwn(it, STATE); + }; +} + +module.exports = { + set: set, + get: get, + has: has, + enforce: enforce, + getterFor: getterFor +}; + +}); + +// MODULE: ./node_modules/core-js/internals/is-array-iterator-method.js +var is_array_iterator_method_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var wellKnownSymbol = (well_known_symbol_namespaceFn()); +var Iterators = (iterators_namespaceFn()); + +var ITERATOR = wellKnownSymbol('iterator'); +var ArrayPrototype = Array.prototype; + +// check on default Array iterator +module.exports = function (it) { + return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/is-array.js +var is_array_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var classof = (classof_raw_namespaceFn()); + +// `IsArray` abstract operation +// https://tc39.es/ecma262/#sec-isarray +// eslint-disable-next-line es/no-array-isarray -- safe +module.exports = Array.isArray || function isArray(argument) { + return classof(argument) === 'Array'; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/is-big-int-array.js +var is_big_int_array_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var classof = (classof_namespaceFn()); + +module.exports = function (it) { + var klass = classof(it); + return klass === 'BigInt64Array' || klass === 'BigUint64Array'; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/is-callable.js +var is_callable_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot +var documentAll = typeof document == 'object' && document.all; + +// `IsCallable` abstract operation +// https://tc39.es/ecma262/#sec-iscallable +// eslint-disable-next-line unicorn/no-typeof-undefined -- required for testing +module.exports = typeof documentAll == 'undefined' && documentAll !== undefined ? function (argument) { + return typeof argument == 'function' || argument === documentAll; +} : function (argument) { + return typeof argument == 'function'; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/is-forced.js +var is_forced_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var fails = (fails_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); + +var replacement = /#|\.prototype\./; + +var isForced = function (feature, detection) { + var value = data[normalize(feature)]; + return value === POLYFILL ? true + : value === NATIVE ? false + : isCallable(detection) ? fails(detection) + : !!detection; +}; + +var normalize = isForced.normalize = function (string) { + return String(string).replace(replacement, '.').toLowerCase(); +}; + +var data = isForced.data = {}; +var NATIVE = isForced.NATIVE = 'N'; +var POLYFILL = isForced.POLYFILL = 'P'; + +module.exports = isForced; + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/is-null-or-undefined.js +var is_null_or_undefined_namespaceFn = () => { + return __webpack_require__(117); +}; + +// MODULE: ./node_modules/core-js/internals/is-object.js +var is_object_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var isCallable = (is_callable_namespaceFn()); + +module.exports = function (it) { + return typeof it == 'object' ? it !== null : isCallable(it); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/is-possible-prototype.js +var is_possible_prototype_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var isObject = (is_object_namespaceFn()); + +module.exports = function (argument) { + return isObject(argument) || argument === null; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/is-pure.js +var is_pure_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +module.exports = false; + +}); + +// MODULE: ./node_modules/core-js/internals/is-raw-json.js +var is_raw_json_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var isObject = (is_object_namespaceFn()); +var getInternalState = (internal_state_namespaceFn().get); + +module.exports = function isRawJSON(O) { + if (!isObject(O)) return false; + var state = getInternalState(O); + return !!state && state.type === 'RawJSON'; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/is-symbol.js +var is_symbol_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var getBuiltIn = (get_built_in_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); +var isPrototypeOf = (object_is_prototype_of_namespaceFn()); +var USE_SYMBOL_AS_UID = (use_symbol_as_uid_namespaceFn()); + +var $Object = Object; + +module.exports = USE_SYMBOL_AS_UID ? function (it) { + return typeof it == 'symbol'; +} : function (it) { + var $Symbol = getBuiltIn('Symbol'); + return isCallable($Symbol) && isPrototypeOf($Symbol.prototype, $Object(it)); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/iterate-simple.js +var iterate_simple_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var call = (function_call_namespaceFn()); + +module.exports = function (record, fn, ITERATOR_INSTEAD_OF_RECORD) { + var iterator = ITERATOR_INSTEAD_OF_RECORD ? record : record.iterator; + var next = record.next; + var step, result; + while (!(step = call(next, iterator)).done) { + result = fn(step.value); + if (result !== undefined) return result; + } +}; + +}); + +// MODULE: ./node_modules/core-js/internals/iterate.js +var iterate_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var bind = (function_bind_context_namespaceFn()); +var call = (function_call_namespaceFn()); +var anObject = (an_object_namespaceFn()); +var tryToString = (try_to_string_namespaceFn()); +var isArrayIteratorMethod = (is_array_iterator_method_namespaceFn()); +var lengthOfArrayLike = (length_of_array_like_namespaceFn()); +var isPrototypeOf = (object_is_prototype_of_namespaceFn()); +var getIterator = (get_iterator_internal_namespaceFn()); +var getIteratorMethod = (get_iterator_method_internal_namespaceFn()); +var iteratorClose = (iterator_close_namespaceFn()); + +var $TypeError = TypeError; + +var Result = function (stopped, result) { + this.stopped = stopped; + this.result = result; +}; + +var ResultPrototype = Result.prototype; + +module.exports = function (iterable, unboundFunction, options) { + var that = options && options.that; + var AS_ENTRIES = !!(options && options.AS_ENTRIES); + var IS_RECORD = !!(options && options.IS_RECORD); + var IS_ITERATOR = !!(options && options.IS_ITERATOR); + var INTERRUPTED = !!(options && options.INTERRUPTED); + var fn = bind(unboundFunction, that); + var iterator, iterFn, index, length, result, next, step; + + var stop = function (condition) { + var $iterator = iterator; + iterator = undefined; + if ($iterator) iteratorClose($iterator, 'normal'); + return new Result(true, condition); + }; + + var callFn = function (value) { + if (AS_ENTRIES) { + anObject(value); + return INTERRUPTED ? fn(value[0], value[1], stop) : fn(value[0], value[1]); + } return INTERRUPTED ? fn(value, stop) : fn(value); + }; + + if (IS_RECORD) { + iterator = iterable.iterator; + } else if (IS_ITERATOR) { + iterator = iterable; + } else { + iterFn = getIteratorMethod(iterable); + if (!iterFn) throw new $TypeError(tryToString(iterable) + ' is not iterable'); + // optimisation for array iterators + if (isArrayIteratorMethod(iterFn)) { + for (index = 0, length = lengthOfArrayLike(iterable); length > index; index++) { + result = callFn(iterable[index]); + if (result && isPrototypeOf(ResultPrototype, result)) return result; + } return new Result(false); + } + iterator = getIterator(iterable, iterFn); + } + + next = IS_RECORD ? iterable.next : iterator.next; + while (!(step = call(next, iterator)).done) { + // `IteratorValue` errors should propagate without closing the iterator + var value = step.value; + try { + result = callFn(value); + } catch (error) { + if (iterator) iteratorClose(iterator, 'throw', error); + else throw error; + } + if (typeof result == 'object' && result && isPrototypeOf(ResultPrototype, result)) return result; + } return new Result(false); +}; + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/iterator-cleanup-state.js +var iterator_cleanup_state_namespaceFn = () => { + return __webpack_require__(859); +}; + +// MODULE: ./node_modules/core-js/internals/iterator-close-all.js +var iterator_close_all_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var iteratorClose = (iterator_close_namespaceFn()); + +module.exports = function (iters, kind, value) { + for (var i = iters.length - 1; i >= 0; i--) { + if (iters[i] === undefined) continue; + try { + value = iteratorClose(iters[i].iterator, kind, value); + } catch (error) { + kind = 'throw'; + value = error; + } + } + if (kind === 'throw') throw value; + return value; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/iterator-close.js +var iterator_close_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var call = (function_call_namespaceFn()); +var anObject = (an_object_namespaceFn()); +var getMethod = (get_method_namespaceFn()); + +module.exports = function (iterator, kind, value) { + var innerResult, innerError; + anObject(iterator); + try { + innerResult = getMethod(iterator, 'return'); + if (!innerResult) { + if (kind === 'throw') throw value; + return value; + } + innerResult = call(innerResult, iterator); + } catch (error) { + innerError = true; + innerResult = error; + } + if (kind === 'throw') throw value; + if (innerError) throw innerResult; + anObject(innerResult); + return value; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/iterator-create-proxy.js +var iterator_create_proxy_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var call = (function_call_namespaceFn()); +var create = (object_create_namespaceFn()); +var createNonEnumerableProperty = (create_non_enumerable_property_namespaceFn()); +var defineBuiltIns = (define_built_ins_namespaceFn()); +var wellKnownSymbol = (well_known_symbol_namespaceFn()); +var InternalStateModule = (internal_state_namespaceFn()); +var getMethod = (get_method_namespaceFn()); +var IteratorPrototype = (iterators_core_namespaceFn().IteratorPrototype); +var createIterResultObject = (create_iter_result_object_namespaceFn()); +var iteratorClose = (iterator_close_namespaceFn()); +var iteratorCloseAll = (iterator_close_all_namespaceFn()); +var cleanupState = (iterator_cleanup_state_namespaceFn()); + +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); +var ITERATOR_HELPER = 'IteratorHelper'; +var WRAP_FOR_VALID_ITERATOR = 'WrapForValidIterator'; +var NORMAL = 'normal'; +var THROW = 'throw'; +var setInternalState = InternalStateModule.set; + +var createIteratorProxyPrototype = function (IS_ITERATOR) { + var getInternalState = InternalStateModule.getterFor(IS_ITERATOR ? WRAP_FOR_VALID_ITERATOR : ITERATOR_HELPER); + + return defineBuiltIns(create(IteratorPrototype), { + next: function next() { + var state = getInternalState(this); + // for simplification: + // for `%WrapForValidIteratorPrototype%.next` or with `state.returnHandlerResult` our `nextHandler` returns `IterResultObject` + // for `%IteratorHelperPrototype%.next` - just a value + if (IS_ITERATOR) return state.nextHandler(); + if (state.done) return createIterResultObject(undefined, true); + try { + var result = state.nextHandler(); + if (state.done) cleanupState(state); + return state.returnHandlerResult ? result : createIterResultObject(result, state.done); + } catch (error) { + state.done = true; + cleanupState(state); + throw error; + } + }, + 'return': function () { + var state = getInternalState(this); + var iterator = state.iterator; + var inner = state.inner; + var openIters = state.openIters; + var done = state.done; + state.done = true; + if (IS_ITERATOR) { + var returnMethod = getMethod(iterator, 'return'); + return returnMethod ? call(returnMethod, iterator) : createIterResultObject(undefined, true); + } + cleanupState(state); + if (done) return createIterResultObject(undefined, true); + if (inner) try { + iteratorClose(inner.iterator, NORMAL); + } catch (error) { + return iteratorClose(iterator, THROW, error); + } + if (openIters) try { + iteratorCloseAll(openIters, NORMAL); + } catch (error) { + if (iterator) return iteratorClose(iterator, THROW, error); + throw error; + } + if (iterator) iteratorClose(iterator, NORMAL); + return createIterResultObject(undefined, true); + } + }); +}; + +var WrapForValidIteratorPrototype = createIteratorProxyPrototype(true); +var IteratorHelperPrototype = createIteratorProxyPrototype(false); + +createNonEnumerableProperty(IteratorHelperPrototype, TO_STRING_TAG, 'Iterator Helper'); + +module.exports = function (nextHandler, IS_ITERATOR, RETURN_HANDLER_RESULT) { + var IteratorProxy = function Iterator(record, state) { + if (state) { + state.iterator = record.iterator; + state.next = record.next; + } else state = record; + state.type = IS_ITERATOR ? WRAP_FOR_VALID_ITERATOR : ITERATOR_HELPER; + state.returnHandlerResult = !!RETURN_HANDLER_RESULT; + state.nextHandler = nextHandler; + state.counter = 0; + state.done = false; + setInternalState(this, state); + }; + + IteratorProxy.prototype = IS_ITERATOR ? WrapForValidIteratorPrototype : IteratorHelperPrototype; + + return IteratorProxy; +}; + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/iterator-helper-throws-on-invalid-iterator.js +var iterator_helper_throws_on_invalid_iterator_namespaceFn = () => { + return __webpack_require__(684); +}; + +// MODULE: ./node_modules/core-js/internals/iterator-helper-without-closing-on-early-error.js +var iterator_helper_without_closing_on_early_error_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var globalThis = (global_this_namespaceFn()); + +// https://github.com/tc39/ecma262/pull/3467 +module.exports = function (METHOD_NAME, ExpectedError) { + var Iterator = globalThis.Iterator; + var IteratorPrototype = Iterator && Iterator.prototype; + var method = IteratorPrototype && IteratorPrototype[METHOD_NAME]; + + var CLOSED = false; + + if (method) try { + method.call({ + next: function () { return { done: true }; }, + 'return': function () { CLOSED = true; } + }, -1); + } catch (error) { + // https://bugs.webkit.org/show_bug.cgi?id=291195 + if (!(error instanceof ExpectedError)) CLOSED = false; + } + + if (!CLOSED) return method; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/iterators-core.js +var iterators_core_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var fails = (fails_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); +var isObject = (is_object_namespaceFn()); +var create = (object_create_namespaceFn()); +var getPrototypeOf = (object_get_prototype_of_namespaceFn()); +var defineBuiltIn = (define_built_in_namespaceFn()); +var wellKnownSymbol = (well_known_symbol_namespaceFn()); +var IS_PURE = (is_pure_namespaceFn()); + +var ITERATOR = wellKnownSymbol('iterator'); +var BUGGY_SAFARI_ITERATORS = false; + +// `%IteratorPrototype%` object +// https://tc39.es/ecma262/#sec-%iteratorprototype%-object +var IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator; + +/* eslint-disable es/no-array-prototype-keys -- safe */ +if ([].keys) { + arrayIterator = [].keys(); + // Safari 8 has buggy iterators w/o `next` + if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true; + else { + PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator)); + if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype; + } +} + +var NEW_ITERATOR_PROTOTYPE = !isObject(IteratorPrototype) || fails(function () { + var test = {}; + // FF44- legacy iterators case + return IteratorPrototype[ITERATOR].call(test) !== test; +}); + +if (NEW_ITERATOR_PROTOTYPE) IteratorPrototype = {}; +else if (IS_PURE) IteratorPrototype = create(IteratorPrototype); + +// `%IteratorPrototype%[@@iterator]()` method +// https://tc39.es/ecma262/#sec-%iteratorprototype%-@@iterator +if (!isCallable(IteratorPrototype[ITERATOR])) { + defineBuiltIn(IteratorPrototype, ITERATOR, function () { + return this; + }); +} + +module.exports = { + IteratorPrototype: IteratorPrototype, + ...(/* unused pure expression */ null && (BUGGY_SAFARI_ITERATORS)) +}; + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/iterators.js +var iterators_namespaceFn = () => { + return __webpack_require__(269); +}; + +// MODULE: ./node_modules/core-js/internals/length-of-array-like.js +var length_of_array_like_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var toLength = (to_length_namespaceFn()); + +// `LengthOfArrayLike` abstract operation +// https://tc39.es/ecma262/#sec-lengthofarraylike +module.exports = function (obj) { + return toLength(obj.length); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/make-built-in.js +var make_built_in_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); +var fails = (fails_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); +var hasOwn = (has_own_property_namespaceFn()); +var DESCRIPTORS = (descriptors_namespaceFn()); +var CONFIGURABLE_FUNCTION_NAME = (function_name_namespaceFn().CONFIGURABLE); +var inspectSource = (inspect_source_namespaceFn()); +var InternalStateModule = (internal_state_namespaceFn()); + +var enforceInternalState = InternalStateModule.enforce; +var getInternalState = InternalStateModule.get; +var $String = String; +// eslint-disable-next-line es/no-object-defineproperty -- safe +var defineProperty = Object.defineProperty; +var stringSlice = uncurryThis(''.slice); +var replace = uncurryThis(''.replace); +var join = uncurryThis([].join); + +var CONFIGURABLE_LENGTH = DESCRIPTORS && !fails(function () { + return defineProperty(function () { /* empty */ }, 'length', { value: 8 }).length !== 8; +}); + +var TEMPLATE = String(String).split('String'); + +var makeBuiltIn = module.exports = function (value, name, options) { + if (stringSlice($String(name), 0, 7) === 'Symbol(') { + name = '[' + replace($String(name), /^Symbol\(([^)]*)\).*$/, '$1') + ']'; + } + if (options && options.getter) name = 'get ' + name; + if (options && options.setter) name = 'set ' + name; + if (!hasOwn(value, 'name') || (CONFIGURABLE_FUNCTION_NAME && value.name !== name)) { + if (DESCRIPTORS) defineProperty(value, 'name', { value: name, configurable: true }); + else value.name = name; + } + if (CONFIGURABLE_LENGTH && options && hasOwn(options, 'arity') && value.length !== options.arity) { + defineProperty(value, 'length', { value: options.arity }); + } + try { + if (options && hasOwn(options, 'constructor') && options.constructor) { + if (DESCRIPTORS) defineProperty(value, 'prototype', { writable: false }); + // in V8 ~ Chrome 53, prototypes of some methods, like `Array.prototype.values`, are non-writable + } else if (value.prototype) value.prototype = undefined; + } catch (error) { /* empty */ } + var state = enforceInternalState(value); + if (!hasOwn(state, 'source')) { + state.source = join(TEMPLATE, typeof name == 'string' ? name : ''); + } return value; +}; + +// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative +// eslint-disable-next-line no-extend-native -- required +Function.prototype.toString = makeBuiltIn(function toString() { + return isCallable(this) && getInternalState(this).source || inspectSource(this); +}, 'toString'); + +}); + +// MODULE: ./node_modules/core-js/internals/map-helpers.js +var map_helpers_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); + +// eslint-disable-next-line es/no-map -- safe +var MapPrototype = Map.prototype; + +module.exports = { + // eslint-disable-next-line es/no-map -- safe + Map: Map, + set: uncurryThis(MapPrototype.set), + get: uncurryThis(MapPrototype.get), + has: uncurryThis(MapPrototype.has), + remove: uncurryThis(MapPrototype['delete']), + proto: MapPrototype +}; + +}); + +// MODULE: ./node_modules/core-js/internals/native-raw-json.js +var native_raw_json_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +/* eslint-disable es/no-json -- safe */ +var fails = (fails_namespaceFn()); + +module.exports = !fails(function () { + var unsafeInt = '9007199254740993'; + // eslint-disable-next-line es/no-json-rawjson -- feature detection + var raw = JSON.rawJSON(unsafeInt); + // eslint-disable-next-line es/no-json-israwjson -- feature detection + return !JSON.isRawJSON(raw) || JSON.stringify(raw) !== unsafeInt; +}); + +}); + +// MODULE: ./node_modules/core-js/internals/new-promise-capability.js +var new_promise_capability_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var aCallable = (a_callable_namespaceFn()); + +var $TypeError = TypeError; + +var PromiseCapability = function (C) { + var resolve, reject; + this.promise = new C(function ($$resolve, $$reject) { + if (resolve !== undefined || reject !== undefined) throw new $TypeError('Bad Promise constructor'); + resolve = $$resolve; + reject = $$reject; + }); + this.resolve = aCallable(resolve); + this.reject = aCallable(reject); +}; + +// `NewPromiseCapability` abstract operation +// https://tc39.es/ecma262/#sec-newpromisecapability +module.exports.f = function (C) { + return new PromiseCapability(C); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/object-create.js +var object_create_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +/* global ActiveXObject -- old IE, WSH */ +var anObject = (an_object_namespaceFn()); +var definePropertiesModule = (object_define_properties_namespaceFn()); +var enumBugKeys = (enum_bug_keys_namespaceFn()); +var hiddenKeys = (hidden_keys_namespaceFn()); +var html = (html_namespaceFn()); +var documentCreateElement = (document_create_element_namespaceFn()); +var sharedKey = (shared_key_namespaceFn()); + +var GT = '>'; +var LT = '<'; +var PROTOTYPE = 'prototype'; +var SCRIPT = 'script'; +var IE_PROTO = sharedKey('IE_PROTO'); + +var EmptyConstructor = function () { /* empty */ }; + +var scriptTag = function (content) { + return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT; +}; + +// Create object with fake `null` prototype: use ActiveX Object with cleared prototype +var NullProtoObjectViaActiveX = function (activeXDocument) { + activeXDocument.write(scriptTag('')); + activeXDocument.close(); + var temp = activeXDocument.parentWindow.Object; + // eslint-disable-next-line no-useless-assignment -- avoid memory leak + activeXDocument = null; + return temp; +}; + +// Create object with fake `null` prototype: use iframe Object with cleared prototype +var NullProtoObjectViaIFrame = function () { + // Thrash, waste and sodomy: IE GC bug + var iframe = documentCreateElement('iframe'); + var JS = 'java' + SCRIPT + ':'; + var iframeDocument; + iframe.style.display = 'none'; + html.appendChild(iframe); + // https://github.com/zloirock/core-js/issues/475 + iframe.src = String(JS); + iframeDocument = iframe.contentWindow.document; + iframeDocument.open(); + iframeDocument.write(scriptTag('document.F=Object')); + iframeDocument.close(); + return iframeDocument.F; +}; + +// Check for document.domain and active x support +// No need to use active x approach when document.domain is not set +// see https://github.com/es-shims/es5-shim/issues/150 +// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346 +// avoid IE GC bug +var activeXDocument; +var NullProtoObject = function () { + try { + activeXDocument = new ActiveXObject('htmlfile'); + } catch (error) { /* ignore */ } + NullProtoObject = typeof document != 'undefined' + ? document.domain && activeXDocument + ? NullProtoObjectViaActiveX(activeXDocument) // old IE + : NullProtoObjectViaIFrame() + : NullProtoObjectViaActiveX(activeXDocument); // WSH + var length = enumBugKeys.length; + while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]]; + return NullProtoObject(); +}; + +hiddenKeys[IE_PROTO] = true; + +// `Object.create` method +// https://tc39.es/ecma262/#sec-object.create +// eslint-disable-next-line es/no-object-create -- safe +module.exports = Object.create || function create(O, Properties) { + var result; + if (O !== null) { + EmptyConstructor[PROTOTYPE] = anObject(O); + result = new EmptyConstructor(); + EmptyConstructor[PROTOTYPE] = null; + // add "__proto__" for Object.getPrototypeOf polyfill + result[IE_PROTO] = O; + } else result = NullProtoObject(); + return Properties === undefined ? result : definePropertiesModule.f(result, Properties); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/object-define-properties.js +var object_define_properties_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var DESCRIPTORS = (descriptors_namespaceFn()); +var V8_PROTOTYPE_DEFINE_BUG = (v8_prototype_define_bug_namespaceFn()); +var definePropertyModule = (object_define_property_namespaceFn()); +var anObject = (an_object_namespaceFn()); +var toIndexedObject = (to_indexed_object_namespaceFn()); +var objectKeys = (object_keys_namespaceFn()); + +// `Object.defineProperties` method +// https://tc39.es/ecma262/#sec-object.defineproperties +// eslint-disable-next-line es/no-object-defineproperties -- safe +exports.f = DESCRIPTORS && !V8_PROTOTYPE_DEFINE_BUG ? Object.defineProperties : function defineProperties(O, Properties) { + anObject(O); + var props = toIndexedObject(Properties); + var keys = objectKeys(Properties); + var length = keys.length; + var index = 0; + var key; + while (length > index) definePropertyModule.f(O, key = keys[index++], props[key]); + return O; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/object-define-property.js +var object_define_property_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var DESCRIPTORS = (descriptors_namespaceFn()); +var IE8_DOM_DEFINE = (ie8_dom_define_namespaceFn()); +var V8_PROTOTYPE_DEFINE_BUG = (v8_prototype_define_bug_namespaceFn()); +var anObject = (an_object_namespaceFn()); +var toPropertyKey = (to_property_key_namespaceFn()); + +var $TypeError = TypeError; +// eslint-disable-next-line es/no-object-defineproperty -- safe +var $defineProperty = Object.defineProperty; +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; +var ENUMERABLE = 'enumerable'; +var CONFIGURABLE = 'configurable'; +var WRITABLE = 'writable'; + +// `Object.defineProperty` method +// https://tc39.es/ecma262/#sec-object.defineproperty +exports.f = DESCRIPTORS ? V8_PROTOTYPE_DEFINE_BUG ? function defineProperty(O, P, Attributes) { + anObject(O); + P = toPropertyKey(P); + anObject(Attributes); + if (typeof O === 'function' && P === 'prototype' && 'value' in Attributes && WRITABLE in Attributes && !Attributes[WRITABLE]) { + var current = $getOwnPropertyDescriptor(O, P); + if (current && current[WRITABLE]) { + O[P] = Attributes.value; + Attributes = { + configurable: CONFIGURABLE in Attributes ? Attributes[CONFIGURABLE] : current[CONFIGURABLE], + enumerable: ENUMERABLE in Attributes ? Attributes[ENUMERABLE] : current[ENUMERABLE], + writable: false + }; + } + } return $defineProperty(O, P, Attributes); +} : $defineProperty : function defineProperty(O, P, Attributes) { + anObject(O); + P = toPropertyKey(P); + anObject(Attributes); + if (IE8_DOM_DEFINE) try { + return $defineProperty(O, P, Attributes); + } catch (error) { /* empty */ } + if ('get' in Attributes || 'set' in Attributes) throw new $TypeError('Accessors not supported'); + if ('value' in Attributes) O[P] = Attributes.value; + return O; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/object-get-own-property-descriptor.js +var object_get_own_property_descriptor_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var DESCRIPTORS = (descriptors_namespaceFn()); +var call = (function_call_namespaceFn()); +var propertyIsEnumerableModule = (object_property_is_enumerable_namespaceFn()); +var createPropertyDescriptor = (create_property_descriptor_namespaceFn()); +var toIndexedObject = (to_indexed_object_namespaceFn()); +var toPropertyKey = (to_property_key_namespaceFn()); +var hasOwn = (has_own_property_namespaceFn()); +var IE8_DOM_DEFINE = (ie8_dom_define_namespaceFn()); + +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; + +// `Object.getOwnPropertyDescriptor` method +// https://tc39.es/ecma262/#sec-object.getownpropertydescriptor +exports.f = DESCRIPTORS ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) { + O = toIndexedObject(O); + P = toPropertyKey(P); + if (IE8_DOM_DEFINE) try { + return $getOwnPropertyDescriptor(O, P); + } catch (error) { /* empty */ } + if (hasOwn(O, P)) return createPropertyDescriptor(!call(propertyIsEnumerableModule.f, O, P), O[P]); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/object-get-own-property-names.js +var object_get_own_property_names_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var internalObjectKeys = (object_keys_internal_namespaceFn()); +var enumBugKeys = (enum_bug_keys_namespaceFn()); + +var hiddenKeys = enumBugKeys.concat('length', 'prototype'); + +// `Object.getOwnPropertyNames` method +// https://tc39.es/ecma262/#sec-object.getownpropertynames +// eslint-disable-next-line es/no-object-getownpropertynames -- safe +exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) { + return internalObjectKeys(O, hiddenKeys); +}; + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/object-get-own-property-symbols.js +var object_get_own_property_symbols_namespaceFn = () => { + return __webpack_require__(717); +}; + +// MODULE: ./node_modules/core-js/internals/object-get-prototype-of.js +var object_get_prototype_of_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var hasOwn = (has_own_property_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); +var toObject = (to_object_namespaceFn()); +var sharedKey = (shared_key_namespaceFn()); +var CORRECT_PROTOTYPE_GETTER = (correct_prototype_getter_namespaceFn()); + +var IE_PROTO = sharedKey('IE_PROTO'); +var $Object = Object; +var ObjectPrototype = $Object.prototype; + +// `Object.getPrototypeOf` method +// https://tc39.es/ecma262/#sec-object.getprototypeof +// eslint-disable-next-line es/no-object-getprototypeof -- safe +module.exports = CORRECT_PROTOTYPE_GETTER ? $Object.getPrototypeOf : function (O) { + var object = toObject(O); + if (hasOwn(object, IE_PROTO)) return object[IE_PROTO]; + var constructor = object.constructor; + if (isCallable(constructor) && object instanceof constructor) { + return constructor.prototype; + } return object instanceof $Object ? ObjectPrototype : null; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/object-is-prototype-of.js +var object_is_prototype_of_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); + +module.exports = uncurryThis({}.isPrototypeOf); + +}); + +// MODULE: ./node_modules/core-js/internals/object-keys-internal.js +var object_keys_internal_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); +var hasOwn = (has_own_property_namespaceFn()); +var toIndexedObject = (to_indexed_object_namespaceFn()); +var indexOf = (array_includes_namespaceFn().indexOf); +var hiddenKeys = (hidden_keys_namespaceFn()); + +var push = uncurryThis([].push); + +module.exports = function (object, names) { + var O = toIndexedObject(object); + var i = 0; + var result = []; + var key; + for (key in O) !hasOwn(hiddenKeys, key) && hasOwn(O, key) && push(result, key); + // Don't enum bug & hidden keys + while (names.length > i) if (hasOwn(O, key = names[i++])) { + ~indexOf(result, key) || push(result, key); + } + return result; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/object-keys.js +var object_keys_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var internalObjectKeys = (object_keys_internal_namespaceFn()); +var enumBugKeys = (enum_bug_keys_namespaceFn()); + +// `Object.keys` method +// https://tc39.es/ecma262/#sec-object.keys +// eslint-disable-next-line es/no-object-keys -- safe +module.exports = Object.keys || function keys(O) { + return internalObjectKeys(O, enumBugKeys); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/object-property-is-enumerable.js +var object_property_is_enumerable_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $propertyIsEnumerable = {}.propertyIsEnumerable; +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; + +// Nashorn ~ JDK8 bug +var NASHORN_BUG = getOwnPropertyDescriptor && !$propertyIsEnumerable.call({ 1: 2 }, 1); + +// `Object.prototype.propertyIsEnumerable` method implementation +// https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable +exports.f = NASHORN_BUG ? function propertyIsEnumerable(V) { + var descriptor = getOwnPropertyDescriptor(this, V); + return !!descriptor && descriptor.enumerable; +} : $propertyIsEnumerable; + +}); + +// MODULE: ./node_modules/core-js/internals/object-set-prototype-of.js +var object_set_prototype_of_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +/* eslint-disable no-proto -- safe */ +var uncurryThisAccessor = (function_uncurry_this_accessor_namespaceFn()); +var isObject = (is_object_namespaceFn()); +var requireObjectCoercible = (require_object_coercible_namespaceFn()); +var aPossiblePrototype = (a_possible_prototype_namespaceFn()); + +// `Object.setPrototypeOf` method +// https://tc39.es/ecma262/#sec-object.setprototypeof +// Works with __proto__ only. Old v8 can't work with null proto objects. +// eslint-disable-next-line es/no-object-setprototypeof -- safe +module.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () { + var CORRECT_SETTER = false; + var test = {}; + var setter; + try { + setter = uncurryThisAccessor(Object.prototype, '__proto__', 'set'); + setter(test, []); + CORRECT_SETTER = test instanceof Array; + } catch (error) { /* empty */ } + return function setPrototypeOf(O, proto) { + requireObjectCoercible(O); + aPossiblePrototype(proto); + if (!isObject(O)) return O; + if (CORRECT_SETTER) setter(O, proto); + else O.__proto__ = proto; + return O; + }; +}() : undefined); + +}); + +// MODULE: ./node_modules/core-js/internals/ordinary-to-primitive.js +var ordinary_to_primitive_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var call = (function_call_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); +var isObject = (is_object_namespaceFn()); + +var $TypeError = TypeError; + +// `OrdinaryToPrimitive` abstract operation +// https://tc39.es/ecma262/#sec-ordinarytoprimitive +module.exports = function (input, pref) { + var fn, val; + if (pref === 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val; + if (isCallable(fn = input.valueOf) && !isObject(val = call(fn, input))) return val; + if (pref !== 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val; + throw new $TypeError("Can't convert object to primitive value"); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/own-keys.js +var own_keys_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var getBuiltIn = (get_built_in_namespaceFn()); +var uncurryThis = (function_uncurry_this_namespaceFn()); +var getOwnPropertyNamesModule = (object_get_own_property_names_namespaceFn()); +var getOwnPropertySymbolsModule = (object_get_own_property_symbols_namespaceFn()); +var anObject = (an_object_namespaceFn()); + +var concat = uncurryThis([].concat); + +// all object keys, includes non-enumerable and symbols +module.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) { + var keys = getOwnPropertyNamesModule.f(anObject(it)); + var getOwnPropertySymbols = getOwnPropertySymbolsModule.f; + return getOwnPropertySymbols ? concat(keys, getOwnPropertySymbols(it)) : keys; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/parse-json-string.js +var parse_json_string_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); +var hasOwn = (has_own_property_namespaceFn()); + +var $SyntaxError = SyntaxError; +var $parseInt = parseInt; +var fromCharCode = String.fromCharCode; +var at = uncurryThis(''.charAt); +var slice = uncurryThis(''.slice); +var exec = uncurryThis(/./.exec); + +var codePoints = { + '\\"': '"', + '\\\\': '\\', + '\\/': '/', + '\\b': '\b', + '\\f': '\f', + '\\n': '\n', + '\\r': '\r', + '\\t': '\t' +}; + +var IS_4_HEX_DIGITS = /^[\da-f]{4}$/i; +// eslint-disable-next-line regexp/no-control-character -- safe +var IS_C0_CONTROL_CODE = /^[\u0000-\u001F]$/; + +module.exports = function (source, i) { + var unterminated = true; + var value = ''; + while (i < source.length) { + var chr = at(source, i); + if (chr === '\\') { + var twoChars = slice(source, i, i + 2); + if (hasOwn(codePoints, twoChars)) { + value += codePoints[twoChars]; + i += 2; + } else if (twoChars === '\\u') { + i += 2; + var fourHexDigits = slice(source, i, i + 4); + if (!exec(IS_4_HEX_DIGITS, fourHexDigits)) throw new $SyntaxError('Bad Unicode escape at: ' + i); + value += fromCharCode($parseInt(fourHexDigits, 16)); + i += 4; + } else throw new $SyntaxError('Unknown escape sequence: "' + twoChars + '"'); + } else if (chr === '"') { + unterminated = false; + i++; + break; + } else { + if (exec(IS_C0_CONTROL_CODE, chr)) throw new $SyntaxError('Bad control character in string literal at: ' + i); + value += chr; + i++; + } + } + if (unterminated) throw new $SyntaxError('Unterminated string at: ' + i); + return { value: value, end: i }; +}; + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/perform.js +var perform_namespaceFn = () => { + return __webpack_require__(103); +}; + +// MODULE: ./node_modules/core-js/internals/promise-resolve.js +var promise_resolve_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var anObject = (an_object_namespaceFn()); +var isObject = (is_object_namespaceFn()); +var newPromiseCapability = (new_promise_capability_namespaceFn()); + +module.exports = function (C, x) { + anObject(C); + if (isObject(x) && x.constructor === C) return x; + var promiseCapability = newPromiseCapability.f(C); + var resolve = promiseCapability.resolve; + resolve(x); + return promiseCapability.promise; +}; + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/require-object-coercible.js +var require_object_coercible_namespaceFn = () => { + return __webpack_require__(750); +}; + +// MODULE: ./node_modules/core-js/internals/set-clone.js +var set_clone_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var SetHelpers = (set_helpers_namespaceFn()); +var iterate = (set_iterate_namespaceFn()); + +var Set = SetHelpers.Set; +var add = SetHelpers.add; + +module.exports = function (set) { + var result = new Set(); + iterate(set, function (it) { + add(result, it); + }); + return result; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/set-difference.js +var set_difference_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var aSet = (a_set_namespaceFn()); +var SetHelpers = (set_helpers_namespaceFn()); +var clone = (set_clone_namespaceFn()); +var size = (set_size_namespaceFn()); +var getSetRecord = (get_set_record_namespaceFn()); +var iterateSet = (set_iterate_namespaceFn()); +var iterateSimple = (iterate_simple_namespaceFn()); + +var has = SetHelpers.has; +var remove = SetHelpers.remove; + +// `Set.prototype.difference` method +// https://tc39.es/ecma262/#sec-set.prototype.difference +module.exports = function difference(other) { + var O = aSet(this); + var otherRec = getSetRecord(other); + var result = clone(O); + if (size(result) <= otherRec.size) iterateSet(result, function (e) { + if (otherRec.includes(e)) remove(result, e); + }); + else iterateSimple(otherRec.getIterator(), function (e) { + if (has(result, e)) remove(result, e); + }); + return result; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/set-helpers.js +var set_helpers_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); + +// eslint-disable-next-line es/no-set -- safe +var SetPrototype = Set.prototype; + +module.exports = { + // eslint-disable-next-line es/no-set -- safe + Set: Set, + add: uncurryThis(SetPrototype.add), + has: uncurryThis(SetPrototype.has), + remove: uncurryThis(SetPrototype['delete']), + proto: SetPrototype +}; + +}); + +// MODULE: ./node_modules/core-js/internals/set-intersection.js +var set_intersection_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var aSet = (a_set_namespaceFn()); +var SetHelpers = (set_helpers_namespaceFn()); +var size = (set_size_namespaceFn()); +var getSetRecord = (get_set_record_namespaceFn()); +var iterateSet = (set_iterate_namespaceFn()); +var iterateSimple = (iterate_simple_namespaceFn()); + +var Set = SetHelpers.Set; +var add = SetHelpers.add; +var has = SetHelpers.has; + +// `Set.prototype.intersection` method +// https://tc39.es/ecma262/#sec-set.prototype.intersection +module.exports = function intersection(other) { + var O = aSet(this); + var otherRec = getSetRecord(other); + var result = new Set(); + + if (size(O) > otherRec.size) { + iterateSimple(otherRec.getIterator(), function (e) { + if (has(O, e)) add(result, e); + }); + } else { + iterateSet(O, function (e) { + if (otherRec.includes(e)) add(result, e); + }); + } + + return result; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/set-is-disjoint-from.js +var set_is_disjoint_from_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var aSet = (a_set_namespaceFn()); +var has = (set_helpers_namespaceFn().has); +var size = (set_size_namespaceFn()); +var getSetRecord = (get_set_record_namespaceFn()); +var iterateSet = (set_iterate_namespaceFn()); +var iterateSimple = (iterate_simple_namespaceFn()); +var iteratorClose = (iterator_close_namespaceFn()); + +// `Set.prototype.isDisjointFrom` method +// https://tc39.es/ecma262/#sec-set.prototype.isdisjointfrom +module.exports = function isDisjointFrom(other) { + var O = aSet(this); + var otherRec = getSetRecord(other); + if (size(O) <= otherRec.size) return iterateSet(O, function (e) { + if (otherRec.includes(e)) return false; + }, true) !== false; + var iterator = otherRec.getIterator(); + return iterateSimple(iterator, function (e) { + if (has(O, e)) return iteratorClose(iterator.iterator, 'normal', false); + }) !== false; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/set-is-subset-of.js +var set_is_subset_of_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var aSet = (a_set_namespaceFn()); +var size = (set_size_namespaceFn()); +var iterate = (set_iterate_namespaceFn()); +var getSetRecord = (get_set_record_namespaceFn()); + +// `Set.prototype.isSubsetOf` method +// https://tc39.es/ecma262/#sec-set.prototype.issubsetof +module.exports = function isSubsetOf(other) { + var O = aSet(this); + var otherRec = getSetRecord(other); + if (size(O) > otherRec.size) return false; + return iterate(O, function (e) { + if (!otherRec.includes(e)) return false; + }, true) !== false; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/set-is-superset-of.js +var set_is_superset_of_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var aSet = (a_set_namespaceFn()); +var has = (set_helpers_namespaceFn().has); +var size = (set_size_namespaceFn()); +var getSetRecord = (get_set_record_namespaceFn()); +var iterateSimple = (iterate_simple_namespaceFn()); +var iteratorClose = (iterator_close_namespaceFn()); + +// `Set.prototype.isSupersetOf` method +// https://tc39.es/ecma262/#sec-set.prototype.issupersetof +module.exports = function isSupersetOf(other) { + var O = aSet(this); + var otherRec = getSetRecord(other); + if (size(O) < otherRec.size) return false; + var iterator = otherRec.getIterator(); + return iterateSimple(iterator, function (e) { + if (!has(O, e)) return iteratorClose(iterator.iterator, 'normal', false); + }) !== false; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/set-iterate.js +var set_iterate_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); +var iterateSimple = (iterate_simple_namespaceFn()); +var SetHelpers = (set_helpers_namespaceFn()); + +var Set = SetHelpers.Set; +var SetPrototype = SetHelpers.proto; +var forEach = uncurryThis(SetPrototype.forEach); +var keys = uncurryThis(SetPrototype.keys); +var next = keys(new Set()).next; + +module.exports = function (set, fn, interruptible) { + return interruptible ? iterateSimple({ iterator: keys(set), next: next }, fn) : forEach(set, fn); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/set-method-accept-set-like.js +var set_method_accept_set_like_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var getBuiltIn = (get_built_in_namespaceFn()); + +var createSetLike = function (size) { + return { + size: size, + has: function () { + return false; + }, + keys: function () { + return { + next: function () { + return { done: true }; + } + }; + } + }; +}; + +var createSetLikeWithInfinitySize = function (size) { + return { + size: size, + has: function () { + return true; + }, + keys: function () { + throw new Error('e'); + } + }; +}; + +module.exports = function (name, callback) { + var Set = getBuiltIn('Set'); + try { + new Set()[name](createSetLike(0)); + try { + // late spec change, early WebKit ~ Safari 17 implementation does not pass it + // https://github.com/tc39/proposal-set-methods/pull/88 + // also covered engines with + // https://bugs.webkit.org/show_bug.cgi?id=272679 + new Set()[name](createSetLike(-1)); + return false; + } catch (error2) { + if (!callback) return true; + // early V8 implementation bug + // https://issues.chromium.org/issues/351332634 + try { + new Set()[name](createSetLikeWithInfinitySize(-Infinity)); + return false; + } catch (error) { + var set = new Set([1, 2]); + return callback(set[name](createSetLikeWithInfinitySize(Infinity))); + } + } + } catch (error) { + return false; + } +}; + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/set-method-get-keys-before-cloning-detection.js +var set_method_get_keys_before_cloning_detection_namespaceFn = () => { + return __webpack_require__(835); +}; + +// MODULE: ./node_modules/core-js/internals/set-size.js +var set_size_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThisAccessor = (function_uncurry_this_accessor_namespaceFn()); +var SetHelpers = (set_helpers_namespaceFn()); + +module.exports = uncurryThisAccessor(SetHelpers.proto, 'size', 'get') || function (set) { + return set.size; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/set-symmetric-difference.js +var set_symmetric_difference_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var aSet = (a_set_namespaceFn()); +var SetHelpers = (set_helpers_namespaceFn()); +var clone = (set_clone_namespaceFn()); +var getSetRecord = (get_set_record_namespaceFn()); +var iterateSimple = (iterate_simple_namespaceFn()); + +var add = SetHelpers.add; +var has = SetHelpers.has; +var remove = SetHelpers.remove; + +// `Set.prototype.symmetricDifference` method +// https://tc39.es/ecma262/#sec-set.prototype.symmetricdifference +module.exports = function symmetricDifference(other) { + var O = aSet(this); + var keysIter = getSetRecord(other).getIterator(); + var result = clone(O); + iterateSimple(keysIter, function (e) { + if (has(O, e)) remove(result, e); + else add(result, e); + }); + return result; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/set-union.js +var set_union_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var aSet = (a_set_namespaceFn()); +var add = (set_helpers_namespaceFn().add); +var clone = (set_clone_namespaceFn()); +var getSetRecord = (get_set_record_namespaceFn()); +var iterateSimple = (iterate_simple_namespaceFn()); + +// `Set.prototype.union` method +// https://tc39.es/ecma262/#sec-set.prototype.union +module.exports = function union(other) { + var O = aSet(this); + var keysIter = getSetRecord(other).getIterator(); + var result = clone(O); + iterateSimple(keysIter, function (it) { + add(result, it); + }); + return result; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/shared-key.js +var shared_key_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var shared = (shared_namespaceFn()); +var uid = (uid_namespaceFn()); + +var keys = shared('keys'); + +module.exports = function (key) { + return keys[key] || (keys[key] = uid(key)); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/shared-store.js +var shared_store_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var IS_PURE = (is_pure_namespaceFn()); +var globalThis = (global_this_namespaceFn()); +var defineGlobalProperty = (define_global_property_namespaceFn()); + +var SHARED = '__core-js_shared__'; +var store = module.exports = globalThis[SHARED] || defineGlobalProperty(SHARED, {}); + +(store.versions || (store.versions = [])).push({ + version: '3.50.0', + mode: IS_PURE ? 'pure' : 'global', + copyright: '© 2013–2025 Denis Pushkarev (zloirock.ru), 2025–2026 CoreJS Company (core-js.io). All rights reserved.', + license: 'https://github.com/zloirock/core-js/blob/v3.50.0/LICENSE', + source: 'https://github.com/zloirock/core-js' +}); + +}); + +// MODULE: ./node_modules/core-js/internals/shared.js +var shared_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var store = (shared_store_namespaceFn()); +// eslint-disable-next-line es/no-object-create -- safe +var create = Object.create || Object; + +module.exports = function (key, value) { + return store[key] || (store[key] = value || create(null)); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/symbol-constructor-detection.js +var symbol_constructor_detection_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +/* eslint-disable es/no-symbol -- required for testing */ +var V8_VERSION = (environment_v8_version_namespaceFn()); +var fails = (fails_namespaceFn()); +var globalThis = (global_this_namespaceFn()); + +var $String = globalThis.String; + +// eslint-disable-next-line es/no-object-getownpropertysymbols -- required for testing +module.exports = !!Object.getOwnPropertySymbols && !fails(function () { + var symbol = Symbol('symbol detection'); + // Chrome 38 Symbol has incorrect toString conversion + // `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances + // nb: Do not call `String` directly to avoid this being optimized out to `symbol+''` which will, + // of course, fail. + return !$String(symbol) || !(Object(symbol) instanceof Symbol) || + // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances + !Symbol.sham && V8_VERSION && V8_VERSION < 41; +}); + +}); + +// MODULE: ./node_modules/core-js/internals/this-number-value.js +var this_number_value_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); + +// `thisNumberValue` abstract operation +// https://tc39.es/ecma262/#sec-thisnumbervalue +module.exports = uncurryThis(1.1.valueOf); + +}); + +// MODULE: ./node_modules/core-js/internals/to-absolute-index.js +var to_absolute_index_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var toIntegerOrInfinity = (to_integer_or_infinity_namespaceFn()); + +var max = Math.max; +var min = Math.min; + +// Helper for a popular repeating case of the spec: +// Let integer be ? ToInteger(index). +// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length). +module.exports = function (index, length) { + var integer = toIntegerOrInfinity(index); + return integer < 0 ? max(integer + length, 0) : min(integer, length); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/to-big-int.js +var to_big_int_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var toPrimitive = (to_primitive_namespaceFn()); + +var $TypeError = TypeError; + +// `ToBigInt` abstract operation +// https://tc39.es/ecma262/#sec-tobigint +module.exports = function (argument) { + var prim = toPrimitive(argument, 'number'); + if (typeof prim == 'number') throw new $TypeError("Can't convert number to bigint"); + // eslint-disable-next-line es/no-bigint -- safe + return BigInt(prim); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/to-indexed-object.js +var to_indexed_object_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +// toObject with fallback for non-array-like ES3 strings +var IndexedObject = (indexed_object_namespaceFn()); +var requireObjectCoercible = (require_object_coercible_namespaceFn()); + +module.exports = function (it) { + return IndexedObject(requireObjectCoercible(it)); +}; + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/to-integer-or-infinity.js +var to_integer_or_infinity_namespaceFn = () => { + return __webpack_require__(291); +}; + +// EXTERNAL MODULE: ./node_modules/core-js/internals/to-length.js +var to_length_namespaceFn = () => { + return __webpack_require__(14); +}; + +// EXTERNAL MODULE: ./node_modules/core-js/internals/to-object.js +var to_object_namespaceFn = () => { + return __webpack_require__(981); +}; + +// MODULE: ./node_modules/core-js/internals/to-primitive.js +var to_primitive_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var call = (function_call_namespaceFn()); +var isObject = (is_object_namespaceFn()); +var isSymbol = (is_symbol_namespaceFn()); +var getMethod = (get_method_namespaceFn()); +var ordinaryToPrimitive = (ordinary_to_primitive_namespaceFn()); +var wellKnownSymbol = (well_known_symbol_namespaceFn()); + +var $TypeError = TypeError; +var TO_PRIMITIVE = wellKnownSymbol('toPrimitive'); + +// `ToPrimitive` abstract operation +// https://tc39.es/ecma262/#sec-toprimitive +module.exports = function (input, pref) { + if (!isObject(input) || isSymbol(input)) return input; + var exoticToPrim = getMethod(input, TO_PRIMITIVE); + var result; + if (exoticToPrim) { + if (pref === undefined) pref = 'default'; + result = call(exoticToPrim, input, pref); + if (!isObject(result) || isSymbol(result)) return result; + throw new $TypeError("Can't convert object to primitive value"); + } + if (pref === undefined) pref = 'number'; + return ordinaryToPrimitive(input, pref); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/to-property-key.js +var to_property_key_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var toPrimitive = (to_primitive_namespaceFn()); +var isSymbol = (is_symbol_namespaceFn()); + +// `ToPropertyKey` abstract operation +// https://tc39.es/ecma262/#sec-topropertykey +module.exports = function (argument) { + var key = toPrimitive(argument, 'string'); + return isSymbol(key) ? key : key + ''; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/to-string-tag-support.js +var to_string_tag_support_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var wellKnownSymbol = (well_known_symbol_namespaceFn()); + +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); +var test = {}; +// eslint-disable-next-line unicorn/no-immediate-mutation -- ES3 syntax limitation +test[TO_STRING_TAG] = 'z'; + +module.exports = String(test) === '[object z]'; + +}); + +// MODULE: ./node_modules/core-js/internals/to-string.js +var to_string_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var classof = (classof_namespaceFn()); + +var $String = String; + +module.exports = function (argument) { + if (classof(argument) === 'Symbol') throw new TypeError('Cannot convert a Symbol value to a string'); + return $String(argument); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/try-to-string.js +var try_to_string_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $String = String; + +module.exports = function (argument) { + try { + return $String(argument); + } catch (error) { + return 'Object'; + } +}; + +}); + +// MODULE: ./node_modules/core-js/internals/uid.js +var uid_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); + +var id = 0; +var postfix = Math.random(); +var toString = uncurryThis(1.1.toString); + +module.exports = function (key) { + return 'Symbol(' + (key === undefined ? '' : key) + ')_' + toString(++id + postfix, 36); +}; + +}); + +// MODULE: ./node_modules/core-js/internals/uint8-from-base64.js +var uint8_from_base64_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var globalThis = (global_this_namespaceFn()); +var uncurryThis = (function_uncurry_this_namespaceFn()); +var anObjectOrUndefined = (an_object_or_undefined_namespaceFn()); +var aString = (a_string_namespaceFn()); +var hasOwn = (has_own_property_namespaceFn()); +var base64Map = (base64_map_namespaceFn()); +var getAlphabetOption = (get_alphabet_option_namespaceFn()); +var notDetached = (array_buffer_not_detached_namespaceFn()); + +var base64Alphabet = base64Map.c2i; +var base64UrlAlphabet = base64Map.c2iUrl; + +var SyntaxError = globalThis.SyntaxError; +var TypeError = globalThis.TypeError; +var $Array = globalThis.Array; +var at = uncurryThis(''.charAt); +var floor = Math.floor; + +var skipAsciiWhitespace = function (string, index) { + var length = string.length; + for (;index < length; index++) { + var chr = at(string, index); + if (chr !== ' ' && chr !== '\t' && chr !== '\n' && chr !== '\f' && chr !== '\r') break; + } return index; +}; + +var decodeBase64Chunk = function (chunk, alphabet, throwOnExtraBits) { + var chunkLength = chunk.length; + + if (chunkLength < 4) { + chunk += chunkLength === 2 ? 'AA' : 'A'; + } + + var triplet = (alphabet[at(chunk, 0)] << 18) + + (alphabet[at(chunk, 1)] << 12) + + (alphabet[at(chunk, 2)] << 6) + + alphabet[at(chunk, 3)]; + + var chunkBytes = [ + (triplet >> 16) & 255, + (triplet >> 8) & 255, + triplet & 255 + ]; + + if (chunkLength === 2) { + if (throwOnExtraBits && chunkBytes[1] !== 0) { + throw new SyntaxError('Extra bits'); + } + return [chunkBytes[0]]; + } + + if (chunkLength === 3) { + if (throwOnExtraBits && chunkBytes[2] !== 0) { + throw new SyntaxError('Extra bits'); + } + return [chunkBytes[0], chunkBytes[1]]; + } + + return chunkBytes; +}; + +var writeBytes = function (bytes, elements, written) { + var elementsLength = elements.length; + for (var index = 0; index < elementsLength; index++) { + bytes[written + index] = elements[index]; + } + return written + elementsLength; +}; + +/* eslint-disable max-statements, max-depth -- TODO */ +module.exports = function (string, options, into, maxLength) { + aString(string); + anObjectOrUndefined(options); + var alphabet = getAlphabetOption(options) === 'base64' ? base64Alphabet : base64UrlAlphabet; + var lastChunkHandling = options ? options.lastChunkHandling : undefined; + + if (lastChunkHandling === undefined) lastChunkHandling = 'loose'; + + if (lastChunkHandling !== 'loose' && lastChunkHandling !== 'strict' && lastChunkHandling !== 'stop-before-partial') { + throw new TypeError('Incorrect `lastChunkHandling` option'); + } + + if (into) notDetached(into.buffer); + + var stringLength = string.length; + var bytes = into || $Array(floor(stringLength * 3 / 4)); + var written = 0; + var read = 0; + var chunk = ''; + var index = 0; + + if (maxLength) while (true) { + index = skipAsciiWhitespace(string, index); + if (index === stringLength) { + if (chunk.length > 0) { + if (lastChunkHandling === 'stop-before-partial') { + break; + } + if (lastChunkHandling === 'loose') { + if (chunk.length === 1) { + throw new SyntaxError('Malformed padding: exactly one additional character'); + } + written = writeBytes(bytes, decodeBase64Chunk(chunk, alphabet, false), written); + } else { + throw new SyntaxError('Missing padding'); + } + } + read = stringLength; + break; + } + var chr = at(string, index); + ++index; + if (chr === '=') { + if (chunk.length < 2) { + throw new SyntaxError('Padding is too early'); + } + index = skipAsciiWhitespace(string, index); + if (chunk.length === 2) { + if (index === stringLength) { + if (lastChunkHandling === 'stop-before-partial') { + break; + } + throw new SyntaxError('Malformed padding: only one ='); + } + if (at(string, index) === '=') { + ++index; + index = skipAsciiWhitespace(string, index); + } + } + if (index < stringLength) { + throw new SyntaxError('Unexpected character after padding'); + } + written = writeBytes(bytes, decodeBase64Chunk(chunk, alphabet, lastChunkHandling === 'strict'), written); + read = stringLength; + break; + } + if (!hasOwn(alphabet, chr)) { + throw new SyntaxError('Unexpected character'); + } + var remainingBytes = maxLength - written; + if (remainingBytes === 1 && chunk.length === 2 || remainingBytes === 2 && chunk.length === 3) { + // special case: we can fit exactly the number of bytes currently represented by chunk, so we were just checking for `=` + break; + } + + chunk += chr; + if (chunk.length === 4) { + written = writeBytes(bytes, decodeBase64Chunk(chunk, alphabet, false), written); + chunk = ''; + read = index; + if (written === maxLength) { + break; + } + } + } + if (!into) bytes.length = written; + return { bytes: bytes, read: read, written: written }; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/uint8-from-hex.js +var uint8_from_hex_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var globalThis = (global_this_namespaceFn()); +var uncurryThis = (function_uncurry_this_namespaceFn()); + +var Uint8Array = globalThis.Uint8Array; +var SyntaxError = globalThis.SyntaxError; +var min = Math.min; +var stringMatch = uncurryThis(''.match); + +module.exports = function (string, into) { + var stringLength = string.length; + if (stringLength % 2 !== 0) throw new SyntaxError('String should be an even number of characters'); + var maxLength = into ? min(into.length, stringLength / 2) : stringLength / 2; + var bytes = into || new Uint8Array(maxLength); + var segments = stringMatch(string, /[\S\s]{2}/g); + var written = 0; + for (; written < maxLength; written++) { + var result = +('0x' + segments[written] + '0'); + // eslint-disable-next-line no-self-compare -- NaN check + if (result !== result) { + throw new SyntaxError('String should only contain hex characters'); + } + bytes[written] = result >> 4; + } + return { bytes: bytes, read: written << 1 }; +}; + +}); + +// MODULE: ./node_modules/core-js/internals/url-constructor-detection.js +var url_constructor_detection_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var fails = (fails_namespaceFn()); +var wellKnownSymbol = (well_known_symbol_namespaceFn()); +var DESCRIPTORS = (descriptors_namespaceFn()); +var IS_PURE = (is_pure_namespaceFn()); + +var ITERATOR = wellKnownSymbol('iterator'); + +module.exports = !fails(function () { + // eslint-disable-next-line unicorn/relative-url-style -- required for testing + var url = new URL('b?a=1&b=2&c=3', 'https://a'); + var params = url.searchParams; + var params2 = new URLSearchParams('a=1&a=2&b=3'); + var result = ''; + url.pathname = 'c%20d'; + params.forEach(function (value, key) { + params['delete']('b'); + result += key + value; + }); + params2['delete']('a', 2); + // `undefined` case is a Chromium 117 bug + // https://bugs.chromium.org/p/v8/issues/detail?id=14222 + params2['delete']('b', undefined); + return (IS_PURE && (!url.toJSON || !params2.has('a', 1) || params2.has('a', 2) || !params2.has('a', undefined) || params2.has('b'))) + || (!params.size && (IS_PURE || !DESCRIPTORS)) + || !params.sort + || url.href !== 'https://a/c%20d?a=1&c=3' + || params.get('c') !== '3' + || String(new URLSearchParams('?a=1')) !== 'a=1' + || !params[ITERATOR] + // throws in Edge + || new URL('https://a@b').username !== 'a' + || new URLSearchParams(new URLSearchParams('a=b')).get('a') !== 'b' + // not punycoded in Edge + || new URL('https://тест').host !== 'xn--e1aybc' + // not escaped in Chrome 62- + || new URL('https://a#б').hash !== '#%D0%B1' + // fails in Chrome 66- + || result !== 'a1c3' + // throws in Safari + || new URL('https://x', undefined).host !== 'x'; +}); + +}); + +// MODULE: ./node_modules/core-js/internals/use-symbol-as-uid.js +var use_symbol_as_uid_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +/* eslint-disable es/no-symbol -- required for testing */ +var NATIVE_SYMBOL = (symbol_constructor_detection_namespaceFn()); + +module.exports = NATIVE_SYMBOL && + !Symbol.sham && + typeof Symbol.iterator == 'symbol'; + +}); + +// MODULE: ./node_modules/core-js/internals/v8-prototype-define-bug.js +var v8_prototype_define_bug_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var DESCRIPTORS = (descriptors_namespaceFn()); +var fails = (fails_namespaceFn()); + +// V8 ~ Chrome 36- +// https://bugs.chromium.org/p/v8/issues/detail?id=3334 +module.exports = DESCRIPTORS && fails(function () { + // eslint-disable-next-line es/no-object-defineproperty -- required for testing + return Object.defineProperty(function () { /* empty */ }, 'prototype', { + value: 42, + writable: false + }).prototype !== 42; +}); + +}); + +// EXTERNAL MODULE: ./node_modules/core-js/internals/validate-arguments-length.js +var validate_arguments_length_namespaceFn = () => { + return __webpack_require__(812); +}; + +// MODULE: ./node_modules/core-js/internals/weak-map-basic-detection.js +var weak_map_basic_detection_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var globalThis = (global_this_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); + +var WeakMap = globalThis.WeakMap; + +module.exports = isCallable(WeakMap) && /native code/.test(String(WeakMap)); + +}); + +// MODULE: ./node_modules/core-js/internals/weak-map-helpers.js +var weak_map_helpers_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var uncurryThis = (function_uncurry_this_namespaceFn()); + +// eslint-disable-next-line es/no-weak-map -- safe +var WeakMapPrototype = WeakMap.prototype; + +module.exports = { + // eslint-disable-next-line es/no-weak-map -- safe + WeakMap: WeakMap, + set: uncurryThis(WeakMapPrototype.set), + get: uncurryThis(WeakMapPrototype.get), + has: uncurryThis(WeakMapPrototype.has), + remove: uncurryThis(WeakMapPrototype['delete']) +}; + +}); + +// MODULE: ./node_modules/core-js/internals/well-known-symbol.js +var well_known_symbol_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var globalThis = (global_this_namespaceFn()); +var shared = (shared_namespaceFn()); +var hasOwn = (has_own_property_namespaceFn()); +var uid = (uid_namespaceFn()); +var NATIVE_SYMBOL = (symbol_constructor_detection_namespaceFn()); +var USE_SYMBOL_AS_UID = (use_symbol_as_uid_namespaceFn()); + +var Symbol = globalThis.Symbol; +var WellKnownSymbolsStore = shared('wks'); +var createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol['for'] || Symbol : Symbol && Symbol.withoutSetter || uid; + +module.exports = function (name) { + if (!hasOwn(WellKnownSymbolsStore, name)) { + WellKnownSymbolsStore[name] = NATIVE_SYMBOL && hasOwn(Symbol, name) + ? Symbol[name] + : createWellKnownSymbol('Symbol.' + name); + } return WellKnownSymbolsStore[name]; +}; + +}); + +// MODULE: ./node_modules/core-js/modules/es.array.includes.js +var es_array_includes_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var $includes = (array_includes_namespaceFn().includes); +var fails = (fails_namespaceFn()); +var addToUnscopables = (add_to_unscopables_namespaceFn()); + +// FF99+ bug +var BROKEN_ON_SPARSE = fails(function () { + // eslint-disable-next-line es/no-array-prototype-includes -- detection + return !Array(1).includes(); +}); + +// Safari 26.4- bug +var BROKEN_ON_SPARSE_WITH_FROM_INDEX = fails(function () { + // eslint-disable-next-line no-sparse-arrays, es/no-array-prototype-includes -- detection + return [, 1].includes(undefined, 1); +}); + +// `Array.prototype.includes` method +// https://tc39.es/ecma262/#sec-array.prototype.includes +$({ target: 'Array', proto: true, forced: BROKEN_ON_SPARSE || BROKEN_ON_SPARSE_WITH_FROM_INDEX }, { + includes: function includes(el /* , fromIndex = 0 */) { + return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined); + } +}); + +// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables +addToUnscopables('includes'); + +}); + +// MODULE: ./node_modules/core-js/modules/es.array.push.js +var es_array_push_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var toObject = (to_object_namespaceFn()); +var lengthOfArrayLike = (length_of_array_like_namespaceFn()); +var setArrayLength = (array_set_length_namespaceFn()); +var doesNotExceedSafeInteger = (does_not_exceed_safe_integer_namespaceFn()); +var fails = (fails_namespaceFn()); + +var INCORRECT_TO_LENGTH = fails(function () { + return [].push.call({ length: 0x100000000 }, 1) !== 4294967297; +}); + +// V8 <= 121 and Safari <= 15.4; FF < 23 throws InternalError +// https://bugs.chromium.org/p/v8/issues/detail?id=12681 +var properErrorOnNonWritableLength = function () { + try { + // eslint-disable-next-line es/no-object-defineproperty -- safe + Object.defineProperty([], 'length', { writable: false }).push(); + } catch (error) { + return error instanceof TypeError; + } +}; + +var FORCED = INCORRECT_TO_LENGTH || !properErrorOnNonWritableLength(); + +// `Array.prototype.push` method +// https://tc39.es/ecma262/#sec-array.prototype.push +$({ target: 'Array', proto: true, arity: 1, forced: FORCED }, { + // eslint-disable-next-line no-unused-vars -- required for `.length` + push: function push(item) { + var O = toObject(this); + var len = lengthOfArrayLike(O); + var argCount = arguments.length; + doesNotExceedSafeInteger(len + argCount); + for (var i = 0; i < argCount; i++) { + O[len] = arguments[i]; + len++; + } + setArrayLength(O, len); + return len; + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.iterator.constructor.js +var es_iterator_constructor_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var globalThis = (global_this_namespaceFn()); +var anInstance = (an_instance_namespaceFn()); +var anObject = (an_object_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); +var getPrototypeOf = (object_get_prototype_of_namespaceFn()); +var defineBuiltInAccessor = (define_built_in_accessor_namespaceFn()); +var createProperty = (create_property_namespaceFn()); +var fails = (fails_namespaceFn()); +var hasOwn = (has_own_property_namespaceFn()); +var wellKnownSymbol = (well_known_symbol_namespaceFn()); +var IteratorPrototype = (iterators_core_namespaceFn().IteratorPrototype); +var DESCRIPTORS = (descriptors_namespaceFn()); +var IS_PURE = (is_pure_namespaceFn()); + +var CONSTRUCTOR = 'constructor'; +var ITERATOR = 'Iterator'; +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); + +var $TypeError = TypeError; +var NativeIterator = globalThis[ITERATOR]; + +// FF56- have non-standard global helper `Iterator` +var FORCED = IS_PURE + || !isCallable(NativeIterator) + || NativeIterator.prototype !== IteratorPrototype + // FF44- non-standard `Iterator` passes previous tests + || !fails(function () { NativeIterator({}); }); + +var IteratorConstructor = function Iterator() { + anInstance(this, IteratorPrototype); + if (getPrototypeOf(this) === IteratorPrototype) throw new $TypeError('Abstract class Iterator not directly constructable'); +}; + +var defineIteratorPrototypeAccessor = function (key, value) { + if (DESCRIPTORS) { + defineBuiltInAccessor(IteratorPrototype, key, { + configurable: true, + get: function () { + return value; + }, + set: function (replacement) { + anObject(this); + if (this === IteratorPrototype) throw new $TypeError("You can't redefine this property"); + if (hasOwn(this, key)) this[key] = replacement; + else createProperty(this, key, replacement); + } + }); + } else IteratorPrototype[key] = value; +}; + +if (!hasOwn(IteratorPrototype, TO_STRING_TAG)) defineIteratorPrototypeAccessor(TO_STRING_TAG, ITERATOR); + +if (FORCED || !hasOwn(IteratorPrototype, CONSTRUCTOR) || IteratorPrototype[CONSTRUCTOR] === Object) { + defineIteratorPrototypeAccessor(CONSTRUCTOR, IteratorConstructor); +} + +IteratorConstructor.prototype = IteratorPrototype; + +// `Iterator` constructor +// https://tc39.es/ecma262/#sec-iterator +$({ global: true, constructor: true, forced: FORCED }, { + Iterator: IteratorConstructor +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.iterator.every.js +var es_iterator_every_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var call = (function_call_namespaceFn()); +var iterate = (iterate_namespaceFn()); +var aCallable = (a_callable_namespaceFn()); +var anObject = (an_object_namespaceFn()); +var getIteratorDirect = (get_iterator_direct_namespaceFn()); +var iteratorClose = (iterator_close_namespaceFn()); +var iteratorHelperWithoutClosingOnEarlyError = (iterator_helper_without_closing_on_early_error_namespaceFn()); + +var everyWithoutClosingOnEarlyError = iteratorHelperWithoutClosingOnEarlyError('every', TypeError); + +// `Iterator.prototype.every` method +// https://tc39.es/ecma262/#sec-iterator.prototype.every +$({ target: 'Iterator', proto: true, real: true, forced: everyWithoutClosingOnEarlyError }, { + every: function every(predicate) { + anObject(this); + try { + aCallable(predicate); + } catch (error) { + iteratorClose(this, 'throw', error); + } + + if (everyWithoutClosingOnEarlyError) return call(everyWithoutClosingOnEarlyError, this, predicate); + + var record = getIteratorDirect(this); + var counter = 0; + return !iterate(record, function (value, stop) { + if (!predicate(value, counter++)) return stop(); + }, { IS_RECORD: true, INTERRUPTED: true }).stopped; + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.iterator.filter.js +var es_iterator_filter_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var call = (function_call_namespaceFn()); +var aCallable = (a_callable_namespaceFn()); +var anObject = (an_object_namespaceFn()); +var getIteratorDirect = (get_iterator_direct_namespaceFn()); +var createIteratorProxy = (iterator_create_proxy_namespaceFn()); +var callWithSafeIterationClosing = (call_with_safe_iteration_closing_namespaceFn()); +var IS_PURE = (is_pure_namespaceFn()); +var iteratorClose = (iterator_close_namespaceFn()); +var iteratorHelperThrowsOnInvalidIterator = (iterator_helper_throws_on_invalid_iterator_namespaceFn()); +var iteratorHelperWithoutClosingOnEarlyError = (iterator_helper_without_closing_on_early_error_namespaceFn()); + +var FILTER_WITHOUT_THROWING_ON_INVALID_ITERATOR = !IS_PURE && !iteratorHelperThrowsOnInvalidIterator('filter', function () { /* empty */ }); +var filterWithoutClosingOnEarlyError = !IS_PURE && !FILTER_WITHOUT_THROWING_ON_INVALID_ITERATOR + && iteratorHelperWithoutClosingOnEarlyError('filter', TypeError); + +var FORCED = IS_PURE || FILTER_WITHOUT_THROWING_ON_INVALID_ITERATOR || filterWithoutClosingOnEarlyError; + +var IteratorProxy = createIteratorProxy(function () { + var iterator = this.iterator; + var predicate = this.predicate; + var next = this.next; + var result, done, value; + while (true) { + result = anObject(call(next, iterator)); + done = this.done = !!result.done; + if (done) return; + value = result.value; + if (callWithSafeIterationClosing(iterator, predicate, [value, this.counter++], true)) return value; + } +}); + +// `Iterator.prototype.filter` method +// https://tc39.es/ecma262/#sec-iterator.prototype.filter +$({ target: 'Iterator', proto: true, real: true, forced: FORCED }, { + filter: function filter(predicate) { + anObject(this); + try { + aCallable(predicate); + } catch (error) { + iteratorClose(this, 'throw', error); + } + + if (filterWithoutClosingOnEarlyError) return call(filterWithoutClosingOnEarlyError, this, predicate); + + return new IteratorProxy(getIteratorDirect(this), { + predicate: predicate + }); + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.iterator.find.js +var es_iterator_find_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var call = (function_call_namespaceFn()); +var iterate = (iterate_namespaceFn()); +var aCallable = (a_callable_namespaceFn()); +var anObject = (an_object_namespaceFn()); +var getIteratorDirect = (get_iterator_direct_namespaceFn()); +var iteratorClose = (iterator_close_namespaceFn()); +var iteratorHelperWithoutClosingOnEarlyError = (iterator_helper_without_closing_on_early_error_namespaceFn()); + +var findWithoutClosingOnEarlyError = iteratorHelperWithoutClosingOnEarlyError('find', TypeError); + +// `Iterator.prototype.find` method +// https://tc39.es/ecma262/#sec-iterator.prototype.find +$({ target: 'Iterator', proto: true, real: true, forced: findWithoutClosingOnEarlyError }, { + find: function find(predicate) { + anObject(this); + try { + aCallable(predicate); + } catch (error) { + iteratorClose(this, 'throw', error); + } + + if (findWithoutClosingOnEarlyError) return call(findWithoutClosingOnEarlyError, this, predicate); + + var record = getIteratorDirect(this); + var counter = 0; + return iterate(record, function (value, stop) { + if (predicate(value, counter++)) return stop(value); + }, { IS_RECORD: true, INTERRUPTED: true }).result; + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.iterator.flat-map.js +var es_iterator_flat_map_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var call = (function_call_namespaceFn()); +var aCallable = (a_callable_namespaceFn()); +var anObject = (an_object_namespaceFn()); +var getIteratorDirect = (get_iterator_direct_namespaceFn()); +var getIteratorFlattenable = (get_iterator_flattenable_namespaceFn()); +var createIteratorProxy = (iterator_create_proxy_namespaceFn()); +var iteratorClose = (iterator_close_namespaceFn()); +var fails = (fails_namespaceFn()); +var IS_PURE = (is_pure_namespaceFn()); +var iteratorHelperThrowsOnInvalidIterator = (iterator_helper_throws_on_invalid_iterator_namespaceFn()); +var iteratorHelperWithoutClosingOnEarlyError = (iterator_helper_without_closing_on_early_error_namespaceFn()); + +// Should not throw an error for an iterator without `return` method. Fixed in Safari 26.2 +// https://bugs.webkit.org/show_bug.cgi?id=297532 +var THROWS_ON_ITERATOR_WITHOUT_RETURN = !IS_PURE && fails(function () { + // eslint-disable-next-line es/no-array-prototype-values, es/no-iterator-prototype-flatmap, es/no-iterator-prototype-find -- testing + return [1].values() + .flatMap(function () { return [1]; }) + .find(function () { return true; }) !== 1; +}); + +var FLAT_MAP_WITHOUT_THROWING_ON_INVALID_ITERATOR = !IS_PURE && !THROWS_ON_ITERATOR_WITHOUT_RETURN + && !iteratorHelperThrowsOnInvalidIterator('flatMap', function () { /* empty */ }); + +var flatMapWithoutClosingOnEarlyError = !IS_PURE && !THROWS_ON_ITERATOR_WITHOUT_RETURN && !FLAT_MAP_WITHOUT_THROWING_ON_INVALID_ITERATOR + && iteratorHelperWithoutClosingOnEarlyError('flatMap', TypeError); + +var FORCED = IS_PURE || THROWS_ON_ITERATOR_WITHOUT_RETURN || FLAT_MAP_WITHOUT_THROWING_ON_INVALID_ITERATOR + || flatMapWithoutClosingOnEarlyError; + +var IteratorProxy = createIteratorProxy(function () { + var iterator = this.iterator; + var mapper = this.mapper; + var result, inner; + + while (true) { + if (inner = this.inner) try { + result = anObject(call(inner.next, inner.iterator)); + if (!result.done) return result.value; + this.inner = null; + } catch (error) { iteratorClose(iterator, 'throw', error); } + + result = anObject(call(this.next, iterator)); + + if (this.done = !!result.done) return; + + try { + this.inner = getIteratorFlattenable(mapper(result.value, this.counter++), false); + } catch (error) { iteratorClose(iterator, 'throw', error); } + } +}); + +// `Iterator.prototype.flatMap` method +// https://tc39.es/ecma262/#sec-iterator.prototype.flatmap +$({ target: 'Iterator', proto: true, real: true, forced: FORCED }, { + flatMap: function flatMap(mapper) { + anObject(this); + try { + aCallable(mapper); + } catch (error) { + iteratorClose(this, 'throw', error); + } + + if (flatMapWithoutClosingOnEarlyError) return call(flatMapWithoutClosingOnEarlyError, this, mapper); + + return new IteratorProxy(getIteratorDirect(this), { + mapper: mapper, + inner: null + }); + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.iterator.for-each.js +var es_iterator_for_each_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var call = (function_call_namespaceFn()); +var iterate = (iterate_namespaceFn()); +var aCallable = (a_callable_namespaceFn()); +var anObject = (an_object_namespaceFn()); +var getIteratorDirect = (get_iterator_direct_namespaceFn()); +var iteratorClose = (iterator_close_namespaceFn()); +var iteratorHelperWithoutClosingOnEarlyError = (iterator_helper_without_closing_on_early_error_namespaceFn()); + +var forEachWithoutClosingOnEarlyError = iteratorHelperWithoutClosingOnEarlyError('forEach', TypeError); + +// `Iterator.prototype.forEach` method +// https://tc39.es/ecma262/#sec-iterator.prototype.foreach +$({ target: 'Iterator', proto: true, real: true, forced: forEachWithoutClosingOnEarlyError }, { + forEach: function forEach(fn) { + anObject(this); + try { + aCallable(fn); + } catch (error) { + iteratorClose(this, 'throw', error); + } + + if (forEachWithoutClosingOnEarlyError) return call(forEachWithoutClosingOnEarlyError, this, fn); + + var record = getIteratorDirect(this); + var counter = 0; + iterate(record, function (value) { + fn(value, counter++); + }, { IS_RECORD: true }); + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.iterator.map.js +var es_iterator_map_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var call = (function_call_namespaceFn()); +var aCallable = (a_callable_namespaceFn()); +var anObject = (an_object_namespaceFn()); +var getIteratorDirect = (get_iterator_direct_namespaceFn()); +var createIteratorProxy = (iterator_create_proxy_namespaceFn()); +var callWithSafeIterationClosing = (call_with_safe_iteration_closing_namespaceFn()); +var iteratorClose = (iterator_close_namespaceFn()); +var iteratorHelperThrowsOnInvalidIterator = (iterator_helper_throws_on_invalid_iterator_namespaceFn()); +var iteratorHelperWithoutClosingOnEarlyError = (iterator_helper_without_closing_on_early_error_namespaceFn()); +var IS_PURE = (is_pure_namespaceFn()); + +var MAP_WITHOUT_THROWING_ON_INVALID_ITERATOR = !IS_PURE && !iteratorHelperThrowsOnInvalidIterator('map', function () { /* empty */ }); +var mapWithoutClosingOnEarlyError = !IS_PURE && !MAP_WITHOUT_THROWING_ON_INVALID_ITERATOR + && iteratorHelperWithoutClosingOnEarlyError('map', TypeError); + +var FORCED = IS_PURE || MAP_WITHOUT_THROWING_ON_INVALID_ITERATOR || mapWithoutClosingOnEarlyError; + +var IteratorProxy = createIteratorProxy(function () { + var iterator = this.iterator; + var result = anObject(call(this.next, iterator)); + var done = this.done = !!result.done; + if (!done) return callWithSafeIterationClosing(iterator, this.mapper, [result.value, this.counter++], true); +}); + +// `Iterator.prototype.map` method +// https://tc39.es/ecma262/#sec-iterator.prototype.map +$({ target: 'Iterator', proto: true, real: true, forced: FORCED }, { + map: function map(mapper) { + anObject(this); + try { + aCallable(mapper); + } catch (error) { + iteratorClose(this, 'throw', error); + } + + if (mapWithoutClosingOnEarlyError) return call(mapWithoutClosingOnEarlyError, this, mapper); + + return new IteratorProxy(getIteratorDirect(this), { + mapper: mapper + }); + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.iterator.some.js +var es_iterator_some_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var call = (function_call_namespaceFn()); +var iterate = (iterate_namespaceFn()); +var aCallable = (a_callable_namespaceFn()); +var anObject = (an_object_namespaceFn()); +var getIteratorDirect = (get_iterator_direct_namespaceFn()); +var iteratorClose = (iterator_close_namespaceFn()); +var iteratorHelperWithoutClosingOnEarlyError = (iterator_helper_without_closing_on_early_error_namespaceFn()); + +var someWithoutClosingOnEarlyError = iteratorHelperWithoutClosingOnEarlyError('some', TypeError); + +// `Iterator.prototype.some` method +// https://tc39.es/ecma262/#sec-iterator.prototype.some +$({ target: 'Iterator', proto: true, real: true, forced: someWithoutClosingOnEarlyError }, { + some: function some(predicate) { + anObject(this); + try { + aCallable(predicate); + } catch (error) { + iteratorClose(this, 'throw', error); + } + + if (someWithoutClosingOnEarlyError) return call(someWithoutClosingOnEarlyError, this, predicate); + + var record = getIteratorDirect(this); + var counter = 0; + return iterate(record, function (value, stop) { + if (predicate(value, counter++)) return stop(); + }, { IS_RECORD: true, INTERRUPTED: true }).stopped; + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.iterator.to-array.js +var es_iterator_to_array_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var anObject = (an_object_namespaceFn()); +var createProperty = (create_property_namespaceFn()); +var iterate = (iterate_namespaceFn()); +var getIteratorDirect = (get_iterator_direct_namespaceFn()); + +// `Iterator.prototype.toArray` method +// https://tc39.es/ecma262/#sec-iterator.prototype.toarray +$({ target: 'Iterator', proto: true, real: true }, { + toArray: function toArray() { + var result = []; + var index = 0; + iterate(getIteratorDirect(anObject(this)), function (element) { + createProperty(result, index++, element); + }, { IS_RECORD: true }); + return result; + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.json.stringify.js +var es_json_stringify_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var getBuiltIn = (get_built_in_namespaceFn()); +var call = (function_call_namespaceFn()); +var uncurryThis = (function_uncurry_this_namespaceFn()); +var fails = (fails_namespaceFn()); +var isArray = (is_array_namespaceFn()); +var isCallable = (is_callable_namespaceFn()); +var isObject = (is_object_namespaceFn()); +var create = (object_create_namespaceFn()); +var isRawJSON = (is_raw_json_namespaceFn()); +var isSymbol = (is_symbol_namespaceFn()); +var classof = (classof_raw_namespaceFn()); +var thisNumberValue = (this_number_value_namespaceFn()); +var includes = (array_includes_namespaceFn().includes); +var hasOwn = (has_own_property_namespaceFn()); +var toString = (to_string_namespaceFn()); +var parseJSONString = (parse_json_string_namespaceFn()); +var uid = (uid_namespaceFn()); +var NATIVE_SYMBOL = (symbol_constructor_detection_namespaceFn()); +var NATIVE_RAW_JSON = (native_raw_json_namespaceFn()); + +var $String = String; +var $TypeError = TypeError; +var $stringify = getBuiltIn('JSON', 'stringify'); +var $BigInt = getBuiltIn('BigInt'); +var stringValueOf = uncurryThis(''.valueOf); +var booleanValueOf = uncurryThis(true.valueOf); +var bigIntValueOf = $BigInt && uncurryThis($BigInt.prototype.valueOf); +var exec = uncurryThis(/./.exec); +var charAt = uncurryThis(''.charAt); +var charCodeAt = uncurryThis(''.charCodeAt); +var replace = uncurryThis(''.replace); +var slice = uncurryThis(''.slice); +var push = uncurryThis([].push); +var pop = uncurryThis([].pop); +var numberToString = uncurryThis(1.1.toString); + +var surrogates = /[\uD800-\uDFFF]/g; +var leadingSurrogates = /^[\uD800-\uDBFF]$/; +var trailingSurrogates = /^[\uDC00-\uDFFF]$/; +var digits = /^\d+$/; + +// a placeholder of a raw JSON value +var RAW_MARK = uid(); +// a prefix of keys of a reordered object, see `createOrderedObject` +var KEY_MARK = uid(); +// the last key of a reordered object, marks the end of its serialization +var END_MARK = uid(); +var RAW_MARK_LENGTH = RAW_MARK.length; +var KEY_MARK_LENGTH = KEY_MARK.length; + +var WRONG_SYMBOLS_CONVERSION = !NATIVE_SYMBOL || fails(function () { + var symbol = getBuiltIn('Symbol')('stringify detection'); + // MS Edge converts symbol values to JSON as {} + return $stringify([symbol]) !== '[null]' + // WebKit converts symbol values to JSON as null + || $stringify({ a: symbol }) !== '{}' + // V8 throws on boxed symbols + || $stringify(Object(symbol)) !== '{}'; +}); + +// https://github.com/tc39/proposal-well-formed-stringify +var ILL_FORMED_UNICODE = fails(function () { + return $stringify('\uDF06\uD834') !== '"\\udf06\\ud834"' + || $stringify('\uDEAD') !== '"\\udead"'; +}); + +var isRawJSONValue = NATIVE_RAW_JSON ? getBuiltIn('JSON', 'isRawJSON') : isRawJSON; + +var stringifyWithProperSymbolsConversion = WRONG_SYMBOLS_CONVERSION ? function (it, replacer, space) { + return $stringify(it, function (key, value) { + var replaced = call(replacer, this, key, value); + if (!isSymbol(replaced)) return replaced; + }, space); +} : $stringify; + +var fixIllFormedJSON = function (match, offset, string) { + var prev = charAt(string, offset - 1); + var next = charAt(string, offset + 1); + if ( + (exec(leadingSurrogates, match) && !exec(trailingSurrogates, next)) || + (exec(trailingSurrogates, match) && !exec(leadingSurrogates, prev)) + ) { + return '\\u' + numberToString(charCodeAt(match, 0), 16); + } return match; +}; + +// `PropertyList` of `JSON.stringify` +// https://tc39.es/ecma262/#sec-json.stringify +var getPropertyList = function (replacer) { + if (!isArray(replacer)) return; + var rawLength = replacer.length; + var propertyList = []; + // a null prototype object is used as a set of already added keys to keep the deduplication linear + var addedKeys = create(null); + for (var i = 0; i < rawLength; i++) { + var element = replacer[i]; + var key; + if (typeof element == 'string') key = element; + else if (typeof element == 'number' || classof(element) === 'Number' || classof(element) === 'String') key = toString(element); + else continue; + if (!hasOwn(addedKeys, key)) { + addedKeys[key] = true; + push(propertyList, key); + } + } + return propertyList; +}; + +// values with such an internal slot are unwrapped by `SerializeJSONProperty` instead of being serialized as objects +var hasInternalSlot = function (valueOf, it) { + try { + valueOf(it); + return true; + } catch (error) { + return false; + } +}; + +// the slot check is expensive, so it's performed only for the kind reported by the value itself - +// a value lying about its kind via `Symbol.toStringTag` is serialized as an ordinary object +var isBoxedPrimitive = function (it) { + var kind = classof(it); + return (kind === 'Number' && hasInternalSlot(thisNumberValue, it)) + || (kind === 'String' && hasInternalSlot(stringValueOf, it)) + || (kind === 'Boolean' && hasInternalSlot(booleanValueOf, it)) + || (!!bigIntValueOf && kind === 'BigInt' && hasInternalSlot(bigIntValueOf, it)); +}; + +// only objects serialized by `SerializeJSONObject` are affected by the property list +var isSerializedAsObject = function (it) { + if (!isObject(it) || isCallable(it) || isArray(it)) return false; + try { + return !isBoxedPrimitive(it); + // `classof` reads `Symbol.toStringTag`, so a proxy could throw - it has no internal slots anyway + } catch (error) { + return true; + } +}; + +// the engine unwraps it in the same order as it would read the original property, +// so the property is read lazily and `toJSON` is called once and with the original key +var createElementHolder = function (holder, key) { + return { + toJSON: function () { + var element = holder[key]; + if (isObject(element) || typeof element == 'bigint') { + var elementToJSON = element.toJSON; + if (isCallable(elementToJSON)) element = call(elementToJSON, element, key); + } return element; + } + }; +}; + +// own keys of objects are sorted - integer-like keys are moved to the beginning, +// so such keys should be marked and restored in the serialized string +var getKeyPrefix = function (propertyList) { + for (var i = 0, length = propertyList.length; i < length; i++) { + if (exec(digits, propertyList[i])) return KEY_MARK; + } return ''; +}; + +// `SerializeJSONObject` iterates the property list, so the value is replaced with an object with keys in this order +var createOrderedObject = function (value, propertyList, keyPrefix) { + // keys are not marked if the property list has no integer-like keys, so `Object.prototype` + // with a setter, a non-writable property or `__proto__` should not intercept the assignment + var ordered = create(null); + for (var i = 0, length = propertyList.length; i < length; i++) { + var key = propertyList[i]; + ordered[keyPrefix + key] = createElementHolder(value, key); + } + ordered[END_MARK] = null; + return ordered; +}; + +// `JSON.stringify` method +// https://tc39.es/ecma262/#sec-json.stringify +// https://github.com/tc39/proposal-json-parse-with-source +if ($stringify) $({ target: 'JSON', stat: true, arity: 3, forced: WRONG_SYMBOLS_CONVERSION || ILL_FORMED_UNICODE || !NATIVE_RAW_JSON }, { + stringify: function stringify(text, replacer, space) { + var replacerFunction = isCallable(replacer) ? replacer : undefined; + var propertyList = replacerFunction ? undefined : getPropertyList(replacer); + var keyPrefix = propertyList && getKeyPrefix(propertyList); + var rawStrings = []; + var openObjects = []; + var parentOrdered = []; + var currentOrdered; + var marked = false; + var root = true; + + var json = stringifyWithProperSymbolsConversion(text, function (key, value) { + // some old implementations (like WebKit) could pass numbers as keys + key = $String(key); + + if (propertyList) { + if (key === END_MARK) { + pop(openObjects); + currentOrdered = pop(parentOrdered); + return; + } + if (root) root = false; + // the innermost reordered object already contains only keys of the property list and arrays are not + // affected by it, the rest of objects (like objects with a fake `Symbol.toStringTag`) are filtered here + else if (this !== currentOrdered && !isArray(this) && !includes(propertyList, key)) return; + } else if (replacerFunction) value = call(replacerFunction, this, key, value); + + if (isRawJSONValue(value)) { + if (NATIVE_RAW_JSON) return value; + marked = true; + return RAW_MARK + (push(rawStrings, value.rawJSON) - 1); + } + + if (propertyList && isSerializedAsObject(value)) { + // reordered objects are new each time, so cycles should be detected before the engine does it + if (includes(openObjects, value)) throw new $TypeError('Converting circular structure to JSON'); + var ordered = createOrderedObject(value, propertyList, keyPrefix); + push(openObjects, value); + push(parentOrdered, currentOrdered); + currentOrdered = ordered; + if (keyPrefix) marked = true; + return ordered; + } + + return value; + }, space); + + if (typeof json != 'string') return json; + + if (ILL_FORMED_UNICODE) json = replace(json, surrogates, fixIllFormedJSON); + + if (!marked) return json; + + var result = ''; + var length = json.length; + + for (var i = 0; i < length; i++) { + var chr = charAt(json, i); + if (chr === '"') { + var end = parseJSONString(json, ++i).end - 1; + var string = slice(json, i, end); + if (slice(string, 0, RAW_MARK_LENGTH) === RAW_MARK) result += rawStrings[slice(string, RAW_MARK_LENGTH)]; + else if (slice(string, 0, KEY_MARK_LENGTH) === KEY_MARK) result += '"' + slice(string, KEY_MARK_LENGTH) + '"'; + else result += '"' + string + '"'; + i = end; + } else result += chr; + } + + return result; + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.map.get-or-insert-computed.js +var es_map_get_or_insert_computed_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var aCallable = (a_callable_namespaceFn()); +var MapHelpers = (map_helpers_namespaceFn()); +var IS_PURE = (is_pure_namespaceFn()); + +var get = MapHelpers.get; +var has = MapHelpers.has; +var set = MapHelpers.set; + +// `Map.prototype.getOrInsertComputed` method +// https://tc39.es/ecma262/#sec-map.prototype.getorinsertcomputed +$({ target: 'Map', proto: true, real: true, forced: IS_PURE }, { + getOrInsertComputed: function getOrInsertComputed(key, callbackfn) { + var hasKey = has(this, key); + aCallable(callbackfn); + if (hasKey) return get(this, key); + // CanonicalizeKeyedCollectionKey + if (key === 0 && 1 / key === -Infinity) key = 0; + var value = callbackfn(key); + set(this, key, value); + return value; + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.map.get-or-insert.js +var es_map_get_or_insert_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var MapHelpers = (map_helpers_namespaceFn()); +var IS_PURE = (is_pure_namespaceFn()); + +var get = MapHelpers.get; +var has = MapHelpers.has; +var set = MapHelpers.set; + +// `Map.prototype.getOrInsert` method +// https://tc39.es/ecma262/#sec-map.prototype.getorinsert +$({ target: 'Map', proto: true, real: true, forced: IS_PURE }, { + getOrInsert: function getOrInsert(key, value) { + if (has(this, key)) return get(this, key); + set(this, key, value); + return value; + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.math.sum-precise.js +var es_math_sum_precise_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +// based on Shewchuk's algorithm for exactly floating point addition +// adapted from https://github.com/tc39/proposal-math-sum/blob/3513d58323a1ae25560e8700aa5294500c6c9287/polyfill/polyfill.mjs +var $ = (export_namespaceFn()); +var uncurryThis = (function_uncurry_this_namespaceFn()); +var iterate = (iterate_namespaceFn()); + +var $RangeError = RangeError; +var $TypeError = TypeError; +var $Infinity = Infinity; +var $NaN = NaN; +var abs = Math.abs; +var pow = Math.pow; +var push = uncurryThis([].push); + +var POW_2_1023 = pow(2, 1023); +var MAX_SAFE_INTEGER = pow(2, 53) - 1; // 2 ** 53 - 1 === 9007199254740991 +var MAX_DOUBLE = Number.MAX_VALUE; // 2 ** 1024 - 2 ** (1023 - 52) === 1.79769313486231570815e+308 +var MAX_ULP = pow(2, 971); // 2 ** (1023 - 52) === 1.99584030953471981166e+292 + +var NOT_A_NUMBER = {}; +var MINUS_INFINITY = {}; +var PLUS_INFINITY = {}; +var MINUS_ZERO = {}; +var FINITE = {}; + +// prerequisite: abs(x) >= abs(y) +var twosum = function (x, y) { + var hi = x + y; + var lo = y - (hi - x); + return { hi: hi, lo: lo }; +}; + +// `Math.sumPrecise` method +// https://tc39.es/ecma262/#sec-math.sumprecise +$({ target: 'Math', stat: true }, { + // eslint-disable-next-line max-statements -- ok + sumPrecise: function sumPrecise(items) { + var numbers = []; + var count = 0; + var state = MINUS_ZERO; + + iterate(items, function (n) { + if (++count > MAX_SAFE_INTEGER) throw new $RangeError('Maximum allowed index exceeded'); + if (typeof n != 'number') throw new $TypeError('Value is not a number'); + if (state !== NOT_A_NUMBER) { + // eslint-disable-next-line no-self-compare -- NaN check + if (n !== n) state = NOT_A_NUMBER; + else if (n === $Infinity) state = state === MINUS_INFINITY ? NOT_A_NUMBER : PLUS_INFINITY; + else if (n === -$Infinity) state = state === PLUS_INFINITY ? NOT_A_NUMBER : MINUS_INFINITY; + else if ((n !== 0 || (1 / n) === $Infinity) && (state === MINUS_ZERO || state === FINITE)) { + state = FINITE; + push(numbers, n); + } + } + }); + + switch (state) { + case NOT_A_NUMBER: return $NaN; + case MINUS_INFINITY: return -$Infinity; + case PLUS_INFINITY: return $Infinity; + case MINUS_ZERO: return -0; + } + + var partials = []; + var overflow = 0; // conceptually 2 ** 1024 times this value; the final partial is biased by this amount + var x, y, sum, hi, lo, tmp; + + for (var i = 0; i < numbers.length; i++) { + x = numbers[i]; + var actuallyUsedPartials = 0; + for (var j = 0; j < partials.length; j++) { + y = partials[j]; + if (abs(x) < abs(y)) { + tmp = x; + x = y; + y = tmp; + } + sum = twosum(x, y); + hi = sum.hi; + lo = sum.lo; + if (abs(hi) === $Infinity) { + var sign = hi === $Infinity ? 1 : -1; + overflow += sign; + + x = (x - (sign * POW_2_1023)) - (sign * POW_2_1023); + if (abs(x) < abs(y)) { + tmp = x; + x = y; + y = tmp; + } + sum = twosum(x, y); + hi = sum.hi; + lo = sum.lo; + } + if (lo !== 0) partials[actuallyUsedPartials++] = lo; + x = hi; + } + partials.length = actuallyUsedPartials; + if (x !== 0) push(partials, x); + } + + // compute the exact sum of partials, stopping once we lose precision + var n = partials.length - 1; + hi = 0; + lo = 0; + + if (overflow !== 0) { + var next = n >= 0 ? partials[n] : 0; + n--; + if (abs(overflow) > 1 || (overflow > 0 && next > 0) || (overflow < 0 && next < 0)) { + return overflow > 0 ? $Infinity : -$Infinity; + } + // here we actually have to do the arithmetic + // drop a factor of 2 so we can do it without overflow + // assert(abs(overflow) === 1) + sum = twosum(overflow * POW_2_1023, next / 2); + hi = sum.hi; + lo = sum.lo; + lo *= 2; + if (abs(2 * hi) === $Infinity) { + // rounding to the maximum value + if (hi > 0) { + return (hi === POW_2_1023 && lo === -(MAX_ULP / 2) && n >= 0 && partials[n] < 0) ? MAX_DOUBLE : $Infinity; + } return (hi === -POW_2_1023 && lo === (MAX_ULP / 2) && n >= 0 && partials[n] > 0) ? -MAX_DOUBLE : -$Infinity; + } + + if (lo !== 0) { + partials[++n] = lo; + lo = 0; + } + + hi *= 2; + } + + while (n >= 0) { + sum = twosum(hi, partials[n--]); + hi = sum.hi; + lo = sum.lo; + if (lo !== 0) break; + } + + if (n >= 0 && ((lo < 0 && partials[n] < 0) || (lo > 0 && partials[n] > 0))) { + y = lo * 2; + x = hi + y; + if (y === x - hi) hi = x; + } + + return hi; + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.promise.try.js +var es_promise_try_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var globalThis = (global_this_namespaceFn()); +var apply = (function_apply_namespaceFn()); +var slice = (array_slice_namespaceFn()); +var promiseResolve = (promise_resolve_namespaceFn()); +var newPromiseCapabilityModule = (new_promise_capability_namespaceFn()); +var aCallable = (a_callable_namespaceFn()); +var perform = (perform_namespaceFn()); +var fails = (fails_namespaceFn()); + +var Promise = globalThis.Promise; + +var ACCEPT_ARGUMENTS = false; +var FORCED = !Promise || !Promise['try'] || fails(function () { + var p = Promise.resolve(); + return Promise['try'](function (argument) { + // avoiding the use of polyfills of the previous iteration of this proposal + // that does not accept arguments of the callback + ACCEPT_ARGUMENTS = argument === 8; + return p; + // it should use `PromiseResolve` + // https://github.com/tc39/ecma262/pull/3883 + }, 8) !== p; +}) || !ACCEPT_ARGUMENTS; + +// `Promise.try` method +// https://tc39.es/ecma262/#sec-promise.try +$({ target: 'Promise', stat: true, forced: FORCED }, { + 'try': function (callbackfn /* , ...args */) { + var args = arguments.length > 1 ? slice(arguments, 1) : []; + var result = perform(function () { + return apply(aCallable(callbackfn), undefined, args); + }); + if (!result.error) return promiseResolve(this, result.value); + var promiseCapability = newPromiseCapabilityModule.f(this); + var reject = promiseCapability.reject; + reject(result.value); + return promiseCapability.promise; + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.set.difference.v2.js +var es_set_difference_v2_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var difference = (set_difference_namespaceFn()); +var fails = (fails_namespaceFn()); +var setMethodAcceptSetLike = (set_method_accept_set_like_namespaceFn()); + +var SET_LIKE_INCORRECT_BEHAVIOR = !setMethodAcceptSetLike('difference', function (result) { + return result.size === 0; +}); + +var FORCED = SET_LIKE_INCORRECT_BEHAVIOR || fails(function () { + // https://bugs.webkit.org/show_bug.cgi?id=288595 + var setLike = { + size: 1, + has: function () { return true; }, + keys: function () { + var index = 0; + return { + next: function () { + var done = index++ > 1; + if (baseSet.has(1)) baseSet.clear(); + return { done: done, value: 2 }; + } + }; + } + }; + // eslint-disable-next-line es/no-set -- testing + var baseSet = new Set([1, 2, 3, 4]); + // eslint-disable-next-line es/no-set-prototype-difference -- testing + return baseSet.difference(setLike).size !== 3; +}); + +// `Set.prototype.difference` method +// https://tc39.es/ecma262/#sec-set.prototype.difference +$({ target: 'Set', proto: true, real: true, forced: FORCED }, { + difference: difference +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.set.intersection.v2.js +var es_set_intersection_v2_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var fails = (fails_namespaceFn()); +var intersection = (set_intersection_namespaceFn()); +var setMethodAcceptSetLike = (set_method_accept_set_like_namespaceFn()); + +var INCORRECT = !setMethodAcceptSetLike('intersection', function (result) { + return result.size === 2 && result.has(1) && result.has(2); +}) || fails(function () { + // eslint-disable-next-line es/no-array-from, es/no-set, es/no-set-prototype-intersection -- testing + return String(Array.from(new Set([1, 2, 3]).intersection(new Set([3, 2])))) !== '3,2'; +}); + +// `Set.prototype.intersection` method +// https://tc39.es/ecma262/#sec-set.prototype.intersection +$({ target: 'Set', proto: true, real: true, forced: INCORRECT }, { + intersection: intersection +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.set.is-disjoint-from.v2.js +var es_set_is_disjoint_from_v2_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var isDisjointFrom = (set_is_disjoint_from_namespaceFn()); +var setMethodAcceptSetLike = (set_method_accept_set_like_namespaceFn()); + +var INCORRECT = !setMethodAcceptSetLike('isDisjointFrom', function (result) { + return !result; +}); + +// `Set.prototype.isDisjointFrom` method +// https://tc39.es/ecma262/#sec-set.prototype.isdisjointfrom +$({ target: 'Set', proto: true, real: true, forced: INCORRECT }, { + isDisjointFrom: isDisjointFrom +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.set.is-subset-of.v2.js +var es_set_is_subset_of_v2_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var isSubsetOf = (set_is_subset_of_namespaceFn()); +var setMethodAcceptSetLike = (set_method_accept_set_like_namespaceFn()); + +var INCORRECT = !setMethodAcceptSetLike('isSubsetOf', function (result) { + return result; +}); + +// `Set.prototype.isSubsetOf` method +// https://tc39.es/ecma262/#sec-set.prototype.issubsetof +$({ target: 'Set', proto: true, real: true, forced: INCORRECT }, { + isSubsetOf: isSubsetOf +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.set.is-superset-of.v2.js +var es_set_is_superset_of_v2_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var isSupersetOf = (set_is_superset_of_namespaceFn()); +var setMethodAcceptSetLike = (set_method_accept_set_like_namespaceFn()); + +var INCORRECT = !setMethodAcceptSetLike('isSupersetOf', function (result) { + return !result; +}); + +// `Set.prototype.isSupersetOf` method +// https://tc39.es/ecma262/#sec-set.prototype.issupersetof +$({ target: 'Set', proto: true, real: true, forced: INCORRECT }, { + isSupersetOf: isSupersetOf +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.set.symmetric-difference.v2.js +var es_set_symmetric_difference_v2_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var symmetricDifference = (set_symmetric_difference_namespaceFn()); +var setMethodGetKeysBeforeCloning = (set_method_get_keys_before_cloning_detection_namespaceFn()); +var setMethodAcceptSetLike = (set_method_accept_set_like_namespaceFn()); + +var FORCED = !setMethodAcceptSetLike('symmetricDifference') || !setMethodGetKeysBeforeCloning('symmetricDifference'); + +// `Set.prototype.symmetricDifference` method +// https://tc39.es/ecma262/#sec-set.prototype.symmetricdifference +$({ target: 'Set', proto: true, real: true, forced: FORCED }, { + symmetricDifference: symmetricDifference +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.set.union.v2.js +var es_set_union_v2_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var union = (set_union_namespaceFn()); +var setMethodGetKeysBeforeCloning = (set_method_get_keys_before_cloning_detection_namespaceFn()); +var setMethodAcceptSetLike = (set_method_accept_set_like_namespaceFn()); + +var FORCED = !setMethodAcceptSetLike('union') || !setMethodGetKeysBeforeCloning('union'); + +// `Set.prototype.union` method +// https://tc39.es/ecma262/#sec-set.prototype.union +$({ target: 'Set', proto: true, real: true, forced: FORCED }, { + union: union +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.typed-array.with.js +var es_typed_array_with_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var ArrayBufferViewCore = (array_buffer_view_core_namespaceFn()); +var isBigIntArray = (is_big_int_array_namespaceFn()); +var lengthOfArrayLike = (length_of_array_like_namespaceFn()); +var toIntegerOrInfinity = (to_integer_or_infinity_namespaceFn()); +var toBigInt = (to_big_int_namespaceFn()); + +var aTypedArray = ArrayBufferViewCore.aTypedArray; +var getTypedArrayConstructor = ArrayBufferViewCore.getTypedArrayConstructor; +var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod; + +var $RangeError = RangeError; + +var PROPER_ORDER = function () { + try { + // eslint-disable-next-line no-throw-literal, es/no-typed-arrays, es/no-array-prototype-with -- required for testing + new Int8Array(1)['with'](2, { valueOf: function () { throw 8; } }); + } catch (error) { + // some early implementations, like WebKit, does not follow the final semantic + // https://github.com/tc39/proposal-change-array-by-copy/pull/86 + return error === 8; + } +}(); + +// Bug in WebKit. It should truncate a negative fractional index to zero, but instead throws an error +var THROW_ON_NEGATIVE_FRACTIONAL_INDEX = PROPER_ORDER && function () { + try { + // eslint-disable-next-line es/no-typed-arrays, es/no-array-prototype-with -- required for testing + new Int8Array(1)['with'](-0.5, 1); + } catch (error) { + return true; + } +}(); + +// `%TypedArray%.prototype.with` method +// https://tc39.es/ecma262/#sec-%typedarray%.prototype.with +exportTypedArrayMethod('with', { 'with': function (index, value) { + var O = aTypedArray(this); + var len = lengthOfArrayLike(O); + var relativeIndex = toIntegerOrInfinity(index); + var actualIndex = relativeIndex < 0 ? len + relativeIndex : relativeIndex; + var numericValue = isBigIntArray(O) ? toBigInt(value) : +value; + if (actualIndex >= len || actualIndex < 0) throw new $RangeError('Incorrect index'); + var A = new (getTypedArrayConstructor(O))(len); + var k = 0; + for (; k < len; k++) A[k] = k === actualIndex ? numericValue : O[k]; + return A; +} }['with'], !PROPER_ORDER || THROW_ON_NEGATIVE_FRACTIONAL_INDEX); + +}); + +// MODULE: ./node_modules/core-js/modules/es.uint8-array.from-base64.js +var es_uint8_array_from_base64_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var globalThis = (global_this_namespaceFn()); +var arrayFromConstructorAndList = (array_from_constructor_and_list_namespaceFn()); +var $fromBase64 = (uint8_from_base64_namespaceFn()); + +var Uint8Array = globalThis.Uint8Array; + +var INCORRECT_BEHAVIOR_OR_DOESNT_EXISTS = !Uint8Array || !Uint8Array.fromBase64 || !function () { + // Webkit not throw an error on odd length string + try { + Uint8Array.fromBase64('a'); + return; + } catch (error) { /* empty */ } + try { + Uint8Array.fromBase64('', null); + } catch (error) { + return true; + } +}(); + +// `Uint8Array.fromBase64` method +// https://tc39.es/ecma262/#sec-uint8array.frombase64 +if (Uint8Array) $({ target: 'Uint8Array', stat: true, forced: INCORRECT_BEHAVIOR_OR_DOESNT_EXISTS }, { + fromBase64: function fromBase64(string /* , options */) { + var result = $fromBase64(string, arguments.length > 1 ? arguments[1] : undefined, null, 0x1FFFFFFFFFFFFF); + return arrayFromConstructorAndList(Uint8Array, result.bytes); + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.uint8-array.set-from-base64.js +var es_uint8_array_set_from_base64_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var globalThis = (global_this_namespaceFn()); +var $fromBase64 = (uint8_from_base64_namespaceFn()); +var anUint8Array = (an_uint8_array_namespaceFn()); + +var Uint8Array = globalThis.Uint8Array; + +var INCORRECT_BEHAVIOR_OR_DOESNT_EXISTS = !Uint8Array || !Uint8Array.prototype.setFromBase64 || !function () { + var target = new Uint8Array([255, 255, 255, 255, 255]); + try { + target.setFromBase64('', null); + return; + } catch (error) { /* empty */ } + // Webkit not throw an error on odd length string + try { + target.setFromBase64('a'); + return; + } catch (error) { /* empty */ } + try { + target.setFromBase64('MjYyZg==='); + } catch (error) { + return target[0] === 50 && target[1] === 54 && target[2] === 50 && target[3] === 255 && target[4] === 255; + } +}(); + +// `Uint8Array.prototype.setFromBase64` method +// https://tc39.es/ecma262/#sec-uint8array.prototype.setfrombase64 +if (Uint8Array) $({ target: 'Uint8Array', proto: true, forced: INCORRECT_BEHAVIOR_OR_DOESNT_EXISTS }, { + setFromBase64: function setFromBase64(string /* , options */) { + anUint8Array(this); + + var result = $fromBase64(string, arguments.length > 1 ? arguments[1] : undefined, this, this.length); + + return { read: result.read, written: result.written }; + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.uint8-array.set-from-hex.js +var es_uint8_array_set_from_hex_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var globalThis = (global_this_namespaceFn()); +var aString = (a_string_namespaceFn()); +var anUint8Array = (an_uint8_array_namespaceFn()); +var notDetached = (array_buffer_not_detached_namespaceFn()); +var $fromHex = (uint8_from_hex_namespaceFn()); + +// Should not throw an error on length-tracking views over ResizableArrayBuffer +// https://issues.chromium.org/issues/454630441 +function throwsOnLengthTrackingView() { + try { + // eslint-disable-next-line es/no-resizable-and-growable-arraybuffers -- required for testing + var rab = new ArrayBuffer(16, { maxByteLength: 1024 }); + // eslint-disable-next-line es/no-uint8array-prototype-setfromhex, es/no-typed-arrays -- required for testing + new Uint8Array(rab).setFromHex('cafed00d'); + } catch (error) { + return true; + } +} + +// `Uint8Array.prototype.setFromHex` method +// https://tc39.es/ecma262/#sec-uint8array.prototype.setfromhex +if (globalThis.Uint8Array) $({ target: 'Uint8Array', proto: true, forced: throwsOnLengthTrackingView() }, { + setFromHex: function setFromHex(string) { + anUint8Array(this); + aString(string); + notDetached(this.buffer); + var read = $fromHex(string, this).read; + return { read: read, written: read / 2 }; + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.uint8-array.to-base64.js +var es_uint8_array_to_base64_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +/* eslint-disable no-useless-assignment -- false positive for [index++] syntax */ +var $ = (export_namespaceFn()); +var globalThis = (global_this_namespaceFn()); +var uncurryThis = (function_uncurry_this_namespaceFn()); +var anObjectOrUndefined = (an_object_or_undefined_namespaceFn()); +var anUint8Array = (an_uint8_array_namespaceFn()); +var notDetached = (array_buffer_not_detached_namespaceFn()); +var base64Map = (base64_map_namespaceFn()); +var getAlphabetOption = (get_alphabet_option_namespaceFn()); + +var base64Alphabet = base64Map.i2c; +var base64UrlAlphabet = base64Map.i2cUrl; +var $floor = Math.floor; +var $ceil = Math.ceil; + +var charAt = uncurryThis(''.charAt); + +var Uint8Array = globalThis.Uint8Array; +var $Array = globalThis.Array; +var join = uncurryThis([].join); + +var INCORRECT_BEHAVIOR_OR_DOESNT_EXISTS = !Uint8Array || !Uint8Array.prototype.toBase64 || !function () { + try { + var target = new Uint8Array(); + target.toBase64(null); + } catch (error) { + return true; + } +}(); + +// `Uint8Array.prototype.toBase64` method +// https://tc39.es/ecma262/#sec-uint8array.prototype.tobase64 +if (Uint8Array) $({ target: 'Uint8Array', proto: true, forced: INCORRECT_BEHAVIOR_OR_DOESNT_EXISTS }, { + toBase64: function toBase64(/* options */) { + var array = anUint8Array(this); + var options = arguments.length ? anObjectOrUndefined(arguments[0]) : undefined; + var alphabet = getAlphabetOption(options) === 'base64' ? base64Alphabet : base64UrlAlphabet; + var omitPadding = !!options && !!options.omitPadding; + notDetached(this.buffer); + + var i = 0; + var length = array.length; + var result = $Array(omitPadding ? $floor(length / 3) * 4 + (length % 3 ? length % 3 + 1 : 0) : $ceil(length / 3) * 4); + var written = 0; + var triplet; + + var at = function (shift) { + return charAt(alphabet, (triplet >> (6 * shift)) & 63); + }; + + for (; i + 2 < length; i += 3) { + triplet = (array[i] << 16) + (array[i + 1] << 8) + array[i + 2]; + result[written++] = at(3); + result[written++] = at(2); + result[written++] = at(1); + result[written++] = at(0); + } + if (i + 2 === length) { + triplet = (array[i] << 16) + (array[i + 1] << 8); + result[written++] = at(3); + result[written++] = at(2); + result[written++] = at(1); + if (!omitPadding) result[written++] = '='; + } else if (i + 1 === length) { + triplet = array[i] << 16; + result[written++] = at(3); + result[written++] = at(2); + if (!omitPadding) { + result[written++] = '='; + result[written++] = '='; + } + } + + return join(result, ''); + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.uint8-array.to-hex.js +var es_uint8_array_to_hex_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var globalThis = (global_this_namespaceFn()); +var uncurryThis = (function_uncurry_this_namespaceFn()); +var anUint8Array = (an_uint8_array_namespaceFn()); +var notDetached = (array_buffer_not_detached_namespaceFn()); + +var numberToString = uncurryThis(1.1.toString); +var join = uncurryThis([].join); +var $Array = Array; + +var Uint8Array = globalThis.Uint8Array; + +var INCORRECT_BEHAVIOR_OR_DOESNT_EXISTS = !Uint8Array || !Uint8Array.prototype.toHex || !(function () { + try { + var target = new Uint8Array([255, 255, 255, 255, 255, 255, 255, 255]); + return target.toHex() === 'ffffffffffffffff'; + } catch (error) { + return false; + } +})(); + +// `Uint8Array.prototype.toHex` method +// https://tc39.es/ecma262/#sec-uint8array.prototype.tohex +if (Uint8Array) $({ target: 'Uint8Array', proto: true, forced: INCORRECT_BEHAVIOR_OR_DOESNT_EXISTS }, { + toHex: function toHex() { + anUint8Array(this); + notDetached(this.buffer); + var result = $Array(this.length); + for (var i = 0, length = this.length; i < length; i++) { + var hex = numberToString(this[i], 16); + result[i] = hex.length === 1 ? '0' + hex : hex; + } + return join(result, ''); + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.weak-map.get-or-insert-computed.js +var es_weak_map_get_or_insert_computed_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var aCallable = (a_callable_namespaceFn()); +var aWeakMap = (a_weak_map_namespaceFn()); +var aWeakKey = (a_weak_key_namespaceFn()); +var WeakMapHelpers = (weak_map_helpers_namespaceFn()); +var IS_PURE = (is_pure_namespaceFn()); + +var get = WeakMapHelpers.get; +var has = WeakMapHelpers.has; +var set = WeakMapHelpers.set; + +var FORCED = IS_PURE || !function () { + try { + // eslint-disable-next-line es/no-weak-map, no-throw-literal -- testing + if (WeakMap.prototype.getOrInsertComputed) new WeakMap().getOrInsertComputed(1, function () { throw 1; }); + } catch (error) { + // FF144 Nightly - Beta 3 bug + // https://bugzilla.mozilla.org/show_bug.cgi?id=1988369 + return error instanceof TypeError; + } +}(); + +// `WeakMap.prototype.getOrInsertComputed` method +// https://tc39.es/ecma262/#sec-weakmap.prototype.getorinsertcomputed +$({ target: 'WeakMap', proto: true, real: true, forced: FORCED }, { + getOrInsertComputed: function getOrInsertComputed(key, callbackfn) { + if (!IS_PURE) aWeakMap(this); + aWeakKey(key); + aCallable(callbackfn); + if (has(this, key)) return get(this, key); + var value = callbackfn(key); + set(this, key, value); + return value; + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/es.weak-map.get-or-insert.js +var es_weak_map_get_or_insert_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var WeakMapHelpers = (weak_map_helpers_namespaceFn()); +var IS_PURE = (is_pure_namespaceFn()); + +var get = WeakMapHelpers.get; +var has = WeakMapHelpers.has; +var set = WeakMapHelpers.set; + +// `WeakMap.prototype.getOrInsert` method +// https://tc39.es/ecma262/#sec-weakmap.prototype.getorinsert +$({ target: 'WeakMap', proto: true, real: true, forced: IS_PURE }, { + getOrInsert: function getOrInsert(key, value) { + if (has(this, key)) return get(this, key); + set(this, key, value); + return value; + } +}); + +}); + +// MODULE: ./node_modules/core-js/modules/web.self.js +var web_self_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var globalThis = (global_this_namespaceFn()); +var defineBuiltInAccessor = (define_built_in_accessor_namespaceFn()); +var DESCRIPTORS = (descriptors_namespaceFn()); + +var $TypeError = TypeError; +// eslint-disable-next-line es/no-object-defineproperty -- safe +var defineProperty = Object.defineProperty; +var INCORRECT_VALUE = globalThis.self !== globalThis; + +// `self` getter +// https://html.spec.whatwg.org/multipage/window-object.html#dom-self +try { + if (DESCRIPTORS) { + // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe + var descriptor = Object.getOwnPropertyDescriptor(globalThis, 'self'); + // some engines have `self`, but with incorrect descriptor + // https://github.com/denoland/deno/issues/15765 + if (INCORRECT_VALUE || !descriptor || !descriptor.get || !descriptor.enumerable) { + defineBuiltInAccessor(globalThis, 'self', { + get: function self() { + return globalThis; + }, + set: function self(value) { + if (this !== globalThis) throw new $TypeError('Illegal invocation'); + defineProperty(globalThis, 'self', { + value: value, + writable: true, + configurable: true, + enumerable: true + }); + }, + configurable: true, + enumerable: true + }); + } + } else $({ global: true, simple: true, forced: INCORRECT_VALUE }, { + self: globalThis + }); +} catch (error) { /* empty */ } + +}); + +// MODULE: ./node_modules/core-js/modules/web.url.parse.js +var web_url_parse_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, exports) { + +var $ = (export_namespaceFn()); +var getBuiltIn = (get_built_in_namespaceFn()); +var validateArgumentsLength = (validate_arguments_length_namespaceFn()); +var toString = (to_string_namespaceFn()); +var USE_NATIVE_URL = (url_constructor_detection_namespaceFn()); + +var URL = getBuiltIn('URL'); + +// `URL.parse` method +// https://url.spec.whatwg.org/#dom-url-parse +$({ target: 'URL', stat: true, forced: !USE_NATIVE_URL }, { + parse: function parse(url) { + var length = validateArgumentsLength(arguments.length, 1); + var urlString = toString(url); + var base = length < 2 || arguments[1] === undefined ? undefined : toString(arguments[1]); + try { + return new URL(urlString, base); + } catch (error) { + return null; + } + } +}); + +}); + +;// ./node_modules/core-js/modules/es.array.push.js +es_array_push_namespaceFn(); + +;// ./node_modules/core-js/modules/es.iterator.constructor.js +es_iterator_constructor_namespaceFn(); + +;// ./node_modules/core-js/modules/es.iterator.filter.js +es_iterator_filter_namespaceFn(); + +;// ./node_modules/core-js/modules/es.iterator.map.js +es_iterator_map_namespaceFn(); + +;// ./node_modules/core-js/modules/es.iterator.some.js +es_iterator_some_namespaceFn(); + +;// ./node_modules/core-js/modules/es.map.get-or-insert.js +es_map_get_or_insert_namespaceFn(); + +;// ./node_modules/core-js/modules/es.map.get-or-insert-computed.js +es_map_get_or_insert_computed_namespaceFn(); + +;// ./node_modules/core-js/modules/es.set.difference.v2.js +es_set_difference_v2_namespaceFn(); + +;// ./node_modules/core-js/modules/es.set.intersection.v2.js +es_set_intersection_v2_namespaceFn(); + +;// ./node_modules/core-js/modules/es.set.is-disjoint-from.v2.js +es_set_is_disjoint_from_v2_namespaceFn(); + +;// ./node_modules/core-js/modules/es.set.is-subset-of.v2.js +es_set_is_subset_of_v2_namespaceFn(); + +;// ./node_modules/core-js/modules/es.set.is-superset-of.v2.js +es_set_is_superset_of_v2_namespaceFn(); + +;// ./node_modules/core-js/modules/es.set.symmetric-difference.v2.js +es_set_symmetric_difference_v2_namespaceFn(); + +;// ./node_modules/core-js/modules/es.set.union.v2.js +es_set_union_v2_namespaceFn(); + +;// ./node_modules/core-js/modules/es.typed-array.with.js +es_typed_array_with_namespaceFn(); + +;// ./node_modules/core-js/modules/es.uint8-array.set-from-base64.js +es_uint8_array_set_from_base64_namespaceFn(); + +;// ./node_modules/core-js/modules/es.uint8-array.set-from-hex.js +es_uint8_array_set_from_hex_namespaceFn(); + +;// ./node_modules/core-js/modules/es.uint8-array.to-base64.js +es_uint8_array_to_base64_namespaceFn(); + +;// ./node_modules/core-js/modules/es.uint8-array.to-hex.js +es_uint8_array_to_hex_namespaceFn(); + +;// ./node_modules/core-js/modules/web.self.js +web_self_namespaceFn(); + +;// ./node_modules/core-js/modules/es.array.includes.js +es_array_includes_namespaceFn(); + +;// ./node_modules/core-js/modules/web.url.parse.js +web_url_parse_namespaceFn(); + +;// ./src/shared/util.js + + + + + + + + + + + + + + + + + + + +const isNodeJS = typeof process === "object" && process + "" === "[object process]" && !process.versions.nw && !(process.versions.electron && process.type && process.type !== "browser"); +const BBOX_INIT = [Infinity, Infinity, -Infinity, -Infinity]; +const F32_BBOX_INIT = new Float32Array(BBOX_INIT); +const FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0]; +const LINE_FACTOR = 1.35; +const LINE_DESCENT_FACTOR = 0.35; +const BASELINE_FACTOR = LINE_DESCENT_FACTOR / LINE_FACTOR; +const SVG_NS = "http://www.w3.org/2000/svg"; +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 = (/* unused pure expression or super */ null && ({ + DISABLE: 0, + ENABLE: 1, + ENABLE_FORMS: 2, + ENABLE_STORAGE: 3 +})); +const AnnotationPrefix = "pdfjs_internal_id_"; +const AnnotationEditorPrefix = "pdfjs_internal_editor_"; +const AnnotationEditorType = { + DISABLE: -1, + NONE: 0, + FREETEXT: 3, + HIGHLIGHT: 9, + STAMP: 13, + INK: 15, + POPUP: 16, + SIGNATURE: 101, + COMMENT: 102 +}; +const AnnotationEditorParamsType = (/* unused pure expression or super */ null && ({ + RESIZE: 1, + CREATE: 2, + FREETEXT_SIZE: 11, + FREETEXT_COLOR: 12, + FREETEXT_OPACITY: 13, + INK_COLOR: 21, + INK_THICKNESS: 22, + INK_OPACITY: 23, + INK_COLOR_AND_OPACITY: 24, + HIGHLIGHT_COLOR: 31, + HIGHLIGHT_THICKNESS: 32, + HIGHLIGHT_FREE: 33, + HIGHLIGHT_SHOW_ALL: 34, + DRAW_STEP: 41 +})); +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 MeshFigureType = { + TRIANGLES: 1, + LATTICE: 2, + PATCH: 3 +}; +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, + RICHMEDIA: 27 +}; +const AnnotationReplyType = { + GROUP: "Group", + REPLY: "R" +}; +const AnnotationRenditionOperation = { + PLAY_OR_RESUME: 0, + STOP: 1, + PAUSE: 2, + RESUME: 3, + PLAY: 4 +}; +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, + rawFillPath: 94 +}; +const DrawOPS = { + moveTo: 0, + lineTo: 1, + curveTo: 2, + quadraticCurveTo: 3, + closePath: 4 +}; +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.info(`Info: ${msg}`); + } +} +function warn(msg) { + if (verbosity >= VerbosityLevel.WARNINGS) { + console.warn(`Warning: ${msg}`); + } +} +function unreachable(msg) { + throw new Error(msg); +} +function util_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; + } + if (options && typeof url === "string") { + if (options.addDefaultProtocol && url.startsWith("www.")) { + const dots = url.match(/\./g); + if (dots?.length >= 2) { + url = `http://${url}`; + } + } + if (options.tryConvertEncoding) { + try { + url = stringToUTF8String(url); + } catch {} + } + } + const absoluteUrl = baseUrl ? URL.parse(url, baseUrl) : URL.parse(url); + return _isValidProtocol(absoluteUrl) ? absoluteUrl : null; +} +function updateUrlHash(url, hash, allowRel = false) { + const res = URL.parse(url); + if (res) { + res.hash = hash; + return res.href; + } + if (allowRel && createValidAbsoluteUrl(url, "http://example.com")) { + return url.split("#", 1)[0] + `${hash ? `#${hash}` : ""}`; + } + return ""; +} +function stripPath(str) { + return str.substring(str.lastIndexOf("/") + 1); +} +function util_shadow(obj, prop, value, nonSerializable = false) { + Object.defineProperty(obj, prop, { + value, + enumerable: !nonSerializable, + configurable: true, + writable: false + }); + return value; +} +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 BaseException { + constructor(msg, code) { + super(msg, "PasswordException"); + this.code = code; + } +} +class UnknownErrorException extends BaseException { + constructor(msg, details) { + super(msg, "UnknownErrorException"); + this.details = details; + } +} +class InvalidPDFException extends BaseException { + constructor(msg) { + super(msg, "InvalidPDFException"); + } +} +class ResponseException extends BaseException { + constructor(msg, status, missing) { + super(msg, "ResponseException"); + this.status = status; + this.missing = missing; + } +} +class FormatError extends BaseException { + constructor(msg) { + super(msg, "FormatError"); + } +} +class AbortException extends BaseException { + constructor(msg) { + super(msg, "AbortException"); + } +} +function bytesToString(bytes) { + if (typeof bytes !== "object" || bytes?.length === undefined) { + unreachable("Invalid argument for bytesToString"); + } + 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(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; +} +class FeatureTest { + static get isLittleEndian() { + const buffer8 = new Uint8Array(4); + buffer8[0] = 1; + const view32 = new Uint32Array(buffer8.buffer, 0, 1); + return util_shadow(this, "isLittleEndian", view32[0] === 1); + } + static get isOffscreenCanvasSupported() { + return util_shadow(this, "isOffscreenCanvasSupported", typeof OffscreenCanvas !== "undefined"); + } + static get isImageDecoderSupported() { + return util_shadow(this, "isImageDecoderSupported", typeof ImageDecoder !== "undefined"); + } + static get isFloat16ArraySupported() { + return util_shadow(this, "isFloat16ArraySupported", typeof Float16Array !== "undefined"); + } + static get isSanitizerSupported() { + return util_shadow(this, "isSanitizerSupported", typeof Sanitizer !== "undefined"); + } + static get platform() { + const { + platform, + userAgent + } = navigator; + return util_shadow(this, "platform", { + isAndroid: userAgent.includes("Android"), + isLinux: platform.includes("Linux"), + isMac: platform.includes("Mac"), + isWindows: platform.includes("Win"), + isFirefox: userAgent.includes("Firefox") + }); + } + static get isCanvasFilterSupported() { + let ctx; + if (this.isOffscreenCanvasSupported) { + ctx = new OffscreenCanvas(1, 1).getContext("2d"); + } + return util_shadow(this, "isCanvasFilterSupported", ctx?.filter !== undefined); + } + static get isAlphaColorInputSupported() { + return util_shadow(this, "isAlphaColorInputSupported", false); + } + static get isBackdropFilterSupported() { + return util_shadow(this, "isBackdropFilterSupported", typeof CSS !== "undefined" && CSS.supports("backdrop-filter", "blur(1px)")); + } +} +class Util { + static get hexNums() { + return util_shadow(this, "hexNums", Array.from({ + length: 256 + }, (_, n) => n.toString(16).padStart(2, "0"))); + } + static makeHexColor(r, g, b) { + return `#${this.hexNums[r]}${this.hexNums[g]}${this.hexNums[b]}`; + } + static transform(m1, m2) { + return [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 multiplyByDOMMatrix(m, md) { + return [m[0] * md.a + m[2] * md.b, m[1] * md.a + m[3] * md.b, m[0] * md.c + m[2] * md.d, m[1] * md.c + m[3] * md.d, m[0] * md.e + m[2] * md.f + m[4], m[1] * md.e + m[3] * md.f + m[5]]; + } + static applyTransform(p, m, pos = 0) { + const p0 = p[pos]; + const p1 = p[pos + 1]; + p[pos] = p0 * m[0] + p1 * m[2] + m[4]; + p[pos + 1] = p0 * m[1] + p1 * m[3] + m[5]; + } + static applyTransformToBezier(p, transform, pos = 0) { + const m0 = transform[0]; + const m1 = transform[1]; + const m2 = transform[2]; + const m3 = transform[3]; + const m4 = transform[4]; + const m5 = transform[5]; + for (let i = 0; i < 6; i += 2) { + const pI = p[pos + i]; + const pI1 = p[pos + i + 1]; + p[pos + i] = pI * m0 + pI1 * m2 + m4; + p[pos + i + 1] = pI * m1 + pI1 * m3 + m5; + } + } + static applyInverseTransform(p, m) { + const p0 = p[0]; + const p1 = p[1]; + const d = m[0] * m[3] - m[1] * m[2]; + p[0] = (p0 * m[3] - p1 * m[2] + m[2] * m[5] - m[4] * m[3]) / d; + p[1] = (-p0 * m[1] + p1 * m[0] + m[4] * m[1] - m[5] * m[0]) / d; + } + static axialAlignedBoundingBox(rect, transform, output) { + const m0 = transform[0]; + const m1 = transform[1]; + const m2 = transform[2]; + const m3 = transform[3]; + const m4 = transform[4]; + const m5 = transform[5]; + const r0 = rect[0]; + const r1 = rect[1]; + const r2 = rect[2]; + const r3 = rect[3]; + let a0 = m0 * r0 + m4; + let a2 = a0; + let a1 = m0 * r2 + m4; + let a3 = a1; + let b0 = m3 * r1 + m5; + let b2 = b0; + let b1 = m3 * r3 + m5; + let b3 = b1; + if (m1 !== 0 || m2 !== 0) { + const m1r0 = m1 * r0; + const m1r2 = m1 * r2; + const m2r1 = m2 * r1; + const m2r3 = m2 * r3; + a0 += m2r1; + a3 += m2r1; + a1 += m2r3; + a2 += m2r3; + b0 += m1r0; + b3 += m1r0; + b1 += m1r2; + b2 += m1r2; + } + output[0] = Math.min(output[0], a0, a1, a2, a3); + output[1] = Math.min(output[1], b0, b1, b2, b3); + output[2] = Math.max(output[2], a0, a1, a2, a3); + output[3] = Math.max(output[3], b0, b1, b2, b3); + } + static inverseTransform(m) { + const d = m[0] * m[3] - m[1] * m[2]; + return [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 singularValueDecompose2dScale(matrix, output) { + const m0 = matrix[0]; + const m1 = matrix[1]; + const m2 = matrix[2]; + const m3 = matrix[3]; + const a = m0 ** 2 + m1 ** 2; + const b = m0 * m2 + m1 * m3; + const c = m2 ** 2 + m3 ** 2; + const first = (a + c) / 2; + const second = Math.sqrt(first ** 2 - (a * c - b ** 2)); + output[0] = Math.sqrt(first + second || 1); + output[1] = Math.sqrt(first - second || 1); + } + static normalizeRect(rect) { + const r = rect.slice(0); + if (rect[0] > rect[2]) { + r[0] = rect[2]; + r[2] = rect[0]; + } + if (rect[1] > rect[3]) { + r[1] = rect[3]; + r[3] = rect[1]; + } + return 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])); + return yLow > yHigh ? null : [xLow, yLow, xHigh, yHigh]; + } + static pointBoundingBox(x, y, minMax) { + 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 rectBoundingBox(x0, y0, x1, y1, minMax) { + minMax[0] = Math.min(minMax[0], x0, x1); + minMax[1] = Math.min(minMax[1], y0, y1); + minMax[2] = Math.max(minMax[2], x0, x1); + minMax[3] = Math.max(minMax[3], y0, y1); + } + static #getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, t, minMax) { + if (t <= 0 || t >= 1) { + return; + } + 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 #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.#getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, (-b - sqrtDelta) / a2, minMax); + } + static bezierBoundingBox(x0, y0, x1, y1, x2, y2, x3, y3, 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); + 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); + } +} +function stringToUTF8String(str) { + return decodeURIComponent(escape(str)); +} +function utf8StringToString(str) { + return unescape(encodeURIComponent(str)); +} +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; +} +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.randomUUID === "function") { + return crypto.randomUUID(); + } + const buf = new Uint8Array(32); + crypto.getRandomValues(buf); + return bytesToString(buf); +} +function _isValidExplicitDest(validRef, validName, dest) { + if (!Array.isArray(dest) || dest.length < 2) { + return false; + } + const [page, zoom, ...args] = dest; + if (!validRef(page) && !Number.isInteger(page)) { + return false; + } + if (!validName(zoom)) { + return false; + } + const argsLen = args.length; + let allowNull = true; + switch (zoom.name) { + case "XYZ": + if (argsLen < 2 || argsLen > 3) { + return false; + } + break; + case "Fit": + case "FitB": + return argsLen === 0; + case "FitH": + case "FitBH": + case "FitV": + case "FitBV": + if (argsLen > 1) { + return false; + } + break; + case "FitR": + if (argsLen !== 4) { + return false; + } + allowNull = false; + break; + default: + return false; + } + for (const arg of args) { + if (typeof arg === "number" || allowNull && arg === null) { + continue; + } + return false; + } + return true; +} +const makeArr = () => []; +const makeMap = () => new Map(); +const makeObj = () => Object.create(null); +const makeSet = () => new Set(); +if (typeof Blob.prototype.bytes !== "function") { + Blob.prototype.bytes = async function () { + return new Uint8Array(await this.arrayBuffer()); + }; +} +if (typeof Response.prototype.bytes !== "function") { + Response.prototype.bytes = async function () { + return new Uint8Array(await this.arrayBuffer()); + }; +} +if (typeof Iterator.prototype.join !== "function") { + Iterator.prototype.join = function (separator) { + return [...this].join(separator); + }; +} + +;// ./node_modules/core-js/modules/es.iterator.every.js +es_iterator_every_namespaceFn(); + +;// ./src/core/primitives.js + + + + + + + + + + + +const CIRCULAR_REF = Symbol("CIRCULAR_REF"); +const EOF = Symbol("EOF"); +const CmdCache = new Map(); +const NameCache = new Map(); +const RefCache = new Map(); +function clearPrimitiveCaches() { + CmdCache.clear(); + NameCache.clear(); + RefCache.clear(); +} +class Name { + constructor(name) { + this.name = name; + } + static get(name) { + let n = NameCache.get(name); + if (!n) { + n = new Name(name); + NameCache.set(name, n); + } + return n; + } +} +class Cmd { + constructor(cmd) { + this.cmd = cmd; + } + static get(cmd) { + let c = CmdCache.get(cmd); + if (!c) { + c = new Cmd(cmd); + CmdCache.set(cmd, c); + } + return c; + } +} +const nonSerializable = () => nonSerializable; +class Dict { + __nonSerializable__ = nonSerializable; + #map = new Map(); + objId = null; + suppressEncryption = false; + xref; + constructor(xref = null) { + this.xref = xref; + } + assignXref(newXref) { + this.xref = newXref; + } + get size() { + return this.#map.size; + } + #getValue(isAsync, key1, key2) { + let value = this.#map.get(key1); + if (value === undefined && key2 !== undefined) { + value = this.#map.get(key2); + } + if (value instanceof Ref && this.xref) { + return isAsync ? this.xref.fetchAsync(value, this.suppressEncryption) : this.xref.fetch(value, this.suppressEncryption); + } + return value; + } + get(key1, key2) { + return this.#getValue(false, key1, key2); + } + async getAsync(key1, key2) { + return this.#getValue(true, key1, key2); + } + getArray(key1, key2) { + let value = this.#getValue(false, key1, key2); + 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(key) { + return this.#map.get(key); + } + getKeys() { + return this.#map.keys(); + } + getRawValues() { + return this.#map.values(); + } + getRawEntries() { + return this.#map.entries(); + } + set(key, value) { + this.#map.set(key, value); + } + setIfNotExists(key, value) { + if (!this.has(key)) { + this.set(key, value); + } + } + setIfNumber(key, value) { + if (typeof value === "number") { + this.set(key, value); + } + } + setIfArray(key, value) { + if (Array.isArray(value) || ArrayBuffer.isView(value)) { + this.set(key, value); + } + } + setIfDefined(key, value) { + if (value !== undefined && value !== null) { + this.set(key, value); + } + } + setIfName(key, value) { + if (typeof value === "string") { + this.set(key, Name.get(value)); + } else if (value instanceof Name) { + this.set(key, value); + } + } + setIfDict(key, value) { + if (value instanceof Dict) { + this.set(key, value); + } + } + has(key) { + return this.#map.has(key); + } + *[Symbol.iterator]() { + for (const [key, value] of this.#map) { + yield [key, value instanceof Ref && this.xref ? this.xref.fetch(value, this.suppressEncryption) : value]; + } + } + static get empty() { + const emptyDict = new Dict(null); + emptyDict.set = (key, value) => { + unreachable("Should not call `set` on the empty dictionary."); + }; + return util_shadow(this, "empty", emptyDict); + } + static merge({ + xref, + dictArray, + mergeSubDicts = false + }) { + const mergedDict = new Dict(xref), + properties = new Map(); + for (const dict of dictArray) { + if (!(dict instanceof Dict)) { + continue; + } + for (const [key, value] of dict.getRawEntries()) { + const property = properties.getOrInsertComputed(key, makeArr); + if (property.length && !(mergeSubDicts && value instanceof Dict)) { + continue; + } + property.push(value); + } + } + for (const [name, values] of properties) { + if (values.length === 1 || !(values[0] instanceof Dict)) { + mergedDict.set(name, values[0]); + continue; + } + const subDict = new Dict(xref); + for (const dict of values) { + for (const [key, value] of dict.getRawEntries()) { + subDict.setIfNotExists(key, value); + } + } + if (subDict.size > 0) { + mergedDict.set(name, subDict); + } + } + properties.clear(); + return mergedDict.size > 0 ? mergedDict : Dict.empty; + } + clone() { + const dict = new Dict(this.xref); + for (const [key, value] of this.#map) { + dict.set(key, value); + } + return dict; + } + delete(key) { + this.#map.delete(key); + } +} +class Ref { + #str; + constructor(str, num, gen) { + this.#str = str; + this.num = num; + this.gen = gen; + } + toString() { + return this.#str; + } + static fromString(str) { + let ref = RefCache.get(str); + if (ref) { + return ref; + } + const m = /^([1-9]\d*)R([1-9]\d*)?$/.exec(str); + if (!m) { + return null; + } + ref = new Ref(str, parseInt(m[1], 10), !m[2] ? 0 : parseInt(m[2], 10)); + RefCache.set(str, ref); + return ref; + } + static get(num, gen) { + const str = gen === 0 ? `${num}R` : `${num}R${gen}`; + let ref = RefCache.get(str); + if (!ref) { + ref = new Ref(str, num, gen); + RefCache.set(str, ref); + } + return ref; + } +} +class RefSet { + #set = new Set(); + constructor(parent = null) { + if (parent) { + for (const refStr of parent) { + this.#set.add(refStr); + } + } + } + has(ref) { + return this.#set.has(ref.toString()); + } + put(ref) { + this.#set.add(ref.toString()); + } + remove(ref) { + this.#set.delete(ref.toString()); + } + [Symbol.iterator]() { + return this.#set.keys(); + } + clear() { + this.#set.clear(); + } +} +class RefMap { + #map = new Map(); + get size() { + return this.#map.size; + } + get(ref) { + return this.#map.get(ref.toString()); + } + has(ref) { + return this.#map.has(ref.toString()); + } + put(ref, obj) { + this.#map.set(ref.toString(), obj); + } + putAlias(ref, aliasRef) { + this.#map.set(ref.toString(), this.get(aliasRef)); + } + getOrPutComputed(ref, callback) { + const map = this.#map, + refStr = ref.toString(); + if (!map.has(refStr)) { + map.set(refStr, callback(ref)); + } + return map.get(refStr); + } + [Symbol.iterator]() { + return this.#map.values(); + } + clear() { + this.#map.clear(); + } + *values() { + yield* this.#map.values(); + } + *items() { + for (const [ref, value] of this.#map) { + yield [Ref.fromString(ref), value]; + } + } + *keys() { + for (const ref of this.#map.keys()) { + yield Ref.fromString(ref); + } + } +} +function isName(v, name) { + return v instanceof Name && (name === undefined || v.name === name); +} +function isCmd(v, cmd) { + return v instanceof Cmd && (cmd === undefined || v.cmd === cmd); +} +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 { + get length() { + unreachable("Abstract getter `length` accessed"); + } + get isEmpty() { + unreachable("Abstract getter `isEmpty` accessed"); + } + get isDataLoaded() { + return util_shadow(this, "isDataLoaded", true); + } + getByte() { + unreachable("Abstract method `getByte` called"); + } + getBytes(length) { + unreachable("Abstract method `getBytes` called"); + } + async getImageData(length, decoderOptions) { + return this.getBytes(length, decoderOptions); + } + async asyncGetBytes() { + unreachable("Abstract method `asyncGetBytes` called"); + } + get isAsync() { + return false; + } + get isAsyncDecoder() { + return false; + } + get isImageStream() { + return false; + } + get canAsyncDecodeImageFromBuffer() { + return false; + } + async getTransferableImage(width, height) { + return null; + } + peekByte() { + const peekedByte = this.getByte(); + if (peekedByte !== -1) { + this.pos--; + } + return peekedByte; + } + peekBytes(length) { + const bytes = this.getBytes(length); + this.pos -= bytes.length; + return bytes; + } + getUint16() { + const b0 = this.getByte(); + const b1 = this.getByte(); + return b0 === -1 || b1 === -1 ? -1 : (b0 << 8) + b1; + } + getInt32() { + const b0 = this.getByte(); + const b1 = this.getByte(); + const b2 = this.getByte(); + const b3 = this.getByte(); + return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3; + } + getByteRange(begin, end) { + unreachable("Abstract method `getByteRange` called"); + } + getString(length) { + return bytesToString(this.getBytes(length)); + } + skip(n) { + this.pos += n || 1; + } + reset() { + unreachable("Abstract method `reset` called"); + } + moveStart() { + unreachable("Abstract method `moveStart` called"); + } + makeSubStream(start, length, dict = null) { + unreachable("Abstract method `makeSubStream` called"); + } + clone() { + unreachable("Abstract method `clone` called"); + } + getBaseStreams() { + return null; + } + getOriginalStream() { + return this.stream?.getOriginalStream() || this; + } +} + +;// ./src/shared/css_utils.js +const CONTROL_CHAR_REGEXP = /\p{Cc}/u; +function isCSSString(str) { + const quote = str[0]; + if (str.length < 2 || quote !== `"` && quote !== `'` || str.at(-1) !== quote) { + return false; + } + const end = str.length - 1; + for (let i = 1; i < end; i++) { + const char = str[i]; + if (char === quote || CONTROL_CHAR_REGEXP.test(char)) { + return false; + } + if (char === "\\") { + if (++i >= end || CONTROL_CHAR_REGEXP.test(str[i])) { + return false; + } + } + } + return true; +} +function serializeFontFamily(fontFamily) { + if (isCSSString(fontFamily)) { + return fontFamily; + } + const escaped = fontFamily.replaceAll(/["\\\p{Cc}]/gu, char => char === `"` || char === "\\" ? `\\${char}` : `\\${char.codePointAt(0).toString(16)} `); + return `"${escaped}"`; +} + +;// ./src/core/string_utils.js + + + +function isAscii(str) { + return typeof str === "string" && (!str || /^[\x00-\x7F]*$/.test(str)); +} +function stringToAsciiOrUTF16BE(str) { + return str === null || str === undefined || isAscii(str) ? str : stringToUTF16String(str, true); +} +function stringToUTF16HexString(str) { + const buf = []; + for (let i = 0, ii = str.length; i < ii; i++) { + const char = str.charCodeAt(i); + buf.push(Util.hexNums[char >> 8 & 0xff], Util.hexNums[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 buf.join(""); +} +const PDFStringTranslateTable = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2d8, 0x2c7, 0x2c6, 0x2d9, 0x2dd, 0x2db, 0x2da, 0x2dc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x192, 0x2044, 0x2039, 0x203a, 0x2212, 0x2030, 0x201e, 0x201c, 0x201d, 0x2018, 0x2019, 0x201a, 0x2122, 0xfb01, 0xfb02, 0x141, 0x152, 0x160, 0x178, 0x17d, 0x131, 0x142, 0x153, 0x161, 0x17e, 0, 0x20ac]; +const PDFStringTextDecoders = Object.create(null); +function stringToPDFString(str, keepEscapeSequence = false) { + 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 = PDFStringTextDecoders[encoding] ??= new TextDecoder(encoding, { + fatal: true + }); + const buffer = stringToBytes(str); + const decoded = decoder.decode(buffer); + return keepEscapeSequence || !decoded.includes("\x1b") ? decoded : decoded.replaceAll(/\x1b[^\x1b]*(?:\x1b|$)/g, ""); + } catch (ex) { + warn(`stringToPDFString: "${ex}".`); + } + } + } + const strBuf = []; + for (let i = 0, ii = str.length; i < ii; i++) { + const charCode = str.charCodeAt(i); + if (!keepEscapeSequence && charCode === 0x1b) { + while (++i < ii && str.charCodeAt(i) !== 0x1b) {} + continue; + } + const code = PDFStringTranslateTable[charCode]; + strBuf.push(code ? String.fromCharCode(code) : str.charAt(i)); + } + return strBuf.join(""); +} + +;// ./src/core/core_utils.js + + + + + + + + + + + + + + + + + + + + + + + +const PDF_VERSION_REGEXP = /^[1-9]\.\d$/; +const MAX_INT_32 = 2 ** 31 - 1; +const IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0]; +const RESOURCES_KEYS_OPERATOR_LIST = ["ColorSpace", "ExtGState", "Font", "Pattern", "Properties", "Shading", "XObject"]; +const RESOURCES_KEYS_TEXT_CONTENT = ["ExtGState", "Font", "Properties", "XObject"]; +function getLookupTableFactory(initializer, useArray = false) { + let lookup; + return function () { + if (initializer) { + lookup = useArray ? [] : Object.create(null); + initializer(lookup); + initializer = null; + } + return lookup; + }; +} +class MissingDataException extends BaseException { + constructor(begin, end) { + super(`Missing data [${begin}, ${end})`, "MissingDataException"); + this.begin = begin; + this.end = end; + } +} +class ParserEOFException extends BaseException { + constructor(msg) { + super(msg, "ParserEOFException"); + } +} +class XRefEntryException extends BaseException { + constructor(msg) { + super(msg, "XRefEntryException"); + } +} +class XRefParseException extends BaseException { + constructor(msg) { + super(msg, "XRefParseException"); + } +} +function arrayBuffersToBytes(arr) { + const length = arr.length; + if (length === 0) { + return new Uint8Array(0); + } + 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; +} +async function fetchBinaryData(url) { + const response = await fetch(url); + if (!response.ok) { + throw new Error(`Failed to fetch file "${url}" with "${response.statusText}".`); + } + return response.bytes(); +} +function getInheritableProperty({ + dict, + key, + getArray = false, + stopWhenFound = true +}) { + let values; + const visited = new RefSet(); + while (dict instanceof Dict && !(dict.objId && visited.has(dict.objId))) { + if (dict.objId) { + visited.put(dict.objId); + } + const value = getArray ? dict.getArray(key) : dict.get(key); + if (value !== undefined) { + if (stopWhenFound) { + return value; + } + (values ||= []).push(value); + } + dict = dict.get("Parent"); + } + return values; +} +function getParentToUpdate(dict, ref, xref) { + const visited = new RefSet(); + const firstDict = dict; + const result = { + dict: null, + ref: null + }; + while (dict instanceof Dict && !visited.has(ref)) { + visited.put(ref); + if (dict.has("T")) { + break; + } + ref = dict.getRaw("Parent"); + if (!(ref instanceof Ref)) { + return result; + } + dict = xref.fetch(ref); + } + if (dict instanceof Dict && dict !== firstDict) { + result.dict = dict; + result.ref = ref; + } + return result; +} +function deepCompare(a, b) { + if (a === b) { + return true; + } + if (a instanceof Ref && b instanceof Ref) { + return isRefsEqual(a, b); + } + if (a instanceof Name && b instanceof Name) { + return a.name === b.name; + } + if (a instanceof Dict && b instanceof Dict) { + if (a.size !== b.size) { + return false; + } + for (const [key, value1] of a.getRawEntries()) { + const value2 = b.getRaw(key); + if (value2 === undefined || !deepCompare(value1, value2)) { + return false; + } + } + return true; + } + if (Array.isArray(a) && Array.isArray(b)) { + if (a.length !== b.length) { + return false; + } + for (let i = 0, ii = a.length; i < ii; i++) { + if (!deepCompare(a[i], b[i])) { + return false; + } + } + return true; + } + return false; +} +const ROMAN_NUMBER_MAP = ["", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM", "", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC", "", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"]; +function toRomanNumerals(number, lowerCase = false) { + util_assert(Number.isInteger(number) && number > 0, "The number should be a positive integer."); + const roman = "M".repeat(number / 1000 | 0) + ROMAN_NUMBER_MAP[number % 1000 / 100 | 0] + ROMAN_NUMBER_MAP[10 + (number % 100 / 10 | 0)] + ROMAN_NUMBER_MAP[20 + number % 10]; + return lowerCase ? roman.toLowerCase() : roman; +} +function isWhiteSpace(ch) { + return ch === 0x20 || ch === 0x09 || ch === 0x0d || ch === 0x0a; +} +function isBooleanArray(arr, len) { + return Array.isArray(arr) && (len === null || arr.length === len) && arr.every(x => typeof x === "boolean"); +} +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 instanceof BigInt64Array || arr instanceof BigUint64Array) && (len === null || arr.length === len); +} +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); + return m ? { + name: m[1], + pos: parseInt(m[2], 10) + } : { + name: component, + pos: 0 + }; + }); +} +function escapePDFName(str) { + const buffer = []; + let start = 0; + for (let i = 0, ii = str.length; i < ii; i++) { + const char = str.charCodeAt(i); + if (char < 0x21 || char > 0x7e || char === 0x23 || char === 0x28 || char === 0x29 || char === 0x3c || char === 0x3e || char === 0x5b || char === 0x5d || char === 0x7b || char === 0x7d || char === 0x2f || char === 0x25) { + if (start < i) { + buffer.push(str.substring(start, i)); + } + buffer.push(`#${char.toString(16).padStart(2, "0")}`); + start = i + 1; + } + } + if (buffer.length === 0) { + return str; + } + if (start < str.length) { + buffer.push(str.substring(start)); + } + return buffer.join(""); +} +function escapeString(str) { + return str.replaceAll(/([()\\\n\r])/g, match => { + if (match === "\n") { + return "\\n"; + } else if (match === "\r") { + return "\\r"; + } + return `\\${match}`; + }); +} +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, true).replaceAll("\x00", ""); + if (code) { + list.push(code.trim()); + } + } + _collectJS(entry.getRaw("Next"), xref, list, parents); + } + if (parent) { + parents.remove(parent); + } +} +function _collectAction(dict, name, xref, actions) { + const list = []; + _collectJS(dict, xref, list, new RefSet()); + if (list.length) { + actions.set(name, list); + } +} +function collectActions(xref, dict, eventType) { + const actions = new Map(); + 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, rawActionDict] of additionalActions.getRawEntries()) { + const action = eventType[key]; + if (action) { + _collectAction(rawActionDict, action, xref, actions); + } + } + } + } + if (dict.has("A")) { + _collectAction(dict.get("A"), "Action", xref, actions); + } + return actions.size ? actions : null; +} +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(str) { + const buffer = []; + let start = 0; + for (let i = 0, ii = str.length; i < ii; i++) { + const char = str.codePointAt(i); + if (0x20 <= char && char <= 0x7e) { + const entity = XMLEntities[char]; + if (entity) { + if (start < i) { + buffer.push(str.substring(start, i)); + } + buffer.push(entity); + start = i + 1; + } + } else { + if (start < i) { + buffer.push(str.substring(start, i)); + } + buffer.push(`&#x${char.toString(16).toUpperCase()};`); + if (char > 0xffff) { + i++; + } + start = i + 1; + } + } + if (buffer.length === 0) { + return str; + } + if (start < str.length) { + buffer.push(str.substring(start)); + } + return buffer.join(""); +} +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 false; + } + if (CONTROL_CHAR_REGEXP.test(fontFamily)) { + if (mustWarn) { + warn(`FontFamily contains control characters: ${fontFamily}.`); + } + 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 normalizeCSSFontFamily(fontFamily) { + return fontFamily.replaceAll(/( +)(\d)?/g, (_, spaces, digit) => digit ?? " "); +} +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(str) { + const URL_OPEN_METHODS = ["app.launchURL", "window.open", "xfa.host.gotoURL"]; + const regex = new RegExp("^\\s*(" + URL_OPEN_METHODS.join("|").replaceAll(".", "\\.") + ")\\((?:'|\")([^'\"]*)(?:'|\")(?:,\\s*(\\w+)\\)|\\))", "i"); + const jsUrl = regex.exec(str); + if (jsUrl?.[2]) { + return { + url: jsUrl[2], + newWindow: jsUrl[1] === "app.launchURL" && jsUrl[3] === "true" + }; + } + return null; +} +function core_utils_numberToString(value) { + if (Number.isInteger(value)) { + return value.toString(); + } + const roundedValue = Math.round(value * 100); + if (roundedValue % 100 === 0) { + return (roundedValue / 100).toString(); + } + return roundedValue % 10 === 0 ? value.toFixed(1) : value.toFixed(2); +} +function getNewAnnotationsMap(annotationStorage) { + if (!annotationStorage) { + return null; + } + const newAnnotationsByPage = new Map(); + for (const [key, value] of annotationStorage) { + if (!key.startsWith(AnnotationEditorPrefix)) { + continue; + } + newAnnotationsByPage.getOrInsertComputed(value.pageIndex, makeArr).push(value); + } + return newAnnotationsByPage.size > 0 ? newAnnotationsByPage : null; +} +function getModificationDate(date = new Date()) { + if (!(date instanceof Date)) { + date = new Date(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(""); +} +function getRotationMatrix(rotation, width, height) { + switch (rotation) { + case 90: + return [0, 1, -1, 0, width, 0]; + case 180: + return [-1, 0, 0, -1, width, height]; + case 270: + return [0, -1, 1, 0, 0, height]; + default: + throw new Error("Invalid rotation"); + } +} +function getSizeInBytes(x) { + return Math.ceil(Math.ceil(Math.log2(1 + x)) / 8); +} + +;// ./external/qcms/qcms_utils.js + + + + + +const ALPHA_MASK = new Uint8Array(new Uint32Array([1]).buffer)[0] === 1 ? 0xff000000 : 0x000000ff; +const RGB_MASK = ~ALPHA_MASK; +class QCMS { + static #memoryArray = null; + static _memory = null; + static _destBuffer = null; + static _destOffset = 0; + static _keepAlpha = false; + static get _memoryArray() { + const array = this.#memoryArray; + if (array?.byteLength) { + return array; + } + return this.#memoryArray = new Uint8Array(this._memory.buffer); + } +} +function copy_result(ptr, len) { + const { + _destBuffer, + _destOffset, + _keepAlpha, + _memoryArray + } = QCMS; + if (!_keepAlpha) { + _destBuffer.set(_memoryArray.subarray(ptr, ptr + len), _destOffset); + return; + } + const count = len >> 2; + const destStart = _destBuffer.byteOffset + _destOffset; + if (((destStart | ptr) & 3) === 0) { + const dest32 = new Uint32Array(_destBuffer.buffer, destStart, count); + const src32 = new Uint32Array(QCMS._memory.buffer, ptr, count); + for (let i = 0; i < count; i++) { + dest32[i] = dest32[i] & ALPHA_MASK | src32[i] & RGB_MASK; + } + return; + } + for (let i = ptr, ii = ptr + len, j = _destOffset; i < ii; i += 4, j += 4) { + _destBuffer[j] = _memoryArray[i]; + _destBuffer[j + 1] = _memoryArray[i + 1]; + _destBuffer[j + 2] = _memoryArray[i + 2]; + } +} + +;// ./external/qcms/qcms.js + + + + + + +const DataType = Object.freeze({ + RGB8: 0, + "0": "RGB8", + RGBA8: 1, + "1": "RGBA8", + BGRA8: 2, + "2": "BGRA8", + Gray8: 3, + "3": "Gray8", + GrayA8: 4, + "4": "GrayA8", + CMYK: 5, + "5": "CMYK" +}); +const Intent = Object.freeze({ + Perceptual: 0, + "0": "Perceptual", + RelativeColorimetric: 1, + "1": "RelativeColorimetric", + Saturation: 2, + "2": "Saturation", + AbsoluteColorimetric: 3, + "3": "AbsoluteColorimetric" +}); +function qcms_convert_array(transformer, src, add_alpha) { + const ptr0 = passArray8ToWasm0(src, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + wasm.qcms_convert_array(transformer, ptr0, len0, add_alpha); +} +function qcms_convert_four(transformer, src1, src2, src3, src4) { + const ret = wasm.qcms_convert_four(transformer, src1, src2, src3, src4); + return ret >>> 0; +} +function qcms_convert_one(transformer, src) { + const ret = wasm.qcms_convert_one(transformer, src); + return ret >>> 0; +} +function qcms_convert_three(transformer, src1, src2, src3) { + const ret = wasm.qcms_convert_three(transformer, src1, src2, src3); + return ret >>> 0; +} +function qcms_drop_transformer(transformer) { + wasm.qcms_drop_transformer(transformer); +} +function qcms_transformer_from_memory(mem, in_type, intent) { + const ptr0 = passArray8ToWasm0(mem, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.qcms_transformer_from_memory(ptr0, len0, in_type, intent); + return ret >>> 0; +} +function __wbg_get_imports() { + const import0 = { + __proto__: null, + __wbg___wbindgen_throw_344f42d3211c4765: function (arg0, arg1) { + throw new Error(getStringFromWasm0(arg0, arg1)); + }, + __wbg_copy_result_0d15f3bf9d9012ae: function (arg0, arg1) { + copy_result(arg0 >>> 0, arg1 >>> 0); + }, + __wbindgen_init_externref_table: function () { + const table = wasm.__wbindgen_externrefs; + const offset = table.grow(4); + table.set(0, undefined); + table.set(offset + 0, undefined); + table.set(offset + 1, null); + table.set(offset + 2, true); + table.set(offset + 3, false); + } + }; + return { + __proto__: null, + "./qcms_bg.js": import0 + }; +} +function getStringFromWasm0(ptr, len) { + return decodeText(ptr >>> 0, len); +} +let cachedUint8ArrayMemory0 = null; +function getUint8ArrayMemory0() { + if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) { + cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8ArrayMemory0; +} +function passArray8ToWasm0(arg, malloc) { + const ptr = malloc(arg.length * 1, 1) >>> 0; + getUint8ArrayMemory0().set(arg, ptr / 1); + WASM_VECTOR_LEN = arg.length; + return ptr; +} +let cachedTextDecoder = new TextDecoder('utf-8', { + ignoreBOM: true, + fatal: true +}); +cachedTextDecoder.decode(); +const MAX_SAFARI_DECODE_BYTES = 2146435072; +let numBytesDecoded = 0; +function decodeText(ptr, len) { + numBytesDecoded += len; + if (numBytesDecoded >= MAX_SAFARI_DECODE_BYTES) { + cachedTextDecoder = new TextDecoder('utf-8', { + ignoreBOM: true, + fatal: true + }); + cachedTextDecoder.decode(); + numBytesDecoded = len; + } + return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); +} +let WASM_VECTOR_LEN = 0; +let wasmModule, wasmInstance, wasm; +function __wbg_finalize_init(instance, module) { + wasmInstance = instance; + wasm = instance.exports; + wasmModule = module; + cachedUint8ArrayMemory0 = null; + wasm.__wbindgen_start(); + return wasm; +} +async function __wbg_load(module, imports) { + if (typeof Response === 'function' && module instanceof Response) { + if (typeof WebAssembly.instantiateStreaming === 'function') { + try { + return await WebAssembly.instantiateStreaming(module, imports); + } catch (e) { + const validResponse = module.ok && expectedResponseType(module.type); + if (validResponse && module.headers.get('Content-Type') !== 'application/wasm') { + console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); + } else { + throw e; + } + } + } + const bytes = await module.arrayBuffer(); + return await WebAssembly.instantiate(bytes, imports); + } else { + const instance = await WebAssembly.instantiate(module, imports); + if (instance instanceof WebAssembly.Instance) { + return { + instance, + module + }; + } else { + return instance; + } + } + function expectedResponseType(type) { + switch (type) { + case 'basic': + case 'cors': + case 'default': + return true; + } + return false; + } +} +function initSync(module) { + if (wasm !== undefined) return wasm; + if (module !== undefined) { + if (Object.getPrototypeOf(module) === Object.prototype) { + ({ + module + } = module); + } else { + console.warn('using deprecated parameters for `initSync()`; pass a single object instead'); + } + } + const imports = __wbg_get_imports(); + if (!(module instanceof WebAssembly.Module)) { + module = new WebAssembly.Module(module); + } + const instance = new WebAssembly.Instance(module, imports); + return __wbg_finalize_init(instance, module); +} +async function __wbg_init(module_or_path) { + if (wasm !== undefined) return wasm; + if (module_or_path !== undefined) { + if (Object.getPrototypeOf(module_or_path) === Object.prototype) { + ({ + module_or_path + } = module_or_path); + } else { + console.warn('using deprecated parameters for the initialization function; pass a single object instead'); + } + } + const imports = __wbg_get_imports(); + if (typeof module_or_path === 'string' || typeof Request === 'function' && module_or_path instanceof Request || typeof URL === 'function' && module_or_path instanceof URL) { + module_or_path = fetch(module_or_path); + } + const { + instance, + module + } = await __wbg_load(await module_or_path, imports); + return __wbg_finalize_init(instance, module); +} + +;// ./src/shared/math_clamp.js +function MathClamp(v, min, max) { + return Math.min(Math.max(v, min), max); +} + +;// ./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]; + } + } +} +function isDefaultDecodeHelper(decode, expectedLen) { + if (!Array.isArray(decode)) { + return true; + } + const decodeLen = decode.length; + if (decodeLen < expectedLen) { + warn("Decode map length is too short."); + return true; + } + if (decodeLen > expectedLen) { + info("Truncating too long decode map."); + decode.length = expectedLen; + } + return false; +} +class ColorSpace { + static #rgbBuf = new Uint8ClampedArray(3); + constructor(name, numComps) { + this.name = name; + this.numComps = numComps; + } + getRgb(src, srcOffset, output = new Uint8ClampedArray(3)) { + this.getRgbItem(src, srcOffset, output, 0); + return output; + } + getRgbHex(src, srcOffset) { + const buffer = this.getRgb(src, srcOffset, ColorSpace.#rgbBuf); + return Util.makeHexColor(buffer[0], buffer[1], buffer[2]); + } + getRgbItem(src, srcOffset, dest, destOffset) { + unreachable("Should not call ColorSpace.getRgbItem"); + } + getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { + unreachable("Should not call ColorSpace.getRgbBuffer"); + } + getRgbItems(src, count, dest, destOffset, alpha01) { + const { + numComps + } = this; + for (let i = 0, srcOffset = 0; i < count; i++, srcOffset += numComps) { + this.getRgbItem(src, srcOffset, dest, destOffset); + destOffset += 3 + alpha01; + } + } + isPassthrough(bits) { + return false; + } + isDefaultDecode(decode, bpc) { + return ColorSpace.isDefaultDecode(decode, this.numComps); + } + fillRgb(dest, originalWidth, originalHeight, width, height, actualHeight, bpc, comps, alpha01) { + const count = originalWidth * originalHeight; + let rgbBuf = null; + const numComponentColors = 1 << bpc; + const needsResizing = originalHeight !== height || originalWidth !== width; + if (this.isPassthrough(bpc)) { + rgbBuf = comps; + } else if (this.numComps === 1 && count > numComponentColors && this.name !== "DeviceGray" && this.name !== "DeviceRGB") { + const allColors = bpc <= 8 ? new Uint8Array(numComponentColors) : new Uint16Array(numComponentColors); + for (let i = 0; i < numComponentColors; i++) { + allColors[i] = i; + } + 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 { + 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 (!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 util_shadow(this, "usesZeroToOneRange", true); + } + static isDefaultDecode(decode, numComps) { + if (isDefaultDecodeHelper(decode, numComps * 2)) { + 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; + } +} +class AlternateCS extends ColorSpace { + constructor(numComps, base, tintFn) { + super("Alternate", numComps); + this.base = base; + this.tintFn = tintFn; + this.tmpBuf = new Float32Array(base.numComps); + } + getRgbItem(src, srcOffset, dest, destOffset) { + const tmpBuf = this.tmpBuf; + this.tintFn(src, srcOffset, tmpBuf, 0); + this.base.getRgbItem(tmpBuf, 0, dest, destOffset); + } + getRgbItems(src, count, dest, destOffset, alpha01) { + const { + base, + numComps, + tintFn + } = this; + const baseNumComps = base.numComps; + const tinted = new Float32Array(count * baseNumComps); + for (let i = 0, srcOffset = 0, tintedOffset = 0; i < count; i++) { + tintFn(src, srcOffset, tinted, tintedOffset); + srcOffset += numComps; + tintedOffset += baseNumComps; + } + base.getRgbItems(tinted, count, dest, destOffset, alpha01); + } + 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; + } + } + if (!isPassthrough) { + base.getRgbBuffer(baseBuf, 0, count, dest, destOffset, 8, alpha01); + } + } +} +class PatternCS extends ColorSpace { + constructor(baseCS) { + super("Pattern", null); + this.base = baseCS; + } + isDefaultDecode(decode, bpc) { + unreachable("Should not call PatternCS.isDefaultDecode"); + } +} +class IndexedCS extends ColorSpace { + #rgbLookup; + constructor(base, highVal, lookup) { + super("Indexed", 1); + this.highVal = highVal; + const count = highVal + 1; + const length = base.numComps * count; + const palette = new Uint8Array(length); + if (lookup instanceof BaseStream) { + palette.set(lookup.getBytes(length)); + } else if (typeof lookup === "string") { + for (let i = 0; i < length; ++i) { + palette[i] = lookup.charCodeAt(i); + } + } else { + throw new FormatError(`IndexedCS - unrecognized lookup table: ${lookup}`); + } + this.#rgbLookup = new Uint8ClampedArray(count * 3); + base.getRgbBuffer(palette, 0, count, this.#rgbLookup, 0, 8, 0); + } + getRgbItem(src, srcOffset, dest, destOffset) { + const rgbLookup = this.#rgbLookup; + const pos = MathClamp(Math.round(src[srcOffset]), 0, this.highVal) * 3; + dest[destOffset] = rgbLookup[pos]; + dest[destOffset + 1] = rgbLookup[pos + 1]; + dest[destOffset + 2] = rgbLookup[pos + 2]; + } + getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { + const { + highVal + } = this; + const rgbLookup = this.#rgbLookup; + for (let i = 0; i < count; ++i) { + const pos = MathClamp(Math.round(src[srcOffset++]), 0, highVal) * 3; + dest[destOffset++] = rgbLookup[pos]; + dest[destOffset++] = rgbLookup[pos + 1]; + dest[destOffset++] = rgbLookup[pos + 2]; + destOffset += alpha01; + } + } + isDefaultDecode(decode, bpc) { + if (isDefaultDecodeHelper(decode, 2)) { + return true; + } + if (!Number.isInteger(bpc) || bpc < 1) { + warn("Bits per component is not correct"); + return true; + } + return decode[0] === 0 && decode[1] === (1 << bpc) - 1; + } +} +class DeviceGrayCS extends ColorSpace { + constructor() { + super("DeviceGray", 1); + } + getRgbItem(src, srcOffset, dest, destOffset) { + const c = src[srcOffset] * 255; + dest[destOffset] = dest[destOffset + 1] = dest[destOffset + 2] = c; + } + 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; + } + } +} +class DeviceRgbCS extends ColorSpace { + constructor() { + super("DeviceRGB", 3); + } + getRgbItem(src, srcOffset, dest, destOffset) { + dest[destOffset] = src[srcOffset] * 255; + dest[destOffset + 1] = src[srcOffset + 1] * 255; + dest[destOffset + 2] = src[srcOffset + 2] * 255; + } + getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { + if (bits === 8 && alpha01 === 0) { + dest.set(src.subarray(srcOffset, srcOffset + count * 3), destOffset); + return; + } + 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; + } + } + isPassthrough(bits) { + return bits === 8; + } +} +class DeviceRgbaCS extends ColorSpace { + constructor() { + super("DeviceRGBA", 4); + } + 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); + } + #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 + c * (-4.387332384609988 * c + 54.48615194189176 * m + 18.82290502165302 * y + 212.25662451639585 * k + -285.2331026137004) + m * (1.7149763477362134 * m - 5.6096736904047315 * y + -17.873870861415444 * k - 5.497006427196366) + y * (-2.5217340131683033 * y - 21.248923337353073 * k + 17.5119270841813) + k * (-21.86122147463605 * k - 189.48180835922747); + dest[destOffset + 1] = 255 + c * (8.841041422036149 * c + 60.118027045597366 * m + 6.871425592049007 * y + 31.159100130055922 * k + -79.2970844816548) + m * (-15.310361306967817 * m + 17.575251261109482 * y + 131.35250912493976 * k - 190.9453302588951) + y * (4.444339102852739 * y + 9.8632861493405 * k - 24.86741582555878) + k * (-20.737325471181034 * k - 187.80453709719578); + dest[destOffset + 2] = 255 + c * (0.8842522430003296 * c + 8.078677503112928 * m + 30.89978309703729 * y - 0.23883238689178934 * k + -14.183576799673286) + m * (10.49593273432072 * m + 63.02378494754052 * y + 50.606957656360734 * k - 112.23884253719248) + y * (0.03296041114873217 * y + 115.60384449646641 * k + -193.58209356861505) + k * (-22.33816807309886 * k - 180.12613974708367); + } + getRgbItem(src, srcOffset, dest, destOffset) { + this.#toRgb(src, srcOffset, 1, dest, destOffset); + } + 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; + } + } +} +class CalGrayCS extends ColorSpace { + constructor(whitePoint, blackPoint, gamma) { + super("CalGray", 1); + if (!whitePoint) { + throw new FormatError("WhitePoint missing - required for color space CalGray"); + } + [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; + } + 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.`); + } + if (this.G < 1) { + info(`Invalid Gamma: ${this.G} for ${this.name}, falling back to default.`); + this.G = 1; + } + } + #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(src, srcOffset, dest, destOffset) { + this.#toRgb(src, srcOffset, dest, destOffset, 1); + } + 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; + } + } +} +class CalRGBCS extends ColorSpace { + 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 #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 #SRGB_D65_XYZ_TO_RGB_MATRIX = new Float32Array([3.2404542, -1.5371385, -0.4985314, -0.9692660, 1.8760108, 0.0415560, 0.0556434, -0.2040259, 1.0572252]); + 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 (!whitePoint) { + throw new FormatError("WhitePoint missing - required for color space CalRGB"); + } + 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, this.MZA, this.MXB, this.MYB, this.MZB, this.MXC, this.MYC, this.MZC] = 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 (XB < 0 || YB < 0 || ZB < 0) { + info(`Invalid BlackPoint for ${this.name} [${XB}, ${YB}, ${ZB}], ` + "falling back to default."); + this.blackPoint = new Float32Array(3); + } + if (this.GR < 0 || this.GG < 0 || this.GB < 0) { + info(`Invalid Gamma [${this.GR}, ${this.GG}, ${this.GB}] for ` + `${this.name}, falling back to default.`); + this.GR = this.GG = this.GB = 1; + } + } + #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]; + } + #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]; + } + #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]; + } + #sRGBTransferFunction(color) { + if (color <= 0.0031308) { + return MathClamp(12.92 * color, 0, 1); + } + return color >= 0.99554525 ? 1 : MathClamp((1 + 0.055) * color ** (1 / 2.4) - 0.055, 0, 1); + } + #decodeL(L) { + if (L < 0) { + return -this.#decodeL(-L); + } + return L > 8.0 ? ((L + 16) / 116) ** 3 : L * CalRGBCS.#DECODE_L_CONSTANT; + } + #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 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; + } + #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 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); + } + #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); + } + #toRgb(src, srcOffset, dest, destOffset, scale) { + const A = MathClamp(src[srcOffset] * scale, 0, 1); + const B = MathClamp(src[srcOffset + 1] * scale, 0, 1); + const C = MathClamp(src[srcOffset + 2] * scale, 0, 1); + 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(src, srcOffset, dest, destOffset) { + this.#toRgb(src, srcOffset, dest, destOffset, 1); + } + 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; + } + } +} +class LabCS extends ColorSpace { + constructor(whitePoint, blackPoint, range) { + super("Lab", 3); + if (!whitePoint) { + throw new FormatError("WhitePoint missing - required for color space Lab"); + } + [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; + } + if (this.amin > this.amax || this.bmin > this.bmax) { + info("Invalid Range, falling back to defaults"); + this.amin = -100; + this.amax = 100; + this.bmin = -100; + this.bmax = 100; + } + } + #fn_g(x) { + return x >= 6 / 29 ? x ** 3 : 108 / 841 * (x - 4 / 29); + } + #decode(value, high1, low2, high2) { + return low2 + value * (high2 - low2) / high1; + } + #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); + } + 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) { + r = X * 3.1339 + Y * -1.617 + Z * -0.4906; + g = X * -0.9785 + Y * 1.916 + Z * 0.0333; + b = X * 0.072 + Y * -0.229 + Z * 1.4057; + } else { + r = X * 3.2406 + Y * -1.5372 + Z * -0.4986; + g = X * -0.9689 + Y * 1.8758 + Z * 0.0415; + b = X * 0.0557 + Y * -0.204 + Z * 1.057; + } + dest[destOffset] = Math.sqrt(r) * 255; + dest[destOffset + 1] = Math.sqrt(g) * 255; + dest[destOffset + 2] = Math.sqrt(b) * 255; + } + getRgbItem(src, srcOffset, dest, destOffset) { + this.#toRgb(src, srcOffset, false, dest, destOffset); + } + 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; + } + } + isDefaultDecode(decode, bpc) { + return true; + } + get usesZeroToOneRange() { + return util_shadow(this, "usesZeroToOneRange", false); + } +} + +;// ./src/core/icc_colorspace.js + + + + + + + + + +function fetchSync(url) { + const xhr = new XMLHttpRequest(); + xhr.open("GET", url, false); + xhr.responseType = "arraybuffer"; + xhr.send(null); + return xhr.response; +} +class IccColorSpace extends ColorSpace { + #transformer; + #convertPixel; + static #useWasm = true; + static #wasmUrl = null; + static #finalizer = null; + constructor(iccProfile, name, numComps) { + if (!IccColorSpace.isUsable) { + throw new Error("No ICC color space support"); + } + super(name, numComps); + let inType; + switch (numComps) { + case 1: + inType = DataType.Gray8; + this.#convertPixel = (src, srcOffset) => qcms_convert_one(this.#transformer, src[srcOffset] * 255); + break; + case 3: + inType = DataType.RGB8; + this.#convertPixel = (src, srcOffset) => qcms_convert_three(this.#transformer, src[srcOffset] * 255, src[srcOffset + 1] * 255, src[srcOffset + 2] * 255); + break; + case 4: + inType = DataType.CMYK; + this.#convertPixel = (src, srcOffset) => qcms_convert_four(this.#transformer, src[srcOffset] * 255, src[srcOffset + 1] * 255, src[srcOffset + 2] * 255, src[srcOffset + 3] * 255); + break; + default: + throw new Error(`Unsupported number of components: ${numComps}`); + } + this.#transformer = qcms_transformer_from_memory(iccProfile, inType, Intent.Perceptual); + if (!this.#transformer) { + throw new Error("Failed to create ICC color space"); + } + IccColorSpace.#finalizer ||= new FinalizationRegistry(transformer => { + qcms_drop_transformer(transformer); + }); + IccColorSpace.#finalizer.register(this, this.#transformer); + } + getRgbHex(src, srcOffset) { + const color = this.#convertPixel(src, srcOffset); + return Util.makeHexColor(color >> 16, color >> 8 & 0xff, color & 0xff); + } + getRgbItem(src, srcOffset, dest, destOffset) { + const color = this.#convertPixel(src, srcOffset); + dest[destOffset] = color >> 16; + dest[destOffset + 1] = color >> 8 & 0xff; + dest[destOffset + 2] = color & 0xff; + } + getRgbItems(src, count, dest, destOffset, alpha01) { + const { + numComps + } = this; + const length = count * numComps; + const scaled = new Uint8Array(length); + for (let i = 0; i < length; i++) { + scaled[i] = src[i] * 255; + } + QCMS._destBuffer = dest; + QCMS._destOffset = destOffset; + QCMS._keepAlpha = alpha01 === 1; + qcms_convert_array(this.#transformer, scaled, alpha01 === 1); + QCMS._destBuffer = null; + } + getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { + src = src.subarray(srcOffset, srcOffset + count * this.numComps); + if (bits !== 8) { + const scale = 255 / ((1 << bits) - 1); + for (let i = 0, ii = src.length; i < ii; i++) { + src[i] *= scale; + } + } + QCMS._destBuffer = dest; + QCMS._destOffset = destOffset; + QCMS._keepAlpha = alpha01 === 1 && dest.buffer !== src.buffer; + qcms_convert_array(this.#transformer, src, alpha01 === 1); + QCMS._destBuffer = null; + } + static setOptions({ + useWasm, + useWorkerFetch, + wasmUrl + }) { + if (!useWorkerFetch) { + this.#useWasm = false; + return; + } + this.#useWasm = useWasm; + this.#wasmUrl = wasmUrl; + } + static get isUsable() { + let isUsable = false; + if (this.#useWasm) { + if (this.#wasmUrl) { + try { + this._module = initSync({ + module: fetchSync(`${this.#wasmUrl}qcms_bg.wasm`) + }); + isUsable = !!this._module; + QCMS._memory = this._module.memory; + } catch (e) { + warn(`ICCBased color space: "${e}".`); + } + } else { + warn("No ICC color space support due to missing `wasmUrl` API option"); + } + } + return util_shadow(this, "isUsable", isUsable); + } +} +class CmykICCBasedCS extends IccColorSpace { + static #iccUrl; + constructor() { + const iccProfile = new Uint8Array(fetchSync(`${CmykICCBasedCS.#iccUrl}CGATS001Compat-v2-micro.icc`)); + super(iccProfile, "DeviceCMYK", 4); + } + static setOptions({ + iccUrl + }) { + this.#iccUrl = iccUrl; + } + static get isUsable() { + let isUsable = false; + if (IccColorSpace.isUsable) { + if (this.#iccUrl) { + isUsable = true; + } else { + warn("No CMYK ICC profile support due to missing `iccUrl` API option"); + } + } + return util_shadow(this, "isUsable", isUsable); + } +} + +;// ./src/core/stream.js + + + + + + + +class Stream extends BaseStream { + constructor(arrayBuffer, start, length, dict) { + super(); + this.bytes = arrayBuffer instanceof Uint8Array ? arrayBuffer : new Uint8Array(arrayBuffer); + this.start = start || 0; + this.pos = this.start; + this.end = start + length || this.bytes.length; + this.dict = dict; + } + get length() { + return this.end - this.start; + } + get isEmpty() { + return this.length === 0; + } + getByte() { + return this.pos >= this.end ? -1 : this.bytes[this.pos++]; + } + getBytes(length) { + const pos = this.pos; + const endPos = !length ? this.end : Math.min(pos + length, this.end); + this.pos = endPos; + return this.bytes.subarray(pos, endPos); + } + getByteRange(begin, end) { + if (begin < 0) { + begin = 0; + } + if (end > this.end) { + end = this.end; + } + return this.bytes.subarray(begin, end); + } + reset() { + this.pos = this.start; + } + moveStart() { + this.start = this.pos; + } + makeSubStream(start, length, dict = null) { + return new Stream(this.bytes.buffer, start, length, dict); + } + clone() { + return new Stream(this.bytes.buffer, this.start, this.length, this.dict?.clone()); + } +} +class StringStream extends Stream { + constructor(str, dict = null) { + super(stringToBytes(str), NaN, NaN, dict); + } +} +class NullStream extends Stream { + constructor() { + super(new Uint8Array(0)); + } +} + +;// ./src/core/chunked_stream.js + + + + + + + + + + + + + + + + + + + + +class ChunkedStream extends Stream { + progressiveDataLength = 0; + _lastSuccessfulEnsureByteChunk = -1; + _loadedChunks = new Set(); + constructor(length, chunkSize, manager) { + super(new Uint8Array(length), 0, length, null); + this.chunkSize = chunkSize; + this.numChunks = Math.ceil(length / chunkSize); + this.manager = manager; + } + getMissingChunks() { + 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; + } + get isDataLoaded() { + return this.numChunksLoaded === this.numChunks; + } + 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); + } + } + 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 || chunk === this._lastSuccessfulEnsureByteChunk) { + return; + } + if (!this._loadedChunks.has(chunk)) { + throw new MissingDataException(pos, pos + 1); + } + this._lastSuccessfulEnsureByteChunk = chunk; + } + ensureRange(begin, end) { + if (begin >= end || 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 chunk = beginChunk; chunk < endChunk; ++chunk) { + if (!this._loadedChunks.has(chunk)) { + throw new MissingDataException(begin, end); + } + } + } + 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(chunk) { + return this._loadedChunks.has(chunk); + } + getByte() { + const pos = this.pos; + if (pos >= this.end) { + return -1; + } + if (pos >= this.progressiveDataLength) { + this.ensureByte(pos); + } + return this.bytes[this.pos++]; + } + getBytes(length) { + const pos = this.pos; + const endPos = !length ? this.end : Math.min(pos + length, this.end); + if (endPos > this.progressiveDataLength) { + this.ensureRange(pos, endPos); + } + this.pos = endPos; + return this.bytes.subarray(pos, endPos); + } + 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(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 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 || this.getMissingChunks().length === 0; + }, + configurable: true + }); + 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 { + #aborted = false; + #requestId = 0; + #chunksNeededByRequest = new Map(); + #loadedStreamCapability = Promise.withResolvers(); + _promisesByRequest = new Map(); + _requestsByChunk = new Map(); + constructor(pdfStream, args) { + this.length = args.length; + this.chunkSize = args.rangeChunkSize; + this.stream = new ChunkedStream(this.length, this.chunkSize, this); + this.pdfStream = pdfStream; + this.disableAutoFetch = args.disableAutoFetch; + this.msgHandler = args.msgHandler; + } + async sendRequest(begin, end) { + const rangeReader = this.pdfStream.getRangeReader(begin, end); + let chunks = []; + while (true) { + const { + value, + done + } = await rangeReader.read(); + if (this.#aborted) { + chunks = null; + return; + } + if (done) { + break; + } + chunks.push(value); + } + if (chunks.length === 0 && this.disableAutoFetch) { + return; + } + const data = arrayBuffersToBytes(chunks); + chunks = null; + this.onReceiveData({ + chunk: data.buffer, + begin + }); + } + requestAllChunks(noFetch = false) { + if (!noFetch) { + const missingChunks = this.stream.getMissingChunks(); + this._requestChunks(missingChunks); + } + return this.#loadedStreamCapability.promise; + } + _requestChunks(chunks) { + const chunksNeeded = new Set(); + for (const chunk of chunks) { + if (!this.stream.hasChunk(chunk)) { + chunksNeeded.add(chunk); + } + } + if (chunksNeeded.size === 0) { + return Promise.resolve(); + } + const requestId = this.#requestId++; + this.#chunksNeededByRequest.set(requestId, chunksNeeded); + const capability = Promise.withResolvers(); + this._promisesByRequest.set(requestId, capability); + const chunksToRequest = []; + for (const chunk of chunksNeeded) { + const requestIds = this._requestsByChunk.getOrInsertComputed(chunk, () => { + chunksToRequest.push(chunk); + return []; + }); + 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(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); + } + return this._requestChunks(chunks); + } + 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); + } + } + } + chunksToRequest.sort((a, b) => 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; + } + return groupedChunks; + } + onReceiveData(args) { + const { + chunkSize, + length, + stream + } = this; + const chunk = args.chunk; + const isProgressive = args.begin === undefined; + const begin = isProgressive ? stream.progressiveDataLength : args.begin; + const end = begin + chunk.byteLength; + const beginChunk = Math.floor(begin / chunkSize); + const endChunk = end < length ? Math.floor(end / chunkSize) : Math.ceil(end / chunkSize); + if (isProgressive) { + stream.onReceiveProgressiveData(chunk); + } else { + stream.onReceiveData(begin, chunk); + } + if (stream.isDataLoaded) { + this.#loadedStreamCapability.resolve(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 (stream.numChunksLoaded === 1) { + const lastChunk = stream.numChunks - 1; + if (!stream.hasChunk(lastChunk)) { + nextEmptyChunk = lastChunk; + } + } else { + nextEmptyChunk = 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: MathClamp(stream.numChunksLoaded * chunkSize, stream.progressiveDataLength, length), + total: length + }); + } + getBeginChunk(begin) { + return Math.floor(begin / this.chunkSize); + } + getEndChunk(end) { + return Math.floor((end - 1) / this.chunkSize) + 1; + } + abort(reason) { + this.#aborted = true; + this.pdfStream?.cancelAllRequests(reason); + for (const capability of this._promisesByRequest.values()) { + capability.reject(reason); + } + this.#loadedStreamCapability.reject(reason); + } +} + +;// ./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, + srcPos = 0, + dest, + width, + height, + nonBlackColor = 0xffffffff, + inverseDecode = false +}) { + const black = FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff; + const [zeroMapping, oneMapping] = inverseDecode ? [nonBlackColor, black] : [black, nonBlackColor]; + const widthInSource = width >> 3; + const widthRemainder = width & 7; + const xorMask = zeroMapping ^ oneMapping; + 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, destPos += 8) { + const elem = src[srcPos]; + dest[destPos] = zeroMapping ^ -(elem >> 7 & 1) & xorMask; + dest[destPos + 1] = zeroMapping ^ -(elem >> 6 & 1) & xorMask; + dest[destPos + 2] = zeroMapping ^ -(elem >> 5 & 1) & xorMask; + dest[destPos + 3] = zeroMapping ^ -(elem >> 4 & 1) & xorMask; + dest[destPos + 4] = zeroMapping ^ -(elem >> 3 & 1) & xorMask; + dest[destPos + 5] = zeroMapping ^ -(elem >> 2 & 1) & xorMask; + dest[destPos + 6] = zeroMapping ^ -(elem >> 1 & 1) & xorMask; + dest[destPos + 7] = zeroMapping ^ -(elem & 1) & xorMask; + } + if (widthRemainder === 0) { + continue; + } + const elem = srcPos < srcLength ? src[srcPos++] : 255; + for (let j = 0; j < widthRemainder; ++j, ++destPos) { + dest[destPos] = zeroMapping ^ -(elem >> 7 - j & 1) & xorMask; + } + } + return { + srcPos, + destPos + }; +} +function convertRGBToRGBA({ + src, + srcPos = 0, + dest, + destPos = 0, + width, + height +}) { + let i = 0; + const len = width * height * 3; + const len32 = len >> 2; + const src32 = new Uint32Array(src.buffer, srcPos, len32); + const alphaMask = FeatureTest.isLittleEndian ? 0xff000000 : 0xff; + if (FeatureTest.isLittleEndian) { + for (; i < len32 - 2; i += 3, destPos += 4) { + const s1 = src32[i], + s2 = src32[i + 1], + s3 = src32[i + 2]; + dest[destPos] = s1 | alphaMask; + dest[destPos + 1] = s1 >>> 24 | s2 << 8 | alphaMask; + dest[destPos + 2] = s2 >>> 16 | s3 << 16 | alphaMask; + dest[destPos + 3] = s3 >>> 8 | alphaMask; + } + for (let j = srcPos + i * 4, jj = srcPos + len; j < jj; j += 3) { + dest[destPos++] = src[j] | src[j + 1] << 8 | src[j + 2] << 16 | alphaMask; + } + } else { + for (; i < len32 - 2; i += 3, destPos += 4) { + const s1 = src32[i], + s2 = src32[i + 1], + s3 = src32[i + 2]; + dest[destPos] = s1 | alphaMask; + dest[destPos + 1] = s1 << 24 | s2 >>> 8 | alphaMask; + dest[destPos + 2] = s2 << 16 | s3 >>> 16 | alphaMask; + dest[destPos + 3] = s3 << 8 | alphaMask; + } + for (let j = srcPos + i * 4, jj = srcPos + len; j < jj; j += 3) { + dest[destPos++] = src[j] << 24 | src[j + 1] << 16 | src[j + 2] << 8 | alphaMask; + } + } + return { + srcPos: srcPos + len, + 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/image_resizer.js + + + + + + + + +const MIN_IMAGE_DIM = 2048; +const MAX_IMAGE_DIM = 32768; +const MAX_ERROR = 128; +class ImageResizer { + static #goodSquareLength = MIN_IMAGE_DIM; + static #isImageDecoderSupported = FeatureTest.isImageDecoderSupported; + constructor(imgData, isMask) { + this._imgData = imgData; + this._isMask = isMask; + } + static get canUseImageDecoder() { + return util_shadow(this, "canUseImageDecoder", this.#isImageDecoderSupported ? ImageDecoder.isTypeSupported("image/bmp") : Promise.resolve(false)); + } + static needsToBeResized(width, height) { + if (width <= this.#goodSquareLength && height <= this.#goodSquareLength) { + return false; + } + 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 getReducePower(width, height, maxArea = Infinity) { + if (!Number.isInteger(width) || width <= 0 || !Number.isInteger(height) || height <= 0) { + return 0; + } + const area = width * height; + if (!this.needsToBeResized(width, height)) { + return area > maxArea ? Math.ceil(Math.log2(area / maxArea)) : 0; + } + const { + MAX_DIM, + MAX_AREA + } = this; + const minFactor = Math.max(width / MAX_DIM, height / MAX_DIM, Math.sqrt(area / Math.min(maxArea, MAX_AREA))); + return Math.max(0, Math.ceil(Math.log2(minFactor))); + } + static getReducePowerForJPX(width, height, componentsCount) { + return this.getReducePower(width, height, 2 ** 30 / (componentsCount * 4)); + } + static get MAX_DIM() { + return util_shadow(this, "MAX_DIM", this._guessMax(MIN_IMAGE_DIM, MAX_IMAGE_DIM, 0, 1)); + } + static get MAX_AREA() { + this._hasMaxArea = true; + return util_shadow(this, "MAX_AREA", this._guessMax(this.#goodSquareLength, this.MAX_DIM, MAX_ERROR, 0) ** 2); + } + static set MAX_AREA(area) { + if (area >= 0) { + this._hasMaxArea = true; + util_shadow(this, "MAX_AREA", area); + } + } + static setOptions({ + canvasMaxAreaInBytes = -1, + isImageDecoderSupported = false + }) { + if (!this._hasMaxArea) { + this.MAX_AREA = canvasMaxAreaInBytes >> 2; + } + this.#isImageDecoderSupported = isImageDecoderSupported; + } + static _areGoodDims(width, height) { + try { + 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 false; + } + } + 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 start; + } + static async createImage(imgData, isMask = false) { + return new ImageResizer(imgData, isMask)._createImage(); + } + async _createImage() { + const { + _imgData: imgData + } = this; + const { + width, + height + } = imgData; + if (width * height * 4 > MAX_INT_32) { + const result = this.#rescaleImageData(); + if (result) { + return result; + } + } + 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" + })); + } + const { + MAX_AREA, + MAX_DIM + } = ImageResizer; + 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); + newHeight = Math.floor(newHeight / step); + 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; + } + #rescaleImageData() { + const { + _imgData: imgData + } = this; + const { + data, + width, + height, + kind + } = imgData; + const rgbaSize = width * height * 4; + const K = Math.ceil(Math.log2(rgbaSize / MAX_INT_32)); + const newWidth = width >> K; + const newHeight = height >> K; + let rgbaData; + let maxHeight = height; + try { + rgbaData = new Uint8Array(rgbaSize); + } catch { + let n = Math.floor(Math.log2(rgbaSize + 1)); + while (true) { + try { + rgbaData = new Uint8Array(2 ** n - 1); + break; + } catch { + n -= 1; + } + } + maxHeight = Math.floor((2 ** n - 1) / (width * 4)); + const newSize = width * maxHeight * 4; + if (newSize < rgbaData.length) { + rgbaData = new Uint8Array(newSize); + } + } + const src32 = new Uint32Array(rgbaData.buffer); + const dest32 = new Uint32Array(newWidth * newHeight); + let srcPos = 0; + let newIndex = 0; + const step = Math.ceil(height / maxHeight); + const remainder = height % maxHeight === 0 ? height : height % maxHeight; + for (let k = 0; k < step; k++) { + const h = k < step - 1 ? maxHeight : remainder; + ({ + srcPos + } = convertToRGBA({ + kind, + src: data, + dest: src32, + width, + height: h, + inverseDecode: this._isMask, + srcPos + })); + for (let i = 0, ii = h >> K; i < ii; i++) { + const buf = src32.subarray((i << K) * width); + for (let j = 0; j < newWidth; j++) { + dest32[newIndex++] = buf[j << K]; + } + } + } + if (ImageResizer.needsToBeResized(newWidth, newHeight)) { + imgData.data = dest32; + imgData.width = newWidth; + imgData.height = newHeight; + imgData.kind = ImageKind.RGBA_32BPP; + return null; + } + const canvas = new OffscreenCanvas(newWidth, newHeight); + const ctx = canvas.getContext("2d", { + willReadFrequently: true + }); + ctx.putImageData(new ImageData(new Uint8ClampedArray(dest32.buffer), newWidth, newHeight), 0, 0); + imgData.data = null; + imgData.bitmap = canvas.transferToImageBitmap(); + imgData.width = newWidth; + imgData.height = newHeight; + return imgData; + } + _encodeBMP() { + 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 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 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]; + } + k += extraLen; + } + data = newData; + } else { + 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 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; + } +} + +;// ./src/core/decode_stream.js + + + + + + + + + + + +const emptyBuffer = new Uint8Array(0); +class DecodeStream extends BaseStream { + buffer = emptyBuffer; + bufferLength = 0; + eof = false; + minBufferLength = 512; + pos = 0; + constructor(maybeMinBufferLength) { + super(); + this._rawMinBufferLength = maybeMinBufferLength || 0; + if (maybeMinBufferLength) { + while (this.minBufferLength < maybeMinBufferLength) { + this.minBufferLength *= 2; + } + } + } + readBlock() { + unreachable("Abstract method `readBlock` called"); + } + get isEmpty() { + while (!this.eof && this.bufferLength === 0) { + this.readBlock(); + } + return this.bufferLength === 0; + } + 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 pos = this.pos; + while (this.bufferLength <= pos) { + if (this.eof) { + return -1; + } + this.readBlock(); + } + return this.buffer[this.pos++]; + } + 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 { + while (!this.eof) { + this.readBlock(decoderOptions); + } + end = this.bufferLength; + } + this.pos = end; + return this.buffer.subarray(pos, end); + } + async getImageData(length, decoderOptions) { + if (!this.canAsyncDecodeImageFromBuffer) { + return this.isAsyncDecoder ? this.decodeImage(null, length, decoderOptions) : this.getBytes(length, decoderOptions); + } + const data = await this.stream.asyncGetBytes(); + return this.decodeImage(data, length, decoderOptions); + } + async asyncGetBytesFromDecompressionStream(name) { + this.stream.reset(); + const bytes = this.stream.isAsync ? await this.stream.asyncGetBytes() : this.stream.getBytes(); + try { + const { + readable, + writable + } = new DecompressionStream(name); + 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 data = new Uint8Array(totalLength); + let offset = 0; + for (const chunk of chunks) { + data.set(chunk, offset); + offset += chunk.byteLength; + } + return { + decompressed: data, + compressed: bytes + }; + } catch { + return { + decompressed: null, + compressed: bytes + }; + } + } + reset() { + this.pos = 0; + } + 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, start, length, dict); + } + clone() { + while (!this.eof) { + this.readBlock(); + } + return new Stream(this.buffer, 0, this.bufferLength, this.dict?.clone()); + } + getBaseStreams() { + return this.stream ? this.stream.getBaseStreams() : null; + } +} +class StreamsSequenceStream extends DecodeStream { + constructor(streams, onError = null) { + streams = streams.filter(s => s instanceof BaseStream && !s.isImageStream); + 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 streams = this.streams; + if (streams.length === 0) { + this.eof = true; + return; + } + const stream = streams.shift(); + let chunk; + try { + chunk = stream.getBytes(); + } catch (reason) { + if (this._onError) { + this._onError(reason, stream.dict?.objId); + return; + } + throw reason; + } + const bufferLength = this.bufferLength; + const newLength = bufferLength + chunk.length; + const buffer = this.ensureBuffer(newLength); + buffer.set(chunk, bufferLength); + this.bufferLength = newLength; + } + getBaseStreams() { + const baseStreamsBuf = []; + for (const stream of this.streams) { + const baseStreams = stream.getBaseStreams(); + if (baseStreams) { + baseStreamsBuf.push(...baseStreams); + } + } + return baseStreamsBuf.length > 0 ? baseStreamsBuf : null; + } +} + +;// ./src/core/colorspace_utils.js + + + + + + +class ColorSpaceUtils { + static parse({ + cs, + xref, + resources = null, + pdfFunctionFactory, + globalColorSpaceCache, + localColorSpaceCache, + asyncIfNotCached = false + }) { + const options = { + xref, + resources, + pdfFunctionFactory, + globalColorSpaceCache, + localColorSpaceCache + }; + let csName, csRef, parsedCS; + if (cs instanceof Ref) { + csRef = cs; + const cachedCS = globalColorSpaceCache.getByRef(csRef) || localColorSpaceCache.getByRef(csRef); + if (cachedCS) { + return cachedCS; + } + cs = xref.fetch(cs); + } + if (cs instanceof Name) { + csName = cs.name; + const cachedCS = localColorSpaceCache.getByName(csName); + if (cachedCS) { + return cachedCS; + } + } + try { + parsedCS = this.#parse(cs, options); + } catch (ex) { + if (asyncIfNotCached && !(ex instanceof MissingDataException)) { + return Promise.reject(ex); + } + throw ex; + } + if (csName || csRef) { + localColorSpaceCache.set(csName, csRef, parsedCS); + if (csRef) { + globalColorSpaceCache.set(null, csRef, parsedCS); + } + } + return asyncIfNotCached ? Promise.resolve(parsedCS) : parsedCS; + } + static #subParse(cs, options) { + const { + globalColorSpaceCache + } = options; + let csRef; + if (cs instanceof Ref) { + csRef = cs; + const cachedCS = globalColorSpaceCache.getByRef(csRef); + if (cachedCS) { + return cachedCS; + } + } + const parsedCS = this.#parse(cs, options); + if (csRef) { + globalColorSpaceCache.set(null, csRef, parsedCS); + } + return parsedCS; + } + static #parse(cs, options) { + const { + xref, + resources, + pdfFunctionFactory, + globalColorSpaceCache + } = options; + cs = xref.fetchIfRef(cs); + if (cs instanceof Name) { + switch (cs.name) { + case "G": + case "DeviceGray": + return this.gray; + case "RGB": + case "DeviceRGB": + return this.rgb; + case "DeviceRGBA": + return this.rgba; + case "CMYK": + case "DeviceCMYK": + return this.cmyk; + case "Pattern": + return new PatternCS(null); + default: + 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, options); + } + cs = resourcesCS; + break; + } + } + } + warn(`Unrecognized ColorSpace: ${cs.name}`); + return this.gray; + } + } + 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.gray; + case "RGB": + case "DeviceRGB": + return this.rgb; + case "CMYK": + case "DeviceCMYK": + return this.cmyk; + case "CalGray": + params = xref.fetchIfRef(cs[1]); + whitePoint = params.getArray("WhitePoint"); + blackPoint = params.getArray("BlackPoint"); + gamma = params.get("Gamma"); + return new CalGrayCS(whitePoint, blackPoint, gamma); + case "CalRGB": + params = xref.fetchIfRef(cs[1]); + whitePoint = params.getArray("WhitePoint"); + blackPoint = params.getArray("BlackPoint"); + gamma = params.getArray("Gamma"); + const matrix = params.getArray("Matrix"); + return new CalRGBCS(whitePoint, blackPoint, gamma, matrix); + case "ICCBased": + const isRef = cs[1] instanceof Ref; + if (isRef) { + const cachedCS = globalColorSpaceCache.getByRef(cs[1]); + if (cachedCS) { + return cachedCS; + } + } + const stream = xref.fetchIfRef(cs[1]); + const dict = stream.dict; + numComps = dict.get("N"); + if (IccColorSpace.isUsable) { + try { + const iccCS = new IccColorSpace(stream.getBytes(), "ICCBased", numComps); + if (isRef) { + globalColorSpaceCache.set(null, cs[1], iccCS); + } + return iccCS; + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn(`ICCBased color space (${cs[1]}): "${ex}".`); + } + } + const altRaw = dict.getRaw("Alternate"); + if (altRaw) { + const altCS = this.#subParse(altRaw, options); + if (altCS.numComps === numComps) { + return altCS; + } + warn("ICCBased color space: Ignoring incorrect /Alternate entry."); + } + if (numComps === 1) { + return this.gray; + } else if (numComps === 3) { + return this.rgb; + } else if (numComps === 4) { + return this.cmyk; + } + break; + case "Pattern": + baseCS = cs[1] || null; + baseCS &&= this.#subParse(baseCS, options); + return new PatternCS(baseCS); + case "I": + case "Indexed": + baseCS = this.#subParse(cs[1], options); + const hiVal = MathClamp(xref.fetchIfRef(cs[2]), 0, 255); + const lookup = xref.fetchIfRef(cs[3]); + return new IndexedCS(baseCS, hiVal, lookup); + case "Separation": + case "DeviceN": + const name = xref.fetchIfRef(cs[1]); + numComps = Array.isArray(name) ? name.length : 1; + baseCS = this.#subParse(cs[2], options); + const tintFn = pdfFunctionFactory.create(cs[3]); + return new AlternateCS(numComps, baseCS, tintFn); + case "Lab": + params = xref.fetchIfRef(cs[1]); + whitePoint = params.getArray("WhitePoint"); + blackPoint = params.getArray("BlackPoint"); + const range = params.getArray("Range"); + return new LabCS(whitePoint, blackPoint, range); + default: + warn(`Unimplemented ColorSpace object: ${mode}`); + return this.gray; + } + } + warn(`Unrecognized ColorSpace object: ${cs}`); + return this.gray; + } + static get gray() { + return util_shadow(this, "gray", new DeviceGrayCS()); + } + static get rgb() { + return util_shadow(this, "rgb", new DeviceRgbCS()); + } + static get rgba() { + return util_shadow(this, "rgba", new DeviceRgbaCS()); + } + static get cmyk() { + if (CmykICCBasedCS.isUsable) { + try { + return util_shadow(this, "cmyk", new CmykICCBasedCS()); + } catch { + warn("CMYK fallback: DeviceCMYK"); + } + } + return util_shadow(this, "cmyk", new DeviceCmykCS()); + } +} + +;// ./src/core/jpg.js + + + + + + + + + + +class JpegError extends BaseException { + constructor(msg) { + super(msg, "JpegError"); + } +} +class DNLMarkerError extends BaseException { + constructor(message, scanLines) { + super(message, "DNLMarkerError"); + this.scanLines = scanLines; + } +} +class EOIMarkerError extends BaseException { + constructor(msg) { + super(msg, "EOIMarkerError"); + } +} +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(); + } + 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 < length) { + code.push(q = { + children: [], + index: 0 + }); + p.children[p.index] = q.children; + p = q; + } + } + return code[0].children; +} +function getBlockBufferOffset(component, row, col) { + return 64 * ((component.blocksPerLine + 1) * row + col); +} +function decodeScan(data, view, 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 (bitsCount > 0) { + bitsCount--; + return bitsData >> bitsCount & 1; + } + bitsData = data[offset++]; + if (bitsData === 0xff) { + const nextByte = data[offset++]; + if (nextByte) { + if (nextByte === 0xdc && parseDNLMarker) { + offset += 2; + const scanLines = view.getUint16(offset); + offset += 2; + if (scanLines > 0 && scanLines !== frame.scanLines) { + throw new DNLMarkerError("Found DNL marker (0xFFDC) while parsing scan data", scanLines); + } + } else if (nextByte === 0xd9) { + if (parseDNLMarker) { + const maybeScanLines = blockRow * (frame.precision === 8 ? 8 : 0); + if (maybeScanLines > 0 && Math.round(frame.scanLines / maybeScanLines) >= 5) { + throw new DNLMarkerError("Found EOI marker (0xFFD9) while parsing scan data, " + "possibly caused by incorrect `scanLines` parameter", maybeScanLines); + } + } + throw new EOIMarkerError("Found EOI marker (0xFFD9) while parsing scan data"); + } + throw new JpegError(`unexpected marker ${(bitsData << 8 | nextByte).toString(16)}`); + } + } + bitsCount = 7; + return bitsData >>> 7; + } + function decodeHuffman(tree) { + let node = tree; + while (true) { + node = node[readBit()]; + switch (typeof node) { + case "number": + return node; + case "object": + continue; + } + throw new JpegError("invalid huffman sequence"); + } + } + function receive(length) { + let n = 0; + while (length > 0) { + n = n << 1 | readBit(); + length--; + } + return n; + } + function receiveAndExtend(length) { + if (length === 1) { + return readBit() === 1 ? 1 : -1; + } + const n = receive(length); + return n >= 1 << length - 1 ? n : 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, view, offset); + if (!fileMarker) { + break; + } + if (fileMarker.invalid) { + const partialMsg = mcuToRead > 0 ? "unexpected" : "excessive"; + warn(`decodeScan - ${partialMsg} MCU data, current marker is: ${fileMarker.invalid}`); + offset = fileMarker.offset; + } + if (fileMarker.marker >= 0xffd0 && fileMarker.marker <= 0xffd7) { + offset += 2; + } else { + break; + } + } + 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 { + 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(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 component.blockData; +} +function findNextFileMarker(data, view, currentPos, startPos = currentPos) { + const maxPos = data.length - 1; + let newPos = startPos < currentPos ? startPos : currentPos; + if (currentPos >= maxPos) { + return null; + } + const currentMarker = view.getUint16(currentPos); + if (currentMarker >= 0xffc0 && currentMarker <= 0xfffe) { + return { + invalid: null, + marker: currentMarker, + offset: currentPos + }; + } + let newMarker = view.getUint16(newPos); + while (!(newMarker >= 0xffc0 && newMarker <= 0xfffe)) { + if (++newPos >= maxPos) { + return null; + } + newMarker = view.getUint16(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, view, offset) { + const length = view.getUint16(offset); + offset += 2; + let endOffset = offset + length - 2; + const fileMarker = findNextFileMarker(data, view, endOffset, offset); + if (fileMarker?.invalid) { + warn("readDataBlock - incorrect length, current marker is: " + fileMarker.invalid); + endOffset = fileMarker.offset; + } + const array = data.subarray(offset, endOffset); + return { + appData: array, + oldOffset: offset, + newOffset: offset + array.length + }; +} +function skipData(data, view, offset) { + const length = view.getUint16(offset); + offset += 2; + const endOffset = offset + length - 2; + const fileMarker = findNextFileMarker(data, view, endOffset, offset); + return fileMarker?.invalid ? fileMarker.offset : endOffset; +} +class JpegImage { + constructor(options) { + this._colorTransform = options?.colorTransform ?? -1; + } + static canUseImageDecoder(data, colorTransform = -1) { + const view = new DataView(data.buffer, data.byteOffset, data.byteLength); + const info = { + width: 0, + height: 0, + exifStart: 0, + exifEnd: 0 + }; + let offset = 0; + let numComponents = null; + let fileMarker = view.getUint16(offset); + offset += 2; + if (fileMarker !== 0xffd8) { + throw new JpegError("SOI not found"); + } + fileMarker = view.getUint16(offset); + offset += 2; + markerLoop: while (fileMarker !== 0xffd9) { + switch (fileMarker) { + case 0xffe1: + const { + appData, + oldOffset, + newOffset + } = readDataBlock(data, view, offset); + offset = newOffset; + if (appData[0] === 0x45 && appData[1] === 0x78 && appData[2] === 0x69 && appData[3] === 0x66 && appData[4] === 0 && appData[5] === 0) { + if (info.exifStart) { + throw new JpegError("Duplicate EXIF-blocks found."); + } + info.exifStart = oldOffset + 6; + info.exifEnd = newOffset; + } + fileMarker = view.getUint16(offset); + offset += 2; + continue; + case 0xffc0: + case 0xffc1: + case 0xffc2: + info.height = view.getUint16(offset + (2 + 1)); + info.width = view.getUint16(offset + (2 + 1 + 2)); + numComponents = data[offset + (2 + 1 + 2 + 2)]; + break markerLoop; + case 0xffff: + if (data[offset] !== 0xff) { + offset--; + } + break; + } + offset = skipData(data, view, offset); + fileMarker = view.getUint16(offset); + offset += 2; + } + if (numComponents === 4) { + return null; + } + if (numComponents === 3 && colorTransform === 0) { + return null; + } + return info; + } + parse(data, { + dnlScanLines = null + } = {}) { + const view = new DataView(data.buffer, data.byteOffset, data.byteLength); + const maxOffset = data.length - 1; + let offset = 0; + let jfif = null; + let adobe = null; + let frame, resetInterval; + let numSOSMarkers = 0; + const quantizationTables = []; + const huffmanTablesAC = [], + huffmanTablesDC = []; + let fileMarker = view.getUint16(offset); + offset += 2; + if (fileMarker !== 0xffd8) { + throw new JpegError("SOI not found"); + } + fileMarker = view.getUint16(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, view, 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 = view.getUint16(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] = view.getUint16(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 = view.getUint16(offset); + offset += 2; + frame.scanLines = dnlScanLines || sofScanLines; + frame.samplesPerLine = view.getUint16(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 + }); + frame.componentIds[componentId] = l - 1; + offset += 3; + } + frame.maxH = maxH; + frame.maxV = maxV; + prepareComponents(frame); + break; + case 0xffc4: + const huffmanLength = view.getUint16(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 0xffdd: + offset += 2; + resetInterval = view.getUint16(offset); + offset += 2; + break; + 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 spectralStart = data[offset++], + spectralEnd = data[offset++], + successiveApproximation = data[offset++]; + try { + const processed = decodeScan(data, view, 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; + } + throw ex; + } + break; + case 0xffdc: + offset += 4; + break; + case 0xffff: + if (data[offset] !== 0xff) { + offset--; + } + break; + default: + const nextFileMarker = findNextFileMarker(data, view, offset - 2, offset - 3); + if (nextFileMarker?.invalid) { + warn("JpegImage.parse - unexpected data, current marker is: " + nextFileMarker.invalid); + offset = nextFileMarker.offset; + break; + } + if (!nextFileMarker || offset >= maxOffset) { + warn("JpegImage.parse - reached the end of the image data " + "without finding an EOI marker (0xFFD9)."); + break markerLoop; + } + throw new JpegError("JpegImage.parse - unknown marker: " + fileMarker.toString(16)); + } + if (offset < maxOffset) { + fileMarker = view.getUint16(offset); + offset += 2; + } else { + fileMarker = 0; + } + } + 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 component of frame.components) { + const quantizationTable = quantizationTables[component.quantizationId]; + if (quantizationTable) { + component.quantizationTable = quantizationTable; + } + this.components.push({ + index: component.index, + output: buildComponentData(frame, component), + scaleX: component.h / frame.maxH, + scaleY: component.v / frame.maxV, + blocksPerLine: component.blocksPerLine, + blocksPerColumn: component.blocksPerColumn + }); + } + this.numComponents = this.components.length; + return undefined; + } + #getLinearizedBlockData(width, height) { + const scaleX = this.width / width, + scaleY = this.height / height; + let component, componentScaleX, componentScaleY, blocksPerScanline; + let x, y, i, j, k; + let offset = 0; + 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; + const 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; + } + lastComponentScaleX = componentScaleX; + } + for (y = 0; y < height; y++) { + j = 0 | y * componentScaleY; + const index = blocksPerScanline * (j & mask3LSB) | (j & 7) << 3; + for (x = 0; x < width; x++) { + data[offset] = output[index + xScaleBlockOffset[x]]; + offset += numComponents; + } + } + } + return data; + } + get _isColorConversionNeeded() { + if (this.adobe) { + return !!this.adobe.transformCode; + } + 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; + } + if (this._colorTransform === 1) { + return true; + } + return false; + } + _convertYccToRgb(data) { + let Y, Cb, Cr; + for (let i = 0, ii = data.length; i < ii; 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, ii = data.length; i < ii; 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) { + this._convertYcckToCmyk(data); + return this._convertCmykToRgb(data); + } + _convertYcckToRgba(data) { + this._convertYcckToCmyk(data); + return this._convertCmykToRgba(data); + } + _convertYcckToCmyk(data) { + let Y, Cb, Cr; + for (let i = 0, ii = data.length; i < ii; 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 data; + } + _convertCmykToRgb(data) { + const count = data.length / 4; + ColorSpaceUtils.cmyk.getRgbBuffer(data, 0, count, data, 0, 8, 0); + return data.subarray(0, count * 3); + } + _convertCmykToRgba(data) { + ColorSpaceUtils.cmyk.getRgbBuffer(data, 0, data.length / 4, data, 0, 8, 1); + if (ColorSpaceUtils.cmyk instanceof DeviceCmykCS) { + for (let i = 3, ii = data.length; i < ii; i += 4) { + data[i] = 255; + } + } + return data; + } + getData({ + width, + height, + forceRGBA = false, + forceRGB = false + }) { + if (this.numComponents > 4) { + throw new JpegError("Unsupported color mode"); + } + const data = this.#getLinearizedBlockData(width, height); + if (this.numComponents === 1 && (forceRGBA || forceRGB)) { + const len = data.length * (forceRGBA ? 4 : 3); + const rgbaData = new Uint8ClampedArray(len); + if (forceRGBA) { + grayToRGBA(data, new Uint32Array(rgbaData.buffer)); + } else { + let offset = 0; + for (const grayColor of data) { + rgbaData[offset++] = grayColor; + rgbaData[offset++] = grayColor; + rgbaData[offset++] = grayColor; + } + } + 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); + } + return forceRGB ? this._convertYcckToRgb(data) : this._convertYcckToCmyk(data); + } else if (forceRGBA) { + return this._convertCmykToRgba(data); + } else if (forceRGB) { + return this._convertCmykToRgb(data); + } + } + return data; + } +} + +;// ./src/core/jpeg_stream.js + + + + + +class JpegStream extends DecodeStream { + static #isImageDecoderSupported = FeatureTest.isImageDecoderSupported; + constructor(stream, maybeLength, params) { + super(maybeLength); + this.stream = stream; + this.dict = stream.dict; + this.maybeLength = maybeLength; + this.params = params; + } + static get canUseImageDecoder() { + return util_shadow(this, "canUseImageDecoder", this.#isImageDecoderSupported ? ImageDecoder.isTypeSupported("image/jpeg") : Promise.resolve(false)); + } + static setOptions({ + isImageDecoderSupported = false + }) { + this.#isImageDecoderSupported = isImageDecoderSupported; + } + get bytes() { + return util_shadow(this, "bytes", this.stream.getBytes(this.maybeLength)); + } + ensureBuffer(requested) {} + readBlock() { + this.decodeImage(); + } + get jpegOptions() { + const jpegOptions = { + colorTransform: undefined + }; + if (this.params instanceof Dict) { + const colorTransform = this.params.get("ColorTransform"); + if (Number.isInteger(colorTransform)) { + jpegOptions.colorTransform = colorTransform; + } + } + return util_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 + }); + this.buffer = data; + this.bufferLength = data.length; + this.eof = true; + return this.buffer; + } + get canAsyncDecodeImageFromBuffer() { + return this.stream.isAsync; + } + async getTransferableImage(width, height) { + if (!(await JpegStream.canUseImageDecoder)) { + return null; + } + const jpegOptions = this.jpegOptions; + let decoder; + try { + const bytes = this.canAsyncDecodeImageFromBuffer && (await this.stream.asyncGetBytes()) || this.bytes; + if (!bytes) { + return null; + } + let data = this.#skipUselessBytes(bytes); + const useImageDecoder = JpegImage.canUseImageDecoder(data, jpegOptions.colorTransform); + if (!useImageDecoder) { + return null; + } + const { + width: frameWidth, + height: frameHeight + } = useImageDecoder; + const reducePower = ImageResizer.getReducePower(frameWidth, frameHeight); + if ((frameWidth !== width || frameHeight !== height) && (reducePower || !frameHeight)) { + return null; + } + if (useImageDecoder.exifStart) { + data = data.slice(); + data.fill(0x00, useImageDecoder.exifStart, useImageDecoder.exifEnd); + } + const init = { + data, + type: "image/jpeg", + preferAnimation: false + }; + if (reducePower) { + const factor = 2 ** reducePower; + init.desiredWidth = Math.ceil(frameWidth / factor); + init.desiredHeight = Math.ceil(frameHeight / factor); + } + decoder = new ImageDecoder(init); + return (await decoder.decode()).image; + } catch (reason) { + warn(`getTransferableImage - failed: "${reason}".`); + return null; + } finally { + decoder?.close(); + } + } + get isImageStream() { + return true; + } +} + +;// ./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] ||= []; + } + state[pattern.at(-1)] = { + checkFn, + iterateFn, + processFn + }; +} +const InitialState = []; +addState(InitialState, [OPS.save, OPS.transform, OPS.paintInlineImageXObject, OPS.restore], null, function iterateInlineImageGroup(context, i) { + const fnArray = context.fnArray; + const iFirstSave = context.iCurr - 3; + const pos = (i - iFirstSave) % 4; + switch (pos) { + case 0: + return fnArray[i] === OPS.save; + case 1: + return fnArray[i] === OPS.transform; + case 2: + return fnArray[i] === OPS.paintInlineImageXObject; + case 3: + return fnArray[i] === OPS.restore; + } + throw new Error(`iterateInlineImageGroup - invalid pos: ${pos}`); +}, function foundInlineImageGroup(context, i) { + const MIN_IMAGES_IN_INLINE_IMAGES_BLOCK = 10; + const MAX_IMAGES_IN_INLINE_IMAGES_BLOCK = 200; + const MAX_WIDTH = 1000; + const IMAGE_PADDING = 1; + const fnArray = context.fnArray, + argsArray = context.argsArray; + const curr = context.iCurr; + const iFirstSave = curr - 3; + const iFirstTransform = curr - 2; + const iFirstPIIXO = curr - 1; + const count = Math.min(Math.floor((i - iFirstSave) / 4), MAX_IMAGES_IN_INLINE_IMAGES_BLOCK); + if (count < MIN_IMAGES_IN_INLINE_IMAGES_BLOCK) { + return i - (i - iFirstSave) % 4; + } + let maxX = 0; + const map = []; + let maxLineHeight = 0; + let currentX = IMAGE_PADDING, + currentY = IMAGE_PADDING; + for (let q = 0; q < count; q++) { + const transform = argsArray[iFirstTransform + (q << 2)]; + const img = argsArray[iFirstPIIXO + (q << 2)][0]; + if (currentX + img.width > MAX_WIDTH) { + maxX = Math.max(maxX, currentX); + currentY += maxLineHeight + 2 * IMAGE_PADDING; + currentX = 0; + maxLineHeight = 0; + } + map.push({ + transform, + x: currentX, + y: currentY, + w: img.width, + h: img.height + }); + currentX += img.width + 2 * IMAGE_PADDING; + maxLineHeight = Math.max(maxLineHeight, img.height); + } + const imgWidth = Math.max(maxX, currentX) + IMAGE_PADDING; + const imgHeight = currentY + maxLineHeight + IMAGE_PADDING; + const imgData = new 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 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); + img.bitmap = canvas.transferToImageBitmap(); + img.data = null; + } else { + img.kind = ImageKind.RGBA_32BPP; + img.data = imgData; + } + fnArray.splice(iFirstSave, count * 4, OPS.paintInlineImageXObjectGroup); + argsArray.splice(iFirstSave, count * 4, [img, map]); + return iFirstSave + 1; +}); +addState(InitialState, [OPS.save, OPS.transform, OPS.paintImageMaskXObject, OPS.restore], null, function iterateImageMaskGroup(context, i) { + const fnArray = context.fnArray; + const iFirstSave = context.iCurr - 3; + const pos = (i - iFirstSave) % 4; + switch (pos) { + case 0: + return fnArray[i] === OPS.save; + case 1: + return fnArray[i] === OPS.transform; + case 2: + return fnArray[i] === OPS.paintImageMaskXObject; + case 3: + return fnArray[i] === OPS.restore; + } + throw new Error(`iterateImageMaskGroup - invalid pos: ${pos}`); +}, function foundImageMaskGroup(context, i) { + const MIN_IMAGES_IN_MASKS_BLOCK = 10; + const MAX_IMAGES_IN_MASKS_BLOCK = 100; + const MAX_SAME_IMAGES_IN_MASKS_BLOCK = 1000; + const fnArray = context.fnArray, + argsArray = context.argsArray; + const curr = context.iCurr; + const iFirstSave = curr - 3; + const iFirstTransform = curr - 2; + const iFirstPIMXO = curr - 1; + let count = Math.floor((i - iFirstSave) / 4); + if (count < MIN_IMAGES_IN_MASKS_BLOCK) { + return i - (i - iFirstSave) % 4; + } + let isSameImage = false; + let iTransform, transformArgs; + const firstPIMXOArg0 = argsArray[iFirstPIMXO][0]; + const firstTransformArg0 = argsArray[iFirstTransform][0], + firstTransformArg1 = argsArray[iFirstTransform][1], + firstTransformArg2 = argsArray[iFirstTransform][2], + firstTransformArg3 = argsArray[iFirstTransform][3]; + if (firstTransformArg1 === firstTransformArg2) { + isSameImage = true; + iTransform = iFirstTransform + 4; + let iPIMXO = iFirstPIMXO + 4; + for (let q = 1; q < count; q++, iTransform += 4, iPIMXO += 4) { + transformArgs = argsArray[iTransform]; + if (argsArray[iPIMXO][0] !== firstPIMXOArg0 || transformArgs[0] !== firstTransformArg0 || transformArgs[1] !== firstTransformArg1 || transformArgs[2] !== firstTransformArg2 || transformArgs[3] !== firstTransformArg3) { + if (q < MIN_IMAGES_IN_MASKS_BLOCK) { + isSameImage = false; + } else { + count = q; + } + break; + } + } + } + if (isSameImage) { + count = Math.min(count, MAX_SAME_IMAGES_IN_MASKS_BLOCK); + const positions = new Float32Array(count * 2); + iTransform = iFirstTransform; + for (let q = 0; q < count; q++, iTransform += 4) { + transformArgs = argsArray[iTransform]; + positions[q << 1] = transformArgs[4]; + positions[(q << 1) + 1] = transformArgs[5]; + } + fnArray.splice(iFirstSave, count * 4, OPS.paintImageMaskXObjectRepeat); + argsArray.splice(iFirstSave, count * 4, [firstPIMXOArg0, firstTransformArg0, firstTransformArg1, firstTransformArg2, firstTransformArg3, positions]); + } else { + count = Math.min(count, MAX_IMAGES_IN_MASKS_BLOCK); + const images = []; + for (let q = 0; q < count; q++) { + transformArgs = argsArray[iFirstTransform + (q << 2)]; + const maskParams = argsArray[iFirstPIMXO + (q << 2)][0]; + images.push({ + data: maskParams.data, + width: maskParams.width, + height: maskParams.height, + interpolate: maskParams.interpolate, + count: maskParams.count, + transform: transformArgs + }); + } + fnArray.splice(iFirstSave, count * 4, OPS.paintImageMaskXObjectGroup); + argsArray.splice(iFirstSave, count * 4, [images]); + } + return iFirstSave + 1; +}); +addState(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(context, i) { + const fnArray = context.fnArray, + argsArray = context.argsArray; + const iFirstSave = context.iCurr - 3; + const pos = (i - iFirstSave) % 4; + switch (pos) { + case 0: + return fnArray[i] === OPS.save; + case 1: + 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 (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 fnArray[i] === OPS.restore; + } + throw new Error(`iterateImageGroup - invalid pos: ${pos}`); +}, function (context, i) { + const MIN_IMAGES_IN_BLOCK = 3; + const MAX_IMAGES_IN_BLOCK = 1000; + const fnArray = context.fnArray, + argsArray = context.argsArray; + const curr = context.iCurr; + const iFirstSave = curr - 3; + const iFirstTransform = curr - 2; + const iFirstPIXO = curr - 1; + const firstPIXOArg0 = argsArray[iFirstPIXO][0]; + const firstTransformArg0 = argsArray[iFirstTransform][0]; + const firstTransformArg3 = argsArray[iFirstTransform][3]; + const count = Math.min(Math.floor((i - iFirstSave) / 4), MAX_IMAGES_IN_BLOCK); + if (count < MIN_IMAGES_IN_BLOCK) { + return i - (i - iFirstSave) % 4; + } + const positions = new Float32Array(count * 2); + let iTransform = iFirstTransform; + for (let q = 0; q < count; q++, iTransform += 4) { + const transformArgs = argsArray[iTransform]; + positions[q << 1] = transformArgs[4]; + positions[(q << 1) + 1] = transformArgs[5]; + } + const args = [firstPIXOArg0, firstTransformArg0, firstTransformArg3, positions]; + fnArray.splice(iFirstSave, count * 4, OPS.paintImageXObjectRepeat); + argsArray.splice(iFirstSave, count * 4, args); + return iFirstSave + 1; +}); +addState(InitialState, [OPS.beginText, OPS.setFont, OPS.setTextMatrix, OPS.showText, OPS.endText], null, function iterateShowTextGroup(context, i) { + const fnArray = context.fnArray, + argsArray = context.argsArray; + const iFirstSave = context.iCurr - 4; + const pos = (i - iFirstSave) % 5; + switch (pos) { + case 0: + return fnArray[i] === OPS.beginText; + case 1: + return fnArray[i] === OPS.setFont; + case 2: + return fnArray[i] === OPS.setTextMatrix; + case 3: + 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 fnArray[i] === OPS.endText; + } + throw new Error(`iterateShowTextGroup - invalid pos: ${pos}`); +}, function (context, i) { + const MIN_CHARS_IN_BLOCK = 3; + const MAX_CHARS_IN_BLOCK = 1000; + const fnArray = context.fnArray, + argsArray = context.argsArray; + const curr = context.iCurr; + const iFirstBeginText = curr - 4; + const iFirstSetFont = curr - 3; + const iFirstSetTextMatrix = curr - 2; + const iFirstShowText = curr - 1; + const iFirstEndText = curr; + const firstSetFontArg0 = argsArray[iFirstSetFont][0]; + const firstSetFontArg1 = argsArray[iFirstSetFont][1]; + let count = Math.min(Math.floor((i - iFirstBeginText) / 5), MAX_CHARS_IN_BLOCK); + if (count < MIN_CHARS_IN_BLOCK) { + return i - (i - iFirstBeginText) % 5; + } + let iFirst = iFirstBeginText; + if (iFirstBeginText >= 4 && fnArray[iFirstBeginText - 4] === fnArray[iFirstSetFont] && fnArray[iFirstBeginText - 3] === fnArray[iFirstSetTextMatrix] && fnArray[iFirstBeginText - 2] === fnArray[iFirstShowText] && fnArray[iFirstBeginText - 1] === fnArray[iFirstEndText] && argsArray[iFirstBeginText - 4][0] === firstSetFontArg0 && argsArray[iFirstBeginText - 4][1] === firstSetFontArg1) { + count++; + iFirst -= 5; + } + let iEndText = iFirst + 4; + for (let q = 1; q < count; q++) { + fnArray.splice(iEndText, 3); + argsArray.splice(iEndText, 3); + iEndText += 2; + } + return iEndText + 1; +}); +addState(InitialState, [OPS.save, OPS.transform, OPS.constructPath, OPS.restore], context => { + const argsArray = context.argsArray; + const iFirstConstructPath = context.iCurr - 1; + const op = argsArray[iFirstConstructPath][0]; + if (op !== OPS.stroke && op !== OPS.closeStroke && op !== OPS.fillStroke && op !== OPS.eoFillStroke && op !== OPS.closeFillStroke && op !== OPS.closeEOFillStroke) { + return true; + } + const iFirstTransform = context.iCurr - 2; + const transform = argsArray[iFirstTransform]; + return transform[0] === 1 && transform[1] === 0 && transform[2] === 0 && transform[3] === 1; +}, () => false, (context, i) => { + const { + fnArray, + argsArray + } = context; + const curr = context.iCurr; + const iFirstSave = curr - 3; + const iFirstTransform = curr - 2; + const iFirstConstructPath = curr - 1; + const args = argsArray[iFirstConstructPath]; + const transform = argsArray[iFirstTransform]; + const [, [buffer], minMax] = args; + if (minMax) { + const newBBox = F32_BBOX_INIT.slice(); + Util.axialAlignedBoundingBox(minMax, transform, newBBox); + minMax.set(newBBox); + for (let k = 0, kk = buffer.length; k < kk;) { + switch (buffer[k++]) { + case DrawOPS.moveTo: + case DrawOPS.lineTo: + Util.applyTransform(buffer, transform, k); + k += 2; + break; + case DrawOPS.curveTo: + Util.applyTransformToBezier(buffer, transform, k); + k += 6; + break; + } + } + } + fnArray.splice(iFirstSave, 4, OPS.constructPath); + argsArray.splice(iFirstSave, 4, args); + return iFirstSave + 1; +}); +class NullOptimizer { + constructor(queue) { + this.queue = queue; + } + _optimize() {} + push(fn, args) { + this.queue.fnArray.push(fn); + this.queue.argsArray.push(args); + this._optimize(); + } + flush() {} + reset() {} +} +class QueueOptimizer extends NullOptimizer { + constructor(queue) { + super(queue); + this.state = null; + this.context = { + iCurr: 0, + fnArray: queue.fnArray, + argsArray: queue.argsArray, + isOffscreenCanvasSupported: OperatorList.isOffscreenCanvasSupported + }; + this.match = null; + this.lastProcessed = 0; + } + _optimize() { + const fnArray = this.queue.fnArray; + let i = this.lastProcessed, + ii = fnArray.length; + let state = this.state; + let match = this.match; + if (!state && !match && i + 1 === ii && !InitialState[fnArray[i]]) { + this.lastProcessed = ii; + return; + } + const context = this.context; + while (i < ii) { + if (match) { + const iterate = (0, match.iterateFn)(context, i); + if (iterate) { + i++; + continue; + } + i = (0, match.processFn)(context, i + 1); + ii = fnArray.length; + match = null; + state = null; + if (i >= ii) { + break; + } + } + state = (state || InitialState)[fnArray[i]]; + if (!state || Array.isArray(state)) { + i++; + continue; + } + context.iCurr = i; + i++; + if (state.checkFn && !(0, state.checkFn)(context)) { + state = null; + continue; + } + match = state; + state = null; + } + this.state = state; + this.match = match; + this.lastProcessed = i; + } + flush() { + while (this.match) { + const length = this.queue.fnArray.length; + this.lastProcessed = (0, this.match.processFn)(this.context, length); + this.match = null; + this.state = null; + this._optimize(); + } + } + reset() { + this.state = null; + this.match = null; + this.lastProcessed = 0; + } +} +class OperatorList { + static CHUNK_SIZE = 1000; + static CHUNK_SIZE_ABOUT = this.CHUNK_SIZE - 5; + static isOffscreenCanvasSupported = false; + constructor(intent = 0, streamSink) { + this._streamSink = streamSink; + this.fnArray = []; + this.argsArray = []; + this.optimizer = streamSink && !(intent & RenderingIntentFlag.OPLIST) ? new QueueOptimizer(this) : new NullOptimizer(this); + this.dependencies = new Set(); + this.weight = 0; + this._resolved = streamSink ? null : Promise.resolve(); + } + static setOptions({ + isOffscreenCanvasSupported + }) { + this.isOffscreenCanvasSupported = isOffscreenCanvasSupported; + } + get length() { + return this.argsArray.length; + } + get ready() { + return this._resolved || this._streamSink.ready; + } + addOp(fn, args) { + this.optimizer.push(fn, args); + this.weight++; + if (this._streamSink) { + if (this.weight >= OperatorList.CHUNK_SIZE) { + this.flush(); + } else if (this.weight >= OperatorList.CHUNK_SIZE_ABOUT && (fn === OPS.restore || fn === OPS.endText)) { + this.flush(); + } + } + } + addImageOps(fn, args, optionalContent, hasMask = false) { + if (hasMask) { + this.addOp(OPS.save); + this.addOp(OPS.setGState, [[["SMask", false]]]); + } + if (optionalContent !== undefined) { + this.addOp(OPS.beginMarkedContentProps, ["OC", optionalContent]); + } + this.addOp(fn, args); + if (optionalContent !== undefined) { + this.addOp(OPS.endMarkedContent, []); + } + if (hasMask) { + this.addOp(OPS.restore); + } + } + 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 { + fnArray: this.fnArray, + argsArray: this.argsArray, + length: this.length + }; + } + get _transfers() { + const transfers = []; + const { + fnArray, + argsArray, + length + } = this; + for (let i = 0; i < length; i++) { + switch (fnArray[i]) { + case OPS.paintInlineImageXObject: + case OPS.paintInlineImageXObjectGroup: + case OPS.paintImageMaskXObject: + { + const { + bitmap, + data + } = argsArray[i][0]; + if (bitmap || data?.buffer) { + transfers.push(bitmap || data.buffer); + } + break; + } + case OPS.constructPath: + { + const [, [data], minMax] = argsArray[i]; + if (data) { + transfers.push(data.buffer, minMax.buffer); + } + break; + } + case OPS.paintFormXObjectBegin: + const [matrix, bbox] = argsArray[i]; + if (matrix) { + transfers.push(matrix.buffer); + } + if (bbox) { + transfers.push(bbox.buffer); + } + break; + case OPS.setTextMatrix: + transfers.push(argsArray[i][0].buffer); + break; + } + } + return transfers; + } + flush(lastChunk = false, separateAnnots = null) { + this.optimizer.flush(); + this._streamSink.enqueue({ + fnArray: this.fnArray, + argsArray: this.argsArray, + lastChunk, + separateAnnots, + length: this.length + }, 1, this._transfers); + this.dependencies.clear(); + this.fnArray.length = 0; + this.argsArray.length = 0; + this.weight = 0; + this.optimizer.reset(); + } +} +class CheckedOperatorList extends OperatorList { + needsIsolation = false; + hasSoftMask = false; + addOp(fn, args) { + if (!this.needsIsolation || !this.hasSoftMask) { + if (fn === OPS.beginGroup) { + this.needsIsolation ||= args[0].needsIsolation; + this.hasSoftMask ||= args[0].hasSoftMask; + } else if (fn === OPS.setGState) { + for (const [key, val] of args[0]) { + if (key === "BM" && val !== "source-over") { + this.needsIsolation = true; + } else if (key === "SMask" && val !== false) { + this.needsIsolation = true; + this.hasSoftMask = true; + } + } + } + } + super.addOp(fn, args); + } +} + +;// ./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 +}; +const MAX_SAMPLED_COLOR_COMPONENTS = 1 << 16; +function getColorConversionBatchSize(count, numComps) { + return MathClamp(Math.floor(MAX_SAMPLED_COLOR_COMPONENTS / numComps), 1, count); +} +function parseShadingFunction(fnObj, pdfFunctionFactory, numInputs, numOutputs) { + const fn = pdfFunctionFactory.create(fnObj, true); + if (fn.numInputs !== numInputs || fn.numOutputs !== numOutputs) { + throw new FormatError(`Invalid shading function: expected ${numInputs}-in ${numOutputs}-out, ` + `got ${fn.numInputs}-in ${fn.numOutputs}-out.`); + } + return fn; +} +class Pattern { + static #hasGPU = false; + constructor() { + unreachable("Cannot initialize Pattern."); + } + static setOptions({ + hasGPU + }) { + this.#hasGPU = hasGPU; + } + static parseShading(shading, xref, res, pdfFunctionFactory, globalColorSpaceCache, localColorSpaceCache) { + const dict = shading instanceof BaseStream ? shading.dict : shading; + const type = dict.get("ShadingType"); + try { + switch (type) { + case ShadingType.FUNCTION_BASED: + return new FunctionBasedShading(dict, xref, res, pdfFunctionFactory, globalColorSpaceCache, localColorSpaceCache); + case ShadingType.AXIAL: + case ShadingType.RADIAL: + return new RadialAxialShading(dict, xref, res, pdfFunctionFactory, globalColorSpaceCache, 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, globalColorSpaceCache, localColorSpaceCache); + default: + throw new FormatError("Unsupported ShadingType: " + type); + } + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn(ex); + return new DummyShading(); + } + } +} +class BaseShading { + static SMALL_NUMBER = 1e-6; + getIR() { + unreachable("Abstract method `getIR` called."); + } +} +class RadialAxialShading extends BaseShading { + constructor(dict, xref, resources, pdfFunctionFactory, globalColorSpaceCache, localColorSpaceCache) { + super(); + this.shadingType = dict.get("ShadingType"); + let coordsLen = 0; + if (this.shadingType === ShadingType.AXIAL) { + coordsLen = 4; + } else if (this.shadingType === ShadingType.RADIAL) { + coordsLen = 6; + } + this.coordsArr = dict.getArray("Coords"); + if (!isNumberArray(this.coordsArr, coordsLen)) { + throw new FormatError("RadialAxialShading: Invalid /Coords array."); + } + const cs = ColorSpaceUtils.parse({ + cs: dict.getRaw("CS") || dict.getRaw("ColorSpace"), + xref, + resources, + pdfFunctionFactory, + globalColorSpaceCache, + localColorSpaceCache + }); + this.bbox = lookupNormalRect(dict.getArray("BBox"), null); + const domainArr = dict.getArray("Domain"); + const [t0, t1] = isNumberArray(domainArr, 2) ? domainArr : [0.0, 1.0]; + const extendArr = dict.getArray("Extend"); + const [extendStart, extendEnd] = isBooleanArray(extendArr, 2) ? extendArr : [false, false]; + const fnObj = dict.getRaw("Function"); + const fn = parseShadingFunction(fnObj, pdfFunctionFactory, 1, cs.numComps); + 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 { + numComps + } = cs; + const ratio = new Float32Array(1); + const batchSize = getColorConversionBatchSize(NUMBER_OF_SAMPLES, numComps); + const comps = new Float32Array(batchSize * numComps); + const rgb = new Uint8ClampedArray(NUMBER_OF_SAMPLES * 3); + for (let start = 0; start < NUMBER_OF_SAMPLES; start += batchSize) { + const count = Math.min(batchSize, NUMBER_OF_SAMPLES - start); + for (let i = 0, offset = 0; i < count; i++, offset += numComps) { + ratio[0] = t0 + (start + i) * step; + fn(ratio, 0, comps, offset); + } + cs.getRgbItems(comps, count, rgb, start * 3, 0); + } + let iBase = 0; + let rBase = rgb[0], + gBase = rgb[1], + bBase = rgb[2]; + colorStops.push([0, Util.makeHexColor(rBase, gBase, bBase)]); + let iPrev = 1; + let rPrev = rgb[3], + gPrev = rgb[4], + bPrev = rgb[5]; + let maxSlopeR = rPrev - rBase + 1; + let maxSlopeG = gPrev - gBase + 1; + let maxSlopeB = bPrev - bBase + 1; + let minSlopeR = rPrev - rBase - 1; + let minSlopeG = gPrev - gBase - 1; + let minSlopeB = bPrev - bBase - 1; + for (let i = 2; i < NUMBER_OF_SAMPLES; i++) { + const rgbOffset = i * 3; + const r = rgb[rgbOffset], + g = rgb[rgbOffset + 1], + b = rgb[rgbOffset + 2]; + const run = i - iBase; + maxSlopeR = Math.min(maxSlopeR, (r - rBase + 1) / run); + maxSlopeG = Math.min(maxSlopeG, (g - gBase + 1) / run); + maxSlopeB = Math.min(maxSlopeB, (b - bBase + 1) / run); + minSlopeR = Math.max(minSlopeR, (r - rBase - 1) / run); + minSlopeG = Math.max(minSlopeG, (g - gBase - 1) / run); + minSlopeB = Math.max(minSlopeB, (b - bBase - 1) / run); + const slopesExist = minSlopeR <= maxSlopeR && minSlopeG <= maxSlopeG && minSlopeB <= maxSlopeB; + if (!slopesExist) { + const cssColor = Util.makeHexColor(rPrev, gPrev, bPrev); + colorStops.push([iPrev / NUMBER_OF_SAMPLES, cssColor]); + maxSlopeR = r - rPrev + 1; + maxSlopeG = g - gPrev + 1; + maxSlopeB = b - bPrev + 1; + minSlopeR = r - rPrev - 1; + minSlopeG = g - gPrev - 1; + minSlopeB = b - bPrev - 1; + iBase = iPrev; + rBase = rPrev; + gBase = gPrev; + bBase = bPrev; + } + iPrev = i; + rPrev = r; + gPrev = g; + bPrev = b; + } + colorStops.push([1, Util.makeHexColor(rPrev, gPrev, bPrev)]); + const background = dict.has("Background") ? cs.getRgbHex(dict.get("Background"), 0) : "transparent"; + if (!extendStart) { + colorStops.unshift([0, background]); + colorStops[1][0] += BaseShading.SMALL_NUMBER; + } + if (!extendEnd) { + colorStops.at(-1)[0] -= BaseShading.SMALL_NUMBER; + colorStops.push([1, background]); + } + } + getIR() { + 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]; + } +} +function meshUpdateBounds(self) { + let minX = self.coords[0][0], + minY = self.coords[0][1], + maxX = minX, + maxY = minY; + for (let i = 1, ii = self.coords.length; i < ii; i++) { + const x = self.coords[i][0], + y = self.coords[i][1]; + minX = minX > x ? x : minX; + minY = minY > y ? y : minY; + maxX = maxX < x ? x : maxX; + maxY = maxY < y ? y : maxY; + } + self.bounds = [minX, minY, maxX, maxY]; +} +function meshPackData(self) { + let i, j, ii; + const coords = self.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]; + } + self.coords = coordsPacked; + const colors = self.colors; + const colorsPacked = new Uint8Array(colors.length * 4); + 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]; + j++; + } + self.colors = colorsPacked; + for (const figure of self.figures) { + figure.coords = new Uint32Array(figure.coords); + figure.colors = new Uint32Array(figure.colors); + } +} +function buildMeshVertexData(coords, colors, figures) { + let vertexCount = 0; + for (const figure of figures) { + if (figure.type === MeshFigureType.TRIANGLES) { + vertexCount += figure.coords.length; + } else if (figure.type === MeshFigureType.LATTICE) { + const vpr = figure.verticesPerRow; + vertexCount += (Math.floor(figure.coords.length / vpr) - 1) * (vpr - 1) * 6; + } + } + const posData = new Float32Array(vertexCount * 2); + const colData = new Uint8Array(vertexCount * 4); + let pOff = 0, + cOff = 0; + const addVertex = (pi, ci) => { + posData[pOff++] = coords[pi * 2]; + posData[pOff++] = coords[pi * 2 + 1]; + colData[cOff++] = colors[ci * 4]; + colData[cOff++] = colors[ci * 4 + 1]; + colData[cOff++] = colors[ci * 4 + 2]; + cOff++; + }; + for (const figure of figures) { + const ps = figure.coords; + const cs = figure.colors; + if (figure.type === MeshFigureType.TRIANGLES) { + for (let i = 0, ii = ps.length; i < ii; i++) { + addVertex(ps[i], cs[i]); + } + } else if (figure.type === MeshFigureType.LATTICE) { + const vpr = figure.verticesPerRow; + const rows = Math.floor(ps.length / vpr) - 1; + const cols = vpr - 1; + for (let i = 0; i < rows; i++) { + let q = i * vpr; + for (let j = 0; j < cols; j++, q++) { + addVertex(ps[q], cs[q]); + addVertex(ps[q + 1], cs[q + 1]); + addVertex(ps[q + vpr], cs[q + vpr]); + addVertex(ps[q + vpr + 1], cs[q + vpr + 1]); + addVertex(ps[q + 1], cs[q + 1]); + addVertex(ps[q + vpr], cs[q + vpr]); + } + } + } + } + return { + posData, + colData, + vertexCount + }; +} +class FunctionBasedShading extends BaseShading { + static MAX_STEP_COUNT = 512; + constructor(dict, xref, resources, pdfFunctionFactory, globalColorSpaceCache, localColorSpaceCache) { + super(); + this.bbox = lookupNormalRect(dict.getArray("BBox"), null); + const cs = ColorSpaceUtils.parse({ + cs: dict.getRaw("CS") || dict.getRaw("ColorSpace"), + xref, + resources, + pdfFunctionFactory, + globalColorSpaceCache, + localColorSpaceCache + }); + this.background = dict.has("Background") ? cs.getRgb(dict.get("Background"), 0) : null; + const fnObj = dict.getRaw("Function"); + if (!fnObj) { + throw new FormatError("FunctionBasedShading: missing /Function"); + } + const fn = parseShadingFunction(fnObj, pdfFunctionFactory, 2, cs.numComps); + const [x0, x1, y0, y1] = lookupRect(dict.getArray("Domain"), [0, 1, 0, 1]); + const matrix = lookupMatrix(dict.getArray("Matrix"), IDENTITY_MATRIX); + this.bounds = BBOX_INIT.slice(); + Util.axialAlignedBoundingBox([x0, y0, x1, y1], matrix, this.bounds); + const bboxW = this.bounds[2] - this.bounds[0]; + const bboxH = this.bounds[3] - this.bounds[1]; + const stepsX = MathClamp(Math.ceil(bboxW), 1, FunctionBasedShading.MAX_STEP_COUNT); + const stepsY = MathClamp(Math.ceil(bboxH), 1, FunctionBasedShading.MAX_STEP_COUNT); + const verticesPerRow = stepsX + 1; + const totalVertices = (stepsY + 1) * verticesPerRow; + const coords = this.coords = new Float32Array(totalVertices * 2); + const colors = this.colors = new Uint8ClampedArray(totalVertices * 4); + const { + numComps + } = cs; + const xyBuf = new Float32Array(2); + const batchSize = getColorConversionBatchSize(totalVertices, numComps); + const comps = new Float32Array(batchSize * numComps); + const rangeX = (x1 - x0) / stepsX; + const rangeY = (y1 - y0) / stepsY; + const halfStepX = rangeX / 2; + const halfStepY = rangeY / 2; + let coordOffset = 0; + let compOffset = 0; + let batchCount = 0; + let colorOffset = 0; + for (let row = 0; row <= stepsY; row++) { + const yDomain = y0 + rangeY * row; + xyBuf[1] = row === stepsY ? yDomain - halfStepY : yDomain; + for (let col = 0; col <= stepsX; col++) { + const xDomain = x0 + rangeX * col; + xyBuf[0] = col === stepsX ? xDomain - halfStepX : xDomain; + fn(xyBuf, 0, comps, compOffset); + compOffset += numComps; + batchCount++; + coords[coordOffset] = xDomain; + coords[coordOffset + 1] = yDomain; + Util.applyTransform(coords, matrix, coordOffset); + coordOffset += 2; + if (batchCount === batchSize) { + cs.getRgbItems(comps, batchCount, colors, colorOffset, 1); + colorOffset += batchCount * 4; + compOffset = batchCount = 0; + } + } + } + if (batchCount > 0) { + cs.getRgbItems(comps, batchCount, colors, colorOffset, 1); + } + const ps = new Uint32Array(totalVertices); + for (let i = 0; i < totalVertices; i++) { + ps[i] = i; + } + this.figures = [{ + type: MeshFigureType.LATTICE, + coords: ps, + colors: new Uint32Array(ps), + verticesPerRow + }]; + } + getIR() { + const { + posData, + colData, + vertexCount + } = buildMeshVertexData(this.coords, this.colors, this.figures); + return ["Mesh", ShadingType.FUNCTION_BASED, posData, colData, vertexCount, this.bounds, this.bbox, this.background]; + } +} +class MeshStreamReader { + constructor(stream, context) { + this.stream = stream; + this.context = context; + this.buffer = 0; + this.bufferLength = 0; + 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 true; + } + const nextByte = this.stream.getByte(); + if (nextByte < 0) { + return false; + } + this.buffer = nextByte; + this.bufferLength = 8; + return true; + } + readBits(n) { + const { + stream + } = this; + let { + buffer, + bufferLength + } = this; + if (n === 32) { + if (bufferLength === 0) { + return stream.getInt32() >>> 0; + } + buffer = buffer << 24 | stream.getByte() << 16 | stream.getByte() << 8 | stream.getByte(); + const nextByte = stream.getByte(); + this.buffer = nextByte & (1 << bufferLength) - 1; + return (buffer << 8 - bufferLength | (nextByte & 0xff) >> bufferLength) >>> 0; + } + if (n === 8 && bufferLength === 0) { + return stream.getByte(); + } + while (bufferLength < n) { + buffer = buffer << 8 | stream.getByte(); + bufferLength += 8; + } + bufferLength -= n; + this.bufferLength = bufferLength; + this.buffer = buffer & (1 << bufferLength) - 1; + return buffer >> bufferLength; + } + align() { + this.buffer = 0; + this.bufferLength = 0; + } + readFlag() { + return this.readBits(this.context.bitsPerFlag); + } + readCoordinate() { + const { + bitsPerCoordinate, + decode + } = this.context; + const xi = this.readBits(bitsPerCoordinate); + const yi = this.readBits(bitsPerCoordinate); + 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 { + bitsPerComponent, + colorFn, + colorSpace, + decode, + numComps + } = this.context; + const scale = bitsPerComponent < 32 ? 1 / ((1 << bitsPerComponent) - 1) : 2.3283064365386963e-10; + const components = this.tmpCompsBuf; + for (let i = 0, j = 4; i < numComps; i++, j += 2) { + const ci = this.readBits(bitsPerComponent); + components[i] = ci * scale * (decode[j + 1] - decode[j]) + decode[j]; + } + const color = this.tmpCsCompsBuf; + colorFn?.(components, 0, color, 0); + return colorSpace.getRgb(color, 0); + } +} +let bCache = null; +function getB(count) { + return (bCache ??= new Map()).getOrInsertComputed(count, () => Array.from({ + length: count + 1 + }, (_, i) => { + const t = i / count, + t_ = 1 - t; + return new Float32Array([t_ ** 3, 3 * t * t_ ** 2, 3 * t ** 2 * t_, t ** 3]); + })); +} +function clearPatternCaches() { + bCache?.clear(); +} +class MeshShading extends BaseShading { + static MIN_SPLIT_PATCH_CHUNKS_AMOUNT = 3; + static MAX_SPLIT_PATCH_CHUNKS_AMOUNT = 20; + static TRIANGLE_DENSITY = 20; + constructor(stream, xref, resources, pdfFunctionFactory, globalColorSpaceCache, localColorSpaceCache) { + super(); + if (!(stream instanceof BaseStream)) { + throw new FormatError("Mesh data is not a stream"); + } + const dict = stream.dict; + this.shadingType = dict.get("ShadingType"); + this.bbox = lookupNormalRect(dict.getArray("BBox"), null); + const cs = ColorSpaceUtils.parse({ + cs: dict.getRaw("CS") || dict.getRaw("ColorSpace"), + xref, + resources, + pdfFunctionFactory, + globalColorSpaceCache, + localColorSpaceCache + }); + this.background = dict.has("Background") ? cs.getRgb(dict.get("Background"), 0) : null; + const fnObj = dict.getRaw("Function"); + const fn = fnObj ? parseShadingFunction(fnObj, pdfFunctionFactory, 1, cs.numComps) : null; + this.coords = []; + this.colors = []; + this.figures = []; + const decodeContext = { + bitsPerCoordinate: dict.get("BitsPerCoordinate"), + bitsPerComponent: dict.get("BitsPerComponent"), + bitsPerFlag: dict.get("BitsPerFlag"), + decode: dict.getArray("Decode"), + colorFn: fn, + colorSpace: cs, + numComps: fn ? 1 : cs.numComps + }; + const reader = new MeshStreamReader(stream, decodeContext); + let patchMesh = false; + switch (this.shadingType) { + case ShadingType.FREE_FORM_MESH: + this._decodeType4Shading(reader); + break; + 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 ShadingType.COONS_PATCH_MESH: + this._decodeType6Shading(reader); + patchMesh = true; + break; + case ShadingType.TENSOR_PATCH_MESH: + this._decodeType7Shading(reader); + patchMesh = true; + break; + default: + unreachable("Unsupported mesh type."); + break; + } + if (patchMesh) { + this._updateBounds(); + for (let i = 0, ii = this.figures.length; i < ii; i++) { + this._buildFigureFromPatch(i); + } + } + this._updateBounds(); + this._packData(); + } + _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: + verticesLeft = 3; + break; + case 1: + ps.push(ps.at(-2), ps.at(-1)); + verticesLeft = 1; + break; + case 2: + ps.push(ps.at(-3), ps.at(-1)); + verticesLeft = 1; + break; + } + operators.push(f); + } + ps.push(coords.length); + coords.push(coord); + colors.push(color); + verticesLeft--; + reader.align(); + } + this.figures.push({ + type: MeshFigureType.TRIANGLES, + coords: new Int32Array(ps), + colors: new Int32Array(ps) + }); + } + _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: MeshFigureType.LATTICE, + coords: new Int32Array(ps), + colors: new Int32Array(ps), + verticesPerRow + }); + } + _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: + 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: + 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: + 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: + 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; + } + 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 * 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]); + 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 * 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]); + 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 * coords[ps[12]][1] - coords[ps[3]][1] + 6 * (coords[ps[8]][1] + coords[ps[13]][1]) - 2 * (coords[ps[0]][1] + coords[ps[15]][1]) + 3 * (coords[ps[11]][1] + coords[ps[1]][1])) / 9]); + ps[10] = coords.length; + coords.push([(-4 * coords[ps[15]][0] - coords[ps[0]][0] + 6 * (coords[ps[11]][0] + coords[ps[14]][0]) - 2 * (coords[ps[12]][0] + coords[ps[3]][0]) + 3 * (coords[ps[2]][0] + coords[ps[8]][0])) / 9, (-4 * coords[ps[15]][1] - coords[ps[0]][1] + 6 * (coords[ps[11]][1] + coords[ps[14]][1]) - 2 * (coords[ps[12]][1] + coords[ps[3]][1]) + 3 * (coords[ps[2]][1] + coords[ps[8]][1])) / 9]); + this.figures.push({ + type: MeshFigureType.PATCH, + coords: new Int32Array(ps), + colors: new Int32Array(cs) + }); + } + } + _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: + 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: + 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: + 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: + 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: MeshFigureType.PATCH, + coords: new Int32Array(ps), + colors: new Int32Array(cs) + }); + } + } + _buildFigureFromPatch(index) { + const figure = this.figures[index]; + util_assert(figure.type === MeshFigureType.PATCH, "Unexpected patch mesh figure"); + const coords = this.coords, + colors = this.colors; + const pi = figure.coords; + const ci = figure.colors; + const figureMinX = Math.min(coords[pi[0]][0], coords[pi[3]][0], coords[pi[12]][0], coords[pi[15]][0]); + const figureMinY = Math.min(coords[pi[0]][1], coords[pi[3]][1], coords[pi[12]][1], coords[pi[15]][1]); + const figureMaxX = Math.max(coords[pi[0]][0], coords[pi[3]][0], coords[pi[12]][0], coords[pi[15]][0]); + const figureMaxY = Math.max(coords[pi[0]][1], coords[pi[3]][1], coords[pi[12]][1], coords[pi[15]][1]); + let splitXBy = Math.ceil((figureMaxX - figureMinX) * MeshShading.TRIANGLE_DENSITY / (this.bounds[2] - this.bounds[0])); + splitXBy = MathClamp(splitXBy, MeshShading.MIN_SPLIT_PATCH_CHUNKS_AMOUNT, MeshShading.MAX_SPLIT_PATCH_CHUNKS_AMOUNT); + let splitYBy = Math.ceil((figureMaxY - figureMinY) * MeshShading.TRIANGLE_DENSITY / (this.bounds[3] - this.bounds[1])); + splitYBy = MathClamp(splitYBy, MeshShading.MIN_SPLIT_PATCH_CHUNKS_AMOUNT, MeshShading.MAX_SPLIT_PATCH_CHUNKS_AMOUNT); + const verticesPerRow = splitXBy + 1; + const figureCoords = new Int32Array((splitYBy + 1) * verticesPerRow); + const figureColors = new Int32Array((splitYBy + 1) * verticesPerRow); + let k = 0; + const cl = new Uint8Array(3), + cr = new Uint8Array(3); + const c0 = colors[ci[0]], + c1 = colors[ci[1]], + c2 = colors[ci[2]], + c3 = colors[ci[3]]; + const bRow = getB(splitYBy), + bCol = getB(splitXBy); + for (let row = 0; row <= splitYBy; row++) { + cl[0] = (c0[0] * (splitYBy - row) + c2[0] * row) / splitYBy | 0; + cl[1] = (c0[1] * (splitYBy - row) + c2[1] * row) / splitYBy | 0; + cl[2] = (c0[2] * (splitYBy - row) + c2[2] * row) / splitYBy | 0; + cr[0] = (c1[0] * (splitYBy - row) + c3[0] * row) / splitYBy | 0; + cr[1] = (c1[1] * (splitYBy - row) + c3[1] * row) / splitYBy | 0; + cr[2] = (c1[2] * (splitYBy - row) + c3[2] * row) / splitYBy | 0; + for (let col = 0; col <= splitXBy; col++, k++) { + if ((row === 0 || row === splitYBy) && (col === 0 || col === splitXBy)) { + continue; + } + let x = 0, + y = 0; + let q = 0; + for (let i = 0; i <= 3; i++) { + for (let j = 0; j <= 3; j++, q++) { + const m = bRow[row][i] * bCol[col][j]; + x += coords[pi[q]][0] * m; + y += coords[pi[q]][1] * m; + } + } + figureCoords[k] = coords.length; + coords.push([x, y]); + figureColors[k] = colors.length; + const newColor = new Uint8Array(3); + newColor[0] = (cl[0] * (splitXBy - col) + cr[0] * col) / splitXBy | 0; + newColor[1] = (cl[1] * (splitXBy - col) + cr[1] * col) / splitXBy | 0; + newColor[2] = (cl[2] * (splitXBy - col) + cr[2] * col) / splitXBy | 0; + colors.push(newColor); + } + } + figureCoords[0] = pi[0]; + figureColors[0] = ci[0]; + figureCoords[splitXBy] = pi[3]; + figureColors[splitXBy] = ci[1]; + figureCoords[verticesPerRow * splitYBy] = pi[12]; + figureColors[verticesPerRow * splitYBy] = ci[2]; + figureCoords[verticesPerRow * splitYBy + splitXBy] = pi[15]; + figureColors[verticesPerRow * splitYBy + splitXBy] = ci[3]; + this.figures[index] = { + type: MeshFigureType.LATTICE, + coords: figureCoords, + colors: figureColors, + verticesPerRow + }; + } + _updateBounds() { + meshUpdateBounds(this); + } + _packData() { + meshPackData(this); + } + getIR() { + const { + posData, + colData, + vertexCount + } = buildMeshVertexData(this.coords, this.colors, this.figures); + return ["Mesh", this.shadingType, posData, colData, vertexCount, this.bounds, this.bbox, this.background]; + } +} +class DummyShading extends BaseShading { + getIR() { + return ["Dummy"]; + } +} +function getTilingPatternIR(operatorList, dict, color, needsIsolation = true) { + 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, needsIsolation]; +} + +;// ./node_modules/core-js/modules/es.iterator.find.js +es_iterator_find_namespaceFn(); + +;// ./node_modules/core-js/modules/es.math.sum-precise.js +es_math_sum_precise_namespaceFn(); + +;// ./node_modules/core-js/modules/es.iterator.for-each.js +es_iterator_for_each_namespaceFn(); + +;// ./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]); + } + return size === 3 ? String.fromCharCode(a[0], a[1], a[2], a[3]) : 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 incHex(a, size) { + let c = 1; + for (let i = size; i >= 0 && c > 0; i--) { + c += a[i]; + a[i] = c & 255; + c >>= 8; + } +} +const MAX_NUM_SIZE = 16; +const MAX_ENCODED_NUM_SIZE = 19; +class BinaryCMapStream extends Stream { + tmpBuf = new Uint8Array(MAX_ENCODED_NUM_SIZE); + constructor(data) { + super(data, 0, data.length, null); + } + readNumber() { + let n = 0; + let last; + do { + const b = this.getByte(); + if (b < 0) { + throw new FormatError("unexpected EOF in bcmap"); + } + last = !(b & 0x80); + n = n << 7 | b & 0x7f; + } while (!last); + return n; + } + readSigned() { + const n = this.readNumber(); + return n & 1 ? ~(n >>> 1) : n >>> 1; + } + readHex(num, size) { + num.set(this.getBytes(size + 1)); + } + readHexNumber(num, size) { + let last; + const stack = this.tmpBuf; + let sp = 0; + do { + const b = this.getByte(); + if (b < 0) { + throw new FormatError("unexpected EOF in bcmap"); + } + last = !(b & 0x80); + stack[sp++] = b & 0x7f; + } while (!last); + let i = size, + buffer = 0, + bufferSize = 0; + while (i >= 0) { + while (bufferSize < 8 && stack.length > 0) { + buffer |= stack[--sp] << bufferSize; + bufferSize += 7; + } + num[i] = buffer & 255; + i--; + buffer >>= 8; + bufferSize -= 8; + } + } + readHexSigned(num, size) { + this.readHexNumber(num, size); + const sign = num[size] & 1 ? 255 : 0; + let c = 0; + for (let i = 0; i <= size; i++) { + c = (c & 1) << 8 | num[i]; + num[i] = c >> 1 ^ sign; + } + } + readString() { + 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(data, cMap, extend) { + const stream = new BinaryCMapStream(data); + const header = stream.getByte(); + 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.getByte()) >= 0) { + const type = b >> 5; + if (type === 7) { + switch (b & 0x1f) { + case 0: + stream.readString(); + break; + case 1: + useCMap = stream.readString(); + break; + } + continue; + } + const sequence = !!(b & 0x10); + const dataSize = b & 15; + if (dataSize + 1 > MAX_NUM_SIZE) { + throw new Error("BinaryCMapReader.process: Invalid dataSize."); + } + const ucs2DataSize = 1; + const subitemsCount = stream.readNumber(); + switch (type) { + case 0: + stream.readHex(start, dataSize); + stream.readHexNumber(end, dataSize); + addHex(end, start, dataSize); + cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize), hexToInt(end, dataSize)); + for (let i = 1; i < subitemsCount; i++) { + incHex(end, dataSize); + stream.readHexNumber(start, dataSize); + addHex(start, end, dataSize); + stream.readHexNumber(end, dataSize); + addHex(end, start, dataSize); + cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize), hexToInt(end, dataSize)); + } + break; + case 1: + stream.readHex(start, dataSize); + stream.readHexNumber(end, dataSize); + addHex(end, start, dataSize); + stream.readNumber(); + for (let i = 1; i < subitemsCount; i++) { + incHex(end, dataSize); + stream.readHexNumber(start, dataSize); + addHex(start, end, dataSize); + stream.readHexNumber(end, dataSize); + addHex(end, start, dataSize); + stream.readNumber(); + } + break; + case 2: + stream.readHex(char, dataSize); + code = stream.readNumber(); + cMap.mapOne(hexToInt(char, dataSize), code); + for (let i = 1; i < subitemsCount; i++) { + incHex(char, dataSize); + if (!sequence) { + stream.readHexNumber(tmp, dataSize); + addHex(char, tmp, dataSize); + } + code = stream.readSigned() + (code + 1); + cMap.mapOne(hexToInt(char, dataSize), code); + } + break; + case 3: + stream.readHex(start, dataSize); + stream.readHexNumber(end, dataSize); + addHex(end, start, dataSize); + code = stream.readNumber(); + cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize), code); + for (let i = 1; i < subitemsCount; i++) { + incHex(end, dataSize); + if (!sequence) { + stream.readHexNumber(start, dataSize); + addHex(start, end, dataSize); + } else { + start.set(end); + } + stream.readHexNumber(end, dataSize); + addHex(end, start, dataSize); + code = stream.readNumber(); + cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize), code); + } + break; + case 4: + stream.readHex(char, ucs2DataSize); + stream.readHex(charCode, dataSize); + cMap.mapOne(hexToInt(char, ucs2DataSize), hexToStr(charCode, dataSize)); + for (let i = 1; i < subitemsCount; i++) { + incHex(char, ucs2DataSize); + if (!sequence) { + stream.readHexNumber(tmp, ucs2DataSize); + addHex(char, tmp, ucs2DataSize); + } + incHex(charCode, dataSize); + stream.readHexSigned(tmp, dataSize); + addHex(charCode, tmp, dataSize); + cMap.mapOne(hexToInt(char, ucs2DataSize), hexToStr(charCode, dataSize)); + } + break; + case 5: + stream.readHex(start, ucs2DataSize); + stream.readHexNumber(end, ucs2DataSize); + addHex(end, start, ucs2DataSize); + stream.readHex(charCode, dataSize); + cMap.mapBfRange(hexToInt(start, ucs2DataSize), hexToInt(end, ucs2DataSize), hexToStr(charCode, dataSize)); + for (let i = 1; i < subitemsCount; i++) { + incHex(end, ucs2DataSize); + if (!sequence) { + stream.readHexNumber(start, ucs2DataSize); + addHex(start, end, ucs2DataSize); + } else { + start.set(end); + } + stream.readHexNumber(end, ucs2DataSize); + addHex(end, start, ucs2DataSize); + stream.readHex(charCode, dataSize); + cMap.mapBfRange(hexToInt(start, ucs2DataSize), hexToInt(end, ucs2DataSize), hexToStr(charCode, dataSize)); + } + break; + default: + throw new Error(`BinaryCMapReader.process - unknown type: ${type}`); + } + } + return useCMap ? extend(useCMap) : cMap; + } +} + +;// ./src/core/ascii_85_stream.js + + + + + + + +class Ascii85Stream extends DecodeStream { + #input = new Uint8Array(5); + constructor(str, maybeLength) { + if (maybeLength) { + maybeLength *= 0.8; + } + super(maybeLength); + this.stream = str; + this.dict = str.dict; + } + readBlock() { + const TILDA_CHAR = 0x7e; + const Z_LOWER_CHAR = 0x7a; + const EOF = -1; + const str = this.stream; + let c = str.getByte(); + while (isWhiteSpace(c)) { + c = str.getByte(); + } + if (c === EOF || c === TILDA_CHAR) { + this.eof = true; + return; + } + const bufferLength = this.bufferLength; + let buffer, i; + if (c === Z_LOWER_CHAR) { + buffer = this.ensureBuffer(bufferLength + 4); + buffer.fill(0, bufferLength, bufferLength + 4); + this.bufferLength += 4; + } else { + 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; + } + } + buffer = this.ensureBuffer(bufferLength + i - 1); + this.bufferLength += i - 1; + if (i < 5) { + input.fill(0x21 + 84, i, 5); + this.eof = true; + } + 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(str, maybeLength) { + if (maybeLength) { + maybeLength *= 0.5; + } + super(maybeLength); + this.stream = str; + this.dict = str.dict; + this.firstDigit = -1; + } + readBlock() { + const UPSTREAM_BLOCK_SIZE = 8000; + const bytes = this.stream.getBytes(UPSTREAM_BLOCK_SIZE); + if (!bytes.length) { + this.eof = true; + return; + } + 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 (firstDigit < 0) { + firstDigit = digit; + } else { + buffer[bufferLength++] = firstDigit << 4 | digit; + firstDigit = -1; + } + } + if (firstDigit >= 0 && this.eof) { + buffer[bufferLength++] = firstDigit << 4; + firstDigit = -1; + } + this.firstDigit = firstDigit; + this.bufferLength = bufferLength; + } +} + +;// ./external/brotli/decode.js + + +let Options; +let makeBrotliDecode = () => { + const MAX_HUFFMAN_TABLE_SIZE = Int32Array.from([256, 402, 436, 468, 500, 534, 566, 598, 630, 662, 694, 726, 758, 790, 822, 854, 886, 920, 952, 984, 1016, 1048, 1080]); + const CODE_LENGTH_CODE_ORDER = Int32Array.from([1, 2, 3, 4, 0, 5, 17, 6, 16, 7, 8, 9, 10, 11, 12, 13, 14, 15]); + const DISTANCE_SHORT_CODE_INDEX_OFFSET = Int32Array.from([0, 3, 2, 1, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3]); + const DISTANCE_SHORT_CODE_VALUE_OFFSET = Int32Array.from([0, 0, 0, 0, -1, 1, -2, 2, -3, 3, -1, 1, -2, 2, -3, 3]); + const FIXED_TABLE = Int32Array.from([0x020000, 0x020004, 0x020003, 0x030002, 0x020000, 0x020004, 0x020003, 0x040001, 0x020000, 0x020004, 0x020003, 0x030002, 0x020000, 0x020004, 0x020003, 0x040005]); + const BLOCK_LENGTH_OFFSET = Int32Array.from([1, 5, 9, 13, 17, 25, 33, 41, 49, 65, 81, 97, 113, 145, 177, 209, 241, 305, 369, 497, 753, 1265, 2289, 4337, 8433, 16625]); + const BLOCK_LENGTH_N_BITS = Int32Array.from([2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 7, 8, 9, 10, 11, 12, 13, 24]); + const INSERT_LENGTH_N_BITS = Int16Array.from([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0C, 0x0E, 0x18]); + const COPY_LENGTH_N_BITS = Int16Array.from([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x18]); + const CMD_LOOKUP = new Int16Array(2816); + unpackCommandLookupTable(CMD_LOOKUP); + function log2floor(i) { + let result = -1; + let step = 16; + let v = i; + while (step > 0) { + let next = v >> step; + if (next !== 0) { + result += step; + v = next; + } + step = step >> 1; + } + return result + v; + } + function calculateDistanceAlphabetSize(npostfix, ndirect, maxndistbits) { + return 16 + ndirect + 2 * (maxndistbits << npostfix); + } + function calculateDistanceAlphabetLimit(s, maxDistance, npostfix, ndirect) { + if (maxDistance < ndirect + (2 << npostfix)) { + return makeError(s, -23); + } + const offset = (maxDistance - ndirect >> npostfix) + 4; + const ndistbits = log2floor(offset) - 1; + const group = ndistbits - 1 << 1 | offset >> ndistbits & 1; + return (group - 1 << npostfix) + (1 << npostfix) + ndirect + 16; + } + function unpackCommandLookupTable(cmdLookup) { + const insertLengthOffsets = new Int32Array(24); + const copyLengthOffsets = new Int32Array(24); + copyLengthOffsets[0] = 2; + for (let i = 0; i < 23; ++i) { + insertLengthOffsets[i + 1] = insertLengthOffsets[i] + (1 << INSERT_LENGTH_N_BITS[i]); + copyLengthOffsets[i + 1] = copyLengthOffsets[i] + (1 << COPY_LENGTH_N_BITS[i]); + } + for (let cmdCode = 0; cmdCode < 704; ++cmdCode) { + let rangeIdx = cmdCode >> 6; + let distanceContextOffset = -4; + if (rangeIdx >= 2) { + rangeIdx -= 2; + distanceContextOffset = 0; + } + const insertCode = (0x29850 >> rangeIdx * 2 & 0x3) << 3 | cmdCode >> 3 & 7; + const copyCode = (0x26244 >> rangeIdx * 2 & 0x3) << 3 | cmdCode & 7; + const copyLengthOffset = copyLengthOffsets[copyCode]; + const distanceContext = distanceContextOffset + Math.min(copyLengthOffset, 5) - 2; + const index = cmdCode * 4; + cmdLookup[index] = INSERT_LENGTH_N_BITS[insertCode] | COPY_LENGTH_N_BITS[copyCode] << 8; + cmdLookup[index + 1] = insertLengthOffsets[insertCode]; + cmdLookup[index + 2] = copyLengthOffsets[copyCode]; + cmdLookup[index + 3] = distanceContext; + } + } + function decodeWindowBits(s) { + const largeWindowEnabled = s.isLargeWindow; + s.isLargeWindow = 0; + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + if (readFewBits(s, 1) === 0) { + return 16; + } + let n = readFewBits(s, 3); + if (n !== 0) { + return 17 + n; + } + n = readFewBits(s, 3); + if (n !== 0) { + if (n === 1) { + if (largeWindowEnabled === 0) { + return -1; + } + s.isLargeWindow = 1; + if (readFewBits(s, 1) === 1) { + return -1; + } + n = readFewBits(s, 6); + if (n < 10 || n > 30) { + return -1; + } + return n; + } + return 8 + n; + } + return 17; + } + function attachDictionaryChunk(s, data) { + if (s.runningState !== 1) { + return makeError(s, -24); + } + if (s.cdNumChunks === 0) { + s.cdChunks = new Array(16); + s.cdChunkOffsets = new Int32Array(16); + s.cdBlockBits = -1; + } + if (s.cdNumChunks === 15) { + return makeError(s, -27); + } + s.cdChunks[s.cdNumChunks] = data; + s.cdNumChunks++; + s.cdTotalSize += data.length; + s.cdChunkOffsets[s.cdNumChunks] = s.cdTotalSize; + return 0; + } + function initState(s) { + if (s.runningState !== 0) { + return makeError(s, -26); + } + s.blockTrees = new Int32Array(3091); + s.blockTrees[0] = 7; + s.distRbIdx = 3; + let result = calculateDistanceAlphabetLimit(s, 0x7FFFFFFC, 3, 120); + if (result < 0) { + return result; + } + const maxDistanceAlphabetLimit = result; + s.distExtraBits = new Int8Array(maxDistanceAlphabetLimit); + s.distOffset = new Int32Array(maxDistanceAlphabetLimit); + result = initBitReader(s); + if (result < 0) { + return result; + } + s.runningState = 1; + return 0; + } + function close(s) { + if (s.runningState === 0) { + return makeError(s, -25); + } + if (s.runningState > 0) { + s.runningState = 11; + } + return 0; + } + function decodeVarLenUnsignedByte(s) { + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + if (readFewBits(s, 1) !== 0) { + const n = readFewBits(s, 3); + if (n === 0) { + return 1; + } + return readFewBits(s, n) + (1 << n); + } + return 0; + } + function decodeMetaBlockLength(s) { + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + s.inputEnd = readFewBits(s, 1); + s.metaBlockLength = 0; + s.isUncompressed = 0; + s.isMetadata = 0; + if (s.inputEnd !== 0 && readFewBits(s, 1) !== 0) { + return 0; + } + const sizeNibbles = readFewBits(s, 2) + 4; + if (sizeNibbles === 7) { + s.isMetadata = 1; + if (readFewBits(s, 1) !== 0) { + return makeError(s, -6); + } + const sizeBytes = readFewBits(s, 2); + if (sizeBytes === 0) { + return 0; + } + for (let i = 0; i < sizeBytes; ++i) { + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + const bits = readFewBits(s, 8); + if (bits === 0 && i + 1 === sizeBytes && sizeBytes > 1) { + return makeError(s, -8); + } + s.metaBlockLength += bits << i * 8; + } + } else { + for (let i = 0; i < sizeNibbles; ++i) { + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + const bits = readFewBits(s, 4); + if (bits === 0 && i + 1 === sizeNibbles && sizeNibbles > 4) { + return makeError(s, -8); + } + s.metaBlockLength += bits << i * 4; + } + } + s.metaBlockLength++; + if (s.inputEnd === 0) { + s.isUncompressed = readFewBits(s, 1); + } + return 0; + } + function readSymbol(tableGroup, tableIdx, s) { + let offset = tableGroup[tableIdx]; + const v = s.accumulator32 >>> s.bitOffset; + offset += v & 0xFF; + const bits = tableGroup[offset] >> 16; + const sym = tableGroup[offset] & 0xFFFF; + if (bits <= 8) { + s.bitOffset += bits; + return sym; + } + offset += sym; + const mask = (1 << bits) - 1; + offset += (v & mask) >>> 8; + s.bitOffset += (tableGroup[offset] >> 16) + 8; + return tableGroup[offset] & 0xFFFF; + } + function readBlockLength(tableGroup, tableIdx, s) { + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + const code = readSymbol(tableGroup, tableIdx, s); + const n = BLOCK_LENGTH_N_BITS[code]; + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + return BLOCK_LENGTH_OFFSET[code] + (n <= 16 ? readFewBits(s, n) : readManyBits(s, n)); + } + function moveToFront(v, index) { + let i = index; + const value = v[i]; + while (i > 0) { + v[i] = v[i - 1]; + i--; + } + v[0] = value; + } + function inverseMoveToFrontTransform(v, vLen) { + const mtf = new Int32Array(256); + for (let i = 0; i < 256; ++i) { + mtf[i] = i; + } + for (let i = 0; i < vLen; ++i) { + const index = v[i] & 0xFF; + v[i] = mtf[index]; + if (index !== 0) { + moveToFront(mtf, index); + } + } + } + function readHuffmanCodeLengths(codeLengthCodeLengths, numSymbols, codeLengths, s) { + let symbol = 0; + let prevCodeLen = 8; + let repeat = 0; + let repeatCodeLen = 0; + let space = 32768; + const table = new Int32Array(33); + const tableIdx = table.length - 1; + buildHuffmanTable(table, tableIdx, 5, codeLengthCodeLengths, 18); + while (symbol < numSymbols && space > 0) { + if (s.halfOffset > 2030) { + const result = readMoreInput(s); + if (result < 0) { + return result; + } + } + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + const p = s.accumulator32 >>> s.bitOffset & 31; + s.bitOffset += table[p] >> 16; + const codeLen = table[p] & 0xFFFF; + if (codeLen < 16) { + repeat = 0; + codeLengths[symbol++] = codeLen; + if (codeLen !== 0) { + prevCodeLen = codeLen; + space -= 32768 >> codeLen; + } + } else { + const extraBits = codeLen - 14; + let newLen = 0; + if (codeLen === 16) { + newLen = prevCodeLen; + } + if (repeatCodeLen !== newLen) { + repeat = 0; + repeatCodeLen = newLen; + } + const oldRepeat = repeat; + if (repeat > 0) { + repeat -= 2; + repeat = repeat << extraBits; + } + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + repeat += readFewBits(s, extraBits) + 3; + const repeatDelta = repeat - oldRepeat; + if (symbol + repeatDelta > numSymbols) { + return makeError(s, -2); + } + for (let i = 0; i < repeatDelta; ++i) { + codeLengths[symbol++] = repeatCodeLen; + } + if (repeatCodeLen !== 0) { + space -= repeatDelta << 15 - repeatCodeLen; + } + } + } + if (space !== 0) { + return makeError(s, -18); + } + codeLengths.fill(0, symbol, numSymbols); + return 0; + } + function checkDupes(s, symbols, length) { + for (let i = 0; i < length - 1; ++i) { + for (let j = i + 1; j < length; ++j) { + if (symbols[i] === symbols[j]) { + return makeError(s, -7); + } + } + } + return 0; + } + function readSimpleHuffmanCode(alphabetSizeMax, alphabetSizeLimit, tableGroup, tableIdx, s) { + const codeLengths = new Int32Array(alphabetSizeLimit); + const symbols = new Int32Array(4); + const maxBits = 1 + log2floor(alphabetSizeMax - 1); + const numSymbols = readFewBits(s, 2) + 1; + for (let i = 0; i < numSymbols; ++i) { + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + const symbol = readFewBits(s, maxBits); + if (symbol >= alphabetSizeLimit) { + return makeError(s, -15); + } + symbols[i] = symbol; + } + const result = checkDupes(s, symbols, numSymbols); + if (result < 0) { + return result; + } + let histogramId = numSymbols; + if (numSymbols === 4) { + histogramId += readFewBits(s, 1); + } + switch (histogramId) { + case 1: + codeLengths[symbols[0]] = 1; + break; + case 2: + codeLengths[symbols[0]] = 1; + codeLengths[symbols[1]] = 1; + break; + case 3: + codeLengths[symbols[0]] = 1; + codeLengths[symbols[1]] = 2; + codeLengths[symbols[2]] = 2; + break; + case 4: + codeLengths[symbols[0]] = 2; + codeLengths[symbols[1]] = 2; + codeLengths[symbols[2]] = 2; + codeLengths[symbols[3]] = 2; + break; + case 5: + codeLengths[symbols[0]] = 1; + codeLengths[symbols[1]] = 2; + codeLengths[symbols[2]] = 3; + codeLengths[symbols[3]] = 3; + break; + default: + break; + } + return buildHuffmanTable(tableGroup, tableIdx, 8, codeLengths, alphabetSizeLimit); + } + function readComplexHuffmanCode(alphabetSizeLimit, skip, tableGroup, tableIdx, s) { + const codeLengths = new Int32Array(alphabetSizeLimit); + const codeLengthCodeLengths = new Int32Array(18); + let space = 32; + let numCodes = 0; + for (let i = skip; i < 18; ++i) { + const codeLenIdx = CODE_LENGTH_CODE_ORDER[i]; + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + const p = s.accumulator32 >>> s.bitOffset & 15; + s.bitOffset += FIXED_TABLE[p] >> 16; + const v = FIXED_TABLE[p] & 0xFFFF; + codeLengthCodeLengths[codeLenIdx] = v; + if (v !== 0) { + space -= 32 >> v; + numCodes++; + if (space <= 0) { + break; + } + } + } + if (space !== 0 && numCodes !== 1) { + return makeError(s, -4); + } + const result = readHuffmanCodeLengths(codeLengthCodeLengths, alphabetSizeLimit, codeLengths, s); + if (result < 0) { + return result; + } + return buildHuffmanTable(tableGroup, tableIdx, 8, codeLengths, alphabetSizeLimit); + } + function readHuffmanCode(alphabetSizeMax, alphabetSizeLimit, tableGroup, tableIdx, s) { + if (s.halfOffset > 2030) { + const result = readMoreInput(s); + if (result < 0) { + return result; + } + } + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + const simpleCodeOrSkip = readFewBits(s, 2); + if (simpleCodeOrSkip === 1) { + return readSimpleHuffmanCode(alphabetSizeMax, alphabetSizeLimit, tableGroup, tableIdx, s); + } + return readComplexHuffmanCode(alphabetSizeLimit, simpleCodeOrSkip, tableGroup, tableIdx, s); + } + function decodeContextMap(contextMapSize, contextMap, s) { + let result; + if (s.halfOffset > 2030) { + result = readMoreInput(s); + if (result < 0) { + return result; + } + } + const numTrees = decodeVarLenUnsignedByte(s) + 1; + if (numTrees === 1) { + contextMap.fill(0, 0, contextMapSize); + return numTrees; + } + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + const useRleForZeros = readFewBits(s, 1); + let maxRunLengthPrefix = 0; + if (useRleForZeros !== 0) { + maxRunLengthPrefix = readFewBits(s, 4) + 1; + } + const alphabetSize = numTrees + maxRunLengthPrefix; + const tableSize = MAX_HUFFMAN_TABLE_SIZE[alphabetSize + 31 >> 5]; + const table = new Int32Array(tableSize + 1); + const tableIdx = table.length - 1; + result = readHuffmanCode(alphabetSize, alphabetSize, table, tableIdx, s); + if (result < 0) { + return result; + } + let i = 0; + while (i < contextMapSize) { + if (s.halfOffset > 2030) { + result = readMoreInput(s); + if (result < 0) { + return result; + } + } + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + const code = readSymbol(table, tableIdx, s); + if (code === 0) { + contextMap[i] = 0; + i++; + } else if (code <= maxRunLengthPrefix) { + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + let reps = (1 << code) + readFewBits(s, code); + while (reps !== 0) { + if (i >= contextMapSize) { + return makeError(s, -3); + } + contextMap[i] = 0; + i++; + reps--; + } + } else { + contextMap[i] = code - maxRunLengthPrefix; + i++; + } + } + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + if (readFewBits(s, 1) === 1) { + inverseMoveToFrontTransform(contextMap, contextMapSize); + } + return numTrees; + } + function decodeBlockTypeAndLength(s, treeType, numBlockTypes) { + const ringBuffers = s.rings; + const offset = 4 + treeType * 2; + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + let blockType = readSymbol(s.blockTrees, 2 * treeType, s); + const result = readBlockLength(s.blockTrees, 2 * treeType + 1, s); + if (blockType === 1) { + blockType = ringBuffers[offset + 1] + 1; + } else if (blockType === 0) { + blockType = ringBuffers[offset]; + } else { + blockType -= 2; + } + if (blockType >= numBlockTypes) { + blockType -= numBlockTypes; + } + ringBuffers[offset] = ringBuffers[offset + 1]; + ringBuffers[offset + 1] = blockType; + return result; + } + function decodeLiteralBlockSwitch(s) { + s.literalBlockLength = decodeBlockTypeAndLength(s, 0, s.numLiteralBlockTypes); + const literalBlockType = s.rings[5]; + s.contextMapSlice = literalBlockType << 6; + s.literalTreeIdx = s.contextMap[s.contextMapSlice] & 0xFF; + const contextMode = s.contextModes[literalBlockType]; + s.contextLookupOffset1 = contextMode << 9; + s.contextLookupOffset2 = s.contextLookupOffset1 + 256; + } + function decodeCommandBlockSwitch(s) { + s.commandBlockLength = decodeBlockTypeAndLength(s, 1, s.numCommandBlockTypes); + s.commandTreeIdx = s.rings[7]; + } + function decodeDistanceBlockSwitch(s) { + s.distanceBlockLength = decodeBlockTypeAndLength(s, 2, s.numDistanceBlockTypes); + s.distContextMapSlice = s.rings[9] << 2; + } + function maybeReallocateRingBuffer(s) { + let newSize = s.maxRingBufferSize; + if (newSize > s.expectedTotalSize) { + const minimalNewSize = s.expectedTotalSize; + while (newSize >> 1 > minimalNewSize) { + newSize = newSize >> 1; + } + if (s.inputEnd === 0 && newSize < 16384 && s.maxRingBufferSize >= 16384) { + newSize = 16384; + } + } + if (newSize <= s.ringBufferSize) { + return; + } + const ringBufferSizeWithSlack = newSize + 37; + const newBuffer = new Int8Array(ringBufferSizeWithSlack); + const oldBuffer = s.ringBuffer; + if (oldBuffer.length !== 0) { + newBuffer.set(oldBuffer.subarray(0, s.ringBufferSize), 0); + } + s.ringBuffer = newBuffer; + s.ringBufferSize = newSize; + } + function readNextMetablockHeader(s) { + if (s.inputEnd !== 0) { + s.nextRunningState = 10; + s.runningState = 12; + return 0; + } + s.literalTreeGroup = new Int32Array(0); + s.commandTreeGroup = new Int32Array(0); + s.distanceTreeGroup = new Int32Array(0); + let result; + if (s.halfOffset > 2030) { + result = readMoreInput(s); + if (result < 0) { + return result; + } + } + result = decodeMetaBlockLength(s); + if (result < 0) { + return result; + } + if (s.metaBlockLength === 0 && s.isMetadata === 0) { + return 0; + } + if (s.isUncompressed !== 0 || s.isMetadata !== 0) { + result = jumpToByteBoundary(s); + if (result < 0) { + return result; + } + if (s.isMetadata === 0) { + s.runningState = 6; + } else { + s.runningState = 5; + } + } else { + s.runningState = 3; + } + if (s.isMetadata !== 0) { + return 0; + } + s.expectedTotalSize += s.metaBlockLength; + if (s.expectedTotalSize > 1 << 30) { + s.expectedTotalSize = 1 << 30; + } + if (s.ringBufferSize < s.maxRingBufferSize) { + maybeReallocateRingBuffer(s); + } + return 0; + } + function readMetablockPartition(s, treeType, numBlockTypes) { + let offset = s.blockTrees[2 * treeType]; + if (numBlockTypes <= 1) { + s.blockTrees[2 * treeType + 1] = offset; + s.blockTrees[2 * treeType + 2] = offset; + return 1 << 28; + } + const blockTypeAlphabetSize = numBlockTypes + 2; + let result = readHuffmanCode(blockTypeAlphabetSize, blockTypeAlphabetSize, s.blockTrees, 2 * treeType, s); + if (result < 0) { + return result; + } + offset += result; + s.blockTrees[2 * treeType + 1] = offset; + const blockLengthAlphabetSize = 26; + result = readHuffmanCode(blockLengthAlphabetSize, blockLengthAlphabetSize, s.blockTrees, 2 * treeType + 1, s); + if (result < 0) { + return result; + } + offset += result; + s.blockTrees[2 * treeType + 2] = offset; + return readBlockLength(s.blockTrees, 2 * treeType + 1, s); + } + function calculateDistanceLut(s, alphabetSizeLimit) { + const distExtraBits = s.distExtraBits; + const distOffset = s.distOffset; + const npostfix = s.distancePostfixBits; + const ndirect = s.numDirectDistanceCodes; + const postfix = 1 << npostfix; + let bits = 1; + let half = 0; + let i = 16; + for (let j = 0; j < ndirect; ++j) { + distExtraBits[i] = 0; + distOffset[i] = j + 1; + ++i; + } + while (i < alphabetSizeLimit) { + const base = ndirect + ((2 + half << bits) - 4 << npostfix) + 1; + for (let j = 0; j < postfix; ++j) { + distExtraBits[i] = bits; + distOffset[i] = base + j; + ++i; + } + bits = bits + half; + half = half ^ 1; + } + } + function readMetablockHuffmanCodesAndContextMaps(s) { + s.numLiteralBlockTypes = decodeVarLenUnsignedByte(s) + 1; + let result = readMetablockPartition(s, 0, s.numLiteralBlockTypes); + if (result < 0) { + return result; + } + s.literalBlockLength = result; + s.numCommandBlockTypes = decodeVarLenUnsignedByte(s) + 1; + result = readMetablockPartition(s, 1, s.numCommandBlockTypes); + if (result < 0) { + return result; + } + s.commandBlockLength = result; + s.numDistanceBlockTypes = decodeVarLenUnsignedByte(s) + 1; + result = readMetablockPartition(s, 2, s.numDistanceBlockTypes); + if (result < 0) { + return result; + } + s.distanceBlockLength = result; + if (s.halfOffset > 2030) { + result = readMoreInput(s); + if (result < 0) { + return result; + } + } + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + s.distancePostfixBits = readFewBits(s, 2); + s.numDirectDistanceCodes = readFewBits(s, 4) << s.distancePostfixBits; + s.contextModes = new Int8Array(s.numLiteralBlockTypes); + let i = 0; + while (i < s.numLiteralBlockTypes) { + const limit = Math.min(i + 96, s.numLiteralBlockTypes); + while (i < limit) { + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + s.contextModes[i] = readFewBits(s, 2); + i++; + } + if (s.halfOffset > 2030) { + result = readMoreInput(s); + if (result < 0) { + return result; + } + } + } + const contextMapLength = s.numLiteralBlockTypes << 6; + s.contextMap = new Int8Array(contextMapLength); + result = decodeContextMap(contextMapLength, s.contextMap, s); + if (result < 0) { + return result; + } + const numLiteralTrees = result; + s.trivialLiteralContext = 1; + for (let j = 0; j < contextMapLength; ++j) { + if (s.contextMap[j] !== j >> 6) { + s.trivialLiteralContext = 0; + break; + } + } + s.distContextMap = new Int8Array(s.numDistanceBlockTypes << 2); + result = decodeContextMap(s.numDistanceBlockTypes << 2, s.distContextMap, s); + if (result < 0) { + return result; + } + const numDistTrees = result; + s.literalTreeGroup = new Int32Array(huffmanTreeGroupAllocSize(256, numLiteralTrees)); + result = decodeHuffmanTreeGroup(256, 256, numLiteralTrees, s, s.literalTreeGroup); + if (result < 0) { + return result; + } + s.commandTreeGroup = new Int32Array(huffmanTreeGroupAllocSize(704, s.numCommandBlockTypes)); + result = decodeHuffmanTreeGroup(704, 704, s.numCommandBlockTypes, s, s.commandTreeGroup); + if (result < 0) { + return result; + } + let distanceAlphabetSizeMax = calculateDistanceAlphabetSize(s.distancePostfixBits, s.numDirectDistanceCodes, 24); + let distanceAlphabetSizeLimit = distanceAlphabetSizeMax; + if (s.isLargeWindow === 1) { + distanceAlphabetSizeMax = calculateDistanceAlphabetSize(s.distancePostfixBits, s.numDirectDistanceCodes, 62); + result = calculateDistanceAlphabetLimit(s, 0x7FFFFFFC, s.distancePostfixBits, s.numDirectDistanceCodes); + if (result < 0) { + return result; + } + distanceAlphabetSizeLimit = result; + } + s.distanceTreeGroup = new Int32Array(huffmanTreeGroupAllocSize(distanceAlphabetSizeLimit, numDistTrees)); + result = decodeHuffmanTreeGroup(distanceAlphabetSizeMax, distanceAlphabetSizeLimit, numDistTrees, s, s.distanceTreeGroup); + if (result < 0) { + return result; + } + calculateDistanceLut(s, distanceAlphabetSizeLimit); + s.contextMapSlice = 0; + s.distContextMapSlice = 0; + s.contextLookupOffset1 = s.contextModes[0] * 512; + s.contextLookupOffset2 = s.contextLookupOffset1 + 256; + s.literalTreeIdx = 0; + s.commandTreeIdx = 0; + s.rings[4] = 1; + s.rings[5] = 0; + s.rings[6] = 1; + s.rings[7] = 0; + s.rings[8] = 1; + s.rings[9] = 0; + return 0; + } + function copyUncompressedData(s) { + const ringBuffer = s.ringBuffer; + let result; + if (s.metaBlockLength <= 0) { + result = reload(s); + if (result < 0) { + return result; + } + s.runningState = 2; + return 0; + } + const chunkLength = Math.min(s.ringBufferSize - s.pos, s.metaBlockLength); + result = copyRawBytes(s, ringBuffer, s.pos, chunkLength); + if (result < 0) { + return result; + } + s.metaBlockLength -= chunkLength; + s.pos += chunkLength; + if (s.pos === s.ringBufferSize) { + s.nextRunningState = 6; + s.runningState = 12; + return 0; + } + result = reload(s); + if (result < 0) { + return result; + } + s.runningState = 2; + return 0; + } + function writeRingBuffer(s) { + const toWrite = Math.min(s.outputLength - s.outputUsed, s.ringBufferBytesReady - s.ringBufferBytesWritten); + if (toWrite !== 0) { + s.output.set(s.ringBuffer.subarray(s.ringBufferBytesWritten, s.ringBufferBytesWritten + toWrite), s.outputOffset + s.outputUsed); + s.outputUsed += toWrite; + s.ringBufferBytesWritten += toWrite; + } + if (s.outputUsed < s.outputLength) { + return 0; + } + return 2; + } + function huffmanTreeGroupAllocSize(alphabetSizeLimit, n) { + const maxTableSize = MAX_HUFFMAN_TABLE_SIZE[alphabetSizeLimit + 31 >> 5]; + return n + n * maxTableSize; + } + function decodeHuffmanTreeGroup(alphabetSizeMax, alphabetSizeLimit, n, s, group) { + let next = n; + for (let i = 0; i < n; ++i) { + group[i] = next; + const result = readHuffmanCode(alphabetSizeMax, alphabetSizeLimit, group, i, s); + if (result < 0) { + return result; + } + next += result; + } + return 0; + } + function calculateFence(s) { + let result = s.ringBufferSize; + if (s.isEager !== 0) { + result = Math.min(result, s.ringBufferBytesWritten + s.outputLength - s.outputUsed); + } + return result; + } + function doUseDictionary(s, fence) { + if (s.distance > 0x7FFFFFFC) { + return makeError(s, -9); + } + const address = s.distance - s.maxDistance - 1 - s.cdTotalSize; + if (address < 0) { + const result = initializeCompoundDictionaryCopy(s, -address - 1, s.copyLength); + if (result < 0) { + return result; + } + s.runningState = 14; + } else { + const dictionaryData = data; + const wordLength = s.copyLength; + if (wordLength > 31) { + return makeError(s, -9); + } + const shift = sizeBits[wordLength]; + if (shift === 0) { + return makeError(s, -9); + } + let offset = offsets[wordLength]; + const mask = (1 << shift) - 1; + const wordIdx = address & mask; + const transformIdx = address >> shift; + offset += wordIdx * wordLength; + const transforms = RFC_TRANSFORMS; + if (transformIdx >= transforms.numTransforms) { + return makeError(s, -9); + } + const len = transformDictionaryWord(s.ringBuffer, s.pos, dictionaryData, offset, wordLength, transforms, transformIdx); + s.pos += len; + s.metaBlockLength -= len; + if (s.pos >= fence) { + s.nextRunningState = 4; + s.runningState = 12; + return 0; + } + s.runningState = 4; + } + return 0; + } + function initializeCompoundDictionary(s) { + s.cdBlockMap = new Int8Array(256); + let blockBits = 8; + while (s.cdTotalSize - 1 >> blockBits !== 0) { + blockBits++; + } + blockBits -= 8; + s.cdBlockBits = blockBits; + let cursor = 0; + let index = 0; + while (cursor < s.cdTotalSize) { + while (s.cdChunkOffsets[index + 1] < cursor) { + index++; + } + s.cdBlockMap[cursor >> blockBits] = index; + cursor += 1 << blockBits; + } + } + function initializeCompoundDictionaryCopy(s, address, length) { + if (s.cdBlockBits === -1) { + initializeCompoundDictionary(s); + } + let index = s.cdBlockMap[address >> s.cdBlockBits]; + while (address >= s.cdChunkOffsets[index + 1]) { + index++; + } + if (s.cdTotalSize > address + length) { + return makeError(s, -9); + } + s.distRbIdx = s.distRbIdx + 1 & 0x3; + s.rings[s.distRbIdx] = s.distance; + s.metaBlockLength -= length; + s.cdBrIndex = index; + s.cdBrOffset = address - s.cdChunkOffsets[index]; + s.cdBrLength = length; + s.cdBrCopied = 0; + return 0; + } + function copyFromCompoundDictionary(s, fence) { + let pos = s.pos; + const origPos = pos; + while (s.cdBrLength !== s.cdBrCopied) { + const space = fence - pos; + const chunkLength = s.cdChunkOffsets[s.cdBrIndex + 1] - s.cdChunkOffsets[s.cdBrIndex]; + const remChunkLength = chunkLength - s.cdBrOffset; + let length = s.cdBrLength - s.cdBrCopied; + if (length > remChunkLength) { + length = remChunkLength; + } + if (length > space) { + length = space; + } + s.ringBuffer.set(s.cdChunks[s.cdBrIndex].subarray(s.cdBrOffset, s.cdBrOffset + length), pos); + pos += length; + s.cdBrOffset += length; + s.cdBrCopied += length; + if (length === remChunkLength) { + s.cdBrIndex++; + s.cdBrOffset = 0; + } + if (pos >= fence) { + break; + } + } + return pos - origPos; + } + function decompress(s) { + let result; + if (s.runningState === 0) { + return makeError(s, -25); + } + if (s.runningState < 0) { + return makeError(s, -28); + } + if (s.runningState === 11) { + return makeError(s, -22); + } + if (s.runningState === 1) { + const windowBits = decodeWindowBits(s); + if (windowBits === -1) { + return makeError(s, -11); + } + s.maxRingBufferSize = 1 << windowBits; + s.maxBackwardDistance = s.maxRingBufferSize - 16; + s.runningState = 2; + } + let fence = calculateFence(s); + let ringBufferMask = s.ringBufferSize - 1; + let ringBuffer = s.ringBuffer; + while (s.runningState !== 10) { + switch (s.runningState) { + case 2: + if (s.metaBlockLength < 0) { + return makeError(s, -10); + } + result = readNextMetablockHeader(s); + if (result < 0) { + return result; + } + fence = calculateFence(s); + ringBufferMask = s.ringBufferSize - 1; + ringBuffer = s.ringBuffer; + continue; + case 3: + result = readMetablockHuffmanCodesAndContextMaps(s); + if (result < 0) { + return result; + } + s.runningState = 4; + continue; + case 4: + if (s.metaBlockLength <= 0) { + s.runningState = 2; + continue; + } + if (s.halfOffset > 2030) { + result = readMoreInput(s); + if (result < 0) { + return result; + } + } + if (s.commandBlockLength === 0) { + decodeCommandBlockSwitch(s); + } + s.commandBlockLength--; + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + const cmdCode = readSymbol(s.commandTreeGroup, s.commandTreeIdx, s) << 2; + const insertAndCopyExtraBits = CMD_LOOKUP[cmdCode]; + const insertLengthOffset = CMD_LOOKUP[cmdCode + 1]; + const copyLengthOffset = CMD_LOOKUP[cmdCode + 2]; + s.distanceCode = CMD_LOOKUP[cmdCode + 3]; + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + const insertLengthExtraBits = insertAndCopyExtraBits & 0xFF; + s.insertLength = insertLengthOffset + (insertLengthExtraBits <= 16 ? readFewBits(s, insertLengthExtraBits) : readManyBits(s, insertLengthExtraBits)); + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + const copyLengthExtraBits = insertAndCopyExtraBits >> 8; + s.copyLength = copyLengthOffset + (copyLengthExtraBits <= 16 ? readFewBits(s, copyLengthExtraBits) : readManyBits(s, copyLengthExtraBits)); + s.j = 0; + s.runningState = 7; + continue; + case 7: + if (s.trivialLiteralContext !== 0) { + while (s.j < s.insertLength) { + if (s.halfOffset > 2030) { + result = readMoreInput(s); + if (result < 0) { + return result; + } + } + if (s.literalBlockLength === 0) { + decodeLiteralBlockSwitch(s); + } + s.literalBlockLength--; + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + ringBuffer[s.pos] = readSymbol(s.literalTreeGroup, s.literalTreeIdx, s); + s.pos++; + s.j++; + if (s.pos >= fence) { + s.nextRunningState = 7; + s.runningState = 12; + break; + } + } + } else { + let prevByte1 = ringBuffer[s.pos - 1 & ringBufferMask] & 0xFF; + let prevByte2 = ringBuffer[s.pos - 2 & ringBufferMask] & 0xFF; + while (s.j < s.insertLength) { + if (s.halfOffset > 2030) { + result = readMoreInput(s); + if (result < 0) { + return result; + } + } + if (s.literalBlockLength === 0) { + decodeLiteralBlockSwitch(s); + } + const literalContext = LOOKUP[s.contextLookupOffset1 + prevByte1] | LOOKUP[s.contextLookupOffset2 + prevByte2]; + const literalTreeIdx = s.contextMap[s.contextMapSlice + literalContext] & 0xFF; + s.literalBlockLength--; + prevByte2 = prevByte1; + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + prevByte1 = readSymbol(s.literalTreeGroup, literalTreeIdx, s); + ringBuffer[s.pos] = prevByte1; + s.pos++; + s.j++; + if (s.pos >= fence) { + s.nextRunningState = 7; + s.runningState = 12; + break; + } + } + } + if (s.runningState !== 7) { + continue; + } + s.metaBlockLength -= s.insertLength; + if (s.metaBlockLength <= 0) { + s.runningState = 4; + continue; + } + let distanceCode = s.distanceCode; + if (distanceCode < 0) { + s.distance = s.rings[s.distRbIdx]; + } else { + if (s.halfOffset > 2030) { + result = readMoreInput(s); + if (result < 0) { + return result; + } + } + if (s.distanceBlockLength === 0) { + decodeDistanceBlockSwitch(s); + } + s.distanceBlockLength--; + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + const distTreeIdx = s.distContextMap[s.distContextMapSlice + distanceCode] & 0xFF; + distanceCode = readSymbol(s.distanceTreeGroup, distTreeIdx, s); + if (distanceCode < 16) { + const index = s.distRbIdx + DISTANCE_SHORT_CODE_INDEX_OFFSET[distanceCode] & 0x3; + s.distance = s.rings[index] + DISTANCE_SHORT_CODE_VALUE_OFFSET[distanceCode]; + if (s.distance < 0) { + return makeError(s, -12); + } + } else { + const extraBits = s.distExtraBits[distanceCode]; + let bits; + if (s.bitOffset + extraBits <= 32) { + bits = readFewBits(s, extraBits); + } else { + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + bits = extraBits <= 16 ? readFewBits(s, extraBits) : readManyBits(s, extraBits); + } + s.distance = s.distOffset[distanceCode] + (bits << s.distancePostfixBits); + } + } + if (s.maxDistance !== s.maxBackwardDistance && s.pos < s.maxBackwardDistance) { + s.maxDistance = s.pos; + } else { + s.maxDistance = s.maxBackwardDistance; + } + if (s.distance > s.maxDistance) { + s.runningState = 9; + continue; + } + if (distanceCode > 0) { + s.distRbIdx = s.distRbIdx + 1 & 0x3; + s.rings[s.distRbIdx] = s.distance; + } + if (s.copyLength > s.metaBlockLength) { + return makeError(s, -9); + } + s.j = 0; + s.runningState = 8; + continue; + case 8: + let src = s.pos - s.distance & ringBufferMask; + let dst = s.pos; + const copyLength = s.copyLength - s.j; + const srcEnd = src + copyLength; + const dstEnd = dst + copyLength; + if (srcEnd < ringBufferMask && dstEnd < ringBufferMask) { + if (copyLength < 12 || srcEnd > dst && dstEnd > src) { + const numQuads = copyLength + 3 >> 2; + for (let k = 0; k < numQuads; ++k) { + ringBuffer[dst++] = ringBuffer[src++]; + ringBuffer[dst++] = ringBuffer[src++]; + ringBuffer[dst++] = ringBuffer[src++]; + ringBuffer[dst++] = ringBuffer[src++]; + } + } else { + ringBuffer.copyWithin(dst, src, srcEnd); + } + s.j += copyLength; + s.metaBlockLength -= copyLength; + s.pos += copyLength; + } else { + while (s.j < s.copyLength) { + ringBuffer[s.pos] = ringBuffer[s.pos - s.distance & ringBufferMask]; + s.metaBlockLength--; + s.pos++; + s.j++; + if (s.pos >= fence) { + s.nextRunningState = 8; + s.runningState = 12; + break; + } + } + } + if (s.runningState === 8) { + s.runningState = 4; + } + continue; + case 9: + result = doUseDictionary(s, fence); + if (result < 0) { + return result; + } + continue; + case 14: + s.pos += copyFromCompoundDictionary(s, fence); + if (s.pos >= fence) { + s.nextRunningState = 14; + s.runningState = 12; + return 2; + } + s.runningState = 4; + continue; + case 5: + while (s.metaBlockLength > 0) { + if (s.halfOffset > 2030) { + result = readMoreInput(s); + if (result < 0) { + return result; + } + } + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + readFewBits(s, 8); + s.metaBlockLength--; + } + s.runningState = 2; + continue; + case 6: + result = copyUncompressedData(s); + if (result < 0) { + return result; + } + continue; + case 12: + s.ringBufferBytesReady = Math.min(s.pos, s.ringBufferSize); + s.runningState = 13; + continue; + case 13: + result = writeRingBuffer(s); + if (result !== 0) { + return result; + } + if (s.pos >= s.maxBackwardDistance) { + s.maxDistance = s.maxBackwardDistance; + } + if (s.pos >= s.ringBufferSize) { + if (s.pos > s.ringBufferSize) { + ringBuffer.copyWithin(0, s.ringBufferSize, s.pos); + } + s.pos = s.pos & ringBufferMask; + s.ringBufferBytesWritten = 0; + } + s.runningState = s.nextRunningState; + continue; + default: + return makeError(s, -28); + } + } + if (s.runningState !== 10) { + return makeError(s, -29); + } + if (s.metaBlockLength < 0) { + return makeError(s, -10); + } + result = jumpToByteBoundary(s); + if (result !== 0) { + return result; + } + result = checkHealth(s, 1); + if (result !== 0) { + return result; + } + return 1; + } + function Transforms(numTransforms, prefixSuffixLen, prefixSuffixCount) { + this.numTransforms = 0; + this.triplets = new Int32Array(0); + this.prefixSuffixStorage = new Int8Array(0); + this.prefixSuffixHeads = new Int32Array(0); + this.params = new Int16Array(0); + this.numTransforms = numTransforms; + this.triplets = new Int32Array(numTransforms * 3); + this.params = new Int16Array(numTransforms); + this.prefixSuffixStorage = new Int8Array(prefixSuffixLen); + this.prefixSuffixHeads = new Int32Array(prefixSuffixCount + 1); + } + const RFC_TRANSFORMS = new Transforms(121, 167, 50); + function unpackTransforms(prefixSuffix, prefixSuffixHeads, transforms, prefixSuffixSrc, transformsSrc) { + const prefixSuffixBytes = toUtf8Runes(prefixSuffixSrc); + const n = prefixSuffixBytes.length; + let index = 1; + let j = 0; + for (let i = 0; i < n; ++i) { + const c = prefixSuffixBytes[i]; + if (c === 35) { + prefixSuffixHeads[index++] = j; + } else { + prefixSuffix[j++] = c; + } + } + for (let i = 0; i < 363; ++i) { + transforms[i] = transformsSrc.charCodeAt(i) - 32; + } + } + unpackTransforms(RFC_TRANSFORMS.prefixSuffixStorage, RFC_TRANSFORMS.prefixSuffixHeads, RFC_TRANSFORMS.triplets, "# #s #, #e #.# the #.com/#\xC2\xA0# of # and # in # to #\"#\">#\n#]# for # a # that #. # with #'# from # by #. The # on # as # is #ing #\n\t#:#ed #(# at #ly #=\"# of the #. This #,# not #er #al #='#ful #ive #less #est #ize #ous #", " !! ! , *! &! \" ! ) * * - ! # ! #!*! + ,$ ! - % . / # 0 1 . \" 2 3!* 4% ! # / 5 6 7 8 0 1 & $ 9 + : ; < ' != > ?! 4 @ 4 2 & A *# ( B C& ) % ) !*# *-% A +! *. D! %' & E *6 F G% ! *A *% H! D I!+! J!+ K +- *4! A L!*4 M N +6 O!*% +.! K *G P +%( ! G *D +D Q +# *K!*G!+D!+# +G +A +4!+% +K!+4!*D!+K!*K"); + function transformDictionaryWord(dst, dstOffset, src, srcOffset, wordLen, transforms, transformIndex) { + let offset = dstOffset; + const triplets = transforms.triplets; + const prefixSuffixStorage = transforms.prefixSuffixStorage; + const prefixSuffixHeads = transforms.prefixSuffixHeads; + const transformOffset = 3 * transformIndex; + const prefixIdx = triplets[transformOffset]; + const transformType = triplets[transformOffset + 1]; + const suffixIdx = triplets[transformOffset + 2]; + let prefix = prefixSuffixHeads[prefixIdx]; + const prefixEnd = prefixSuffixHeads[prefixIdx + 1]; + let suffix = prefixSuffixHeads[suffixIdx]; + const suffixEnd = prefixSuffixHeads[suffixIdx + 1]; + let omitFirst = transformType - 11; + let omitLast = transformType; + if (omitFirst < 1 || omitFirst > 9) { + omitFirst = 0; + } + if (omitLast < 1 || omitLast > 9) { + omitLast = 0; + } + while (prefix !== prefixEnd) { + dst[offset++] = prefixSuffixStorage[prefix++]; + } + let len = wordLen; + if (omitFirst > len) { + omitFirst = len; + } + let dictOffset = srcOffset + omitFirst; + len -= omitFirst; + len -= omitLast; + let i = len; + while (i > 0) { + dst[offset++] = src[dictOffset++]; + i--; + } + if (transformType === 10 || transformType === 11) { + let uppercaseOffset = offset - len; + if (transformType === 10) { + len = 1; + } + while (len > 0) { + const c0 = dst[uppercaseOffset] & 0xFF; + if (c0 < 0xC0) { + if (c0 >= 97 && c0 <= 122) { + dst[uppercaseOffset] = dst[uppercaseOffset] ^ 32; + } + uppercaseOffset += 1; + len -= 1; + } else if (c0 < 0xE0) { + dst[uppercaseOffset + 1] = dst[uppercaseOffset + 1] ^ 32; + uppercaseOffset += 2; + len -= 2; + } else { + dst[uppercaseOffset + 2] = dst[uppercaseOffset + 2] ^ 5; + uppercaseOffset += 3; + len -= 3; + } + } + } else if (transformType === 21 || transformType === 22) { + let shiftOffset = offset - len; + const param = transforms.params[transformIndex]; + let scalar = (param & 0x7FFF) + (0x1000000 - (param & 0x8000)); + while (len > 0) { + let step = 1; + const c0 = dst[shiftOffset] & 0xFF; + if (c0 < 0x80) { + scalar += c0; + dst[shiftOffset] = scalar & 0x7F; + } else if (c0 < 0xC0) {} else if (c0 < 0xE0) { + if (len >= 2) { + const c1 = dst[shiftOffset + 1]; + scalar += c1 & 0x3F | (c0 & 0x1F) << 6; + dst[shiftOffset] = 0xC0 | scalar >> 6 & 0x1F; + dst[shiftOffset + 1] = c1 & 0xC0 | scalar & 0x3F; + step = 2; + } else { + step = len; + } + } else if (c0 < 0xF0) { + if (len >= 3) { + const c1 = dst[shiftOffset + 1]; + const c2 = dst[shiftOffset + 2]; + scalar += c2 & 0x3F | (c1 & 0x3F) << 6 | (c0 & 0x0F) << 12; + dst[shiftOffset] = 0xE0 | scalar >> 12 & 0x0F; + dst[shiftOffset + 1] = c1 & 0xC0 | scalar >> 6 & 0x3F; + dst[shiftOffset + 2] = c2 & 0xC0 | scalar & 0x3F; + step = 3; + } else { + step = len; + } + } else if (c0 < 0xF8) { + if (len >= 4) { + const c1 = dst[shiftOffset + 1]; + const c2 = dst[shiftOffset + 2]; + const c3 = dst[shiftOffset + 3]; + scalar += c3 & 0x3F | (c2 & 0x3F) << 6 | (c1 & 0x3F) << 12 | (c0 & 0x07) << 18; + dst[shiftOffset] = 0xF0 | scalar >> 18 & 0x07; + dst[shiftOffset + 1] = c1 & 0xC0 | scalar >> 12 & 0x3F; + dst[shiftOffset + 2] = c2 & 0xC0 | scalar >> 6 & 0x3F; + dst[shiftOffset + 3] = c3 & 0xC0 | scalar & 0x3F; + step = 4; + } else { + step = len; + } + } + shiftOffset += step; + len -= step; + if (transformType === 21) { + len = 0; + } + } + } + while (suffix !== suffixEnd) { + dst[offset++] = prefixSuffixStorage[suffix++]; + } + return offset - dstOffset; + } + function getNextKey(key, len) { + let step = 1 << len - 1; + while ((key & step) !== 0) { + step = step >> 1; + } + return (key & step - 1) + step; + } + function replicateValue(table, offset, step, end, item) { + let pos = end; + while (pos > 0) { + pos -= step; + table[offset + pos] = item; + } + } + function nextTableBitSize(count, len, rootBits) { + let bits = len; + let left = 1 << bits - rootBits; + while (bits < 15) { + left -= count[bits]; + if (left <= 0) { + break; + } + bits++; + left = left << 1; + } + return bits - rootBits; + } + function buildHuffmanTable(tableGroup, tableIdx, rootBits, codeLengths, codeLengthsSize) { + const tableOffset = tableGroup[tableIdx]; + const sorted = new Int32Array(codeLengthsSize); + const count = new Int32Array(16); + const offset = new Int32Array(16); + for (let sym = 0; sym < codeLengthsSize; ++sym) { + count[codeLengths[sym]]++; + } + offset[1] = 0; + for (let len = 1; len < 15; ++len) { + offset[len + 1] = offset[len] + count[len]; + } + for (let sym = 0; sym < codeLengthsSize; ++sym) { + if (codeLengths[sym] !== 0) { + sorted[offset[codeLengths[sym]]++] = sym; + } + } + let tableBits = rootBits; + let tableSize = 1 << tableBits; + let totalSize = tableSize; + if (offset[15] === 1) { + for (let k = 0; k < totalSize; ++k) { + tableGroup[tableOffset + k] = sorted[0]; + } + return totalSize; + } + let key = 0; + let symbol = 0; + let step = 1; + for (let len = 1; len <= rootBits; ++len) { + step = step << 1; + while (count[len] > 0) { + replicateValue(tableGroup, tableOffset + key, step, tableSize, len << 16 | sorted[symbol++]); + key = getNextKey(key, len); + count[len]--; + } + } + const mask = totalSize - 1; + let low = -1; + let currentOffset = tableOffset; + step = 1; + for (let len = rootBits + 1; len <= 15; ++len) { + step = step << 1; + while (count[len] > 0) { + if ((key & mask) !== low) { + currentOffset += tableSize; + tableBits = nextTableBitSize(count, len, rootBits); + tableSize = 1 << tableBits; + totalSize += tableSize; + low = key & mask; + tableGroup[tableOffset + low] = tableBits + rootBits << 16 | currentOffset - tableOffset - low; + } + replicateValue(tableGroup, currentOffset + (key >> rootBits), step, tableSize, len - rootBits << 16 | sorted[symbol++]); + key = getNextKey(key, len); + count[len]--; + } + } + return totalSize; + } + function readMoreInput(s) { + if (s.endOfStreamReached !== 0) { + if (halfAvailable(s) >= -2) { + return 0; + } + return makeError(s, -16); + } + const readOffset = s.halfOffset << 1; + let bytesInBuffer = 4096 - readOffset; + s.byteBuffer.copyWithin(0, readOffset, 4096); + s.halfOffset = 0; + while (bytesInBuffer < 4096) { + const spaceLeft = 4096 - bytesInBuffer; + const len = readInput(s, s.byteBuffer, bytesInBuffer, spaceLeft); + if (len < -1) { + return len; + } + if (len <= 0) { + s.endOfStreamReached = 1; + s.tailBytes = bytesInBuffer; + bytesInBuffer += 1; + break; + } + bytesInBuffer += len; + } + bytesToNibbles(s, bytesInBuffer); + return 0; + } + function checkHealth(s, endOfStream) { + if (s.endOfStreamReached === 0) { + return 0; + } + const byteOffset = (s.halfOffset << 1) + (s.bitOffset + 7 >> 3) - 4; + if (byteOffset > s.tailBytes) { + return makeError(s, -13); + } + if (endOfStream !== 0 && byteOffset !== s.tailBytes) { + return makeError(s, -17); + } + return 0; + } + function readFewBits(s, n) { + const v = s.accumulator32 >>> s.bitOffset & (1 << n) - 1; + s.bitOffset += n; + return v; + } + function readManyBits(s, n) { + const low = readFewBits(s, 16); + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + return low | readFewBits(s, n - 16) << 16; + } + function initBitReader(s) { + s.byteBuffer = new Int8Array(4160); + s.accumulator32 = 0; + s.shortBuffer = new Int16Array(2080); + s.bitOffset = 32; + s.halfOffset = 2048; + s.endOfStreamReached = 0; + return prepare(s); + } + function prepare(s) { + if (s.halfOffset > 2030) { + const result = readMoreInput(s); + if (result !== 0) { + return result; + } + } + let health = checkHealth(s, 0); + if (health !== 0) { + return health; + } + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + return 0; + } + function reload(s) { + if (s.bitOffset === 32) { + return prepare(s); + } + return 0; + } + function jumpToByteBoundary(s) { + const padding = 32 - s.bitOffset & 7; + if (padding !== 0) { + const paddingBits = readFewBits(s, padding); + if (paddingBits !== 0) { + return makeError(s, -5); + } + } + return 0; + } + function halfAvailable(s) { + let limit = 2048; + if (s.endOfStreamReached !== 0) { + limit = s.tailBytes + 1 >> 1; + } + return limit - s.halfOffset; + } + function copyRawBytes(s, data, offset, length) { + let pos = offset; + let len = length; + if ((s.bitOffset & 7) !== 0) { + return makeError(s, -30); + } + while (s.bitOffset !== 32 && len !== 0) { + data[pos++] = s.accumulator32 >>> s.bitOffset; + s.bitOffset += 8; + len--; + } + if (len === 0) { + return 0; + } + const copyNibbles = Math.min(halfAvailable(s), len >> 1); + if (copyNibbles > 0) { + const readOffset = s.halfOffset << 1; + const delta = copyNibbles << 1; + data.set(s.byteBuffer.subarray(readOffset, readOffset + delta), pos); + pos += delta; + len -= delta; + s.halfOffset += copyNibbles; + } + if (len === 0) { + return 0; + } + if (halfAvailable(s) > 0) { + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + while (len !== 0) { + data[pos++] = s.accumulator32 >>> s.bitOffset; + s.bitOffset += 8; + len--; + } + return checkHealth(s, 0); + } + while (len > 0) { + const chunkLen = readInput(s, data, pos, len); + if (chunkLen < -1) { + return chunkLen; + } + if (chunkLen <= 0) { + return makeError(s, -16); + } + pos += chunkLen; + len -= chunkLen; + } + return 0; + } + function bytesToNibbles(s, byteLen) { + const byteBuffer = s.byteBuffer; + const halfLen = byteLen >> 1; + const shortBuffer = s.shortBuffer; + for (let i = 0; i < halfLen; ++i) { + shortBuffer[i] = byteBuffer[i * 2] & 0xFF | (byteBuffer[i * 2 + 1] & 0xFF) << 8; + } + } + const LOOKUP = new Int32Array(2048); + function unpackLookupTable(lookup, utfMap, utfRle) { + for (let i = 0; i < 256; ++i) { + lookup[i] = i & 0x3F; + lookup[512 + i] = i >> 2; + lookup[1792 + i] = 2 + (i >> 6); + } + for (let i = 0; i < 128; ++i) { + lookup[1024 + i] = 4 * (utfMap.charCodeAt(i) - 32); + } + for (let i = 0; i < 64; ++i) { + lookup[1152 + i] = i & 1; + lookup[1216 + i] = 2 + (i & 1); + } + let offset = 1280; + for (let k = 0; k < 19; ++k) { + const value = k & 3; + const rep = utfRle.charCodeAt(k) - 32; + for (let i = 0; i < rep; ++i) { + lookup[offset++] = value; + } + } + for (let i = 0; i < 16; ++i) { + lookup[1792 + i] = 1; + lookup[2032 + i] = 6; + } + lookup[1792] = 0; + lookup[2047] = 7; + for (let i = 0; i < 256; ++i) { + lookup[1536 + i] = lookup[1792 + i] << 3; + } + } + unpackLookupTable(LOOKUP, " !! ! \"#$##%#$&'##(#)#++++++++++((&*'##,---,---,-----,-----,-----&#'###.///.///./////./////./////&#'# ", "A/* ': & : $ \x81 @"); + function State() { + this.ringBuffer = new Int8Array(0); + this.contextModes = new Int8Array(0); + this.contextMap = new Int8Array(0); + this.distContextMap = new Int8Array(0); + this.distExtraBits = new Int8Array(0); + this.output = new Int8Array(0); + this.byteBuffer = new Int8Array(0); + this.shortBuffer = new Int16Array(0); + this.intBuffer = new Int32Array(0); + this.rings = new Int32Array(0); + this.blockTrees = new Int32Array(0); + this.literalTreeGroup = new Int32Array(0); + this.commandTreeGroup = new Int32Array(0); + this.distanceTreeGroup = new Int32Array(0); + this.distOffset = new Int32Array(0); + this.accumulator64 = 0; + this.runningState = 0; + this.nextRunningState = 0; + this.accumulator32 = 0; + this.bitOffset = 0; + this.halfOffset = 0; + this.tailBytes = 0; + this.endOfStreamReached = 0; + this.metaBlockLength = 0; + this.inputEnd = 0; + this.isUncompressed = 0; + this.isMetadata = 0; + this.literalBlockLength = 0; + this.numLiteralBlockTypes = 0; + this.commandBlockLength = 0; + this.numCommandBlockTypes = 0; + this.distanceBlockLength = 0; + this.numDistanceBlockTypes = 0; + this.pos = 0; + this.maxDistance = 0; + this.distRbIdx = 0; + this.trivialLiteralContext = 0; + this.literalTreeIdx = 0; + this.commandTreeIdx = 0; + this.j = 0; + this.insertLength = 0; + this.contextMapSlice = 0; + this.distContextMapSlice = 0; + this.contextLookupOffset1 = 0; + this.contextLookupOffset2 = 0; + this.distanceCode = 0; + this.numDirectDistanceCodes = 0; + this.distancePostfixBits = 0; + this.distance = 0; + this.copyLength = 0; + this.maxBackwardDistance = 0; + this.maxRingBufferSize = 0; + this.ringBufferSize = 0; + this.expectedTotalSize = 0; + this.outputOffset = 0; + this.outputLength = 0; + this.outputUsed = 0; + this.ringBufferBytesWritten = 0; + this.ringBufferBytesReady = 0; + this.isEager = 0; + this.isLargeWindow = 0; + this.cdNumChunks = 0; + this.cdTotalSize = 0; + this.cdBrIndex = 0; + this.cdBrOffset = 0; + this.cdBrLength = 0; + this.cdBrCopied = 0; + this.cdChunks = new Array(0); + this.cdChunkOffsets = new Int32Array(0); + this.cdBlockBits = 0; + this.cdBlockMap = new Int8Array(0); + this.input = new InputStream(new Int8Array(0)); + this.ringBuffer = new Int8Array(0); + this.rings = new Int32Array(10); + this.rings[0] = 16; + this.rings[1] = 15; + this.rings[2] = 11; + this.rings[3] = 4; + } + let data = new Int8Array(0); + const offsets = new Int32Array(32); + const sizeBits = new Int32Array(32); + function setData(newData, newSizeBits) { + const dictionaryOffsets = offsets; + const dictionarySizeBits = sizeBits; + for (let i = 0; i < newSizeBits.length; ++i) { + dictionarySizeBits[i] = newSizeBits[i]; + } + let pos = 0; + for (let i = 0; i < newSizeBits.length; ++i) { + dictionaryOffsets[i] = pos; + const bits = dictionarySizeBits[i]; + if (bits !== 0) { + pos += i << (bits & 31); + } + } + for (let i = newSizeBits.length; i < 32; ++i) { + dictionaryOffsets[i] = pos; + } + data = newData; + } + function unpackDictionaryData(dictionary, data0, data1, skipFlip, sizeBits, sizeBitsData) { + const dict = toUsAsciiBytes(data0 + data1); + const skipFlipRunes = toUtf8Runes(skipFlip); + let offset = 0; + const n = skipFlipRunes.length >> 1; + for (let i = 0; i < n; ++i) { + const skip = skipFlipRunes[2 * i] - 36; + const flip = skipFlipRunes[2 * i + 1] - 36; + for (let j = 0; j < skip; ++j) { + dict[offset] = dict[offset] ^ 3; + offset++; + } + for (let j = 0; j < flip; ++j) { + dict[offset] = dict[offset] ^ 236; + offset++; + } + } + for (let i = 0; i < sizeBitsData.length; ++i) { + sizeBits[i] = sizeBitsData.charCodeAt(i) - 65; + } + dictionary.set(dict); + } + const dictionaryData = new Int8Array(122784); + const dictionarySizeBits = new Int32Array(25); + unpackDictionaryData(dictionaryData, "wjnfgltmojefofewab`h`lgfgbwbpkltlmozpjwf`jwzlsfmivpwojhfeqfftlqhwf{wzfbqlufqalgzolufelqnallhsobzojufojmfkfosklnfpjgfnlqftlqgolmdwkfnujftejmgsbdfgbzpevookfbgwfqnfb`kbqfbeqlnwqvfnbqhbaofvslmkjdkgbwfobmgmftpfufmmf{w`bpfalwkslpwvpfgnbgfkbmgkfqftkbwmbnfOjmhaoldpjyfabpfkfognbhfnbjmvpfq$*#(klogfmgptjwkMftpqfbgtfqfpjdmwbhfkbufdbnfpffm`boosbwktfoosovpnfmvejonsbqwiljmwkjpojpwdllgmffgtbzptfpwilapnjmgboploldlqj`kvpfpobpwwfbnbqnzellghjmdtjoofbpwtbqgafpwejqfSbdfhmltbtbz-smdnlufwkbmolbgdjufpfoemlwfnv`keffgnbmzql`hj`lmlm`follhkjgfgjfgKlnfqvofklpwbib{jmel`ovaobtpofppkboeplnfpv`kylmf233&lmfp`bqfWjnfqb`faovfelvqtffheb`fklsfdbufkbqgolpwtkfmsbqhhfswsbpppkjsqllnKWNOsobmWzsfglmfpbufhffseobdojmhplogejufwllhqbwfwltmivnswkvpgbqh`bqgejofefbqpwbzhjoowkbweboobvwlfufq-`lnwbohpklsulwfgffsnlgfqfpwwvqmalqmabmgefooqlpfvqo+phjmqlof`lnfb`wpbdfpnffwdlog-isdjwfnubqzefowwkfmpfmggqlsUjft`lsz2-3!?,b=pwlsfopfojfpwlvqsb`h-djesbpw`pp!pfwp6s{8-ip<73s{je#+pllmpfbwmlmfwvafyfqlpfmwqffgeb`wjmwldjewkbqn2;s{`bnfkjooalogyllnuljgfbpzqjmdejoosfbhjmjw`lpw0s{8ib`hwbdpajwpqloofgjwhmftmfbq?\"..dqltIPLMgvwzMbnfpbofzlv#olwpsbjmibyy`logfzfpejpkttt-qjphwbapsqfu23s{qjpf16s{Aovfgjmd033/abooelqgfbqmtjogal{-ebjqob`hufqpsbjqivmfwf`kje+\"sj`hfujo'+! tbqnolqgglfpsvoo/333jgfbgqbtkvdfpslwevmgavqmkqfe`foohfzpwj`hklvqolppevfo21s{pvjwgfboQPP!bdfgdqfzDFW!fbpfbjnpdjqobjgp;s{8mbuzdqjgwjsp :::tbqpobgz`bqp*8#~sksolpfmvooubpwtjmgQPP#tfbqqfozaffmpbnfgvhfmbpb`bsftjpkdvoeW109kjwppolwdbwfhj`haovqwkfz26s{$$*8*8!=npjftjmpajqgplqwafwbpffhW2;9lqgpwqffnboo53s{ebqn\x0ElupalzpX3^-$*8!SLPWafbqhjgp*8~~nbqzwfmg+VH*rvbgyk9\n.pjy....sqls$*8\x0EojewW2:9uj`fbmgzgfaw=QPPsllomf`haoltW259gllqfuboW249ofwpebjolqbosloomlub`lopdfmf#\x0Elxplewqlnfwjooqlpp?k0=slvqebgfsjmh?wq=njmj*\x7F\"+njmfyk9\x04abqpkfbq33*8njoh#..=jqlmeqfggjphtfmwpljosvwp,ip,klozW119JPAMW139bgbnpffp?k1=iplm$/#$`lmwW129#QPPollsbpjbnllm?,s=plvoOJMFelqw`bqwW279?k2=;3s{\"..?:s{8W379njhf975Ymj`fjm`kZlqhqj`fyk9\b$**8svqfnbdfsbqbwlmfalmg904Y\\le\\$^*8333/yk9\x0Bwbmhzbqgaltoavpk965YIbub03s{\t\x7F~\t&@0&907YifeeF[SJ`bpkujpbdloepmltyk9\x05rvfq-`pppj`hnfbwnjm-ajmggfookjqfsj`pqfmw905YKWWS.132elwltloeFMG#{al{967YALGZgj`h8\t~\tf{jw906Yubqpafbw$~*8gjfw:::8bmmf~~?,Xj^-Obmdhn.^tjqfwlzpbggppfbobof{8\t\n~f`klmjmf-lqd336*wlmziftppbmgofdpqlle333*#133tjmfdfbqgldpallwdbqz`vwpwzofwfnswjlm-{no`l`hdbmd'+$-63s{Sk-Gnjp`bobmolbmgfphnjofqzbmvmj{gjp`*8~\tgvpw`ojs*-\t\t43s{.133GUGp4^=?wbsfgfnlj((*tbdffvqlskjolswpklofEBRpbpjm.15WobapsfwpVQO#avoh`llh8~\x0E\tKFBGX3^*baaqivbm+2:;ofpkwtjm?,j=plmzdvzpev`hsjsf\x7F.\t\"331*mgltX2^8X^8\tOld#pbow\x0E\t\n\nabmdwqjnabwk*x\x0E\t33s{\t~*8hl9\0effpbg=\x0Ep9,,#X^8wloosovd+*x\tx\x0E\t#-ip$133sgvboalbw-ISD*8\t~rvlw*8\t\t$*8\t\x0E\t~\x0E1327132613251324132;132:13131312131113101317131613151314131;131:130313021301130013071306130513041320132113221323133:133;133413351336133713301331133213332:::2::;2::42::52::62::72::02::12::22::32:;:2:;;2:;42:;52:;62:;72:;02:;12:;22:;32:4:2:4;2:442:452:462:472:402:412:422:432:5:2:5;2:542:552:562:572:502:512:522:532:6:2:6;2:642:652:662:672:602:612:622:632333231720:73333::::`lnln/Mpfpwffpwbsfqlwlglkb`f`bgbb/]lajfmg/Abbp/Aujgb`bpllwqlelqlplollwqb`vbogjilpjgldqbmwjslwfnbgfafbodlrv/Efpwlmbgbwqfpsl`l`bpbabilwlgbpjmlbdvbsvfpvmlpbmwfgj`fovjpfoobnbzlylmbbnlqsjpllaqb`oj`foolgjlpklqb`bpj<[<\\!sbqhpnlvpfNlpw#---?,bnlmdaqbjmalgz#mlmf8abpfg`bqqzgqbewqfefqsbdf\\klnf-nfwfqgfobzgqfbnsqlufiljmw?,wq=gqvdp?\"..#bsqjojgfboboofmf{b`welqwk`lgfpoldj`Ujft#pffnpaobmhslqwp#+133pbufg\\ojmhdlbopdqbmwdqffhklnfpqjmdpqbwfg03s{8tklpfsbqpf+*8!#Aol`hojmv{ilmfpsj{fo$*8!=*8je+.ofewgbujgklqpfEl`vpqbjpfal{fpWqb`hfnfmw?,fn=abq!=-pq`>wltfqbow>!`baofkfmqz17s{8pfwvsjwbozpkbqsnjmlqwbpwftbmwpwkjp-qfpfwtkffodjqop,`pp,233&8`ovappwveeajaofulwfp#2333hlqfb~*8\x0E\tabmgprvfvf>#x~8;3s{8`hjmdx\x0E\t\n\nbkfbg`ol`hjqjpkojhf#qbwjlpwbwpElqn!zbkll*X3^8Balvwejmgp?,k2=gfavdwbphpVQO#>`foop~*+*821s{8sqjnfwfoopwvqmp3{533-isd!psbjmafb`kwb{fpnj`qlbmdfo..=?,djewppwfuf.ojmhalgz-~*8\t\nnlvmw#+2::EBR?,qldfqeqbmh@obpp1;s{8effgp?k2=?p`lwwwfpwp11s{8gqjmh*#\x7F\x7F#oftjppkboo 30:8#elq#olufgtbpwf33s{8ib9\x0Fnpjnlm?elmwqfsoznffwpvmwfq`kfbswjdkwAqbmg*#\">#gqfpp`ojspqllnplmhfznlajonbjm-Mbnf#sobwfevmmzwqffp`ln,!2-isdtnlgfsbqbnPWBQWofew#jggfm/#132*8\t~\telqn-ujqvp`kbjqwqbmptlqpwSbdfpjwjlmsbw`k?\"..\tl.`b`ejqnpwlvqp/333#bpjbmj((*xbglaf$*X3^jg>23alwk8nfmv#-1-nj-smd!hfujm`lb`k@kjogaqv`f1-isdVQO*(-isd\x7Fpvjwfpoj`fkbqqz213!#ptffwwq=\x0E\tmbnf>gjfdlsbdf#ptjpp..=\t\t eee8!=Old-`ln!wqfbwpkffw*#%%#27s{8poffsmwfmwejofgib9\x0Fojg>!`Mbnf!tlqpfpklwp.al{.gfowb\t%ow8afbqp97;Y?gbwb.qvqbo?,b=#psfmgabhfqpklsp>#!!8sks!=`wjlm20s{8aqjbmkfoolpjyf>l>&1E#iljmnbzaf?jnd#jnd!=/#eipjnd!#!*X3^NWlsAWzsf!mftozGbmph`yf`kwqbjohmltp?,k6=ebr!=yk.`m23*8\t.2!*8wzsf>aovfpwqvozgbujp-ip$8=\x0E\t?\"pwffo#zlv#k1=\x0E\telqn#ifpvp233&#nfmv-\x0E\t\n\x0E\ttbofpqjphpvnfmwggjmda.ojhwfb`kdje!#ufdbpgbmphffpwjpkrjspvlnjplaqfgfpgffmwqfwlglpsvfgfb/]lpfpw/Mwjfmfkbpwblwqlpsbqwfglmgfmvfulkb`fqelqnbnjpnlnfilqnvmglbrv/Ag/Abpp/_olbzvgbef`kbwlgbpwbmwlnfmlpgbwlplwqbppjwjlnv`klbklqbovdbqnbzlqfpwlpklqbpwfmfqbmwfpelwlpfpwbpsb/Apmvfubpbovgelqlpnfgjlrvjfmnfpfpslgfq`kjofpfq/Muf`fpgf`jqilp/Efpwbqufmwbdqvslkf`klfoolpwfmdlbnjdl`lpbpmjufodfmwfnjpnbbjqfpivojlwfnbpkb`jbebulqivmjlojaqfsvmwlavfmlbvwlqbaqjoavfmbwf{wlnbqylpbafqojpwbovfdl`/_nlfmfqlivfdlsfq/Vkbafqfpwlzmvm`bnvifqubolqevfqbojaqldvpwbjdvboulwlp`bplpdv/Absvfglplnlpbujplvpwfggfafmml`kfavp`bebowbfvqlppfqjfgj`kl`vqpl`obuf`bpbpof/_msobylobqdllaqbpujpwbbslzlivmwlwqbwbujpwl`qfbq`bnslkfnlp`jm`l`bqdlsjplplqgfmkb`fm/Mqfbgjp`lsfgql`fq`bsvfgbsbsfonfmlq/Vwjo`obqlilqdf`boofslmfqwbqgfmbgjfnbq`bpjdvffoobppjdol`l`kfnlwlpnbgqf`obpfqfpwlmj/]lrvfgbsbpbqabm`lkjilpujbifsbaol/Epwfujfmfqfjmlgfibqelmgl`bmbomlqwfofwqb`bvpbwlnbqnbmlpovmfpbvwlpujoobufmglsfpbqwjslpwfmdbnbq`loofubsbgqfvmjglubnlpylmbpbnalpabmgbnbqjbbavplnv`kbpvajqqjlibujujqdqbgl`kj`bboo/Ailufmgj`kbfpwbmwbofppbojqpvfolsfplpejmfpoobnbavp`l/Epwboofdbmfdqlsobybkvnlqsbdbqivmwbglaofjpobpalopbab/]lkbaobov`kb/mqfbgj`fmivdbqmlwbpuboofboo/M`bqdbglolqbabilfpw/Edvpwlnfmwfnbqjlejqnb`lpwlej`kbsobwbkldbqbqwfpofzfpbrvfonvpflabpfpsl`lpnjwbg`jfol`kj`lnjfgldbmbqpbmwlfwbsbgfafpsobzbqfgfppjfwf`lqwf`lqfbgvgbpgfpflujfilgfpfbbdvbp%rvlw8glnbjm`lnnlmpwbwvpfufmwpnbpwfqpzpwfnb`wjlmabmmfqqfnlufp`qloovsgbwfdolabonfgjvnejowfqmvnafq`kbmdfqfpvowsvaoj`p`qffm`kllpfmlqnbowqbufojppvfpplvq`fwbqdfwpsqjmdnlgvofnlajofptjw`ksklwlpalqgfqqfdjlmjwpfoepl`jbob`wjuf`lovnmqf`lqgelooltwjwof=fjwkfqofmdwkebnjozeqjfmgobzlvwbvwklq`qfbwfqfujftpvnnfqpfqufqsobzfgsobzfqf{sbmgsloj`zelqnbwglvaofsljmwppfqjfpsfqplmojujmdgfpjdmnlmwkpelq`fpvmjrvftfjdkwsflsoffmfqdzmbwvqfpfbq`kejdvqfkbujmd`vpwlnleepfwofwwfqtjmgltpvanjwqfmgfqdqlvspvsolbgkfbowknfwklgujgflpp`klloevwvqfpkbgltgfabwfubovfpLaif`wlwkfqpqjdkwpofbdvf`kqlnfpjnsofmlwj`fpkbqfgfmgjmdpfbplmqfslqwlmojmfprvbqfavwwlmjnbdfpfmbaofnlujmdobwfpwtjmwfqEqbm`fsfqjlgpwqlmdqfsfbwOlmglmgfwbjoelqnfggfnbmgpf`vqfsbppfgwlddofsob`fpgfuj`fpwbwj``jwjfppwqfbnzfooltbwwb`hpwqffweojdkwkjggfmjmel!=lsfmfgvpfevouboofz`bvpfpofbgfqpf`qfwpf`lmggbnbdfpslqwpf{`fswqbwjmdpjdmfgwkjmdpfeef`wejfogppwbwfpleej`fujpvbofgjwlqulovnfQfslqwnvpfvnnlujfpsbqfmwb``fppnlpwoznlwkfq!#jg>!nbqhfwdqlvmg`kbm`fpvqufzafelqfpznalonlnfmwpsff`knlwjlmjmpjgfnbwwfq@fmwfqlaif`wf{jpwpnjggofFvqlsfdqltwkofdb`znbmmfqfmlvdk`bqffqbmptfqlqjdjmslqwbo`ojfmwpfof`wqbmgln`olpfgwlsj`p`lnjmdebwkfqlswjlmpjnsozqbjpfgfp`bsf`klpfm`kvq`kgfejmfqfbplm`lqmfqlvwsvwnfnlqzjeqbnfsloj`fnlgfopMvnafqgvqjmdleefqppwzofphjoofgojpwfg`boofgpjoufqnbqdjmgfofwfafwwfqaqltpfojnjwpDolabopjmdoftjgdfw`fmwfqavgdfwmltqbs`qfgjw`objnpfmdjmfpbefwz`klj`fpsjqjw.pwzofpsqfbgnbhjmdmffgfgqvppjbsofbpff{wfmwP`qjswaqlhfmbooltp`kbqdfgjujgfeb`wlqnfnafq.abpfgwkflqz`lmejdbqlvmgtlqhfgkfosfg@kvq`kjnsb`wpklvogbotbzpoldl!#alwwlnojpw!=*xubq#sqfej{lqbmdfKfbgfq-svpk+`lvsofdbqgfmaqjgdfobvm`kQfujftwbhjmdujpjlmojwwofgbwjmdAvwwlmafbvwzwkfnfpelqdlwPfbq`kbm`klqbonlpwolbgfg@kbmdfqfwvqmpwqjmdqfolbgNlajofjm`lnfpvssozPlvq`flqgfqpujftfg%maps8`lvqpfBalvw#jpobmg?kwno#`llhjfmbnf>!bnbylmnlgfqmbguj`fjm?,b=9#Wkf#gjboldklvpfpAFDJM#Nf{j`lpwbqwp`fmwqfkfjdkwbggjmdJpobmgbppfwpFnsjqfP`kllofeelqwgjqf`wmfbqoznbmvboPfof`w-\t\tLmfiljmfgnfmv!=SkjojsbtbqgpkbmgofjnslqwLeej`fqfdbqgphjoopmbwjlmPslqwpgfdqfftffhoz#+f-d-afkjmggl`wlqolddfgvmjwfg?,a=?,afdjmpsobmwpbppjpwbqwjpwjppvfg033s{\x7F`bmbgbbdfm`zp`kfnfqfnbjmAqbyjopbnsofoldl!=afzlmg.p`bofb``fswpfqufgnbqjmfEllwfq`bnfqb?,k2=\t\\elqn!ofbufppwqfpp!#,=\x0E\t-dje!#lmolbgolbgfqL{elqgpjpwfqpvqujuojpwfmefnbofGfpjdmpjyf>!bssfbowf{w!=ofufopwkbmhpkjdkfqelq`fgbmjnbobmzlmfBeqj`bbdqffgqf`fmwSflsof?aq#,=tlmgfqsqj`fpwvqmfg\x7F\x7F#x~8nbjm!=jmojmfpvmgbztqbs!=ebjofg`fmpvpnjmvwfafb`lmrvlwfp263s{\x7Ffpwbwfqfnlwffnbjo!ojmhfgqjdkw8pjdmboelqnbo2-kwnopjdmvssqjm`feolbw9-smd!#elqvn-B``fppsbsfqpplvmgpf{wfmgKfjdkwpojgfqVWE.;!%bns8#Afelqf-#TjwkpwvgjlltmfqpnbmbdfsqlejwiRvfqzbmmvbosbqbnpalvdkwebnlvpdlldofolmdfqj((*#xjpqbfopbzjmdgf`jgfklnf!=kfbgfqfmpvqfaqbm`ksjf`fpaol`h8pwbwfgwls!=?qb`jmdqfpjyf..%dw8sb`jwzpf{vboavqfbv-isd!#23/333lawbjmwjwofpbnlvmw/#Jm`-`lnfgznfmv!#ozqj`pwlgbz-jmgffg`lvmwz\\oldl-EbnjozollhfgNbqhfwopf#jeSobzfqwvqhfz*8ubq#elqfpwdjujmdfqqlqpGlnbjm~fopfxjmpfqwAold?,ellwfqoldjm-ebpwfqbdfmwp?algz#23s{#3sqbdnbeqjgbzivmjlqgloobqsob`fg`lufqpsovdjm6/333#sbdf!=alpwlm-wfpw+bubwbqwfpwfg\\`lvmwelqvnpp`kfnbjmgf{/ejoofgpkbqfpqfbgfqbofqw+bssfbqPvanjwojmf!=algz!=\t)#WkfWklvdkpffjmdifqpfzMftp?,ufqjezf{sfqwjmivqztjgwk>@llhjfPWBQW#b`qlpp\\jnbdfwkqfbgmbwjufsl`hfwal{!=\tPzpwfn#Gbujg`bm`fqwbaofpsqlufgBsqjo#qfboozgqjufqjwfn!=nlqf!=albqgp`lolqp`bnsvpejqpw#\x7F\x7F#X^8nfgjb-dvjwbqejmjpktjgwk9pkltfgLwkfq#-sks!#bppvnfobzfqptjoplmpwlqfpqfojfeptfgfm@vpwlnfbpjoz#zlvq#Pwqjmd\t\tTkjowbzolq`ofbq9qfplqweqfm`kwklvdk!*#(#!?algz=avzjmdaqbmgpNfnafqmbnf!=lssjmdpf`wlq6s{8!=upsb`fslpwfqnbilq#`leeffnbqwjmnbwvqfkbssfm?,mbu=hbmpbpojmh!=Jnbdfp>ebopftkjof#kpsb`f3%bns8#\t\tJm##sltfqSlophj.`lolqilqgbmAlwwlnPwbqw#.`lvmw1-kwnomftp!=32-isdLmojmf.qjdkwnjoofqpfmjlqJPAM#33/333#dvjgfpubovf*f`wjlmqfsbjq-{no!##qjdkwp-kwno.aol`hqfdF{s9klufqtjwkjmujqdjmsklmfp?,wq=\x0Evpjmd#\t\nubq#=$*8\t\n?,wg=\t?,wq=\tabkbpbaqbpjodbofdlnbdzbqslophjpqsphj4]4C5d\bTA\nzk\x0BBl\bQ\x7F\x0BUm\x05Gx\bSM\nmC\bTA\twQ\nd}\bW@\bTl\bTF\ti@\tcT\x0BBM\x0B|j\x04BV\tqw\tcC\bWI\npa\tfM\n{Z\x05{X\bTF\bVV\bVK\t\x7Fm\x04kF\t[]\bPm\bTv\nsI\x0Bpg\t[I\bQp\x04mx\x0B_W\n^M\npe\x0BQ}\x0BGu\nel\npe\x04Ch\x04BV\bTA\tSo\nzk\x0BGL\x0BxD\nd[\x05Jz\x05MY\bQp\x04li\nfl\npC\x05{B\x05Nt\x0BwT\ti_\bTg\x04QQ\n|p\x0BXN\bQS\x0BxD\x04QC\bWZ\tpD\x0BVS\bTW\x05Nt\x04Yh\nzu\x04Kj\x05N}\twr\tHa\n_D\tj`\x0BQ}\x0BWp\nxZ\x04{c\tji\tBU\nbD\x04a|\tTn\tpV\nZd\nmC\x0BEV\x05{X\tc}\tTo\bWl\bUd\tIQ\tcg\x0Bxs\nXW\twR\x0Bek\tc}\t]y\tJn\nrp\neg\npV\nz\\\x05{W\npl\nz\\\nzU\tPc\t`{\bV@\nc|\bRw\ti_\bVb\nwX\tHv\x04Su\bTF\x0B_W\x0BWs\x0BsI\x05m\x7F\nTT\ndc\tUS\t}f\tiZ\bWz\tc}\x04MD\tBe\tiD\x0B@@\bTl\bPv\t}t\x04Sw\x04M`\x0BnU\tkW\x0Bed\nqo\x0BxY\tA|\bTz\x0By`\x04BR\x04BM\tia\x04XU\nyu\x04n^\tfL\tiI\nXW\tfD\bWz\bW@\tyj\t\x7Fm\tav\tBN\x0Bb\\\tpD\bTf\nY[\tJn\bQy\t[^\x0BWc\x0Byu\x04Dl\x04CJ\x0BWj\x0BHR\t`V\x0BuW\tQy\np@\x0BGu\x05pl\x04Jm\bW[\nLP\nxC\n`m\twQ\x05ui\x05\x7FR\nbI\twQ\tBZ\tWV\x04BR\npg\tcg\x05ti\x04CW\n_y\tRg\bQa\x0BQB\x0BWc\nYb\x05le\ngE\x04Su\nL[\tQ\x7F\tea\tdj\x0B]W\nb~\x04M`\twL\bTV\bVH\nt\x7F\npl\t|b\x05s_\bU|\bTa\x04oQ\x05lv\x04Sk\x04M`\bTv\x0BK}\nfl\tcC\x04oQ\x04BR\tHk\t|d\bQp\tHK\tBZ\x0BHR\bPv\x0BLx\x0BEZ\bT\x7F\bTv\tiD\x05oD\x05MU\x0BwB\x04Su\x05k`\x04St\ntC\tPl\tKg\noi\tjY\x0BxY\x04h}\nzk\bWZ\t\x7Fm\x0Be`\tTB\tfE\nzk\t`z\x04Yh\nV|\tHK\tAJ\tAJ\bUL\tp\\\tql\nYc\x04Kd\nfy\x04Yh\t[I\x0BDg\x04Jm\n]n\nlb\bUd\n{Z\tlu\tfs\x04oQ\bTW\x04Jm\x0BwB\tea\x04Yh\x04BC\tsb\tTn\nzU\n_y\x0BxY\tQ]\ngw\x04mt\tO\\\ntb\bWW\bQy\tmI\tV[\ny\\\naB\x0BRb\twQ\n]Q\x04QJ\bWg\x0BWa\bQj\ntC\bVH\nYm\x0Bxs\bVK\nel\bWI\x0BxY\x04Cq\ntR\x0BHV\bTl\bVw\tay\bQa\bVV\t}t\tdj\nr|\tp\\\twR\n{i\nTT\t[I\ti[\tAJ\x0Bxs\x0B_W\td{\x0BQ}\tcg\tTz\tA|\tCj\x0BLm\x05N}\x05m\x7F\nbK\tdZ\tp\\\t`V\tsV\np@\tiD\twQ\x0BQ}\bTf\x05ka\x04Jm\x0B@@\bV`\tzp\n@N\x04Sw\tiI\tcg\noi\x04Su\bVw\x04lo\x04Cy\tc}\x0Bb\\\tsU\x04BA\bWI\bTf\nxS\tVp\nd|\bTV\x0BbC\tNo\x05Ju\nTC\t|`\n{Z\tD]\bU|\tc}\x05lm\bTl\tBv\tPl\tc}\bQp\t\x7Fm\nLk\tkj\n@N\x04Sb\x04KO\tj_\tp\\\nzU\bTl\bTg\bWI\tcf\x04XO\bWW\ndz\x04li\tBN\nd[\bWO\x04MD\x0BKC\tdj\tI_\bVV\ny\\\x0BLm\x05xl\txB\tkV\x0Bb\\\x0BJW\x0BVS\tVx\x0BxD\td{\x04MD\bTa\t|`\x0BPz\x04R}\x0BWs\x04BM\nsI\x04CN\bTa\x04Jm\npe\ti_\npV\nrh\tRd\tHv\n~A\nxR\x0BWh\x0BWk\nxS\x0BAz\x0BwX\nbI\x04oQ\tfw\nqI\nV|\nun\x05z\x7F\x0Bpg\td\\\x0BoA\x05{D\ti_\x05xB\bT\x7F\t`V\x05qr\tTT\x04g]\x04CA\x0BuR\tVJ\tT`\npw\x0BRb\tI_\nCx\x04Ro\x0BsI\x04Cj\x04Kh\tBv\tWV\x04BB\x05oD\x05{D\nhc\x04Km\x0B^R\tQE\n{I\np@\nc|\x05Gt\tc}\x04Dl\nzU\x05qN\tsV\x05k}\tHh\x0B|j\nqo\x05u|\tQ]\x0Bek\x05\x7FZ\x04M`\x04St\npe\tdj\bVG\x0BeE\t\x7Fm\x0BWc\x04|I\n[W\tfL\bT\x7F\tBZ\x04Su\x0BKa\x04Cq\x05Nt\x04Y[\nqI\bTv\tfM\ti@\t}f\x04B\\\tQy\x0BBl\bWg\x04XD\x05kc\x0Bx[\bVV\tQ]\t\x7Fa\tPy\x0BxD\nfI\t}f\x05oD\tdj\tSG\x05ls\t~D\x04CN\n{Z\t\\v\n_D\nhc\x0Bx_\x04C[\tAJ\nLM\tVx\x04CI\tbj\tc^\tcF\ntC\x04Sx\twr\x04XA\bU\\\t|a\x0BK\\\bTV\bVj\nd|\tfs\x04CX\ntb\bRw\tVx\tAE\tA|\bT\x7F\x05Nt\x0BDg\tVc\bTl\x04d@\npo\t\x7FM\tcF\npe\tiZ\tBo\bSq\nfH\x04l`\bTx\bWf\tHE\x0BF{\tcO\tfD\nlm\x0BfZ\nlm\x0BeU\tdG\x04BH\bTV\tSi\x05MW\nwX\nz\\\t\\c\x04CX\nd}\tl}\bQp\bTV\tF~\bQ\x7F\t`i\ng@\x05nO\bUd\bTl\nL[\twQ\tji\ntC\t|J\nLU\naB\x0BxY\x04Kj\tAJ\x05uN\ti[\npe\x04Sk\x0BDg\x0Bx]\bVb\bVV\nea\tkV\nqI\bTa\x04Sk\nAO\tpD\ntb\nts\nyi\bVg\ti_\x0B_W\nLk\x05Nt\tyj\tfM\x04R\x7F\tiI\bTl\x0BwX\tsV\x0BMl\nyu\tAJ\bVj\x04KO\tWV\x0BA}\x0BW\x7F\nrp\tiD\x0B|o\x05lv\x0BsI\x04BM\td~\tCU\bVb\x04eV\npC\x0BwT\tj`\tc}\x0Bxs\x0Bps\x0Bvh\tWV\x0BGg\x0BAe\x0BVK\x0B]W\trg\x0BWc\x05F`\tBr\x0Bb\\\tdZ\bQp\nqI\x04kF\nLk\x0BAR\bWI\bTg\tbs\tdw\n{L\n_y\tiZ\bTA\tlg\bVV\bTl\tdk\n`k\ta{\ti_\x05{A\x05wj\twN\x0B@@\bTe\ti_\n_D\twL\nAH\x0BiK\x0Bek\n[]\tp_\tyj\bTv\tUS\t[r\n{I\nps\x05Gt\x0BVK\npl\x04S}\x0BWP\t|d\x04MD\x0BHV\bT\x7F\x04R}\x04M`\bTV\bVH\x05lv\x04Ch\bW[\x04Ke\tR{\x0B^R\tab\tBZ\tVA\tB`\nd|\nhs\x04Ke\tBe\x04Oi\tR{\td\\\x05nB\bWZ\tdZ\tVJ\x05Os\t\x7Fm\x04uQ\x0BhZ\x04Q@\x04QQ\nfI\bW[\x04B\\\x04li\nzU\nMd\x04M`\nxS\bVV\n\\}\x0BxD\t\x7Fm\bTp\x04IS\nc|\tkV\x05i~\tV{\x0BhZ\t|b\bWt\n@R\x0BoA\x0BnU\bWI\tea\tB`\tiD\tc}\tTz\x04BR\x0BQB\x05Nj\tCP\t[I\bTv\t`W\x05uN\x0Bpg\x0Bpg\x0BWc\tiT\tbs\twL\tU_\tc\\\t|h\x0BKa\tNr\tfL\nq|\nzu\nz\\\tNr\bUg\t|b\x04m`\bTv\nyd\nrp\bWf\tUX\x04BV\nzk\nd}\twQ\t}f\x04Ce\x0Bed\bTW\bSB\nxU\tcn\bTb\ne\x7F\ta\\\tSG\bU|\npV\nN\\\x04Kn\x0BnU\tAt\tpD\x0B^R\x0BIr\x04b[\tR{\tdE\x0BxD\x0BWK\x0BWA\bQL\bW@\x04Su\bUd\nDM\tPc\x04CA\x04Dl\x04oQ\tHs\x05wi\x04ub\n\x7Fa\bQp\x05Ob\nLP\bTl\x04Y[\x0BK}\tAJ\bQ\x7F\x04n^\x0BsA\bSM\nqM\bWZ\n^W\x0Bz{\x04S|\tfD\bVK\bTv\bPv\x04BB\tCP\x04dF\tid\x0Bxs\x04mx\x0Bws\tcC\ntC\tyc\x05M`\x0BW\x7F\nrh\bQp\x0BxD\x04\\o\nsI\x04_k\nzu\x04kF\tfD\x04Xs\x04XO\tjp\bTv\x04BS\x05{B\tBr\nzQ\nbI\tc{\x04BD\x04BV\x05nO\bTF\tca\x05Jd\tfL\tPV\tI_\nlK\x04`o\twX\npa\tgu\bP}\x05{^\bWf\n{I\tBN\npa\x04Kl\x0Bpg\tcn\tfL\x0Bvh\x04Cq\bTl\x0BnU\bSq\x04Cm\twR\bUJ\npe\nyd\nYg\x04Cy\x0BKW\tfD\nea\x04oQ\tj_\tBv\x04nM\x0BID\bTa\nzA\x05pl\n]n\bTa\tR{\tfr\n_y\bUg\x05{X\x05kk\x0BxD\x04|I\x05xl\nfy\x04Ce\x0BwB\nLk\x0Bd]\noi\n}h\tQ]\npe\bVw\x04Hk\x04OQ\nzk\tAJ\npV\bPv\ny\\\tA{\x04Oi\bSB\x04XA\x0BeE\tjp\nq}\tiD\x05qN\x0B^R\t\x7Fm\tiZ\tBr\bVg\noi\n\\X\tU_\nc|\x0BHV\bTf\tTn\x04\\N\x04\\N\nuB\x05lv\nyu\tTd\bTf\bPL\x0B]W\tdG\nA`\nw^\ngI\npe\tdw\nz\\\x05ia\bWZ\tcF\x04Jm\n{Z\bWO\x04_k\x04Df\x04RR\td\\\bVV\x0Bxs\x04BN\x05ti\x04lm\tTd\t]y\x0BHV\tSo\x0B|j\x04XX\tA|\x0BZ^\x0BGu\bTW\x05M`\x04kF\x0BhZ\x0BVK\tdG\x0BBl\tay\nxU\x05qE\x05nO\bVw\nqI\x04CX\ne\x7F\tPl\bWO\x0BLm\tdL\x05uH\x04Cm\tdT\x04fn\x0BwB\x05ka\x0BnU\n@M\nyT\tHv\t\\}\x04Kh\td~\x04Yh\x05k}\neR\td\\\bWI\t|b\tHK\tiD\bTW\x05MY\npl\bQ_\twr\x0BAx\tHE\bTg\bSq\x05vp\x0Bb\\\bWO\nOl\nsI\nfy\x0BID\t\\c\n{Z\n^~\npe\nAO\tTT\x0Bxv\x04k_\bWO\x0B|j\x0BwB\tQy\ti@\tPl\tHa\tdZ\x05k}\x04ra\tUT\x0BJc\x0Bed\np@\tQN\nd|\tkj\tHk\x04M`\noi\twr\td\\\nlq\no_\nlb\nL[\tac\x04BB\x04BH\x04Cm\npl\tIQ\bVK\x0Bxs\n`e\x0BiK\npa\x04Oi\tUS\bTp\tfD\nPG\x05kk\x04XA\nz\\\neg\x0BWh\twR\x05qN\nqS\tcn\x04lo\nxS\n^W\tBU\nt\x7F\tHE\tp\\\tfF\tfw\bVV\bW@\tak\x0BVK\x05ls\tVJ\bVV\x0BeE\x04\\o\nyX\nYm\x04M`\x05lL\nd|\nzk\tA{\x05sE\twQ\x04XT\nt\x7F\tPl\t]y\x0BwT\x05{p\x04MD\x0Bb\\\tQ]\x04Kj\tJn\nAH\x0BRb\tBU\tHK\t\\c\nfI\x05m\x7F\nqM\n@R\tSo\noi\x04BT\tHv\n_y\x04Kh\tBZ\t]i\bUJ\tV{\x04Sr\nbI\x0BGg\ta_\bTR\nfI\nfl\t[K\tII\x04S|\x0BuW\tiI\bWI\nqI\x0B|j\x04BV\bVg\bWZ\x04kF\x0Bx]\bTA\tab\tfr\ti@\tJd\tJd\x0Bps\nAO\bTa\x05xu\tiD\nzk\t|d\t|`\bW[\tlP\tdG\bVV\x0Bw}\x0BqO\ti[\bQ\x7F\bTz\x0BVF\twN\x05ts\tdw\bTv\neS\ngi\tNr\x05yS\npe\bVV\bSq\n`m\tyj\tBZ\x0BWX\bSB\tc\\\nUR\t[J\tc_\x04nM\bWQ\x0BAx\nMd\tBr\x05ui\x0BxY\bSM\x0BWc\x0B|j\x0Bxs\t}Q\tBO\bPL\bWW\tfM\nAO\tPc\x0BeU\x04e^\bTg\nqI\tac\bPv\tcF\x04oQ\tQ\x7F\x0BhZ\x05ka\nz\\\tiK\tBU\n`k\tCP\x04S|\x04M`\n{I\tS{\x04_O\tBZ\x04Zi\x04Sk\tps\tp\\\nYu\n]s\nxC\bWt\nbD\tkV\x0BGu\x05yS\nqA\t[r\neK\x04M`\tdZ\x05lL\bUg\bTl\nbD\tUS\x0Bb\\\tpV\ncc\x04S\\\tct\t`z\bPL\x0BWs\nA`\neg\bSq\x05uE\x04CR\x0BDg\t`W\x0Bz{\x0BWc\x04Sk\x04Sk\tbW\bUg\tea\nxZ\tiI\tUX\tVJ\nqn\tS{\x0BRb\bTQ\npl\x05Gt\x0BuW\x05uj\npF\nqI\tfL\t[I\tia\x04XO\nyu\x0BDg\x0Bed\tq{\x04VG\bQ\x7F\x05ka\tVj\tkV\txB\nd|\np@\tQN\tPc\tps\x04]j\tkV\toU\bTp\nzU\x05nB\x0BB]\ta{\bV@\n]n\x04m`\tcz\tR{\x04m`\bQa\x0BwT\bSM\x05MY\x05qN\tdj\x05~s\x0BQ}\x05MY\x0BMB\tBv\twR\bRg\x0BQ}\tql\x0BKC\nrm\x05xu\x04CC\x0BwB\x0Bvh\tBq\x04Xq\npV\ti_\x05Ob\x05uE\nbd\nqo\x0B{i\nC~\tBL\x0BeE\x05uH\bVj\x04Ey\x04Gz\x0BzR\x0B{i\tcf\n{Z\n]n\x04XA\x0BGu\x0BnU\thS\x0BGI\nCc\tHE\bTA\tHB\x04BH\x04Cj\nCc\bTF\tHE\nXI\tA{\bQ\x7F\tc\\\x0BmO\x0BWX\nfH\np@\x05MY\bTF\nlK\tBt\nzU\tTT\x04Km\x0BwT\npV\ndt\x0ByI\tVx\tQ\x7F\tRg\tTd\nzU\bRS\nLM\twA\x04nM\tTn\ndS\t]g\nLc\x0BwB\t}t\t[I\tCP\x04kX\x0BFm\x0BhZ\x05m\x7F\ti[\np@\x0BQ}\x0BW\x7F\t|d\nMO\nMd\tf_\tfD\tcJ\tHz\x0BRb\tio\tPy\x04Y[\nxU\tct\x0B@@\tww\bPv\x04BM\x04FF\ntb\x05v|\x0BKm\tBq\tBq\x04Kh\x04`o\nZd\x04XU\ti]\t|`\tSt\x04B\\\bQ\x7F\x0B_W\tTJ\nqI\t|a\tA{\x0BuP\x04MD\tPl\nxR\tfL\x0Bws\tc{\td\\\bV`\neg\tHK\x05kc\nd|\bVV\ny\\\x05kc\ti]\bVG\t`V\tss\tI_\tAE\tbs\tdu\nel\tpD\x0BW\x7F\nqs\x05lv\bSM\x04Zi\x0BVK\x05ia\x0BQB\tQ\x7F\n{Z\bPt\x0BKl\nlK\nhs\ndS\bVK\x05mf\nd^\tkV\tcO\nc|\bVH\t\\]\bTv\bSq\tmI\x0BDg\tVJ\tcn\ny\\\bVg\bTv\nyX\bTF\t]]\bTp\noi\nhs\x0BeU\nBf\tdj\x05Mr\n|p\t\\g\t]r\bVb\x05{D\nd[\x04XN\tfM\tO\\\x05s_\tcf\tiZ\x04XN\x0BWc\tqv\n`m\tU^\x05oD\nd|\x0BGg\tdE\x0Bwf\x04lo\x04u}\nd|\x05oQ\t`i\x04Oi\x0BxD\ndZ\nCx\x04Yw\nzk\ntb\ngw\tyj\tB`\nyX\x0Bps\ntC\x0BpP\x0Bqw\bPu\bPX\tDm\npw\x05Nj\tss\taG\x0Bxs\bPt\noL\x04Gz\tOk\ti@\ti]\x04eC\tIQ\tii\tdj\x0B@J\t|d\x05uh\bWZ\x0BeU\x0BnU\bTa\tcC\x04g]\nzk\x04Yh\bVK\nLU\np@\ntb\ntR\tCj\x0BNP\ti@\bP{\n\\}\n{c\nwX\tfL\bVG\tc{\t|`\tAJ\t|C\tfD\x05ln\t|d\tbs\nqI\x05{B\x0BAx\np@\nzk\x0BRb\x05Os\x0BWS\x04e^\x0BD_\tBv\x0BWd\bVb\x0Bxs\x0BeE\bRw\n]n\n|p\x0Bg|\tfw\x05kc\bTI\x05ka\n\\T\x04Sp\tju\x0Bps\npe\x05u|\x0BGr\bVe\tCU\x04]M\x04XU\x0BxD\bTa\tIQ\x0BWq\tCU\tam\tdj\bSo\x04Sw\x0BnU\x04Ch\tQ]\x05s_\bPt\tfS\bTa\t\\}\n@O\x04Yc\tUZ\bTx\npe\x0BnU\nzU\t|}\tiD\nz\\\bSM\x0BxD\x04BR\nzQ\tQN\x04]M\x04Yh\nLP\x0BFm\x0BLX\x05vc\x0Bql\x05ka\tHK\bVb\ntC\nCy\bTv\nuV\x04oQ\t`z\t[I\tB`\x0BRb\tyj\tsb\x0BWs\bTl\tkV\x0Bed\ne\x7F\x05lL\x0BxN\t\x7Fm\nJn\tjY\x0BxD\bVb\bSq\x0Byu\twL\x0BXL\bTA\tpg\tAt\tnD\x04XX\twR\npl\nhw\x05yS\nps\tcO\bW[\x0B|j\x04XN\tsV\tp\\\tBe\nb~\nAJ\n]e\x05k`\x05qN\tdw\tWV\tHE\x0BEV\x05Jz\tid\tB`\tzh\x05E]\tfD\bTg\x05qN\bTa\tja\x04Cv\bSM\nhc\bUe\x05t_\tie\x04g]\twQ\nPn\bVB\tjw\bVg\x0BbE\tBZ\x0BRH\bP{\tjp\n\\}\ta_\tcC\t|a\x0BD]\tBZ\ti[\tfD\x0BxW\no_\td\\\n_D\ntb\t\\c\tAJ\nlK\x04oQ\x04lo\x0BLx\x0BM@\bWZ\x04Kn\x0Bpg\nTi\nIv\n|r\x0B@}\x05Jz\x05Lm\x05Wh\x05k}\x05ln\x0BxD\n]s\x04gc\x0Bps\tBr\bTW\x0BBM\x05tZ\nBY\x04DW\tjf\x0BSW\x04C}\nqo\tdE\tmv\tIQ\bPP\bUb\x05lv\x04BC\nzQ\t[I\x0Bgl\nig\bUs\x04BT\x0BbC\bSq\tsU\tiW\nJn\tSY\tHK\trg\npV\x0BID\x0B|j\x04KO\t`S\t|a`vbmglfmujbqnbgqjgavp`bqjmj`jlwjfnslslqrvf`vfmwbfpwbglsvfgfmivfdlp`lmwqbfpw/Mmmlnaqfwjfmfmsfqejonbmfqbbnjdlp`jvgbg`fmwqlbvmrvfsvfgfpgfmwqlsqjnfqsqf`jlpfd/Vmavfmlpuloufqsvmwlppfnbmbkba/Abbdlpwlmvfulpvmjglp`bqolpfrvjslmj/]lpnv`klpbodvmb`lqqfljnbdfmsbqwjqbqqjabnbq/Abklnaqffnsoflufqgbg`bnajlnv`kbpevfqlmsbpbglo/Amfbsbqf`fmvfubp`vqplpfpwbabrvjfqlojaqlp`vbmwlb``fplnjdvfoubqjlp`vbwqlwjfmfpdqvslppfq/Mmfvqlsbnfgjlpeqfmwfb`fq`bgfn/Mplefqwb`l`kfpnlgfoljwbojbofwqbpbod/Vm`lnsqb`vbofpf{jpwf`vfqslpjfmglsqfmpboofdbqujbifpgjmfqlnvq`jbslgq/Msvfpwlgjbqjlsvfaolrvjfqfnbmvfosqlsjl`qjpjp`jfqwlpfdvqlnvfqwfevfmwf`fqqbqdqbmgffef`wlsbqwfpnfgjgbsqlsjbleqf`fwjfqqbf.nbjoubqjbpelqnbpevwvqllaifwlpfdvjqqjfpdlmlqnbpnjpnlp/Vmj`l`bnjmlpjwjlpqby/_mgfajglsqvfabwlofglwfm/Abifp/Vpfpsfql`l`jmblqjdfmwjfmgb`jfmwl`/Mgjykbaobqpfq/Abobwjmbevfqybfpwjoldvfqqbfmwqbq/E{jwlo/_sfybdfmgbu/Agflfujwbqsbdjmbnfwqlpibujfqsbgqfpe/M`jo`bafyb/Mqfbppbojgbfmu/Alibs/_mbavplpajfmfpwf{wlpoofubqsvfgbmevfqwf`ln/Vm`obpfpkvnbmlwfmjglajoablvmjgbgfpw/Mpfgjwbq`qfbgl2%bns8Kjpwlqz#>#mft#@fmwqbovsgbwfgPsf`jboMfwtlqhqfrvjqf`lnnfmwtbqmjmd@loofdfwlloabqqfnbjmpaf`bvpffof`wfgGfvwp`kejmbm`ftlqhfqprvj`hozafwtffmf{b`wozpfwwjmdgjpfbpfPl`jfwztfbslmpf{kjajw%ow8\"..@lmwqlo`obppfp`lufqfglvwojmfbwwb`hpgfuj`fp+tjmgltsvqslpfwjwof>!Nlajof#hjoojmdpkltjmdJwbojbmgqlssfgkfbujozfeef`wp.2$^*8\t`lmejqn@vqqfmwbgubm`fpkbqjmdlsfmjmdgqbtjmdajoojlmlqgfqfgDfqnbmzqfobwfg?,elqn=jm`ovgftkfwkfqgfejmfgP`jfm`f`bwboldBqwj`ofavwwlmpobqdfpwvmjelqnilvqmfzpjgfabq@kj`bdlklojgbzDfmfqbosbppbdf/%rvlw8bmjnbwfeffojmdbqqjufgsbppjmdmbwvqboqlvdkoz-\t\tWkf#avw#mlwgfmpjwzAqjwbjm@kjmfpfob`h#lewqjavwfJqfobmg!#gbwb.eb`wlqpqf`fjufwkbw#jpOjaqbqzkvpabmgjm#eb`wbeebjqp@kbqofpqbgj`boaqlvdkwejmgjmdobmgjmd9obmd>!qfwvqm#ofbgfqpsobmmfgsqfnjvnsb`hbdfBnfqj`bFgjwjlm^%rvlw8Nfppbdfmffg#wlubovf>!`lnsof{ollhjmdpwbwjlmafojfufpnboofq.nlajofqf`lqgptbmw#wlhjmg#leEjqfel{zlv#bqfpjnjobqpwvgjfgnb{jnvnkfbgjmdqbsjgoz`ojnbwfhjmdglnfnfqdfgbnlvmwpelvmgfgsjlmffqelqnvobgzmbpwzklt#wl#Pvsslqwqfufmvff`lmlnzQfpvowpaqlwkfqplogjfqobqdfoz`boojmd-%rvlw8B``lvmwFgtbqg#pfdnfmwQlafqw#feelqwpSb`jej`ofbqmfgvs#tjwkkfjdkw9tf#kbufBmdfofpmbwjlmp\\pfbq`kbssojfgb`rvjqfnbppjufdqbmwfg9#ebopfwqfbwfgajddfpwafmfejwgqjujmdPwvgjfpnjmjnvnsfqkbspnlqmjmdpfoojmdjp#vpfgqfufqpfubqjbmw#qlof>!njppjmdb`kjfufsqlnlwfpwvgfmwplnflmff{wqfnfqfpwlqfalwwln9fuloufgboo#wkfpjwfnbsfmdojpktbz#wl##Bvdvpwpznalop@lnsbmznbwwfqpnvpj`bobdbjmpwpfqujmd~*+*8\x0E\tsbznfmwwqlvaof`lm`fsw`lnsbqfsbqfmwpsobzfqpqfdjlmpnlmjwlq#$$Wkf#tjmmjmdf{solqfbgbswfgDboofqzsqlgv`fbajojwzfmkbm`f`bqffqp*-#Wkf#`loof`wPfbq`k#bm`jfmwf{jpwfgellwfq#kbmgofqsqjmwfg`lmplofFbpwfqmf{slqwptjmgltp@kbmmfojoofdbomfvwqbopvddfpw\\kfbgfqpjdmjmd-kwno!=pfwwofgtfpwfqm`bvpjmd.tfahjw`objnfgIvpwj`f`kbswfquj`wjnpWklnbp#nlyjoobsqlnjpfsbqwjfpfgjwjlmlvwpjgf9ebopf/kvmgqfgLoznsj`\\avwwlmbvwklqpqfb`kfg`kqlmj`gfnbmgppf`lmgpsqlwf`wbglswfgsqfsbqfmfjwkfqdqfbwozdqfbwfqlufqboojnsqluf`lnnbmgpsf`jbopfbq`k-tlqpkjsevmgjmdwklvdkwkjdkfpwjmpwfbgvwjojwzrvbqwfq@vowvqfwfpwjmd`ofbqozf{slpfgAqltpfqojafqbo~#`bw`kSqlif`wf{bnsofkjgf+*8EolqjgbbmptfqpbooltfgFnsfqlqgfefmpfpfqjlvpeqffglnPfufqbo.avwwlmEvqwkfqlvw#le#\">#mvoowqbjmfgGfmnbqhuljg+3*,boo-ipsqfufmwQfrvfpwPwfskfm\t\tTkfm#lapfquf?,k1=\x0E\tNlgfqm#sqlujgf!#bow>!alqgfqp-\t\tElq#\t\tNbmz#bqwjpwpsltfqfgsfqelqnej`wjlmwzsf#lenfgj`bowj`hfwplsslpfg@lvm`jotjwmfppivpwj`fDflqdf#Afodjvn---?,b=wtjwwfqmlwbaoztbjwjmdtbqebqf#Lwkfq#qbmhjmdskqbpfpnfmwjlmpvqujufp`klobq?,s=\x0E\t#@lvmwqzjdmlqfgolpp#leivpw#bpDflqdjbpwqbmdf?kfbg=?pwlssfg2$^*8\x0E\tjpobmgpmlwbaofalqgfq9ojpw#le`bqqjfg233/333?,k0=\t#pfufqboaf`lnfppfof`w#tfggjmd33-kwnonlmbq`klee#wkfwfb`kfqkjdkoz#ajloldzojef#lelq#fufmqjpf#le%qbrvl8sovplmfkvmwjmd+wklvdkGlvdobpiljmjmd`jq`ofpElq#wkfBm`jfmwUjfwmbnufkj`ofpv`k#bp`qzpwboubovf#>Tjmgltpfmilzfgb#pnboobppvnfg?b#jg>!elqfjdm#Boo#qjklt#wkfGjpsobzqfwjqfgkltfufqkjggfm8abwwofppffhjmd`bajmfwtbp#mlwollh#bw`lmgv`wdfw#wkfIbmvbqzkbssfmpwvqmjmdb9klufqLmojmf#Eqfm`k#ob`hjmdwzsj`bof{wqb`wfmfnjfpfufm#jedfmfqbwgf`jgfgbqf#mlw,pfbq`kafojfep.jnbdf9ol`bwfgpwbwj`-oldjm!=`lmufqwujlofmwfmwfqfgejqpw!=`jq`vjwEjmobmg`kfnjpwpkf#tbp23s{8!=bp#pv`kgjujgfg?,psbm=tjoo#afojmf#leb#dqfbwnzpwfqz,jmgf{-eboojmdgvf#wl#qbjotbz`loofdfnlmpwfqgfp`fmwjw#tjwkmv`ofbqIftjpk#sqlwfpwAqjwjpkeoltfqpsqfgj`wqfelqnpavwwlm#tkl#tbpof`wvqfjmpwbmwpvj`jgfdfmfqj`sfqjlgpnbqhfwpPl`jbo#ejpkjmd`lnajmfdqbskj`tjmmfqp?aq#,=?az#wkf#MbwvqboSqjub`z`llhjfplvw`lnfqfploufPtfgjpkaqjfeozSfqpjbmpl#nv`k@fmwvqzgfsj`wp`lovnmpklvpjmdp`qjswpmf{w#wlafbqjmdnbssjmdqfujpfgiRvfqz+.tjgwk9wjwof!=wllowjsPf`wjlmgfpjdmpWvqhjpkzlvmdfq-nbw`k+~*+*8\t\tavqmjmdlsfqbwfgfdqffpplvq`f>Qj`kbqg`olpfozsobpwj`fmwqjfp?,wq=\x0E\t`lolq9 vo#jg>!slppfppqloojmdskzpj`pebjojmdf{f`vwf`lmwfpwojmh#wlGfebvow?aq#,=\t9#wqvf/`kbqwfqwlvqjpn`obppj`sql`ffgf{sobjm?,k2=\x0E\tlmojmf-<{no#ufkfosjmdgjbnlmgvpf#wkfbjqojmffmg#..=*-bwwq+qfbgfqpklpwjmd eeeeeeqfbojyfUjm`fmwpjdmbop#pq`>!,Sqlgv`wgfpsjwfgjufqpfwfoojmdSvaoj`#kfog#jmIlpfsk#wkfbwqfbeef`wp?pwzof=b#obqdfglfpm$wobwfq/#Fofnfmwebuj`lm`qfbwlqKvmdbqzBjqslqwpff#wkfpl#wkbwNj`kbfoPzpwfnpSqldqbnp/#bmg##tjgwk>f%rvlw8wqbgjmdofew!=\tsfqplmpDlogfm#Beebjqpdqbnnbqelqnjmdgfpwqlzjgfb#le`bpf#lelogfpw#wkjp#jp-pq`#>#`bqwllmqfdjpwq@lnnlmpNvpojnpTkbw#jpjm#nbmznbqhjmdqfufbopJmgffg/frvbooz,pklt\\blvwgllqfp`bsf+Bvpwqjbdfmfwj`pzpwfn/Jm#wkf#pjwwjmdKf#boplJpobmgpB`bgfnz\t\n\n?\"..Gbmjfo#ajmgjmdaol`h!=jnslpfgvwjojyfBaqbkbn+f{`fswxtjgwk9svwwjmd*-kwno+\x7F\x7F#X^8\tGBWBX#)hjw`kfmnlvmwfgb`wvbo#gjbof`wnbjmoz#\\aobmh$jmpwboof{sfqwpje+wzsfJw#bopl%`lsz8#!=Wfqnpalqm#jmLswjlmpfbpwfqmwbohjmd`lm`fqmdbjmfg#lmdljmdivpwjez`qjwj`peb`wlqzjwp#ltmbppbvowjmujwfgobpwjmdkjp#ltmkqfe>!,!#qfo>!gfufols`lm`fqwgjbdqbngloobqp`ovpwfqsksbo`lklo*8~*+*8vpjmd#b=?psbm=ufppfopqfujuboBggqfppbnbwfvqbmgqljgboofdfgjoomfpptbohjmd`fmwfqprvbojeznbw`kfpvmjejfgf{wjm`wGfefmpfgjfg#jm\t\n?\"..#`vpwlnpojmhjmdOjwwof#Allh#lefufmjmdnjm-iptfbqjmdBoo#Qjd8\t~*+*8qbjpjmd#Bopl/#`qv`jbobalvw!=gf`obqf..=\t?p`ejqfel{bp#nv`kbssojfpjmgf{/#p/#avw#wzsf#>#\t\x0E\t?\"..wltbqgpQf`lqgpSqjubwfElqfjdmSqfnjfq`klj`fpUjqwvboqfwvqmp@lnnfmwSltfqfgjmojmf8slufqwz`kbnafqOjujmd#ulovnfpBmwklmzoldjm!#QfobwfgF`lmlnzqfb`kfp`vwwjmddqbujwzojef#jm@kbswfq.pkbgltMlwbaof?,wg=\x0E\t#qfwvqmpwbgjvntjgdfwpubqzjmdwqbufopkfog#aztkl#bqftlqh#jmeb`vowzbmdvobqtkl#kbgbjqslqwwltm#le\t\tPlnf#$`oj`h$`kbqdfphfztlqgjw#tjoo`jwz#le+wkjp*8Bmgqft#vmjrvf#`kf`hfglq#nlqf033s{8#qfwvqm8qpjlm>!sovdjmptjwkjm#kfqpfoePwbwjlmEfgfqboufmwvqfsvaojpkpfmw#wlwfmpjlmb`wqfpp`lnf#wlejmdfqpGvhf#lesflsof/f{soljwtkbw#jpkbqnlmzb#nbilq!9!kwwsjm#kjp#nfmv!=\tnlmwkozleej`fq`lvm`jodbjmjmdfufm#jmPvnnbqzgbwf#leolzbowzejwmfppbmg#tbpfnsfqlqpvsqfnfPf`lmg#kfbqjmdQvppjbmolmdfpwBoafqwbobwfqbopfw#le#pnboo!=-bssfmggl#tjwkefgfqboabmh#leafmfbwkGfpsjwf@bsjwbodqlvmgp*/#bmg#sfq`fmwjw#eqln`olpjmd`lmwbjmJmpwfbgejewffmbp#tfoo-zbkll-qfpslmgejdkwfqlap`vqfqfeof`wlqdbmj`>#Nbwk-fgjwjmdlmojmf#sbggjmdb#tkloflmfqqlqzfbq#lefmg#le#abqqjfqtkfm#jwkfbgfq#klnf#leqfpvnfgqfmbnfgpwqlmd=kfbwjmdqfwbjmp`olvgeqtbz#le#Nbq`k#2hmltjmdjm#sbqwAfwtffmofpplmp`olpfpwujqwvboojmhp!=`qlppfgFMG#..=ebnlvp#btbqgfgOj`fmpfKfbowk#ebjqoz#tfbowkznjmjnboBeqj`bm`lnsfwfobafo!=pjmdjmdebqnfqpAqbpjo*gjp`vppqfsob`fDqfdlqzelmw#`lsvqpvfgbssfbqpnbhf#vsqlvmgfgalwk#leaol`hfgpbt#wkfleej`fp`lolvqpje+gl`vtkfm#kffmelq`fsvpk+evBvdvpw#VWE.;!=Ebmwbpzjm#nlpwjmivqfgVpvboozebqnjmd`olpvqflaif`w#gfefm`fvpf#le#Nfgj`bo?algz=\tfujgfmwaf#vpfghfz@lgfpj{wffmJpobnj` 333333fmwjqf#tjgfoz#b`wjuf#+wzsflelmf#`bm`lolq#>psfbhfqf{wfmgpSkzpj`pwfqqbjm?walgz=evmfqboujftjmdnjggof#`qj`hfwsqlskfwpkjewfggl`wlqpQvppfoo#wbqdfw`lnsb`wbodfaqbpl`jbo.avoh#lenbm#bmg?,wg=\t#kf#ofew*-ubo+*ebopf*8oldj`boabmhjmdklnf#wlmbnjmd#Bqjylmb`qfgjwp*8\t~*8\telvmgfqjm#wvqm@loojmpafelqf#Avw#wkf`kbqdfgWjwof!=@bswbjmpsfoofgdlggfppWbd#..=Bggjmd9avw#tbpQf`fmw#sbwjfmwab`h#jm>ebopf%Ojm`lomtf#hmlt@lvmwfqIvgbjpnp`qjsw#bowfqfg$^*8\t##kbp#wkfvm`ofbqFufmw$/alwk#jmmlw#boo\t\t?\"..#sob`jmdkbqg#wl#`fmwfqplqw#le`ojfmwppwqffwpAfqmbqgbppfqwpwfmg#wlebmwbpzgltm#jmkbqalvqEqffglniftfoqz,balvw--pfbq`kofdfmgpjp#nbgfnlgfqm#lmoz#lmlmoz#wljnbdf!#ojmfbq#sbjmwfqbmg#mlwqbqfoz#b`qlmzngfojufqpklqwfq33%bns8bp#nbmztjgwk>!,)#?\"X@wjwof#>le#wkf#oltfpw#sj`hfg#fp`bsfgvpfp#lesflsofp#Svaoj`Nbwwkftwb`wj`pgbnbdfgtbz#elqobtp#lefbpz#wl#tjmgltpwqlmd##pjnsof~`bw`k+pfufmwkjmelal{tfmw#wlsbjmwfg`jwjyfmJ#glm$wqfwqfbw-#Plnf#tt-!*8\talnajmdnbjowl9nbgf#jm-#Nbmz#`bqqjfp\x7F\x7Fx~8tjtlqh#lepzmlmzngfefbwpebulqfglswj`bosbdfWqbvmofpp#pfmgjmdofew!=?`lnP`lqBoo#wkfiRvfqz-wlvqjpw@obppj`ebopf!#Tjokfonpvavqapdfmvjmfajpklsp-psojw+dolabo#elooltpalgz#lemlnjmbo@lmwb`wpf`vobqofew#wl`kjfeoz.kjggfm.abmmfq?,oj=\t\t-#Tkfm#jm#alwkgjpnjppF{solqfbotbzp#ujb#wkfpsb/]lotfoebqfqvojmd#bqqbmdf`bswbjmkjp#plmqvof#lekf#wllhjwpfoe/>3%bns8+`boofgpbnsofpwl#nbhf`ln,sbdNbqwjm#Hfmmfgzb``fswpevoo#lekbmgofgAfpjgfp,,..=?,baof#wlwbqdfwpfppfm`fkjn#wl#jwp#az#`lnnlm-njmfqbowl#wbhftbzp#wlp-lqd,obgujpfgsfmbowzpjnsof9je#wkfzOfwwfqpb#pklqwKfqafqwpwqjhfp#dqlvsp-ofmdwkeojdkwplufqobspoltoz#ofppfq#pl`jbo#?,s=\t\n\njw#jmwlqbmhfg#qbwf#levo=\x0E\t##bwwfnswsbjq#lenbhf#jwHlmwbhwBmwlmjlkbujmd#qbwjmdp#b`wjufpwqfbnpwqbssfg!*-`pp+klpwjofofbg#wlojwwof#dqlvsp/Sj`wvqf..=\x0E\t\x0E\t#qltp>!#laif`wjmufqpf?ellwfq@vpwlnU=?_,p`qploujmd@kbnafqpobufqztlvmgfgtkfqfbp\">#$vmgelq#boosbqwoz#.qjdkw9Bqbajbmab`hfg#`fmwvqzvmjw#lenlajof.Fvqlsf/jp#klnfqjph#legfpjqfg@ojmwlm`lpw#lebdf#le#af`lnf#mlmf#les%rvlw8Njggof#fbg$*X3@qjwj`ppwvgjlp=%`lsz8dqlvs!=bppfnaonbhjmd#sqfppfgtjgdfw-sp9!#<#qfavjowaz#plnfElqnfq#fgjwlqpgfobzfg@bmlmj`kbg#wkfsvpkjmd`obpp>!avw#bqfsbqwjboAbazolmalwwln#`bqqjfq@lnnbmgjwp#vpfBp#tjwk`lvqpfpb#wkjqggfmlwfpbopl#jmKlvpwlm13s{8!=b``vpfgglvaof#dlbo#leEbnlvp#*-ajmg+sqjfpwp#Lmojmfjm#Ivozpw#(#!d`lmpvowgf`jnbokfosevoqfujufgjp#ufqzq$($jswolpjmd#efnbofpjp#boplpwqjmdpgbzp#lebqqjuboevwvqf#?laif`welq`jmdPwqjmd+!#,=\t\n\nkfqf#jpfm`lgfg-##Wkf#aboollmglmf#az,`lnnlmad`lolqobt#le#Jmgjbmbbuljgfgavw#wkf1s{#0s{irvfqz-bewfq#bsloj`z-nfm#bmgellwfq.>#wqvf8elq#vpfp`qffm-Jmgjbm#jnbdf#>ebnjoz/kwws9,,#%maps8gqjufqpfwfqmbopbnf#bpmlwj`fgujftfqp~*+*8\t#jp#nlqfpfbplmpelqnfq#wkf#mftjp#ivpw`lmpfmw#Pfbq`ktbp#wkftkz#wkfpkjssfgaq=?aq=tjgwk9#kfjdkw>nbgf#le`vjpjmfjp#wkbwb#ufqz#Bgnjqbo#ej{fg8mlqnbo#NjppjlmSqfpp/#lmwbqjl`kbqpfwwqz#wl#jmubgfg>!wqvf!psb`jmdjp#nlpwb#nlqf#wlwboozeboo#le~*8\x0E\t##jnnfmpfwjnf#jmpfw#lvwpbwjpezwl#ejmggltm#wlolw#le#Sobzfqpjm#Ivmfrvbmwvnmlw#wkfwjnf#wlgjpwbmwEjmmjpkpq`#>#+pjmdof#kfos#leDfqnbm#obt#bmgobafofgelqfpwp`llhjmdpsb`f!=kfbgfq.tfoo#bpPwbmofzaqjgdfp,dolabo@qlbwjb#Balvw#X3^8\t##jw/#bmgdqlvsfgafjmd#b*xwkqltkf#nbgfojdkwfqfwkj`boEEEEEE!alwwln!ojhf#b#fnsolzpojuf#jmbp#pffmsqjmwfqnlpw#leva.ojmhqfif`wpbmg#vpfjnbdf!=pv``ffgeffgjmdMv`ofbqjmelqnbwl#kfosTlnfm$pMfjwkfqNf{j`bmsqlwfjm?wbaof#az#nbmzkfbowkzobtpvjwgfujpfg-svpk+xpfoofqppjnsoz#Wkqlvdk-`llhjf#Jnbdf+logfq!=vp-ip!=#Pjm`f#vmjufqpobqdfq#lsfm#wl\"..#fmgojfp#jm$^*8\x0E\t##nbqhfwtkl#jp#+!GLN@lnbmbdfglmf#elqwzsfle#Hjmdglnsqlejwpsqlslpfwl#pklt`fmwfq8nbgf#jwgqfppfgtfqf#jmnj{wvqfsqf`jpfbqjpjmdpq`#>#$nbhf#b#pf`vqfgAbswjpwulwjmd#\t\n\nubq#Nbq`k#1dqft#vs@ojnbwf-qfnlufphjoofgtbz#wkf?,kfbg=eb`f#leb`wjmd#qjdkw!=wl#tlqhqfgv`fpkbp#kbgfqf`wfgpklt+*8b`wjlm>allh#lebm#bqfb>>#!kww?kfbgfq\t?kwno=`lmelqneb`jmd#`llhjf-qfoz#lmklpwfg#-`vpwlnkf#tfmwavw#elqpsqfbg#Ebnjoz#b#nfbmplvw#wkfelqvnp-ellwbdf!=Nlajo@ofnfmwp!#jg>!bp#kjdkjmwfmpf..=?\"..efnbof#jp#pffmjnsojfgpfw#wkfb#pwbwfbmg#kjpebpwfpwafpjgfpavwwlm\\alvmgfg!=?jnd#Jmelal{fufmwp/b#zlvmdbmg#bqfMbwjuf#`kfbsfqWjnflvwbmg#kbpfmdjmfptlm#wkf+nlpwozqjdkw9#ejmg#b#.alwwlnSqjm`f#bqfb#lenlqf#lepfbq`k\\mbwvqf/ofdboozsfqjlg/obmg#lelq#tjwkjmgv`fgsqlujmdnjppjofol`boozBdbjmpwwkf#tbzh%rvlw8s{8!=\x0E\tsvpkfg#babmglmmvnfqbo@fqwbjmJm#wkjpnlqf#jmlq#plnfmbnf#jpbmg/#jm`qltmfgJPAM#3.`qfbwfpL`wlafqnbz#mlw`fmwfq#obwf#jmGfefm`ffmb`wfgtjpk#wlaqlbgoz`llojmdlmolbg>jw-#Wkfqf`lufqNfnafqpkfjdkw#bppvnfp?kwno=\tsflsof-jm#lmf#>tjmgltellwfq\\b#dllg#qfhobnblwkfqp/wl#wkjp\\`llhjfsbmfo!=Olmglm/gfejmfp`qvpkfgabswjpn`lbpwbopwbwvp#wjwof!#nluf#wlolpw#jmafwwfq#jnsojfpqjuboqzpfqufqp#PzpwfnSfqkbspfp#bmg#`lmwfmgeoltjmdobpwfg#qjpf#jmDfmfpjpujft#leqjpjmd#pffn#wlavw#jm#ab`hjmdkf#tjoodjufm#bdjujmd#`jwjfp-eolt#le#Obwfq#boo#avwKjdktbzlmoz#azpjdm#lekf#glfpgjeefqpabwwfqz%bns8obpjmdofpwkqfbwpjmwfdfqwbhf#lmqfevpfg`boofg#>VP%bnsPff#wkfmbwjufpaz#wkjppzpwfn-kfbg#le9klufq/ofpajbmpvqmbnfbmg#boo`lnnlm,kfbgfq\\\\sbqbnpKbqubqg,sj{fo-qfnlubopl#olmdqlof#leiljmwozphzp`qbVmj`lgfaq#,=\x0E\tBwobmwbmv`ofvp@lvmwz/svqfoz#`lvmw!=fbpjoz#avjog#blm`oj`hb#djufmsljmwfqk%rvlw8fufmwp#fopf#x\tgjwjlmpmlt#wkf/#tjwk#nbm#tkllqd,Tfalmf#bmg`buboqzKf#gjfgpfbwwof33/333#xtjmgltkbuf#wlje+tjmgbmg#jwpplofoz#n%rvlw8qfmftfgGfwqljwbnlmdpwfjwkfq#wkfn#jmPfmbwlqVp?,b=?Hjmd#leEqbm`jp.sqlgv`kf#vpfgbqw#bmgkjn#bmgvpfg#azp`lqjmdbw#klnfwl#kbufqfobwfpjajojwzeb`wjlmAveebolojmh!=?tkbw#kfeqff#wl@jwz#le`lnf#jmpf`wlqp`lvmwfglmf#gbzmfqulvpprvbqf#~8je+dljm#tkbwjnd!#bojp#lmozpfbq`k,wvfpgbzollpfozPlolnlmpf{vbo#.#?b#kqnfgjvn!GL#MLW#Eqbm`f/tjwk#b#tbq#bmgpf`lmg#wbhf#b#=\x0E\t\x0E\t\x0E\tnbqhfw-kjdktbzglmf#jm`wjujwz!obpw!=laojdfgqjpf#wl!vmgfejnbgf#wl#Fbqoz#sqbjpfgjm#jwp#elq#kjpbwkofwfIvsjwfqZbkll\"#wfqnfg#pl#nbmzqfbooz#p-#Wkf#b#tlnbmgjqf`w#qjdkw!#aj`z`ofb`jmd>!gbz#bmgpwbwjmdQbwkfq/kjdkfq#Leej`f#bqf#mltwjnfp/#tkfm#b#sbz#elqlm#wkjp.ojmh!=8alqgfqbqlvmg#bmmvbo#wkf#Mftsvw#wkf-`ln!#wbhjm#wlb#aqjfe+jm#wkfdqlvsp-8#tjgwkfmyznfppjnsof#jm#obwfxqfwvqmwkfqbszb#sljmwabmmjmdjmhp!=\t+*8!#qfb#sob`f_v330@bbalvw#bwq=\x0E\t\n\n``lvmw#djufp#b?P@QJSWQbjotbzwkfnfp,wlloal{AzJg+!{kvnbmp/tbw`kfpjm#plnf#je#+tj`lnjmd#elqnbwp#Vmgfq#avw#kbpkbmgfg#nbgf#azwkbm#jmefbq#legfmlwfg,jeqbnfofew#jmulowbdfjm#fb`kb%rvlw8abpf#leJm#nbmzvmgfqdlqfdjnfpb`wjlm#?,s=\x0E\t?vpwlnUb8%dw8?,jnslqwplq#wkbwnlpwoz#%bns8qf#pjyf>!?,b=?,kb#`obppsbppjufKlpw#>#TkfwkfqefqwjofUbqjlvp>X^8+ev`bnfqbp,=?,wg=b`wp#bpJm#plnf=\x0E\t\x0E\t?\"lqdbmjp#?aq#,=Afjijmd`bwbo/Lgfvwp`kfvqlsfvfvphbqbdbfjodfpufmphbfpsb/]bnfmpbifvpvbqjlwqbabiln/E{j`ls/Mdjmbpjfnsqfpjpwfnbl`wvaqfgvqbmwfb/]bgjqfnsqfpbnlnfmwlmvfpwqlsqjnfqbwqbu/Epdqb`jbpmvfpwqbsql`fplfpwbglp`bojgbgsfqplmbm/Vnfqlb`vfqgln/Vpj`bnjfnaqllefqwbpbodvmlpsb/Apfpfifnsolgfqf`klbgfn/Mpsqjubglbdqfdbqfmob`fpslpjaofklwfofppfujoobsqjnfql/Vowjnlfufmwlpbq`kjul`vowvqbnvifqfpfmwqbgbbmvm`jlfnabqdlnfq`bgldqbmgfpfpwvgjlnfilqfpefaqfqlgjpf/]lwvqjpnl`/_gjdlslqwbgbfpsb`jlebnjojbbmwlmjlsfqnjwfdvbqgbqbodvmbpsqf`jlpbodvjfmpfmwjglujpjwbpw/Awvol`lml`fqpfdvmgl`lmpfileqbm`jbnjmvwlppfdvmgbwfmfnlpfef`wlpn/Mobdbpfpj/_mqfujpwbdqbmbgb`lnsqbqjmdqfpldbq`/Abb``j/_mf`vbglqrvjfmfpjm`ovplgfafq/Mnbwfqjbklnaqfpnvfpwqbslgq/Abnb/]bmb/Vowjnbfpwbnlplej`jbowbnajfmmjmd/Vmpbovglpslgfnlpnfilqbqslpjwjlmavpjmfppklnfsbdfpf`vqjwzobmdvbdfpwbmgbqg`bnsbjdmefbwvqfp`bwfdlqzf{wfqmbo`kjogqfmqfpfqufgqfpfbq`kf{`kbmdfebulqjwfwfnsobwfnjojwbqzjmgvpwqzpfquj`fpnbwfqjbosqlgv`wpy.jmgf{9`lnnfmwpplewtbqf`lnsofwf`bofmgbqsobwelqnbqwj`ofpqfrvjqfgnlufnfmwrvfpwjlmavjogjmdslojwj`pslppjaofqfojdjlmskzpj`boeffgab`hqfdjpwfqsj`wvqfpgjpbaofgsqlwl`lobvgjfm`fpfwwjmdpb`wjujwzfofnfmwpofbqmjmdbmzwkjmdbapwqb`wsqldqfpplufqujftnbdbyjmff`lmlnj`wqbjmjmdsqfppvqfubqjlvp#?pwqlmd=sqlsfqwzpklssjmdwldfwkfqbgubm`fgafkbujlqgltmolbgefbwvqfgellwaboopfof`wfgObmdvbdfgjpwbm`fqfnfnafqwqb`hjmdsbpptlqgnlgjejfgpwvgfmwpgjqf`wozejdkwjmdmlqwkfqmgbwbabpfefpwjuboaqfbhjmdol`bwjlmjmwfqmfwgqlsgltmsqb`wj`ffujgfm`fevm`wjlmnbqqjbdfqfpslmpfsqlaofnpmfdbwjufsqldqbnpbmbozpjpqfofbpfgabmmfq!=svq`kbpfsloj`jfpqfdjlmbo`qfbwjufbqdvnfmwallhnbqhqfefqqfq`kfnj`bogjujpjlm`booab`hpfsbqbwfsqlif`wp`lmeoj`wkbqgtbqfjmwfqfpwgfojufqznlvmwbjmlawbjmfg>#ebopf8elq+ubq#b``fswfg`bsb`jwz`lnsvwfqjgfmwjwzbjq`qbewfnsolzfgsqlslpfgglnfpwj`jm`ovgfpsqlujgfgklpsjwboufqwj`bo`loobspfbssqlb`ksbqwmfqpoldl!=?bgbvdkwfqbvwklq!#`vowvqboebnjojfp,jnbdfp,bppfnaozsltfqevowfb`kjmdejmjpkfggjpwqj`w`qjwj`bo`dj.ajm,svqslpfpqfrvjqfpfof`wjlmaf`lnjmdsqlujgfpb`bgfnj`f{fq`jpfb`wvbooznfgj`jmf`lmpwbmwb``jgfmwNbdbyjmfgl`vnfmwpwbqwjmdalwwln!=lapfqufg9#%rvlw8f{wfmgfgsqfujlvpPlewtbqf`vpwlnfqgf`jpjlmpwqfmdwkgfwbjofgpojdkwozsobmmjmdwf{wbqfb`vqqfm`zfufqzlmfpwqbjdkwwqbmpefqslpjwjufsqlgv`fgkfqjwbdfpkjssjmdbaplovwfqf`fjufgqfofubmwavwwlm!#ujlofm`fbmztkfqfafmfejwpobvm`kfgqf`fmwozboojbm`felooltfgnvowjsofavoofwjmjm`ovgfgl``vqqfgjmwfqmbo'+wkjp*-qfsvaoj`=?wq=?wg`lmdqfppqf`lqgfgvowjnbwfplovwjlm?vo#jg>!gjp`lufqKlnf?,b=tfapjwfpmfwtlqhpbowklvdkfmwjqfoznfnlqjbonfppbdfp`lmwjmvfb`wjuf!=plnftkbwuj`wlqjbTfpwfqm##wjwof>!Ol`bwjlm`lmwqb`wujpjwlqpGltmolbgtjwklvw#qjdkw!=\tnfbpvqfptjgwk#>#ubqjbaofjmuloufgujqdjmjbmlqnboozkbssfmfgb``lvmwppwbmgjmdmbwjlmboQfdjpwfqsqfsbqfg`lmwqlopb``vqbwfajqwkgbzpwqbwfdzleej`jbodqbskj`p`qjnjmboslppjaoz`lmpvnfqSfqplmbopsfbhjmdubojgbwfb`kjfufg-isd!#,=nb`kjmfp?,k1=\t##hfztlqgpeqjfmgozaqlwkfqp`lnajmfglqjdjmbo`lnslpfgf{sf`wfgbgfrvbwfsbhjpwbmeloolt!#ubovbaof?,obafo=qfobwjufaqjmdjmdjm`qfbpfdlufqmlqsovdjmp,Ojpw#le#Kfbgfq!=!#mbnf>!#+%rvlw8dqbgvbwf?,kfbg=\t`lnnfq`fnbobzpjbgjqf`wlqnbjmwbjm8kfjdkw9p`kfgvof`kbmdjmdab`h#wl#`bwkloj`sbwwfqmp`lolq9# dqfbwfpwpvssojfpqfojbaof?,vo=\t\n\n?pfof`w#`jwjyfmp`olwkjmdtbw`kjmd?oj#jg>!psf`jej``bqqzjmdpfmwfm`f?`fmwfq=`lmwqbpwwkjmhjmd`bw`k+f*plvwkfqmNj`kbfo#nfq`kbmw`bqlvpfosbggjmd9jmwfqjlq-psojw+!ojybwjlmL`wlafq#*xqfwvqmjnsqlufg..%dw8\t\t`lufqbdf`kbjqnbm-smd!#,=pvaif`wpQj`kbqg#tkbwfufqsqlabaozqf`lufqzabpfabooivgdnfmw`lmmf`w--`pp!#,=#tfapjwfqfslqwfggfebvow!,=?,b=\x0E\tfof`wqj`p`lwobmg`qfbwjlmrvbmwjwz-#JPAM#3gjg#mlw#jmpwbm`f.pfbq`k.!#obmd>!psfbhfqp@lnsvwfq`lmwbjmpbq`kjufpnjmjpwfqqfb`wjlmgjp`lvmwJwbojbml`qjwfqjbpwqlmdoz9#$kwws9$p`qjsw$`lufqjmdleefqjmdbssfbqfgAqjwjpk#jgfmwjezEb`fallhmvnfqlvpufkj`ofp`lm`fqmpBnfqj`bmkbmgojmdgju#jg>!Tjoojbn#sqlujgfq\\`lmwfmwb``vqb`zpf`wjlm#bmgfqplmeof{jaof@bwfdlqzobtqfm`f?p`qjsw=obzlvw>!bssqlufg#nb{jnvnkfbgfq!=?,wbaof=Pfquj`fpkbnjowlm`vqqfmw#`bmbgjbm`kbmmfop,wkfnfp,,bqwj`oflswjlmboslqwvdboubovf>!!jmwfqubotjqfofppfmwjwofgbdfm`jfpPfbq`k!#nfbpvqfgwklvpbmgpsfmgjmd%kfoojs8mft#Gbwf!#pjyf>!sbdfMbnfnjggof!#!#,=?,b=kjggfm!=pfrvfm`fsfqplmbolufqeoltlsjmjlmpjoojmljpojmhp!=\t\n?wjwof=ufqpjlmppbwvqgbzwfqnjmbojwfnsqlsfmdjmffqpf`wjlmpgfpjdmfqsqlslpbo>!ebopf!Fpsb/]loqfofbpfppvanjw!#fq%rvlw8bggjwjlmpznswlnplqjfmwfgqfplvq`fqjdkw!=?sofbpvqfpwbwjlmpkjpwlqz-ofbujmd##alqgfq>`lmwfmwp`fmwfq!=-\t\tPlnf#gjqf`wfgpvjwbaofavodbqjb-pklt+*8gfpjdmfgDfmfqbo#`lm`fswpF{bnsofptjoojbnpLqjdjmbo!=?psbm=pfbq`k!=lsfqbwlqqfrvfpwpb#%rvlw8booltjmdGl`vnfmwqfujpjlm-#\t\tWkf#zlvqpfoe@lmwb`w#nj`kjdbmFmdojpk#`lovnajbsqjlqjwzsqjmwjmdgqjmhjmdeb`jojwzqfwvqmfg@lmwfmw#leej`fqpQvppjbm#dfmfqbwf.;;6:.2!jmgj`bwfebnjojbq#rvbojwznbqdjm93#`lmwfmwujftslqw`lmwb`wp.wjwof!=slqwbaof-ofmdwk#fojdjaofjmuloufpbwobmwj`lmolbg>!gfebvow-pvssojfgsbznfmwpdolppbqz\t\tBewfq#dvjgbm`f?,wg=?wgfm`lgjmdnjggof!=`bnf#wl#gjpsobzpp`lwwjpkilmbwkbmnbilqjwztjgdfwp-`ojmj`bowkbjobmgwfb`kfqp?kfbg=\t\nbeef`wfgpvsslqwpsljmwfq8wlPwqjmd?,pnboo=lhobklnbtjoo#af#jmufpwlq3!#bow>!klojgbzpQfplvq`foj`fmpfg#+tkj`k#-#Bewfq#`lmpjgfqujpjwjmdf{solqfqsqjnbqz#pfbq`k!#bmgqljg!rvj`hoz#nffwjmdpfpwjnbwf8qfwvqm#8`lolq9 #kfjdkw>bssqlubo/#%rvlw8#`kf`hfg-njm-ip!nbdmfwj`=?,b=?,kelqf`bpw-#Tkjof#wkvqpgbzgufqwjpf%fb`vwf8kbp@obppfubovbwflqgfqjmdf{jpwjmdsbwjfmwp#Lmojmf#`lolqbglLswjlmp!`bnsafoo?\"..#fmg?,psbm=??aq#,=\x0E\t\\slsvsp\x7Fp`jfm`fp/%rvlw8#rvbojwz#Tjmgltp#bppjdmfgkfjdkw9#?a#`obppof%rvlw8#ubovf>!#@lnsbmzf{bnsofp?jeqbnf#afojfufpsqfpfmwpnbqpkboosbqw#le#sqlsfqoz*-\t\tWkf#wb{lmlnznv`k#le#?,psbm=\t!#gbwb.pqwvdv/Fpp`qlooWl#sqlif`w?kfbg=\x0E\tbwwlqmfzfnskbpjppslmplqpebm`zal{tlqog$p#tjogojef`kf`hfg>pfppjlmpsqldqbnns{8elmw.#Sqlif`wilvqmbopafojfufgub`bwjlmwklnsplmojdkwjmdbmg#wkf#psf`jbo#alqgfq>3`kf`hjmd?,walgz=?avwwlm#@lnsofwf`ofbqej{\t?kfbg=\tbqwj`of#?pf`wjlmejmgjmdpqlof#jm#slsvobq##L`wlafqtfapjwf#f{slpvqfvpfg#wl##`kbmdfplsfqbwfg`oj`hjmdfmwfqjmd`lnnbmgpjmelqnfg#mvnafqp##?,gju=`qfbwjmdlmPvanjwnbqzobmg`loofdfpbmbozwj`ojpwjmdp`lmwb`w-olddfgJmbgujplqzpjaojmdp`lmwfmw!p%rvlw8*p-#Wkjp#sb`hbdfp`kf`hal{pvddfpwpsqfdmbmwwlnlqqltpsb`jmd>j`lm-smdibsbmfpf`lgfabpfavwwlm!=dbnaojmdpv`k#bp#/#tkjof#?,psbm=#njpplvqjpslqwjmdwls92s{#-?,psbm=wfmpjlmptjgwk>!1obyzolbgmlufnafqvpfg#jm#kfjdkw>!`qjsw!=\t%maps8?,?wq=?wg#kfjdkw91,sqlgv`w`lvmwqz#jm`ovgf#ellwfq!#%ow8\"..#wjwof!=?,irvfqz-?,elqn=\t+\x0BBl\bQ\x7F*+\x0BUm\x05Gx*kqubwphjjwbojbmlqln/Nm(ow/Pqh/Kf4K4]4C5dwbnaj/Emmlwj`jbpnfmpbifpsfqplmbpgfqf`klpmb`jlmbopfquj`jl`lmwb`wlvpvbqjlpsqldqbnbdlajfqmlfnsqfpbpbmvm`jlpubofm`jb`lolnajbgfpsv/Epgfslqwfpsqlzf`wlsqlgv`wls/Vaoj`lmlplwqlpkjpwlqjbsqfpfmwfnjoolmfpnfgjbmwfsqfdvmwbbmwfqjlqqf`vqplpsqlaofnbpbmwjbdlmvfpwqlplsjmj/_mjnsqjnjqnjfmwqbpbn/Eqj`bufmgfglqpl`jfgbgqfpsf`wlqfbojybqqfdjpwqlsbobaqbpjmwfq/Epfmwlm`fpfpsf`jbonjfnaqlpqfbojgbg`/_qglabybqbdlybs/Mdjmbppl`jbofpaolrvfbqdfpwj/_mborvjofqpjpwfnbp`jfm`jbp`lnsofwlufqpj/_m`lnsofwbfpwvgjlps/Vaoj`blaifwjulboj`bmwfavp`bglq`bmwjgbgfmwqbgbpb``jlmfpbq`kjulppvsfqjlqnbzlq/Abbofnbmjbevm`j/_m/Vowjnlpkb`jfmglbrvfoolpfgj`j/_mefqmbmglbnajfmwfeb`fallhmvfpwqbp`ojfmwfpsql`fplpabpwbmwfsqfpfmwbqfslqwbq`lmdqfplsvaoj`bq`lnfq`jl`lmwqbwli/_ufmfpgjpwqjwlw/E`mj`b`lmivmwlfmfqd/Abwqbabibqbpwvqjbpqf`jfmwfvwjojybqalofw/Ampboubglq`lqqf`wbwqbabilpsqjnfqlpmfdl`jlpojafqwbggfwboofpsbmwboobsq/_{jnlbonfq/Abbmjnbofprvj/Emfp`lqby/_mpf``j/_mavp`bmglls`jlmfpf{wfqjlq`lm`fswlwlgbu/Abdbofq/Abfp`qjajqnfgj`jmboj`fm`jb`lmpvowbbpsf`wlp`q/Awj`bg/_obqfpivpwj`jbgfafq/Mmsfq/Alglmf`fpjwbnbmwfmfqsfrvf/]lqf`jajgbwqjavmbowfmfqjef`bm`j/_m`bmbqjbpgfp`bqdbgjufqplpnboolq`bqfrvjfqfw/E`mj`lgfafq/Abujujfmgbejmbmybpbgfobmwfevm`jlmb`lmpfilpgje/A`jo`jvgbgfpbmwjdvbpbubmybgbw/Eqnjmlvmjgbgfpp/Mm`kfy`bnsb/]bplewlmj`qfujpwbp`lmwjfmfpf`wlqfpnlnfmwlpeb`vowbg`q/Egjwlgjufqpbppvsvfpwleb`wlqfppfdvmglpsfrvf/]b<_!?,pfof`w=Bvpwqbojb!#`obpp>!pjwvbwjlmbvwklqjwzelooltjmdsqjnbqjozlsfqbwjlm`kboofmdfgfufolsfgbmlmznlvpevm`wjlm#evm`wjlmp`lnsbmjfppwqv`wvqfbdqffnfmw!#wjwof>!slwfmwjbofgv`bwjlmbqdvnfmwppf`lmgbqz`lszqjdkwobmdvbdfpf{`ovpjuf`lmgjwjlm?,elqn=\x0E\tpwbwfnfmwbwwfmwjlmAjldqbskz~#fopf#x\tplovwjlmptkfm#wkf#Bmbozwj`pwfnsobwfpgbmdfqlvppbwfoojwfgl`vnfmwpsvaojpkfqjnslqwbmwsqlwlwzsfjmeovfm`f%qbrvl8?,feef`wjufdfmfqboozwqbmpelqnafbvwjevowqbmpslqwlqdbmjyfgsvaojpkfgsqlnjmfmwvmwjo#wkfwkvnambjoMbwjlmbo#-el`vp+*8lufq#wkf#njdqbwjlmbmmlvm`fgellwfq!=\tf{`fswjlmofpp#wkbmf{sfmpjufelqnbwjlmeqbnftlqhwfqqjwlqzmgj`bwjlm`vqqfmwoz`obppMbnf`qjwj`jpnwqbgjwjlmfopftkfqfBof{bmgfqbssljmwfgnbwfqjbopaqlbg`bpwnfmwjlmfgbeejojbwf?,lswjlm=wqfbwnfmwgjeefqfmw,gfebvow-Sqfpjgfmwlm`oj`h>!ajldqbskzlwkfqtjpfsfqnbmfmwEqbm/KbjpKlooztllgf{sbmpjlmpwbmgbqgp?,pwzof=\tqfgv`wjlmGf`fnafq#sqfefqqfg@bnaqjgdflsslmfmwpAvpjmfpp#`lmevpjlm=\t?wjwof=sqfpfmwfgf{sobjmfgglfp#mlw#tlqogtjgfjmwfqeb`fslpjwjlmpmftpsbsfq?,wbaof=\tnlvmwbjmpojhf#wkf#fppfmwjboejmbm`jbopfof`wjlmb`wjlm>!,babmglmfgFgv`bwjlmsbqpfJmw+pwbajojwzvmbaof#wl?,wjwof=\tqfobwjlmpMlwf#wkbwfeej`jfmwsfqelqnfgwtl#zfbqpPjm`f#wkfwkfqfelqftqbssfq!=bowfqmbwfjm`qfbpfgAbwwof#lesfq`fjufgwqzjmd#wlmf`fppbqzslqwqbzfgfof`wjlmpFojybafwk?,jeqbnf=gjp`lufqzjmpvqbm`fp-ofmdwk8ofdfmgbqzDfldqbskz`bmgjgbwf`lqslqbwfplnfwjnfppfquj`fp-jmkfqjwfg?,pwqlmd=@lnnvmjwzqfojdjlvpol`bwjlmp@lnnjwwffavjogjmdpwkf#tlqogml#olmdfqafdjmmjmdqfefqfm`f`bmmlw#afeqfrvfm`zwzsj`boozjmwl#wkf#qfobwjuf8qf`lqgjmdsqfpjgfmwjmjwjboozwf`kmjrvfwkf#lwkfqjw#`bm#aff{jpwfm`fvmgfqojmfwkjp#wjnfwfofsklmfjwfnp`lsfsqb`wj`fpbgubmwbdf*8qfwvqm#Elq#lwkfqsqlujgjmdgfnl`qb`zalwk#wkf#f{wfmpjufpveefqjmdpvsslqwfg`lnsvwfqp#evm`wjlmsqb`wj`bopbjg#wkbwjw#nbz#afFmdojpk?,eqln#wkf#p`kfgvofggltmolbgp?,obafo=\tpvpsf`wfgnbqdjm9#3psjqjwvbo?,kfbg=\t\tnj`qlplewdqbgvboozgjp`vppfgkf#af`bnff{f`vwjufirvfqz-ipklvpfklog`lmejqnfgsvq`kbpfgojwfqboozgfpwqlzfgvs#wl#wkfubqjbwjlmqfnbjmjmdjw#jp#mlw`fmwvqjfpIbsbmfpf#bnlmd#wkf`lnsofwfgbodlqjwknjmwfqfpwpqfafoojlmvmgfejmfgfm`lvqbdfqfpjybaofjmuloujmdpfmpjwjufvmjufqpbosqlujpjlm+bowklvdkefbwvqjmd`lmgv`wfg*/#tkj`k#`lmwjmvfg.kfbgfq!=Efaqvbqz#mvnfqlvp#lufqeolt9`lnslmfmweqbdnfmwpf{`foofmw`lopsbm>!wf`kmj`bomfbq#wkf#Bgubm`fg#plvq`f#lef{sqfppfgKlmd#Hlmd#Eb`fallhnvowjsof#nf`kbmjpnfofubwjlmleefmpjuf?,elqn=\t\npslmplqfggl`vnfmw-lq#%rvlw8wkfqf#bqfwklpf#tklnlufnfmwpsql`fppfpgjeej`vowpvanjwwfgqf`lnnfmg`lmujm`fgsqlnlwjmd!#tjgwk>!-qfsob`f+`obppj`bo`lbojwjlmkjp#ejqpwgf`jpjlmpbppjpwbmwjmgj`bwfgfulovwjlm.tqbssfq!fmlvdk#wlbolmd#wkfgfojufqfg..=\x0E\t?\"..Bnfqj`bm#sqlwf`wfgMlufnafq#?,pwzof=?evqmjwvqfJmwfqmfw##lmaovq>!pvpsfmgfgqf`jsjfmwabpfg#lm#Nlqflufq/balojpkfg`loof`wfgtfqf#nbgffnlwjlmbofnfqdfm`zmbqqbwjufbgul`bwfps{8alqgfq`lnnjwwfggjq>!owq!fnsolzffpqfpfbq`k-#pfof`wfgpv``fpplq`vpwlnfqpgjpsobzfgPfswfnafqbgg@obpp+Eb`fallh#pvddfpwfgbmg#obwfqlsfqbwjmdfobalqbwfPlnfwjnfpJmpwjwvwf`fqwbjmozjmpwboofgelooltfqpIfqvpbofnwkfz#kbuf`lnsvwjmddfmfqbwfgsqlujm`fpdvbqbmwffbqajwqbqzqf`ldmjyftbmwfg#wls{8tjgwk9wkflqz#leafkbujlvqTkjof#wkffpwjnbwfgafdbm#wl#jw#af`bnfnbdmjwvgfnvpw#kbufnlqf#wkbmGjqf`wlqzf{wfmpjlmpf`qfwbqzmbwvqboozl``vqqjmdubqjbaofpdjufm#wkfsobwelqn-?,obafo=?ebjofg#wl`lnslvmgphjmgp#le#pl`jfwjfpbolmdpjgf#..%dw8\t\tplvwktfpwwkf#qjdkwqbgjbwjlmnbz#kbuf#vmfp`bsf+pslhfm#jm!#kqfe>!,sqldqbnnflmoz#wkf#`lnf#eqlngjqf`wlqzavqjfg#jmb#pjnjobqwkfz#tfqf?,elmw=?,Mlqtfdjbmpsf`jejfgsqlgv`jmdsbppfmdfq+mft#Gbwfwfnslqbqzej`wjlmboBewfq#wkffrvbwjlmpgltmolbg-qfdvobqozgfufolsfqbaluf#wkfojmhfg#wlskfmlnfmbsfqjlg#lewllowjs!=pvapwbm`fbvwlnbwj`bpsf`w#leBnlmd#wkf`lmmf`wfgfpwjnbwfpBjq#Elq`fpzpwfn#lelaif`wjufjnnfgjbwfnbhjmd#jwsbjmwjmdp`lmrvfqfgbqf#pwjoosql`fgvqfdqltwk#lekfbgfg#azFvqlsfbm#gjujpjlmpnlof`vofpeqbm`kjpfjmwfmwjlmbwwqb`wfg`kjogkllgbopl#vpfggfgj`bwfgpjmdbslqfgfdqff#leebwkfq#le`lmeoj`wp?,b=?,s=\t`bnf#eqlntfqf#vpfgmlwf#wkbwqf`fjujmdF{f`vwjuffufm#nlqfb``fpp#wl`lnnbmgfqSlojwj`bonvpj`jbmpgfoj`jlvpsqjplmfqpbgufmw#leVWE.;!#,=?\"X@GBWBX!=@lmwb`wPlvwkfqm#ad`lolq>!pfqjfp#le-#Jw#tbp#jm#Fvqlsfsfqnjwwfgubojgbwf-bssfbqjmdleej`jboppfqjlvpoz.obmdvbdfjmjwjbwfgf{wfmgjmdolmd.wfqnjmeobwjlmpv`k#wkbwdfw@llhjfnbqhfg#az?,avwwlm=jnsofnfmwavw#jw#jpjm`qfbpfpgltm#wkf#qfrvjqjmdgfsfmgfmw..=\t?\"..#jmwfqujftTjwk#wkf#`lsjfp#le`lmpfmpvptbp#avjowUfmfyvfob+elqnfqozwkf#pwbwfsfqplmmfopwqbwfdj`ebulvq#lejmufmwjlmTjhjsfgjb`lmwjmfmwujqwvbooztkj`k#tbpsqjm`jsof@lnsofwf#jgfmwj`bopklt#wkbwsqjnjwjufbtbz#eqlnnlof`vobqsqf`jpfozgjpploufgVmgfq#wkfufqpjlm>!=%maps8?,Jw#jp#wkf#Wkjp#jp#tjoo#kbuflqdbmjpnpplnf#wjnfEqjfgqj`ktbp#ejqpwwkf#lmoz#eb`w#wkbwelqn#jg>!sqf`fgjmdWf`kmj`boskzpj`jpwl``vqp#jmmbujdbwlqpf`wjlm!=psbm#jg>!plvdkw#wlafolt#wkfpvqujujmd~?,pwzof=kjp#gfbwkbp#jm#wkf`bvpfg#azsbqwjboozf{jpwjmd#vpjmd#wkftbp#djufmb#ojpw#leofufop#lemlwjlm#leLeej`jbo#gjpnjppfgp`jfmwjpwqfpfnaofpgvsoj`bwff{solpjufqf`lufqfgboo#lwkfqdboofqjfpxsbggjmd9sflsof#leqfdjlm#lebggqfppfpbppl`jbwfjnd#bow>!jm#nlgfqmpklvog#afnfwklg#leqfslqwjmdwjnfpwbnsmffgfg#wlwkf#Dqfbwqfdbqgjmdpffnfg#wlujftfg#bpjnsb`w#lmjgfb#wkbwwkf#Tlqogkfjdkw#lef{sbmgjmdWkfpf#bqf`vqqfmw!=`bqfevooznbjmwbjmp`kbqdf#le@obppj`bobggqfppfgsqfgj`wfgltmfqpkjs?gju#jg>!qjdkw!=\x0E\tqfpjgfm`fofbuf#wkf`lmwfmw!=bqf#lewfm##~*+*8\x0E\tsqlabaoz#Sqlefpplq.avwwlm!#qfpslmgfgpbzp#wkbwkbg#wl#afsob`fg#jmKvmdbqjbmpwbwvp#lepfqufp#bpVmjufqpbof{f`vwjlmbddqfdbwfelq#tkj`kjmef`wjlmbdqffg#wlkltfufq/#slsvobq!=sob`fg#lm`lmpwqv`wfof`wlqbopznalo#lejm`ovgjmdqfwvqm#wlbq`kjwf`w@kqjpwjbmsqfujlvp#ojujmd#jmfbpjfq#wlsqlefpplq\t%ow8\"..#feef`w#lebmbozwj`ptbp#wbhfmtkfqf#wkfwllh#lufqafojfe#jmBeqjhbbmpbp#ebq#bpsqfufmwfgtlqh#tjwkb#psf`jbo?ejfogpfw@kqjpwnbpQfwqjfufg\t\tJm#wkf#ab`h#jmwlmlqwkfbpwnbdbyjmfp=?pwqlmd=`lnnjwwffdlufqmjmddqlvsp#lepwlqfg#jmfpwbaojpkb#dfmfqbojwp#ejqpwwkfjq#ltmslsvobwfgbm#laif`w@bqjaafbmboolt#wkfgjpwqj`wptjp`lmpjmol`bwjlm-8#tjgwk9#jmkbajwfgPl`jbojpwIbmvbqz#2?,ellwfq=pjnjobqoz`klj`f#lewkf#pbnf#psf`jej`#avpjmfpp#Wkf#ejqpw-ofmdwk8#gfpjqf#wlgfbo#tjwkpjm`f#wkfvpfqBdfmw`lm`fjufgjmgf{-sksbp#%rvlw8fmdbdf#jmqf`fmwoz/eft#zfbqptfqf#bopl\t?kfbg=\t?fgjwfg#azbqf#hmltm`jwjfp#jmb``fpphfz`lmgfnmfgbopl#kbufpfquj`fp/ebnjoz#leP`kllo#le`lmufqwfgmbwvqf#le#obmdvbdfnjmjpwfqp?,laif`w=wkfqf#jp#b#slsvobqpfrvfm`fpbgul`bwfgWkfz#tfqfbmz#lwkfqol`bwjlm>fmwfq#wkfnv`k#nlqfqfeof`wfgtbp#mbnfglqjdjmbo#b#wzsj`botkfm#wkfzfmdjmffqp`lvog#mlwqfpjgfmwptfgmfpgbzwkf#wkjqg#sqlgv`wpIbmvbqz#1tkbw#wkfzb#`fqwbjmqfb`wjlmpsql`fpplqbewfq#kjpwkf#obpw#`lmwbjmfg!=?,gju=\t?,b=?,wg=gfsfmg#lmpfbq`k!=\tsjf`fp#le`lnsfwjmdQfefqfm`fwfmmfppfftkj`k#kbp#ufqpjlm>?,psbm=#??,kfbgfq=djufp#wkfkjpwlqjbmubovf>!!=sbggjmd93ujft#wkbwwldfwkfq/wkf#nlpw#tbp#elvmgpvapfw#lebwwb`h#lm`kjogqfm/sljmwp#lesfqplmbo#slpjwjlm9boofdfgoz@ofufobmgtbp#obwfqbmg#bewfqbqf#djufmtbp#pwjoop`qloojmdgfpjdm#lenbhfp#wkfnv`k#ofppBnfqj`bmp-\t\tBewfq#/#avw#wkfNvpfvn#leolvjpjbmb+eqln#wkfnjmmfplwbsbqwj`ofpb#sql`fppGlnjmj`bmulovnf#leqfwvqmjmdgfefmpjuf33s{\x7Fqjdknbgf#eqlnnlvpflufq!#pwzof>!pwbwfp#le+tkj`k#jp`lmwjmvfpEqbm`jp`lavjogjmd#tjwklvw#btjwk#plnftkl#tlvogb#elqn#leb#sbqw#leafelqf#jwhmltm#bp##Pfquj`fpol`bwjlm#bmg#lewfmnfbpvqjmdbmg#jw#jpsbsfqab`hubovfp#le\x0E\t?wjwof=>#tjmglt-gfwfqnjmffq%rvlw8#sobzfg#azbmg#fbqoz?,`fmwfq=eqln#wkjpwkf#wkqffsltfq#bmgle#%rvlw8jmmfqKWNO?b#kqfe>!z9jmojmf8@kvq`k#lewkf#fufmwufqz#kjdkleej`jbo#.kfjdkw9#`lmwfmw>!,`dj.ajm,wl#`qfbwfbeqjhbbmpfpsfqbmwleqbm/Kbjpobwujf)Mvojfwvuj)_(`f)Mwjmb(af)Mwjmb\fUh\fT{\fTN\n{I\np@\x04Fr\x0BBl\bQ\x7F\tA{\x0BUm\x05Gx\tA{\x01yp\x06YA\0zX\bTV\bWl\bUd\x04BM\x0BB{\npV\x0B@x\x04B\\\np@\x04Db\x04Gz\tal\npa\tfM\tuD\bV~\x04mx\x0BQ}\ndS\tp\\\bVK\bS]\bU|\x05oD\tkV\x0Bed\x0BHR\nb~\x04M`\nJp\x05oD\x04|Q\nLP\x04Sw\bTl\nAI\nxC\bWt\tBq\x05F`\x04Cm\x0BLm\tKx\t}t\bPv\ny\\\naB\tV\x7F\nZd\x04XU\x04li\tfr\ti@\tBH\x04BD\x04BV\t`V\n[]\tp_\tTn\n~A\nxR\tuD\t`{\bV@\tTn\tHK\tAJ\x0Bxs\x04Zf\nqI\x04Zf\x0BBM\x0B|j\t}t\bSM\nmC\x0BQ}pfquj`jlpbqw/A`volbqdfmwjmbabq`folmb`vborvjfqsvaoj`bglsqlgv`wlpslo/Awj`bqfpsvfpwbtjhjsfgjbpjdvjfmwfa/Vprvfgb`lnvmjgbgpfdvqjgbgsqjm`jsbosqfdvmwbp`lmwfmjglqfpslmgfqufmfyvfobsqlaofnbpgj`jfnaqfqfob`j/_mmlujfnaqfpjnjobqfpsqlzf`wlpsqldqbnbpjmpwjwvwlb`wjujgbgfm`vfmwqbf`lmln/Abjn/Mdfmfp`lmwb`wbqgfp`bqdbqmf`fpbqjlbwfm`j/_mwfo/Eelml`lnjpj/_m`bm`jlmfp`bsb`jgbgfm`lmwqbqbm/Mojpjpebulqjwlpw/Eqnjmlpsqlujm`jbfwjrvfwbpfofnfmwlpevm`jlmfpqfpvowbgl`bq/M`wfqsqlsjfgbgsqjm`jsjlmf`fpjgbgnvmj`jsbo`qfb`j/_mgfp`bqdbpsqfpfm`jb`lnfq`jbolsjmjlmfpfifq`j`jlfgjwlqjbopbobnbm`bdlmy/Mofygl`vnfmwlsfo/A`vobqf`jfmwfpdfmfqbofpwbqqbdlmbsq/M`wj`bmlufgbgfpsqlsvfpwbsb`jfmwfpw/E`mj`bplaifwjulp`lmwb`wlp\fHB\fIk\fHn\fH^\fHS\fHc\fHU\fId\fHn\fH{\fHC\fHR\fHT\fHR\fHI\fHc\fHY\fHn\fH\\\fHU\fIk\fHy\fIg\fHd\fHy\fIm\fHw\fH\\\fHU\fHR\fH@\fHR\fHJ\fHy\fHU\fHR\fHT\fHA\fIl\fHU\fIm\fHc\fH\\\fHU\fIl\fHB\fId\fHn\fHJ\fHS\fHD\fH@\fHR\fHHgjsolgl`p\fHT\fHB\fHC\fH\\\fIn\fHF\fHD\fHR\fHB\fHF\fHH\fHR\fHG\fHS\fH\\\fHx\fHT\fHH\fHH\fH\\\fHU\fH^\fIg\fH{\fHU\fIm\fHj\fH@\fHR\fH\\\fHJ\fIk\fHZ\fHU\fIm\fHd\fHz\fIk\fH^\fHC\fHJ\fHS\fHy\fHR\fHB\fHY\fIk\fH@\fHH\fIl\fHD\fH@\fIl\fHv\fHB\fI`\fHH\fHT\fHR\fH^\fH^\fIk\fHz\fHp\fIe\fH@\fHB\fHJ\fHJ\fHH\fHI\fHR\fHD\fHU\fIl\fHZ\fHU\fH\\\fHi\fH^\fH{\fHy\fHA\fIl\fHD\fH{\fH\\\fHF\fHR\fHT\fH\\\fHR\fHH\fHy\fHS\fHc\fHe\fHT\fIk\fH{\fHC\fIl\fHU\fIn\fHm\fHj\fH{\fIk\fHs\fIl\fHB\fHz\fIg\fHp\fHy\fHR\fH\\\fHi\fHA\fIl\fH{\fHC\fIk\fHH\fIm\fHB\fHY\fIg\fHs\fHJ\fIk\fHn\fHi\fH{\fH\\\fH|\fHT\fIk\fHB\fIk\fH^\fH^\fH{\fHR\fHU\fHR\fH^\fHf\fHF\fH\\\fHv\fHR\fH\\\fH|\fHT\fHR\fHJ\fIk\fH\\\fHp\fHS\fHT\fHJ\fHS\fH^\fH@\fHn\fHJ\fH@\fHD\fHR\fHU\fIn\fHn\fH^\fHR\fHz\fHp\fIl\fHH\fH@\fHs\fHD\fHB\fHS\fH^\fHk\fHT\fIk\fHj\fHD\fIk\fHD\fHC\fHR\fHy\fIm\fH^\fH^\fIe\fH{\fHA\fHR\fH{\fH\\\fIk\fH^\fHp\fH{\fHU\fH\\\fHR\fHB\fH^\fH{\fIk\fHF\fIk\fHp\fHU\fHR\fHI\fHk\fHT\fIl\fHT\fHU\fIl\fHy\fH^\fHR\fHL\fIl\fHy\fHU\fHR\fHm\fHJ\fIn\fH\\\fHH\fHU\fHH\fHT\fHR\fHH\fHC\fHR\fHJ\fHj\fHC\fHR\fHF\fHR\fHy\fHy\fI`\fHD\fHZ\fHR\fHB\fHJ\fIk\fHz\fHC\fHU\fIl\fH\\\fHR\fHC\fHz\fIm\fHJ\fH^\fH{\fIl`bwfdlqjfpf{sfqjfm`f?,wjwof=\x0E\t@lszqjdkw#ibubp`qjsw`lmgjwjlmpfufqzwkjmd?s#`obpp>!wf`kmloldzab`hdqlvmg?b#`obpp>!nbmbdfnfmw%`lsz8#132ibubP`qjsw`kbqb`wfqpaqfbg`qvnawkfnpfoufpklqjylmwbodlufqmnfmw@bojelqmjbb`wjujwjfpgjp`lufqfgMbujdbwjlmwqbmpjwjlm`lmmf`wjlmmbujdbwjlmbssfbqbm`f?,wjwof=?n`kf`hal{!#wf`kmjrvfpsqlwf`wjlmbssbqfmwozbp#tfoo#bpvmw$/#$VB.qfplovwjlmlsfqbwjlmpwfofujpjlmwqbmpobwfgTbpkjmdwlmmbujdbwlq-#>#tjmglt-jnsqfppjlm%ow8aq%dw8ojwfqbwvqfslsvobwjlmad`lolq>! fpsf`jbooz#`lmwfmw>!sqlgv`wjlmmftpofwwfqsqlsfqwjfpgfejmjwjlmofbgfqpkjsWf`kmloldzSbqojbnfmw`lnsbqjplmvo#`obpp>!-jmgf{Le+!`lm`ovpjlmgjp`vppjlm`lnslmfmwpajloldj`boQfulovwjlm\\`lmwbjmfqvmgfqpwllgmlp`qjsw=?sfqnjppjlmfb`k#lwkfqbwnlpskfqf#lmel`vp>!?elqn#jg>!sql`fppjmdwkjp-ubovfdfmfqbwjlm@lmefqfm`fpvapfrvfmwtfoo.hmltmubqjbwjlmpqfsvwbwjlmskfmlnfmlmgjp`jsojmfoldl-smd!#+gl`vnfmw/alvmgbqjfpf{sqfppjlmpfwwofnfmwAb`hdqlvmglvw#le#wkffmwfqsqjpf+!kwwsp9!#vmfp`bsf+!sbpptlqg!#gfnl`qbwj`?b#kqfe>!,tqbssfq!=\tnfnafqpkjsojmdvjpwj`s{8sbggjmdskjolplskzbppjpwbm`fvmjufqpjwzeb`jojwjfpqf`ldmjyfgsqfefqfm`fje#+wzsflenbjmwbjmfgul`bavobqzkzslwkfpjp-pvanjw+*8%bns8maps8bmmlwbwjlmafkjmg#wkfElvmgbwjlmsvaojpkfq!bppvnswjlmjmwqlgv`fg`lqqvswjlmp`jfmwjpwpf{soj`jwozjmpwfbg#legjnfmpjlmp#lm@oj`h>!`lmpjgfqfggfsbqwnfmwl``vsbwjlmpllm#bewfqjmufpwnfmwsqlmlvm`fgjgfmwjejfgf{sfqjnfmwNbmbdfnfmwdfldqbskj`!#kfjdkw>!ojmh#qfo>!-qfsob`f+,gfsqfppjlm`lmefqfm`fsvmjpknfmwfojnjmbwfgqfpjpwbm`fbgbswbwjlmlsslpjwjlmtfoo#hmltmpvssofnfmwgfwfqnjmfgk2#`obpp>!3s{8nbqdjmnf`kbmj`bopwbwjpwj`p`fofaqbwfgDlufqmnfmw\t\tGvqjmd#wgfufolsfqpbqwjej`jbofrvjubofmwlqjdjmbwfg@lnnjppjlmbwwb`knfmw?psbm#jg>!wkfqf#tfqfMfgfqobmgpafzlmg#wkfqfdjpwfqfgilvqmbojpweqfrvfmwozboo#le#wkfobmd>!fm!#?,pwzof=\x0E\tbaplovwf8#pvsslqwjmdf{wqfnfoz#nbjmpwqfbn?,pwqlmd=#slsvobqjwzfnsolznfmw?,wbaof=\x0E\t#`lopsbm>!?,elqn=\t##`lmufqpjlmbalvw#wkf#?,s=?,gju=jmwfdqbwfg!#obmd>!fmSlqwvdvfpfpvapwjwvwfjmgjujgvbojnslppjaofnvowjnfgjbbonlpw#boos{#plojg# bsbqw#eqlnpvaif`w#wljm#Fmdojpk`qjwj`jyfgf{`fsw#elqdvjgfojmfplqjdjmboozqfnbqhbaofwkf#pf`lmgk1#`obpp>!?b#wjwof>!+jm`ovgjmdsbqbnfwfqpsqlkjajwfg>#!kwws9,,gj`wjlmbqzsfq`fswjlmqfulovwjlmelvmgbwjlms{8kfjdkw9pv``fppevopvsslqwfqpnjoofmmjvnkjp#ebwkfqwkf#%rvlw8ml.qfsfbw8`lnnfq`jbojmgvpwqjbofm`lvqbdfgbnlvmw#le#vmleej`jbofeej`jfm`zQfefqfm`fp`llqgjmbwfgjp`objnfqf{sfgjwjlmgfufolsjmd`bo`vobwfgpjnsojejfgofdjwjnbwfpvapwqjmd+3!#`obpp>!`lnsofwfozjoovpwqbwfejuf#zfbqpjmpwqvnfmwSvaojpkjmd2!#`obpp>!spz`kloldz`lmejgfm`fmvnafq#le#bapfm`f#leel`vpfg#lmiljmfg#wkfpwqv`wvqfpsqfujlvpoz=?,jeqbnf=lm`f#bdbjmavw#qbwkfqjnnjdqbmwple#`lvqpf/b#dqlvs#leOjwfqbwvqfVmojhf#wkf?,b=%maps8\tevm`wjlm#jw#tbp#wkf@lmufmwjlmbvwlnlajofSqlwfpwbmwbddqfppjufbewfq#wkf#Pjnjobqoz/!#,=?,gju=`loof`wjlm\x0E\tevm`wjlmujpjajojwzwkf#vpf#leulovmwffqpbwwqb`wjlmvmgfq#wkf#wkqfbwfmfg)?\"X@GBWBXjnslqwbm`fjm#dfmfqbowkf#obwwfq?,elqn=\t?,-jmgf{Le+$j#>#38#j#?gjeefqfm`fgfulwfg#wlwqbgjwjlmppfbq`k#elqvowjnbwfozwlvqmbnfmwbwwqjavwfppl.`boofg#~\t?,pwzof=fubovbwjlmfnskbpjyfgb``fppjaof?,pf`wjlm=pv``fppjlmbolmd#tjwkNfbmtkjof/jmgvpwqjfp?,b=?aq#,=kbp#af`lnfbpsf`wp#leWfofujpjlmpveej`jfmwabphfwabooalwk#pjgfp`lmwjmvjmdbm#bqwj`of?jnd#bow>!bgufmwvqfpkjp#nlwkfqnbm`kfpwfqsqjm`jsofpsbqwj`vobq`lnnfmwbqzfeef`wp#legf`jgfg#wl!=?pwqlmd=svaojpkfqpIlvqmbo#legjeej`vowzeb`jojwbwfb``fswbaofpwzof-`pp!\nevm`wjlm#jmmlubwjlm=@lszqjdkwpjwvbwjlmptlvog#kbufavpjmfppfpGj`wjlmbqzpwbwfnfmwplewfm#vpfgsfqpjpwfmwjm#Ibmvbqz`lnsqjpjmd?,wjwof=\t\ngjsolnbwj``lmwbjmjmdsfqelqnjmdf{wfmpjlmpnbz#mlw#af`lm`fsw#le#lm`oj`h>!Jw#jp#boplejmbm`jbo#nbhjmd#wkfOv{fnalvqdbggjwjlmbobqf#`boofgfmdbdfg#jm!p`qjsw!*8avw#jw#tbpfof`wqlmj`lmpvanjw>!\t?\"..#Fmg#fof`wqj`boleej`jboozpvddfpwjlmwls#le#wkfvmojhf#wkfBvpwqbojbmLqjdjmboozqfefqfm`fp\t?,kfbg=\x0E\tqf`ldmjpfgjmjwjbojyfojnjwfg#wlBof{bmgqjbqfwjqfnfmwBgufmwvqfpelvq#zfbqp\t\t%ow8\"..#jm`qfbpjmdgf`lqbwjlmk0#`obpp>!lqjdjmp#lelaojdbwjlmqfdvobwjlm`obppjejfg+evm`wjlm+bgubmwbdfpafjmd#wkf#kjpwlqjbmp?abpf#kqfeqfsfbwfgoztjoojmd#wl`lnsbqbaofgfpjdmbwfgmlnjmbwjlmevm`wjlmbojmpjgf#wkfqfufobwjlmfmg#le#wkfp#elq#wkf#bvwklqjyfgqfevpfg#wlwbhf#sob`fbvwlmlnlvp`lnsqlnjpfslojwj`bo#qfpwbvqbmwwtl#le#wkfEfaqvbqz#1rvbojwz#leptelaif`w-vmgfqpwbmgmfbqoz#bootqjwwfm#azjmwfqujftp!#tjgwk>!2tjwkgqbtboeolbw9ofewjp#vpvbooz`bmgjgbwfpmftpsbsfqpnzpwfqjlvpGfsbqwnfmwafpw#hmltmsbqojbnfmwpvssqfppfg`lmufmjfmwqfnfnafqfggjeefqfmw#pzpwfnbwj`kbp#ofg#wlsqlsbdbmgb`lmwqloofgjmeovfm`fp`fqfnlmjbosql`objnfgSqlwf`wjlmoj#`obpp>!P`jfmwjej``obpp>!ml.wqbgfnbqhpnlqf#wkbm#tjgfpsqfbgOjafqbwjlmwllh#sob`fgbz#le#wkfbp#olmd#bpjnsqjplmfgBggjwjlmbo\t?kfbg=\t?nObalqbwlqzMlufnafq#1f{`fswjlmpJmgvpwqjboubqjfwz#leeolbw9#ofeGvqjmd#wkfbppfppnfmwkbuf#affm#gfbop#tjwkPwbwjpwj`pl``vqqfm`f,vo=?,gju=`ofbqej{!=wkf#svaoj`nbmz#zfbqptkj`k#tfqflufq#wjnf/pzmlmznlvp`lmwfmw!=\tsqfpvnbaozkjp#ebnjozvpfqBdfmw-vmf{sf`wfgjm`ovgjmd#`kboofmdfgb#njmlqjwzvmgfejmfg!afolmdp#wlwbhfm#eqlnjm#L`wlafqslpjwjlm9#pbjg#wl#afqfojdjlvp#Efgfqbwjlm#qltpsbm>!lmoz#b#eftnfbmw#wkbwofg#wl#wkf..=\x0E\t?gju#?ejfogpfw=Bq`kajpkls#`obpp>!mlafjmd#vpfgbssqlb`kfpsqjujofdfpmlp`qjsw=\tqfpvowp#jmnbz#af#wkfFbpwfq#fddnf`kbmjpnpqfbplmbaofSlsvobwjlm@loof`wjlmpfof`wfg!=mlp`qjsw=\x0E,jmgf{-sksbqqjubo#le.ippgh$**8nbmbdfg#wljm`lnsofwf`bpvbowjfp`lnsofwjlm@kqjpwjbmpPfswfnafq#bqjwknfwj`sql`fgvqfpnjdkw#kbufSqlgv`wjlmjw#bssfbqpSkjolplskzeqjfmgpkjsofbgjmd#wldjujmd#wkfwltbqg#wkfdvbqbmwffggl`vnfmwfg`lolq9 333ujgfl#dbnf`lnnjppjlmqfeof`wjmd`kbmdf#wkfbppl`jbwfgpbmp.pfqjelmhfzsqfpp8#sbggjmd9Kf#tbp#wkfvmgfqozjmdwzsj`booz#/#bmg#wkf#pq`Fofnfmwpv``fppjufpjm`f#wkf#pklvog#af#mfwtlqhjmdb``lvmwjmdvpf#le#wkfoltfq#wkbmpkltp#wkbw?,psbm=\t\n\n`lnsobjmwp`lmwjmvlvprvbmwjwjfpbpwqlmlnfqkf#gjg#mlwgvf#wl#jwpbssojfg#wlbm#bufqbdffeelqwp#wlwkf#evwvqfbwwfnsw#wlWkfqfelqf/`bsbajojwzQfsvaoj`bmtbp#elqnfgFof`wqlmj`hjolnfwfqp`kboofmdfpsvaojpkjmdwkf#elqnfqjmgjdfmlvpgjqf`wjlmppvapjgjbqz`lmpsjqb`zgfwbjop#lebmg#jm#wkfbeelqgbaofpvapwbm`fpqfbplm#elq`lmufmwjlmjwfnwzsf>!baplovwfozpvsslpfgozqfnbjmfg#bbwwqb`wjufwqbufoojmdpfsbqbwfozel`vpfp#lmfofnfmwbqzbssoj`baofelvmg#wkbwpwzofpkffwnbmvp`qjswpwbmgp#elq#ml.qfsfbw+plnfwjnfp@lnnfq`jbojm#Bnfqj`bvmgfqwbhfmrvbqwfq#lebm#f{bnsofsfqplmboozjmgf{-sks!owqOjfvwfmbmw\t?gju#jg>!wkfz#tlvogbajojwz#lenbgf#vs#lemlwfg#wkbw`ofbq#wkbwbqdvf#wkbwwl#bmlwkfq`kjogqfm$psvqslpf#leelqnvobwfgabpfg#vslmwkf#qfdjlmpvaif`w#lesbppfmdfqpslppfppjlm-\t\tJm#wkf#Afelqf#wkfbewfqtbqgp`vqqfmwoz#b`qlpp#wkfp`jfmwjej``lnnvmjwz-`bsjwbojpnjm#Dfqnbmzqjdkw.tjmdwkf#pzpwfnPl`jfwz#leslojwj`jbmgjqf`wjlm9tfmw#lm#wlqfnlubo#le#Mft#Zlqh#bsbqwnfmwpjmgj`bwjlmgvqjmd#wkfvmofpp#wkfkjpwlqj`bokbg#affm#bgfejmjwjufjmdqfgjfmwbwwfmgbm`f@fmwfq#elqsqlnjmfm`fqfbgzPwbwfpwqbwfdjfpavw#jm#wkfbp#sbqw#le`lmpwjwvwf`objn#wkbwobalqbwlqz`lnsbwjaofebjovqf#le/#pv`k#bp#afdbm#tjwkvpjmd#wkf#wl#sqlujgfefbwvqf#leeqln#tkj`k,!#`obpp>!dfloldj`bopfufqbo#legfojafqbwfjnslqwbmw#klogp#wkbwjmd%rvlw8#ubojdm>wlswkf#Dfqnbmlvwpjgf#lemfdlwjbwfgkjp#`bqffqpfsbqbwjlmjg>!pfbq`ktbp#`boofgwkf#elvqwkqf`qfbwjlmlwkfq#wkbmsqfufmwjlmtkjof#wkf#fgv`bwjlm/`lmmf`wjmdb``vqbwfoztfqf#avjowtbp#hjoofgbdqffnfmwpnv`k#nlqf#Gvf#wl#wkftjgwk9#233plnf#lwkfqHjmdgln#lewkf#fmwjqfebnlvp#elqwl#`lmmf`wlaif`wjufpwkf#Eqfm`ksflsof#bmgefbwvqfg!=jp#pbjg#wlpwqv`wvqboqfefqfmgvnnlpw#lewfmb#pfsbqbwf.=\t?gju#jg#Leej`jbo#tlqogtjgf-bqjb.obafowkf#sobmfwbmg#jw#tbpg!#ubovf>!ollhjmd#bwafmfej`jbobqf#jm#wkfnlmjwlqjmdqfslqwfgozwkf#nlgfqmtlqhjmd#lmbooltfg#wltkfqf#wkf#jmmlubwjuf?,b=?,gju=plvmgwqb`hpfbq`kElqnwfmg#wl#afjmsvw#jg>!lsfmjmd#leqfpwqj`wfgbglswfg#azbggqfppjmdwkfloldjbmnfwklgp#leubqjbmw#le@kqjpwjbm#ufqz#obqdfbvwlnlwjufaz#ebq#wkfqbmdf#eqlnsvqpvjw#leeloolt#wkfaqlvdkw#wljm#Fmdobmgbdqff#wkbwb``vpfg#le`lnfp#eqlnsqfufmwjmdgju#pwzof>kjp#lq#kfqwqfnfmglvpeqffgln#le`lm`fqmjmd3#2fn#2fn8Abphfwaboo,pwzof-`ppbm#fbqojfqfufm#bewfq,!#wjwof>!-`ln,jmgf{wbhjmd#wkfsjwwpavqdk`lmwfmw!=\x0E?p`qjsw=+ewvqmfg#lvwkbujmd#wkf?,psbm=\x0E\t#l``bpjlmboaf`bvpf#jwpwbqwfg#wlskzpj`booz=?,gju=\t##`qfbwfg#az@vqqfmwoz/#ad`lolq>!wbajmgf{>!gjpbpwqlvpBmbozwj`p#bopl#kbp#b=?gju#jg>!?,pwzof=\t?`boofg#elqpjmdfq#bmg-pq`#>#!,,ujlobwjlmpwkjp#sljmw`lmpwbmwozjp#ol`bwfgqf`lqgjmdpg#eqln#wkfmfgfqobmgpslqwvdv/Fp;N;};D;u;F5m4K4]4_7`gfpbqqlool`lnfmwbqjlfgv`b`j/_mpfswjfnaqfqfdjpwqbglgjqf``j/_mvaj`b`j/_msvaoj`jgbgqfpsvfpwbpqfpvowbglpjnslqwbmwfqfpfqubglpbqw/A`volpgjefqfmwfppjdvjfmwfpqfs/Vaoj`bpjwvb`j/_mnjmjpwfqjlsqjub`jgbggjqf`wlqjlelqnb`j/_mslaob`j/_msqfpjgfmwf`lmw", "fmjglpb``fplqjlpwf`kmlqbwjsfqplmbofp`bwfdlq/Abfpsf`jbofpgjpslmjaofb`wvbojgbgqfefqfm`jbuboobglojgajaojlwf`bqfob`jlmfp`bofmgbqjlslo/Awj`bpbmwfqjlqfpgl`vnfmwlpmbwvqbofybnbwfqjbofpgjefqfm`jbf`lm/_nj`bwqbmpslqwfqlgq/Advfysbqwj`jsbqfm`vfmwqbmgjp`vpj/_mfpwqv`wvqbevmgb`j/_meqf`vfmwfpsfqnbmfmwfwlwbonfmwf!2s{#plojg# -dje!#bow>!wqbmpsbqfmwjmelqnbwjlmbssoj`bwjlm!#lm`oj`h>!fpwbaojpkfgbgufqwjpjmd-smd!#bow>!fmujqlmnfmwsfqelqnbm`fbssqlsqjbwf%bns8ngbpk8jnnfgjbwfoz?,pwqlmd=?,qbwkfq#wkbmwfnsfqbwvqfgfufolsnfmw`lnsfwjwjlmsob`fklogfqujpjajojwz9`lszqjdkw!=3!#kfjdkw>!fufm#wklvdkqfsob`fnfmwgfpwjmbwjlm@lqslqbwjlm?vo#`obpp>!Bppl`jbwjlmjmgjujgvbopsfqpsf`wjufpfwWjnflvw+vqo+kwws9,,nbwkfnbwj`pnbqdjm.wls9fufmwvbooz#gfp`qjswjlm*#ml.qfsfbw`loof`wjlmp-ISD\x7Fwkvna\x7Fsbqwj`jsbwf,kfbg=?algzeolbw9ofew8?oj#`obpp>!kvmgqfgp#le\t\tKltfufq/#`lnslpjwjlm`ofbq9alwk8`llsfqbwjlmtjwkjm#wkf#obafo#elq>!alqgfq.wls9Mft#Yfbobmgqf`lnnfmgfgsklwldqbskzjmwfqfpwjmd%ow8pvs%dw8`lmwqlufqpzMfwkfqobmgpbowfqmbwjufnb{ofmdwk>!ptjwyfqobmgGfufolsnfmwfppfmwjbooz\t\tBowklvdk#?,wf{wbqfb=wkvmgfqajqgqfsqfpfmwfg%bns8mgbpk8psf`vobwjlm`lnnvmjwjfpofdjpobwjlmfof`wqlmj`p\t\n?gju#jg>!joovpwqbwfgfmdjmffqjmdwfqqjwlqjfpbvwklqjwjfpgjpwqjavwfg5!#kfjdkw>!pbmp.pfqje8`bsbaof#le#gjpbssfbqfgjmwfqb`wjufollhjmd#elqjw#tlvog#afBedkbmjpwbmtbp#`qfbwfgNbwk-eollq+pvqqlvmgjmd`bm#bopl#aflapfqubwjlmnbjmwfmbm`ffm`lvmwfqfg?k1#`obpp>!nlqf#qf`fmwjw#kbp#affmjmubpjlm#le*-dfwWjnf+*evmgbnfmwboGfpsjwf#wkf!=?gju#jg>!jmpsjqbwjlmf{bnjmbwjlmsqfsbqbwjlmf{sobmbwjlm?jmsvw#jg>!?,b=?,psbm=ufqpjlmp#lejmpwqvnfmwpafelqf#wkf##>#$kwws9,,Gfp`qjswjlmqfobwjufoz#-pvapwqjmd+fb`k#le#wkff{sfqjnfmwpjmeovfmwjbojmwfdqbwjlmnbmz#sflsofgvf#wl#wkf#`lnajmbwjlmgl#mlw#kbufNjggof#Fbpw?mlp`qjsw=?`lszqjdkw!#sfqkbsp#wkfjmpwjwvwjlmjm#Gf`fnafqbqqbmdfnfmwnlpw#ebnlvpsfqplmbojwz`qfbwjlm#leojnjwbwjlmpf{`ovpjufozplufqfjdmwz.`lmwfmw!=\t?wg#`obpp>!vmgfqdqlvmgsbqboofo#wlgl`wqjmf#lel``vsjfg#azwfqnjmloldzQfmbjppbm`fb#mvnafq#lepvsslqw#elqf{solqbwjlmqf`ldmjwjlmsqfgf`fpplq?jnd#pq`>!,?k2#`obpp>!svaoj`bwjlmnbz#bopl#afpsf`jbojyfg?,ejfogpfw=sqldqfppjufnjoojlmp#lepwbwfp#wkbwfmelq`fnfmwbqlvmg#wkf#lmf#bmlwkfq-sbqfmwMlgfbdqj`vowvqfBowfqmbwjufqfpfbq`kfqpwltbqgp#wkfNlpw#le#wkfnbmz#lwkfq#+fpsf`jbooz?wg#tjgwk>!8tjgwk9233&jmgfsfmgfmw?k0#`obpp>!#lm`kbmdf>!*-bgg@obpp+jmwfqb`wjlmLmf#le#wkf#gbvdkwfq#leb``fpplqjfpaqbm`kfp#le\x0E\t?gju#jg>!wkf#obqdfpwgf`obqbwjlmqfdvobwjlmpJmelqnbwjlmwqbmpobwjlmgl`vnfmwbqzjm#lqgfq#wl!=\t?kfbg=\t?!#kfjdkw>!2b`qlpp#wkf#lqjfmwbwjlm*8?,p`qjsw=jnsofnfmwfg`bm#af#pffmwkfqf#tbp#bgfnlmpwqbwf`lmwbjmfq!=`lmmf`wjlmpwkf#Aqjwjpktbp#tqjwwfm\"jnslqwbmw8s{8#nbqdjm.elooltfg#azbajojwz#wl#`lnsoj`bwfggvqjmd#wkf#jnnjdqbwjlmbopl#`boofg?k7#`obpp>!gjpwjm`wjlmqfsob`fg#azdlufqmnfmwpol`bwjlm#lejm#Mlufnafqtkfwkfq#wkf?,s=\t?,gju=b`rvjpjwjlm`boofg#wkf#sfqpf`vwjlmgfpjdmbwjlmxelmw.pjyf9bssfbqfg#jmjmufpwjdbwff{sfqjfm`fgnlpw#ojhfoztjgfoz#vpfggjp`vppjlmpsqfpfm`f#le#+gl`vnfmw-f{wfmpjufozJw#kbp#affmjw#glfp#mlw`lmwqbqz#wljmkbajwbmwpjnsqlufnfmwp`klobqpkjs`lmpvnswjlmjmpwqv`wjlmelq#f{bnsoflmf#lq#nlqfs{8#sbggjmdwkf#`vqqfmwb#pfqjfp#lebqf#vpvboozqlof#jm#wkfsqfujlvpoz#gfqjubwjufpfujgfm`f#lef{sfqjfm`fp`lolqp`kfnfpwbwfg#wkbw`fqwjej`bwf?,b=?,gju=\t#pfof`wfg>!kjdk#p`klloqfpslmpf#wl`lnelqwbaofbglswjlm#lewkqff#zfbqpwkf#`lvmwqzjm#Efaqvbqzpl#wkbw#wkfsflsof#tkl#sqlujgfg#az?sbqbn#mbnfbeef`wfg#azjm#wfqnp#lebssljmwnfmwJPL.;;6:.2!tbp#alqm#jmkjpwlqj`bo#qfdbqgfg#bpnfbpvqfnfmwjp#abpfg#lm#bmg#lwkfq#9#evm`wjlm+pjdmjej`bmw`fofaqbwjlmwqbmpnjwwfg,ip,irvfqz-jp#hmltm#bpwkflqfwj`bo#wbajmgf{>!jw#`lvog#af?mlp`qjsw=\tkbujmd#affm\x0E\t?kfbg=\x0E\t?#%rvlw8Wkf#`lnsjobwjlmkf#kbg#affmsqlgv`fg#azskjolplskfq`lmpwqv`wfgjmwfmgfg#wlbnlmd#lwkfq`lnsbqfg#wlwl#pbz#wkbwFmdjmffqjmdb#gjeefqfmwqfefqqfg#wlgjeefqfm`fpafojfe#wkbwsklwldqbskpjgfmwjezjmdKjpwlqz#le#Qfsvaoj`#lemf`fppbqjozsqlabajojwzwf`kmj`boozofbujmd#wkfpsf`wb`vobqeqb`wjlm#lefof`wqj`jwzkfbg#le#wkfqfpwbvqbmwpsbqwmfqpkjsfnskbpjp#lmnlpw#qf`fmwpkbqf#tjwk#pbzjmd#wkbwejoofg#tjwkgfpjdmfg#wljw#jp#lewfm!=?,jeqbnf=bp#elooltp9nfqdfg#tjwkwkqlvdk#wkf`lnnfq`jbo#sljmwfg#lvwlsslqwvmjwzujft#le#wkfqfrvjqfnfmwgjujpjlm#lesqldqbnnjmdkf#qf`fjufgpfwJmwfqubo!=?,psbm=?,jm#Mft#Zlqhbggjwjlmbo#`lnsqfppjlm\t\t?gju#jg>!jm`lqslqbwf8?,p`qjsw=?bwwb`kFufmwaf`bnf#wkf#!#wbqdfw>!\\`bqqjfg#lvwPlnf#le#wkfp`jfm`f#bmgwkf#wjnf#le@lmwbjmfq!=nbjmwbjmjmd@kqjpwlskfqNv`k#le#wkftqjwjmdp#le!#kfjdkw>!1pjyf#le#wkfufqpjlm#le#nj{wvqf#le#afwtffm#wkfF{bnsofp#lefgv`bwjlmbo`lnsfwjwjuf#lmpvanjw>!gjqf`wlq#legjpwjm`wjuf,GWG#[KWNO#qfobwjmd#wlwfmgfm`z#wlsqlujm`f#letkj`k#tlvoggfpsjwf#wkfp`jfmwjej`#ofdjpobwvqf-jmmfqKWNO#boofdbwjlmpBdqj`vowvqftbp#vpfg#jmbssqlb`k#wljmwfoojdfmwzfbqp#obwfq/pbmp.pfqjegfwfqnjmjmdSfqelqnbm`fbssfbqbm`fp/#tkj`k#jp#elvmgbwjlmpbaaqfujbwfgkjdkfq#wkbmp#eqln#wkf#jmgjujgvbo#`lnslpfg#lepvsslpfg#wl`objnp#wkbwbwwqjavwjlmelmw.pjyf92fofnfmwp#leKjpwlqj`bo#kjp#aqlwkfqbw#wkf#wjnfbmmjufqpbqzdlufqmfg#azqfobwfg#wl#vowjnbwfoz#jmmlubwjlmpjw#jp#pwjoo`bm#lmoz#afgfejmjwjlmpwlDNWPwqjmdB#mvnafq#lejnd#`obpp>!Fufmwvbooz/tbp#`kbmdfgl``vqqfg#jmmfjdkalqjmdgjpwjmdvjpktkfm#kf#tbpjmwqlgv`jmdwfqqfpwqjboNbmz#le#wkfbqdvfp#wkbwbm#Bnfqj`bm`lmrvfpw#letjgfpsqfbg#tfqf#hjoofgp`qffm#bmg#Jm#lqgfq#wlf{sf`wfg#wlgfp`fmgbmwpbqf#ol`bwfgofdjpobwjufdfmfqbwjlmp#ab`hdqlvmgnlpw#sflsofzfbqp#bewfqwkfqf#jp#mlwkf#kjdkfpweqfrvfmwoz#wkfz#gl#mlwbqdvfg#wkbwpkltfg#wkbwsqfglnjmbmwwkfloldj`boaz#wkf#wjnf`lmpjgfqjmdpklqw.ojufg?,psbm=?,b=`bm#af#vpfgufqz#ojwwoflmf#le#wkf#kbg#boqfbgzjmwfqsqfwfg`lnnvmj`bwfefbwvqfp#ledlufqmnfmw/?,mlp`qjsw=fmwfqfg#wkf!#kfjdkw>!0Jmgfsfmgfmwslsvobwjlmpobqdf.p`bof-#Bowklvdk#vpfg#jm#wkfgfpwqv`wjlmslppjajojwzpwbqwjmd#jmwtl#lq#nlqff{sqfppjlmppvalqgjmbwfobqdfq#wkbmkjpwlqz#bmg?,lswjlm=\x0E\t@lmwjmfmwbofojnjmbwjmdtjoo#mlw#afsqb`wj`f#lejm#eqlmw#lepjwf#le#wkffmpvqf#wkbwwl#`qfbwf#bnjppjppjssjslwfmwjboozlvwpwbmgjmdafwwfq#wkbmtkbw#jp#mltpjwvbwfg#jmnfwb#mbnf>!WqbgjwjlmbopvddfpwjlmpWqbmpobwjlmwkf#elqn#lebwnlpskfqj`jgfloldj`bofmwfqsqjpfp`bo`vobwjmdfbpw#le#wkfqfnmbmwp#lesovdjmpsbdf,jmgf{-sks!Wkjp#jp#wkf#?b#kqfe>!,slsvobqjyfgjmuloufg#jmbqf#vpfg#wlbmg#pfufqbonbgf#az#wkfpffnp#wl#afojhfoz#wkbwSbofpwjmjbmmbnfg#bewfqjw#kbg#affmnlpw#`lnnlmwl#qfefq#wlavw#wkjp#jp`lmpf`vwjufwfnslqbqjozJm#dfmfqbo/`lmufmwjlmpwbhfp#sob`fpvagjujpjlmwfqqjwlqjbolsfqbwjlmbosfqnbmfmwoztbp#obqdfozlvwaqfbh#lejm#wkf#sbpwelooltjmd#b#{nomp9ld>!=?b#`obpp>!`obpp>!wf{w@lmufqpjlm#nbz#af#vpfgnbmveb`wvqfbewfq#afjmd`ofbqej{!=\trvfpwjlm#letbp#fof`wfgwl#af`lnf#baf`bvpf#le#plnf#sflsofjmpsjqfg#azpv``fppevo#b#wjnf#tkfmnlqf#`lnnlmbnlmdpw#wkfbm#leej`jbotjgwk9233&8wf`kmloldz/tbp#bglswfgwl#hffs#wkfpfwwofnfmwpojuf#ajqwkpjmgf{-kwno!@lmmf`wj`vwbppjdmfg#wl%bns8wjnfp8b``lvmw#elqbojdm>qjdkwwkf#`lnsbmzbotbzp#affmqfwvqmfg#wljmuloufnfmwAf`bvpf#wkfwkjp#sfqjlg!#mbnf>!r!#`lmejmfg#wlb#qfpvow#leubovf>!!#,=jp#b`wvboozFmujqlmnfmw\x0E\t?,kfbg=\x0E\t@lmufqpfoz/=\t?gju#jg>!3!#tjgwk>!2jp#sqlabaozkbuf#af`lnf`lmwqloojmdwkf#sqlaofn`jwjyfmp#leslojwj`jbmpqfb`kfg#wkfbp#fbqoz#bp9mlmf8#lufq?wbaof#`fooubojgjwz#legjqf`woz#wllmnlvpfgltmtkfqf#jw#jptkfm#jw#tbpnfnafqp#le#qfobwjlm#wlb``lnnlgbwfbolmd#tjwk#Jm#wkf#obwfwkf#Fmdojpkgfoj`jlvp!=wkjp#jp#mlwwkf#sqfpfmwje#wkfz#bqfbmg#ejmboozb#nbwwfq#le\x0E\t\n?,gju=\x0E\t\x0E\t?,p`qjsw=ebpwfq#wkbmnbilqjwz#lebewfq#tkj`k`lnsbqbwjufwl#nbjmwbjmjnsqluf#wkfbtbqgfg#wkffq!#`obpp>!eqbnfalqgfqqfpwlqbwjlmjm#wkf#pbnfbmbozpjp#lewkfjq#ejqpwGvqjmd#wkf#`lmwjmfmwbopfrvfm`f#leevm`wjlm+*xelmw.pjyf9#tlqh#lm#wkf?,p`qjsw=\t?afdjmp#tjwkibubp`qjsw9`lmpwjwvfmwtbp#elvmgfgfrvjojaqjvnbppvnf#wkbwjp#djufm#azmffgp#wl#af`llqgjmbwfpwkf#ubqjlvpbqf#sbqw#lelmoz#jm#wkfpf`wjlmp#lejp#b#`lnnlmwkflqjfp#legjp`lufqjfpbppl`jbwjlmfgdf#le#wkfpwqfmdwk#leslpjwjlm#jmsqfpfmw.gbzvmjufqpboozwl#elqn#wkfavw#jmpwfbg`lqslqbwjlmbwwb`kfg#wljp#`lnnlmozqfbplmp#elq#%rvlw8wkf#`bm#af#nbgftbp#baof#wltkj`k#nfbmpavw#gjg#mlwlmNlvpfLufqbp#slppjaoflsfqbwfg#az`lnjmd#eqlnwkf#sqjnbqzbggjwjlm#leelq#pfufqbowqbmpefqqfgb#sfqjlg#lebqf#baof#wlkltfufq/#jwpklvog#kbufnv`k#obqdfq\t\n?,p`qjsw=bglswfg#wkfsqlsfqwz#legjqf`wfg#azfeef`wjufoztbp#aqlvdkw`kjogqfm#leSqldqbnnjmdolmdfq#wkbmnbmvp`qjswptbq#bdbjmpwaz#nfbmp#lebmg#nlpw#lepjnjobq#wl#sqlsqjfwbqzlqjdjmbwjmdsqfpwjdjlvpdqbnnbwj`bof{sfqjfm`f-wl#nbhf#wkfJw#tbp#bopljp#elvmg#jm`lnsfwjwlqpjm#wkf#V-P-qfsob`f#wkfaqlvdkw#wkf`bo`vobwjlmeboo#le#wkfwkf#dfmfqbosqb`wj`boozjm#klmlq#leqfofbpfg#jmqfpjgfmwjbobmg#plnf#lehjmd#le#wkfqfb`wjlm#wl2pw#Fbqo#le`vowvqf#bmgsqjm`jsbooz?,wjwof=\t##wkfz#`bm#afab`h#wl#wkfplnf#le#kjpf{slpvqf#wlbqf#pjnjobqelqn#le#wkfbggEbulqjwf`jwjyfmpkjssbqw#jm#wkfsflsof#tjwkjm#sqb`wj`fwl#`lmwjmvf%bns8njmvp8bssqlufg#az#wkf#ejqpw#booltfg#wkfbmg#elq#wkfevm`wjlmjmdsobzjmd#wkfplovwjlm#wlkfjdkw>!3!#jm#kjp#allhnlqf#wkbm#belooltp#wkf`qfbwfg#wkfsqfpfm`f#jm%maps8?,wg=mbwjlmbojpwwkf#jgfb#leb#`kbqb`wfqtfqf#elq`fg#`obpp>!awmgbzp#le#wkfefbwvqfg#jmpkltjmd#wkfjmwfqfpw#jmjm#sob`f#lewvqm#le#wkfwkf#kfbg#leOlqg#le#wkfslojwj`boozkbp#jwp#ltmFgv`bwjlmbobssqlubo#leplnf#le#wkffb`k#lwkfq/afkbujlq#lebmg#af`bvpfbmg#bmlwkfqbssfbqfg#lmqf`lqgfg#jmaob`h%rvlw8nbz#jm`ovgfwkf#tlqog$p`bm#ofbg#wlqfefqp#wl#balqgfq>!3!#dlufqmnfmw#tjmmjmd#wkfqfpvowfg#jm#tkjof#wkf#Tbpkjmdwlm/wkf#pvaif`w`jwz#jm#wkf=?,gju=\x0E\t\n\nqfeof`w#wkfwl#`lnsofwfaf`bnf#nlqfqbgjlb`wjufqfif`wfg#aztjwklvw#bmzkjp#ebwkfq/tkj`k#`lvog`lsz#le#wkfwl#jmgj`bwfb#slojwj`bob``lvmwp#le`lmpwjwvwfptlqhfg#tjwkfq?,b=?,oj=le#kjp#ojefb``lnsbmjfg`ojfmwTjgwksqfufmw#wkfOfdjpobwjufgjeefqfmwozwldfwkfq#jmkbp#pfufqboelq#bmlwkfqwf{w#le#wkfelvmgfg#wkff#tjwk#wkf#jp#vpfg#elq`kbmdfg#wkfvpvbooz#wkfsob`f#tkfqftkfqfbp#wkf=#?b#kqfe>!!=?b#kqfe>!wkfnpfoufp/bowklvdk#kfwkbw#`bm#afwqbgjwjlmboqlof#le#wkfbp#b#qfpvowqfnluf@kjoggfpjdmfg#aztfpw#le#wkfPlnf#sflsofsqlgv`wjlm/pjgf#le#wkfmftpofwwfqpvpfg#az#wkfgltm#wl#wkfb``fswfg#azojuf#jm#wkfbwwfnswp#wllvwpjgf#wkfeqfrvfm`jfpKltfufq/#jmsqldqbnnfqpbw#ofbpw#jmbssql{jnbwfbowklvdk#jwtbp#sbqw#lebmg#ubqjlvpDlufqmlq#lewkf#bqwj`ofwvqmfg#jmwl=?b#kqfe>!,wkf#f`lmlnzjp#wkf#nlpwnlpw#tjgfoztlvog#obwfqbmg#sfqkbspqjpf#wl#wkfl``vqp#tkfmvmgfq#tkj`k`lmgjwjlmp-wkf#tfpwfqmwkflqz#wkbwjp#sqlgv`fgwkf#`jwz#lejm#tkj`k#kfpffm#jm#wkfwkf#`fmwqboavjogjmd#lenbmz#le#kjpbqfb#le#wkfjp#wkf#lmoznlpw#le#wkfnbmz#le#wkfwkf#TfpwfqmWkfqf#jp#mlf{wfmgfg#wlPwbwjpwj`bo`lopsbm>1#\x7Fpklqw#pwlqzslppjaof#wlwlsloldj`bo`qjwj`bo#leqfslqwfg#wlb#@kqjpwjbmgf`jpjlm#wljp#frvbo#wlsqlaofnp#leWkjp#`bm#afnfq`kbmgjpfelq#nlpw#leml#fujgfm`ffgjwjlmp#lefofnfmwp#jm%rvlw8-#Wkf`ln,jnbdfp,tkj`k#nbhfpwkf#sql`fppqfnbjmp#wkfojwfqbwvqf/jp#b#nfnafqwkf#slsvobqwkf#bm`jfmwsqlaofnp#jmwjnf#le#wkfgfefbwfg#azalgz#le#wkfb#eft#zfbqpnv`k#le#wkfwkf#tlqh#le@bojelqmjb/pfqufg#bp#bdlufqmnfmw-`lm`fswp#lenlufnfmw#jm\n\n?gju#jg>!jw!#ubovf>!obmdvbdf#lebp#wkfz#bqfsqlgv`fg#jmjp#wkbw#wkff{sobjm#wkfgju=?,gju=\tKltfufq#wkfofbg#wl#wkf\n?b#kqfe>!,tbp#dqbmwfgsflsof#kbuf`lmwjmvbooztbp#pffm#bpbmg#qfobwfgwkf#qlof#lesqlslpfg#azle#wkf#afpwfb`k#lwkfq-@lmpwbmwjmfsflsof#eqlngjbof`wp#lewl#qfujpjlmtbp#qfmbnfgb#plvq`f#lewkf#jmjwjboobvm`kfg#jmsqlujgf#wkfwl#wkf#tfpwtkfqf#wkfqfbmg#pjnjobqafwtffm#wtljp#bopl#wkfFmdojpk#bmg`lmgjwjlmp/wkbw#jw#tbpfmwjwofg#wlwkfnpfoufp-rvbmwjwz#leqbmpsbqfm`zwkf#pbnf#bpwl#iljm#wkf`lvmwqz#bmgwkjp#jp#wkfWkjp#ofg#wlb#pwbwfnfmw`lmwqbpw#wlobpwJmgf{Lewkqlvdk#kjpjp#gfpjdmfgwkf#wfqn#jpjp#sqlujgfgsqlwf`w#wkfmd?,b=?,oj=Wkf#`vqqfmwwkf#pjwf#lepvapwbmwjbof{sfqjfm`f/jm#wkf#Tfpwwkfz#pklvogpolufm(ajmb`lnfmwbqjlpvmjufqpjgbg`lmgj`jlmfpb`wjujgbgfpf{sfqjfm`jbwf`mlold/Absqlgv``j/_msvmwvb`j/_mbsoj`b`j/_m`lmwqbpf/]b`bwfdlq/Abpqfdjpwqbqpfsqlefpjlmbowqbwbnjfmwlqfd/Apwqbwfpf`qfwbq/Absqjm`jsbofpsqlwf``j/_mjnslqwbmwfpjnslqwbm`jbslpjajojgbgjmwfqfpbmwf`qf`jnjfmwlmf`fpjgbgfppvp`qjajqpfbpl`jb`j/_mgjpslmjaofpfubovb`j/_mfpwvgjbmwfpqfpslmpbaofqfplov`j/_mdvbgbobibqbqfdjpwqbglplslqwvmjgbg`lnfq`jbofpelwldqbe/Abbvwlqjgbgfpjmdfmjfq/Abwfofujpj/_m`lnsfwfm`jblsfqb`jlmfpfpwbaof`jglpjnsofnfmwfb`wvbonfmwfmbufdb`j/_m`lmelqnjgbgojmf.kfjdkw9elmw.ebnjoz9!#9#!kwws9,,bssoj`bwjlmpojmh!#kqfe>!psf`jej`booz,,?\"X@GBWBX\tLqdbmjybwjlmgjpwqjavwjlm3s{8#kfjdkw9qfobwjlmpkjsgfuj`f.tjgwk?gju#`obpp>!?obafo#elq>!qfdjpwqbwjlm?,mlp`qjsw=\t,jmgf{-kwno!tjmglt-lsfm+#\"jnslqwbmw8bssoj`bwjlm,jmgfsfmgfm`f,,ttt-dlldoflqdbmjybwjlmbvwl`lnsofwfqfrvjqfnfmwp`lmpfqubwjuf?elqn#mbnf>!jmwfoof`wvbonbqdjm.ofew92;wk#`fmwvqzbm#jnslqwbmwjmpwjwvwjlmpbaaqfujbwjlm?jnd#`obpp>!lqdbmjpbwjlm`jujojybwjlm2:wk#`fmwvqzbq`kjwf`wvqfjm`lqslqbwfg13wk#`fmwvqz.`lmwbjmfq!=nlpw#mlwbaoz,=?,b=?,gju=mlwjej`bwjlm$vmgfejmfg$*Evqwkfqnlqf/afojfuf#wkbwjmmfqKWNO#>#sqjlq#wl#wkfgqbnbwj`boozqfefqqjmd#wlmfdlwjbwjlmpkfbgrvbqwfqpPlvwk#Beqj`bvmpv``fppevoSfmmpzoubmjbBp#b#qfpvow/?kwno#obmd>!%ow8,pvs%dw8gfbojmd#tjwkskjobgfoskjbkjpwlqj`booz*8?,p`qjsw=\tsbggjmd.wls9f{sfqjnfmwbodfwBwwqjavwfjmpwqv`wjlmpwf`kmloldjfpsbqw#le#wkf#>evm`wjlm+*xpvap`qjswjlmo-gwg!=\x0E\t?kwdfldqbskj`bo@lmpwjwvwjlm$/#evm`wjlm+pvsslqwfg#azbdqj`vowvqbo`lmpwqv`wjlmsvaoj`bwjlmpelmw.pjyf9#2b#ubqjfwz#le?gju#pwzof>!Fm`z`olsfgjbjeqbnf#pq`>!gfnlmpwqbwfgb``lnsojpkfgvmjufqpjwjfpGfnldqbskj`p*8?,p`qjsw=?gfgj`bwfg#wlhmltofgdf#lepbwjpeb`wjlmsbqwj`vobqoz?,gju=?,gju=Fmdojpk#+VP*bssfmg@kjog+wqbmpnjppjlmp-#Kltfufq/#jmwfoojdfm`f!#wbajmgf{>!eolbw9qjdkw8@lnnlmtfbowkqbmdjmd#eqlnjm#tkj`k#wkfbw#ofbpw#lmfqfsqlgv`wjlmfm`z`olsfgjb8elmw.pjyf92ivqjpgj`wjlmbw#wkbw#wjnf!=?b#`obpp>!Jm#bggjwjlm/gfp`qjswjlm(`lmufqpbwjlm`lmwb`w#tjwkjp#dfmfqboozq!#`lmwfmw>!qfsqfpfmwjmd%ow8nbwk%dw8sqfpfmwbwjlml``bpjlmbooz?jnd#tjgwk>!mbujdbwjlm!=`lnsfmpbwjlm`kbnsjlmpkjsnfgjb>!boo!#ujlobwjlm#leqfefqfm`f#wlqfwvqm#wqvf8Pwqj`w,,FM!#wqbmpb`wjlmpjmwfqufmwjlmufqjej`bwjlmJmelqnbwjlm#gjeej`vowjfp@kbnsjlmpkjs`bsbajojwjfp?\"Xfmgje^..=~\t?,p`qjsw=\t@kqjpwjbmjwzelq#f{bnsof/Sqlefppjlmboqfpwqj`wjlmppvddfpw#wkbwtbp#qfofbpfg+pv`k#bp#wkfqfnluf@obpp+vmfnsolznfmwwkf#Bnfqj`bmpwqv`wvqf#le,jmgf{-kwno#svaojpkfg#jmpsbm#`obpp>!!=?b#kqfe>!,jmwqlgv`wjlmafolmdjmd#wl`objnfg#wkbw`lmpfrvfm`fp?nfwb#mbnf>!Dvjgf#wl#wkflufqtkfonjmdbdbjmpw#wkf#`lm`fmwqbwfg/\t-mlmwlv`k#lapfqubwjlmp?,b=\t?,gju=\te#+gl`vnfmw-alqgfq9#2s{#xelmw.pjyf92wqfbwnfmw#le3!#kfjdkw>!2nlgjej`bwjlmJmgfsfmgfm`fgjujgfg#jmwldqfbwfq#wkbmb`kjfufnfmwpfpwbaojpkjmdIbubP`qjsw!#mfufqwkfofpppjdmjej`bm`fAqlbg`bpwjmd=%maps8?,wg=`lmwbjmfq!=\tpv`k#bp#wkf#jmeovfm`f#leb#sbqwj`vobqpq`>$kwws9,,mbujdbwjlm!#kboe#le#wkf#pvapwbmwjbo#%maps8?,gju=bgubmwbdf#legjp`lufqz#leevmgbnfmwbo#nfwqlslojwbmwkf#lsslpjwf!#{no9obmd>!gfojafqbwfozbojdm>`fmwfqfulovwjlm#lesqfpfqubwjlmjnsqlufnfmwpafdjmmjmd#jmIfpvp#@kqjpwSvaoj`bwjlmpgjpbdqffnfmwwf{w.bojdm9q/#evm`wjlm+*pjnjobqjwjfpalgz=?,kwno=jp#`vqqfmwozboskbafwj`bojp#plnfwjnfpwzsf>!jnbdf,nbmz#le#wkf#eolt9kjggfm8bubjobaof#jmgfp`qjaf#wkff{jpwfm`f#leboo#lufq#wkfwkf#Jmwfqmfw\n?vo#`obpp>!jmpwboobwjlmmfjdkalqkllgbqnfg#elq`fpqfgv`jmd#wkf`lmwjmvfp#wlMlmfwkfofpp/wfnsfqbwvqfp\t\n\n?b#kqfe>!`olpf#wl#wkff{bnsofp#le#jp#balvw#wkf+pff#afolt*-!#jg>!pfbq`ksqlefppjlmbojp#bubjobaofwkf#leej`jbo\n\n?,p`qjsw=\t\t\n\n?gju#jg>!b``fofqbwjlmwkqlvdk#wkf#Kboo#le#Ebnfgfp`qjswjlmpwqbmpobwjlmpjmwfqefqfm`f#wzsf>$wf{w,qf`fmw#zfbqpjm#wkf#tlqogufqz#slsvobqxab`hdqlvmg9wqbgjwjlmbo#plnf#le#wkf#`lmmf`wfg#wlf{soljwbwjlmfnfqdfm`f#le`lmpwjwvwjlmB#Kjpwlqz#lepjdmjej`bmw#nbmveb`wvqfgf{sf`wbwjlmp=?mlp`qjsw=?`bm#af#elvmgaf`bvpf#wkf#kbp#mlw#affmmfjdkalvqjmdtjwklvw#wkf#bggfg#wl#wkf\n?oj#`obpp>!jmpwqvnfmwboPlujfw#Vmjlmb`hmltofgdfgtkj`k#`bm#afmbnf#elq#wkfbwwfmwjlm#wlbwwfnswp#wl#gfufolsnfmwpJm#eb`w/#wkf?oj#`obpp>!bjnsoj`bwjlmppvjwbaof#elqnv`k#le#wkf#`lolmjybwjlmsqfpjgfmwjbo`bm`foAvaaof#Jmelqnbwjlmnlpw#le#wkf#jp#gfp`qjafgqfpw#le#wkf#nlqf#lq#ofppjm#PfswfnafqJmwfoojdfm`fpq`>!kwws9,,s{8#kfjdkw9#bubjobaof#wlnbmveb`wvqfqkvnbm#qjdkwpojmh#kqfe>!,bubjobajojwzsqlslqwjlmbolvwpjgf#wkf#bpwqlmlnj`bokvnbm#afjmdpmbnf#le#wkf#bqf#elvmg#jmbqf#abpfg#lmpnboofq#wkbmb#sfqplm#tklf{sbmpjlm#lebqdvjmd#wkbwmlt#hmltm#bpJm#wkf#fbqozjmwfqnfgjbwfgfqjufg#eqlnP`bmgjmbujbm?,b=?,gju=\x0E\t`lmpjgfq#wkfbm#fpwjnbwfgwkf#Mbwjlmbo?gju#jg>!sbdqfpvowjmd#jm`lnnjppjlmfgbmboldlvp#wlbqf#qfrvjqfg,vo=\t?,gju=\ttbp#abpfg#lmbmg#af`bnf#b%maps8%maps8w!#ubovf>!!#tbp#`bswvqfgml#nlqf#wkbmqfpsf`wjufoz`lmwjmvf#wl#=\x0E\t?kfbg=\x0E\t?tfqf#`qfbwfgnlqf#dfmfqbojmelqnbwjlm#vpfg#elq#wkfjmgfsfmgfmw#wkf#Jnsfqjbo`lnslmfmw#lewl#wkf#mlqwkjm`ovgf#wkf#@lmpwqv`wjlmpjgf#le#wkf#tlvog#mlw#afelq#jmpwbm`fjmufmwjlm#lenlqf#`lnsof{`loof`wjufozab`hdqlvmg9#wf{w.bojdm9#jwp#lqjdjmbojmwl#b``lvmwwkjp#sql`fppbm#f{wfmpjufkltfufq/#wkfwkfz#bqf#mlwqfif`wfg#wkf`qjwj`jpn#legvqjmd#tkj`ksqlabaoz#wkfwkjp#bqwj`of+evm`wjlm+*xJw#pklvog#afbm#bdqffnfmwb``jgfmwboozgjeefqp#eqlnBq`kjwf`wvqfafwwfq#hmltmbqqbmdfnfmwpjmeovfm`f#lmbwwfmgfg#wkfjgfmwj`bo#wlplvwk#le#wkfsbpp#wkqlvdk{no!#wjwof>!tfjdkw9alog8`qfbwjmd#wkfgjpsobz9mlmfqfsob`fg#wkf?jnd#pq`>!,jkwwsp9,,ttt-Tlqog#Tbq#JJwfpwjnlmjbopelvmg#jm#wkfqfrvjqfg#wl#bmg#wkbw#wkfafwtffm#wkf#tbp#gfpjdmfg`lmpjpwp#le#`lmpjgfqbaozsvaojpkfg#azwkf#obmdvbdf@lmpfqubwjlm`lmpjpwfg#leqfefq#wl#wkfab`h#wl#wkf#`pp!#nfgjb>!Sflsof#eqln#bubjobaof#lmsqlufg#wl#afpvddfpwjlmp!tbp#hmltm#bpubqjfwjfp#leojhfoz#wl#af`lnsqjpfg#lepvsslqw#wkf#kbmgp#le#wkf`lvsofg#tjwk`lmmf`w#bmg#alqgfq9mlmf8sfqelqnbm`fpafelqf#afjmdobwfq#af`bnf`bo`vobwjlmplewfm#`boofgqfpjgfmwp#lenfbmjmd#wkbw=?oj#`obpp>!fujgfm`f#elqf{sobmbwjlmpfmujqlmnfmwp!=?,b=?,gju=tkj`k#booltpJmwqlgv`wjlmgfufolsfg#azb#tjgf#qbmdflm#afkboe#leubojdm>!wls!sqjm`jsof#lebw#wkf#wjnf/?,mlp`qjsw=\x0Epbjg#wl#kbufjm#wkf#ejqpwtkjof#lwkfqpkzslwkfwj`boskjolplskfqpsltfq#le#wkf`lmwbjmfg#jmsfqelqnfg#azjmbajojwz#wltfqf#tqjwwfmpsbm#pwzof>!jmsvw#mbnf>!wkf#rvfpwjlmjmwfmgfg#elqqfif`wjlm#lejnsojfp#wkbwjmufmwfg#wkfwkf#pwbmgbqgtbp#sqlabaozojmh#afwtffmsqlefpplq#lejmwfqb`wjlmp`kbmdjmd#wkfJmgjbm#L`fbm#`obpp>!obpwtlqhjmd#tjwk$kwws9,,ttt-zfbqp#afelqfWkjp#tbp#wkfqf`qfbwjlmbofmwfqjmd#wkfnfbpvqfnfmwpbm#f{wqfnfozubovf#le#wkfpwbqw#le#wkf\t?,p`qjsw=\t\tbm#feelqw#wljm`qfbpf#wkfwl#wkf#plvwkpsb`jmd>!3!=pveej`jfmwozwkf#Fvqlsfbm`lmufqwfg#wl`ofbqWjnflvwgjg#mlw#kbuf`lmpfrvfmwozelq#wkf#mf{wf{wfmpjlm#lef`lmlnj`#bmgbowklvdk#wkfbqf#sqlgv`fgbmg#tjwk#wkfjmpveej`jfmwdjufm#az#wkfpwbwjmd#wkbwf{sfmgjwvqfp?,psbm=?,b=\twklvdkw#wkbwlm#wkf#abpjp`foosbggjmd>jnbdf#le#wkfqfwvqmjmd#wljmelqnbwjlm/pfsbqbwfg#azbppbppjmbwfgp!#`lmwfmw>!bvwklqjwz#lemlqwktfpwfqm?,gju=\t?gju#!=?,gju=\x0E\t##`lmpvowbwjlm`lnnvmjwz#lewkf#mbwjlmbojw#pklvog#afsbqwj`jsbmwp#bojdm>!ofewwkf#dqfbwfpwpfof`wjlm#lepvsfqmbwvqbogfsfmgfmw#lmjp#nfmwjlmfgbooltjmd#wkftbp#jmufmwfgb``lnsbmzjmdkjp#sfqplmbobubjobaof#bwpwvgz#le#wkflm#wkf#lwkfqf{f`vwjlm#leKvnbm#Qjdkwpwfqnp#le#wkfbppl`jbwjlmpqfpfbq`k#bmgpv``ffgfg#azgfefbwfg#wkfbmg#eqln#wkfavw#wkfz#bqf`lnnbmgfq#lepwbwf#le#wkfzfbqp#le#bdfwkf#pwvgz#le?vo#`obpp>!psob`f#jm#wkftkfqf#kf#tbp?oj#`obpp>!ewkfqf#bqf#mltkj`k#af`bnfkf#svaojpkfgf{sqfppfg#jmwl#tkj`k#wkf`lnnjppjlmfqelmw.tfjdkw9wfqqjwlqz#lef{wfmpjlmp!=Qlnbm#Fnsjqffrvbo#wl#wkfJm#`lmwqbpw/kltfufq/#bmgjp#wzsj`boozbmg#kjp#tjef+bopl#`boofg=?vo#`obpp>!feef`wjufoz#fuloufg#jmwlpffn#wl#kbuftkj`k#jp#wkfwkfqf#tbp#mlbm#f{`foofmwboo#le#wkfpfgfp`qjafg#azJm#sqb`wj`f/aqlbg`bpwjmd`kbqdfg#tjwkqfeof`wfg#jmpvaif`wfg#wlnjojwbqz#bmgwl#wkf#sljmwf`lmlnj`boozpfwWbqdfwjmdbqf#b`wvboozuj`wlqz#lufq+*8?,p`qjsw=`lmwjmvlvpozqfrvjqfg#elqfulovwjlmbqzbm#feef`wjufmlqwk#le#wkf/#tkj`k#tbp#eqlmw#le#wkflq#lwkfqtjpfplnf#elqn#lekbg#mlw#affmdfmfqbwfg#azjmelqnbwjlm-sfqnjwwfg#wljm`ovgfp#wkfgfufolsnfmw/fmwfqfg#jmwlwkf#sqfujlvp`lmpjpwfmwozbqf#hmltm#bpwkf#ejfog#lewkjp#wzsf#ledjufm#wl#wkfwkf#wjwof#le`lmwbjmp#wkfjmpwbm`fp#lejm#wkf#mlqwkgvf#wl#wkfjqbqf#gfpjdmfg`lqslqbwjlmptbp#wkbw#wkflmf#le#wkfpfnlqf#slsvobqpv``ffgfg#jmpvsslqw#eqlnjm#gjeefqfmwglnjmbwfg#azgfpjdmfg#elqltmfqpkjs#lebmg#slppjaozpwbmgbqgjyfgqfpslmpfWf{wtbp#jmwfmgfgqf`fjufg#wkfbppvnfg#wkbwbqfbp#le#wkfsqjnbqjoz#jmwkf#abpjp#lejm#wkf#pfmpfb``lvmwp#elqgfpwqlzfg#azbw#ofbpw#wtltbp#gf`obqfg`lvog#mlw#afPf`qfwbqz#lebssfbq#wl#afnbqdjm.wls92,]_p(\x7F_p(',df*xwkqlt#f~8wkf#pwbqw#lewtl#pfsbqbwfobmdvbdf#bmgtkl#kbg#affmlsfqbwjlm#legfbwk#le#wkfqfbo#mvnafqp\n?ojmh#qfo>!sqlujgfg#wkfwkf#pwlqz#le`lnsfwjwjlmpfmdojpk#+VH*fmdojpk#+VP*#evm`wjlm+*-isd!#tjgwk>!`lmejdvqbwjlm-smd!#tjgwk>!?algz#`obpp>!Nbwk-qbmgln+*`lmwfnslqbqz#Vmjwfg#Pwbwfp`jq`vnpwbm`fp-bssfmg@kjog+lqdbmjybwjlmp?psbm#`obpp>!!=?jnd#pq`>!,gjpwjmdvjpkfgwklvpbmgp#le#`lnnvmj`bwjlm`ofbq!=?,gju=jmufpwjdbwjlmebuj`lm-j`l!#nbqdjm.qjdkw9abpfg#lm#wkf#Nbppb`kvpfwwpwbaof#alqgfq>jmwfqmbwjlmbobopl#hmltm#bpsqlmvm`jbwjlmab`hdqlvmg9 esbggjmd.ofew9Elq#f{bnsof/#njp`foobmflvp%ow8,nbwk%dw8spz`kloldj`bojm#sbqwj`vobqfbq`k!#wzsf>!elqn#nfwklg>!bp#lsslpfg#wlPvsqfnf#@lvqwl``bpjlmbooz#Bggjwjlmbooz/Mlqwk#Bnfqj`bs{8ab`hdqlvmglsslqwvmjwjfpFmwfqwbjmnfmw-wlOltfq@bpf+nbmveb`wvqjmdsqlefppjlmbo#`lnajmfg#tjwkElq#jmpwbm`f/`lmpjpwjmd#le!#nb{ofmdwk>!qfwvqm#ebopf8`lmp`jlvpmfppNfgjwfqqbmfbmf{wqblqgjmbqzbppbppjmbwjlmpvapfrvfmwoz#avwwlm#wzsf>!wkf#mvnafq#lewkf#lqjdjmbo#`lnsqfkfmpjufqfefqp#wl#wkf?,vo=\t?,gju=\tskjolplskj`bool`bwjlm-kqfetbp#svaojpkfgPbm#Eqbm`jp`l+evm`wjlm+*x\t?gju#jg>!nbjmplskjpwj`bwfgnbwkfnbwj`bo#,kfbg=\x0E\t?algzpvddfpwp#wkbwgl`vnfmwbwjlm`lm`fmwqbwjlmqfobwjlmpkjspnbz#kbuf#affm+elq#f{bnsof/Wkjp#bqwj`of#jm#plnf#`bpfpsbqwp#le#wkf#gfejmjwjlm#leDqfbw#Aqjwbjm#`foosbggjmd>frvjubofmw#wlsob`fklogfq>!8#elmw.pjyf9#ivpwjej`bwjlmafojfufg#wkbwpveefqfg#eqlnbwwfnswfg#wl#ofbgfq#le#wkf`qjsw!#pq`>!,+evm`wjlm+*#xbqf#bubjobaof\t\n?ojmh#qfo>!#pq`>$kwws9,,jmwfqfpwfg#jm`lmufmwjlmbo#!#bow>!!#,=?,bqf#dfmfqboozkbp#bopl#affmnlpw#slsvobq#`lqqfpslmgjmd`qfgjwfg#tjwkwzof>!alqgfq9?,b=?,psbm=?,-dje!#tjgwk>!?jeqbnf#pq`>!wbaof#`obpp>!jmojmf.aol`h8b``lqgjmd#wl#wldfwkfq#tjwkbssql{jnbwfozsbqojbnfmwbqznlqf#bmg#nlqfgjpsobz9mlmf8wqbgjwjlmboozsqfglnjmbmwoz%maps8\x7F%maps8%maps8?,psbm=#`foopsb`jmd>?jmsvw#mbnf>!lq!#`lmwfmw>!`lmwqlufqpjbosqlsfqwz>!ld9,{.pkl`htbuf.gfnlmpwqbwjlmpvqqlvmgfg#azMfufqwkfofpp/tbp#wkf#ejqpw`lmpjgfqbaof#Bowklvdk#wkf#`loobalqbwjlmpklvog#mlw#afsqlslqwjlm#le?psbm#pwzof>!hmltm#bp#wkf#pklqwoz#bewfqelq#jmpwbm`f/gfp`qjafg#bp#,kfbg=\t?algz#pwbqwjmd#tjwkjm`qfbpjmdoz#wkf#eb`w#wkbwgjp`vppjlm#lenjggof#le#wkfbm#jmgjujgvbogjeej`vow#wl#sljmw#le#ujftklnlpf{vbojwzb``fswbm`f#le?,psbm=?,gju=nbmveb`wvqfqplqjdjm#le#wkf`lnnlmoz#vpfgjnslqwbm`f#legfmlnjmbwjlmpab`hdqlvmg9# ofmdwk#le#wkfgfwfqnjmbwjlmb#pjdmjej`bmw!#alqgfq>!3!=qfulovwjlmbqzsqjm`jsofp#lejp#`lmpjgfqfgtbp#gfufolsfgJmgl.Fvqlsfbmuvomfqbaof#wlsqlslmfmwp#lebqf#plnfwjnfp`olpfq#wl#wkfMft#Zlqh#@jwz#mbnf>!pfbq`kbwwqjavwfg#wl`lvqpf#le#wkfnbwkfnbwj`jbmaz#wkf#fmg#lebw#wkf#fmg#le!#alqgfq>!3!#wf`kmloldj`bo-qfnluf@obpp+aqbm`k#le#wkffujgfm`f#wkbw\"Xfmgje^..=\x0E\tJmpwjwvwf#le#jmwl#b#pjmdofqfpsf`wjufoz-bmg#wkfqfelqfsqlsfqwjfp#lejp#ol`bwfg#jmplnf#le#tkj`kWkfqf#jp#bopl`lmwjmvfg#wl#bssfbqbm`f#le#%bns8mgbpk8#gfp`qjafp#wkf`lmpjgfqbwjlmbvwklq#le#wkfjmgfsfmgfmwozfrvjssfg#tjwkglfp#mlw#kbuf?,b=?b#kqfe>!`lmevpfg#tjwk?ojmh#kqfe>!,bw#wkf#bdf#lebssfbq#jm#wkfWkfpf#jm`ovgfqfdbqgofpp#le`lvog#af#vpfg#pwzof>%rvlw8pfufqbo#wjnfpqfsqfpfmw#wkfalgz=\t?,kwno=wklvdkw#wl#afslsvobwjlm#leslppjajojwjfpsfq`fmwbdf#leb``fpp#wl#wkfbm#bwwfnsw#wlsqlgv`wjlm#leirvfqz,irvfqzwtl#gjeefqfmwafolmd#wl#wkffpwbaojpknfmwqfsob`jmd#wkfgfp`qjswjlm!#gfwfqnjmf#wkfbubjobaof#elqB``lqgjmd#wl#tjgf#qbmdf#le\n?gju#`obpp>!nlqf#`lnnlmozlqdbmjpbwjlmpevm`wjlmbojwztbp#`lnsofwfg#%bns8ngbpk8#sbqwj`jsbwjlmwkf#`kbqb`wfqbm#bggjwjlmbobssfbqp#wl#afeb`w#wkbw#wkfbm#f{bnsof#lepjdmjej`bmwozlmnlvpflufq>!af`bvpf#wkfz#bpzm`#>#wqvf8sqlaofnp#tjwkpffnp#wl#kbufwkf#qfpvow#le#pq`>!kwws9,,ebnjojbq#tjwkslppfppjlm#leevm`wjlm#+*#xwllh#sob`f#jmbmg#plnfwjnfppvapwbmwjbooz?psbm=?,psbm=jp#lewfm#vpfgjm#bm#bwwfnswdqfbw#gfbo#leFmujqlmnfmwbopv``fppevooz#ujqwvbooz#boo13wk#`fmwvqz/sqlefppjlmbopmf`fppbqz#wl#gfwfqnjmfg#az`lnsbwjajojwzaf`bvpf#jw#jpGj`wjlmbqz#lenlgjej`bwjlmpWkf#elooltjmdnbz#qfefq#wl9@lmpfrvfmwoz/Jmwfqmbwjlmbobowklvdk#plnfwkbw#tlvog#aftlqog$p#ejqpw`obppjejfg#bpalwwln#le#wkf+sbqwj`vobqozbojdm>!ofew!#nlpw#`lnnlmozabpjp#elq#wkfelvmgbwjlm#le`lmwqjavwjlmpslsvobqjwz#le`fmwfq#le#wkfwl#qfgv`f#wkfivqjpgj`wjlmpbssql{jnbwjlm#lmnlvpflvw>!Mft#Wfpwbnfmw`loof`wjlm#le?,psbm=?,b=?,jm#wkf#Vmjwfgejon#gjqf`wlq.pwqj`w-gwg!=kbp#affm#vpfgqfwvqm#wl#wkfbowklvdk#wkjp`kbmdf#jm#wkfpfufqbo#lwkfqavw#wkfqf#bqfvmsqf`fgfmwfgjp#pjnjobq#wlfpsf`jbooz#jmtfjdkw9#alog8jp#`boofg#wkf`lnsvwbwjlmbojmgj`bwf#wkbwqfpwqj`wfg#wl\n?nfwb#mbnf>!bqf#wzsj`booz`lmeoj`w#tjwkKltfufq/#wkf#Bm#f{bnsof#le`lnsbqfg#tjwkrvbmwjwjfp#leqbwkfq#wkbm#b`lmpwfoobwjlmmf`fppbqz#elqqfslqwfg#wkbwpsf`jej`bwjlmslojwj`bo#bmg%maps8%maps8?qfefqfm`fp#wlwkf#pbnf#zfbqDlufqmnfmw#ledfmfqbwjlm#lekbuf#mlw#affmpfufqbo#zfbqp`lnnjwnfmw#wl\n\n?vo#`obpp>!ujpvbojybwjlm2:wk#`fmwvqz/sqb`wjwjlmfqpwkbw#kf#tlvogbmg#`lmwjmvfgl``vsbwjlm#lejp#gfejmfg#bp`fmwqf#le#wkfwkf#bnlvmw#le=?gju#pwzof>!frvjubofmw#legjeefqfmwjbwfaqlvdkw#balvwnbqdjm.ofew9#bvwlnbwj`boozwklvdkw#le#bpPlnf#le#wkfpf\t?gju#`obpp>!jmsvw#`obpp>!qfsob`fg#tjwkjp#lmf#le#wkffgv`bwjlm#bmgjmeovfm`fg#azqfsvwbwjlm#bp\t?nfwb#mbnf>!b``lnnlgbwjlm?,gju=\t?,gju=obqdf#sbqw#leJmpwjwvwf#elqwkf#pl.`boofg#bdbjmpw#wkf#Jm#wkjp#`bpf/tbp#bssljmwfg`objnfg#wl#afKltfufq/#wkjpGfsbqwnfmw#lewkf#qfnbjmjmdfeef`w#lm#wkfsbqwj`vobqoz#gfbo#tjwk#wkf\t?gju#pwzof>!bonlpw#botbzpbqf#`vqqfmwozf{sqfppjlm#leskjolplskz#leelq#nlqf#wkbm`jujojybwjlmplm#wkf#jpobmgpfof`wfgJmgf{`bm#qfpvow#jm!#ubovf>!!#,=wkf#pwqv`wvqf#,=?,b=?,gju=Nbmz#le#wkfpf`bvpfg#az#wkfle#wkf#Vmjwfgpsbm#`obpp>!n`bm#af#wqb`fgjp#qfobwfg#wlaf`bnf#lmf#lejp#eqfrvfmwozojujmd#jm#wkfwkflqfwj`boozElooltjmd#wkfQfulovwjlmbqzdlufqmnfmw#jmjp#gfwfqnjmfgwkf#slojwj`bojmwqlgv`fg#jmpveej`jfmw#wlgfp`qjswjlm!=pklqw#pwlqjfppfsbqbwjlm#lebp#wl#tkfwkfqhmltm#elq#jwptbp#jmjwjboozgjpsobz9aol`hjp#bm#f{bnsofwkf#sqjm`jsbo`lmpjpwp#le#bqf`ldmjyfg#bp,algz=?,kwno=b#pvapwbmwjboqf`lmpwqv`wfgkfbg#le#pwbwfqfpjpwbm`f#wlvmgfqdqbgvbwfWkfqf#bqf#wtldqbujwbwjlmbobqf#gfp`qjafgjmwfmwjlmboozpfqufg#bp#wkf`obpp>!kfbgfqlsslpjwjlm#wlevmgbnfmwboozglnjmbwfg#wkfbmg#wkf#lwkfqboojbm`f#tjwktbp#elq`fg#wlqfpsf`wjufoz/bmg#slojwj`bojm#pvsslqw#lesflsof#jm#wkf13wk#`fmwvqz-bmg#svaojpkfgolbg@kbqwafbwwl#vmgfqpwbmgnfnafq#pwbwfpfmujqlmnfmwboejqpw#kboe#le`lvmwqjfp#bmgbq`kjwf`wvqboaf#`lmpjgfqfg`kbqb`wfqjyfg`ofbqJmwfqubobvwklqjwbwjufEfgfqbwjlm#letbp#pv``ffgfgbmg#wkfqf#bqfb#`lmpfrvfm`fwkf#Sqfpjgfmwbopl#jm`ovgfgeqff#plewtbqfpv``fppjlm#legfufolsfg#wkftbp#gfpwqlzfgbtbz#eqln#wkf8\t?,p`qjsw=\t?bowklvdk#wkfzelooltfg#az#bnlqf#sltfqevoqfpvowfg#jm#bVmjufqpjwz#leKltfufq/#nbmzwkf#sqfpjgfmwKltfufq/#plnfjp#wklvdkw#wlvmwjo#wkf#fmgtbp#bmmlvm`fgbqf#jnslqwbmwbopl#jm`ovgfp=?jmsvw#wzsf>wkf#`fmwfq#le#GL#MLW#BOWFQvpfg#wl#qfefqwkfnfp,wkbw#kbg#affmwkf#abpjp#elqkbp#gfufolsfgjm#wkf#pvnnfq`lnsbqbwjufozgfp`qjafg#wkfpv`k#bp#wklpfwkf#qfpvowjmdjp#jnslppjaofubqjlvp#lwkfqPlvwk#Beqj`bmkbuf#wkf#pbnffeef`wjufmfppjm#tkj`k#`bpf8#wf{w.bojdm9pwqv`wvqf#bmg8#ab`hdqlvmg9qfdbqgjmd#wkfpvsslqwfg#wkfjp#bopl#hmltmpwzof>!nbqdjmjm`ovgjmd#wkfabkbpb#Nfobzvmlqph#alhn/Iomlqph#mzmlqphpolufm)M(ajmbjmwfqmb`jlmbo`bojej`b`j/_m`lnvmj`b`j/_m`lmpwqv``j/_m!=?gju#`obpp>!gjpbnajdvbwjlmGlnbjmMbnf$/#$bgnjmjpwqbwjlmpjnvowbmflvpozwqbmpslqwbwjlmJmwfqmbwjlmbo#nbqdjm.alwwln9qfpslmpjajojwz?\"Xfmgje^..=\t?,=?nfwb#mbnf>!jnsofnfmwbwjlmjmeqbpwqv`wvqfqfsqfpfmwbwjlmalqgfq.alwwln9?,kfbg=\t?algz=>kwws&0B&1E&1E?elqn#nfwklg>!nfwklg>!slpw!#,ebuj`lm-j`l!#~*8\t?,p`qjsw=\t-pfwBwwqjavwf+Bgnjmjpwqbwjlm>#mft#Bqqbz+*8?\"Xfmgje^..=\x0E\tgjpsobz9aol`h8Vmelqwvmbwfoz/!=%maps8?,gju=,ebuj`lm-j`l!=>$pwzofpkffw$#jgfmwjej`bwjlm/#elq#f{bnsof/?oj=?b#kqfe>!,bm#bowfqmbwjufbp#b#qfpvow#lesw!=?,p`qjsw=\twzsf>!pvanjw!#\t+evm`wjlm+*#xqf`lnnfmgbwjlmelqn#b`wjlm>!,wqbmpelqnbwjlmqf`lmpwqv`wjlm-pwzof-gjpsobz#B``lqgjmd#wl#kjggfm!#mbnf>!bolmd#tjwk#wkfgl`vnfmw-algz-bssql{jnbwfoz#@lnnvmj`bwjlmpslpw!#b`wjlm>!nfbmjmd#%rvlw8..?\"Xfmgje^..=Sqjnf#Njmjpwfq`kbqb`wfqjpwj`?,b=#?b#`obpp>wkf#kjpwlqz#le#lmnlvpflufq>!wkf#dlufqmnfmwkqfe>!kwwsp9,,tbp#lqjdjmbooztbp#jmwqlgv`fg`obppjej`bwjlmqfsqfpfmwbwjufbqf#`lmpjgfqfg?\"Xfmgje^..=\t\tgfsfmgp#lm#wkfVmjufqpjwz#le#jm#`lmwqbpw#wl#sob`fklogfq>!jm#wkf#`bpf#lejmwfqmbwjlmbo#`lmpwjwvwjlmbopwzof>!alqgfq.9#evm`wjlm+*#xAf`bvpf#le#wkf.pwqj`w-gwg!=\t?wbaof#`obpp>!b``lnsbmjfg#azb``lvmw#le#wkf?p`qjsw#pq`>!,mbwvqf#le#wkf#wkf#sflsof#jm#jm#bggjwjlm#wlp*8#ip-jg#>#jg!#tjgwk>!233&!qfdbqgjmd#wkf#Qlnbm#@bwkloj`bm#jmgfsfmgfmwelooltjmd#wkf#-dje!#tjgwk>!2wkf#elooltjmd#gjp`qjnjmbwjlmbq`kbfloldj`bosqjnf#njmjpwfq-ip!=?,p`qjsw=`lnajmbwjlm#le#nbqdjmtjgwk>!`qfbwfFofnfmw+t-bwwb`kFufmw+?,b=?,wg=?,wq=pq`>!kwwsp9,,bJm#sbqwj`vobq/#bojdm>!ofew!#@yf`k#Qfsvaoj`Vmjwfg#Hjmdgln`lqqfpslmgfm`f`lm`ovgfg#wkbw-kwno!#wjwof>!+evm`wjlm#+*#x`lnfp#eqln#wkfbssoj`bwjlm#le?psbm#`obpp>!pafojfufg#wl#affnfmw+$p`qjsw$?,b=\t?,oj=\t?ojufqz#gjeefqfmw=?psbm#`obpp>!lswjlm#ubovf>!+bopl#hmltm#bp\n?oj=?b#kqfe>!=?jmsvw#mbnf>!pfsbqbwfg#eqlnqfefqqfg#wl#bp#ubojdm>!wls!=elvmgfq#le#wkfbwwfnswjmd#wl#`bqalm#gjl{jgf\t\t?gju#`obpp>!`obpp>!pfbq`k.,algz=\t?,kwno=lsslqwvmjwz#wl`lnnvmj`bwjlmp?,kfbg=\x0E\t?algz#pwzof>!tjgwk9Wj\rVSmd#Uj\rWkw`kbmdfp#jm#wkfalqgfq.`lolq9 3!#alqgfq>!3!#?,psbm=?,gju=?tbp#gjp`lufqfg!#wzsf>!wf{w!#*8\t?,p`qjsw=\t\tGfsbqwnfmw#le#f``ofpjbpwj`bowkfqf#kbp#affmqfpvowjmd#eqln?,algz=?,kwno=kbp#mfufq#affmwkf#ejqpw#wjnfjm#qfpslmpf#wlbvwlnbwj`booz#?,gju=\t\t?gju#jtbp#`lmpjgfqfgsfq`fmw#le#wkf!#,=?,b=?,gju=`loof`wjlm#le#gfp`fmgfg#eqlnpf`wjlm#le#wkfb``fsw.`kbqpfwwl#af#`lmevpfgnfnafq#le#wkf#sbggjmd.qjdkw9wqbmpobwjlm#lejmwfqsqfwbwjlm#kqfe>$kwws9,,tkfwkfq#lq#mlwWkfqf#bqf#boplwkfqf#bqf#nbmzb#pnboo#mvnafqlwkfq#sbqwp#lejnslppjaof#wl##`obpp>!avwwlmol`bwfg#jm#wkf-#Kltfufq/#wkfbmg#fufmwvboozBw#wkf#fmg#le#af`bvpf#le#jwpqfsqfpfmwp#wkf?elqn#b`wjlm>!#nfwklg>!slpw!jw#jp#slppjaofnlqf#ojhfoz#wlbm#jm`qfbpf#jmkbuf#bopl#affm`lqqfpslmgp#wlbmmlvm`fg#wkbwbojdm>!qjdkw!=nbmz#`lvmwqjfpelq#nbmz#zfbqpfbqojfpw#hmltmaf`bvpf#jw#tbpsw!=?,p`qjsw=\x0E#ubojdm>!wls!#jmkbajwbmwp#leelooltjmd#zfbq\x0E\t?gju#`obpp>!njoojlm#sflsof`lmwqlufqpjbo#`lm`fqmjmd#wkfbqdvf#wkbw#wkfdlufqmnfmw#bmgb#qfefqfm`f#wlwqbmpefqqfg#wlgfp`qjajmd#wkf#pwzof>!`lolq9bowklvdk#wkfqfafpw#hmltm#elqpvanjw!#mbnf>!nvowjsoj`bwjlmnlqf#wkbm#lmf#qf`ldmjwjlm#le@lvm`jo#le#wkffgjwjlm#le#wkf##?nfwb#mbnf>!Fmwfqwbjmnfmw#btbz#eqln#wkf#8nbqdjm.qjdkw9bw#wkf#wjnf#lejmufpwjdbwjlmp`lmmf`wfg#tjwkbmg#nbmz#lwkfqbowklvdk#jw#jpafdjmmjmd#tjwk#?psbm#`obpp>!gfp`fmgbmwp#le?psbm#`obpp>!j#bojdm>!qjdkw!?,kfbg=\t?algz#bpsf`wp#le#wkfkbp#pjm`f#affmFvqlsfbm#Vmjlmqfnjmjp`fmw#lenlqf#gjeej`vowUj`f#Sqfpjgfmw`lnslpjwjlm#lesbppfg#wkqlvdknlqf#jnslqwbmwelmw.pjyf922s{f{sobmbwjlm#lewkf#`lm`fsw#letqjwwfm#jm#wkf\n?psbm#`obpp>!jp#lmf#le#wkf#qfpfnaobm`f#wllm#wkf#dqlvmgptkj`k#`lmwbjmpjm`ovgjmd#wkf#gfejmfg#az#wkfsvaoj`bwjlm#lenfbmp#wkbw#wkflvwpjgf#le#wkfpvsslqw#le#wkf?jmsvw#`obpp>!?psbm#`obpp>!w+Nbwk-qbmgln+*nlpw#sqlnjmfmwgfp`qjswjlm#le@lmpwbmwjmlsoftfqf#svaojpkfg?gju#`obpp>!pfbssfbqp#jm#wkf2!#kfjdkw>!2!#nlpw#jnslqwbmwtkj`k#jm`ovgfptkj`k#kbg#affmgfpwqv`wjlm#lewkf#slsvobwjlm\t\n?gju#`obpp>!slppjajojwz#leplnfwjnfp#vpfgbssfbq#wl#kbufpv``fpp#le#wkfjmwfmgfg#wl#afsqfpfmw#jm#wkfpwzof>!`ofbq9a\x0E\t?,p`qjsw=\x0E\t?tbp#elvmgfg#jmjmwfqujft#tjwk\\jg!#`lmwfmw>!`bsjwbo#le#wkf\x0E\t?ojmh#qfo>!pqfofbpf#le#wkfsljmw#lvw#wkbw{NOKwwsQfrvfpwbmg#pvapfrvfmwpf`lmg#obqdfpwufqz#jnslqwbmwpsf`jej`bwjlmppvqeb`f#le#wkfbssojfg#wl#wkfelqfjdm#sloj`z\\pfwGlnbjmMbnffpwbaojpkfg#jmjp#afojfufg#wlJm#bggjwjlm#wlnfbmjmd#le#wkfjp#mbnfg#bewfqwl#sqlwf`w#wkfjp#qfsqfpfmwfgGf`obqbwjlm#lenlqf#feej`jfmw@obppjej`bwjlmlwkfq#elqnp#lekf#qfwvqmfg#wl?psbm#`obpp>!`sfqelqnbm`f#le+evm`wjlm+*#x\x0Eje#bmg#lmoz#jeqfdjlmp#le#wkfofbgjmd#wl#wkfqfobwjlmp#tjwkVmjwfg#Mbwjlmppwzof>!kfjdkw9lwkfq#wkbm#wkfzsf!#`lmwfmw>!Bppl`jbwjlm#le\t?,kfbg=\t?algzol`bwfg#lm#wkfjp#qfefqqfg#wl+jm`ovgjmd#wkf`lm`fmwqbwjlmpwkf#jmgjujgvbobnlmd#wkf#nlpwwkbm#bmz#lwkfq,=\t?ojmh#qfo>!#qfwvqm#ebopf8wkf#svqslpf#lewkf#bajojwz#wl8`lolq9 eee~\t-\t?psbm#`obpp>!wkf#pvaif`w#legfejmjwjlmp#le=\x0E\t?ojmh#qfo>!`objn#wkbw#wkfkbuf#gfufolsfg?wbaof#tjgwk>!`fofaqbwjlm#leElooltjmd#wkf#wl#gjpwjmdvjpk?psbm#`obpp>!awbhfp#sob`f#jmvmgfq#wkf#mbnfmlwfg#wkbw#wkf=?\"Xfmgje^..=\tpwzof>!nbqdjm.jmpwfbg#le#wkfjmwqlgv`fg#wkfwkf#sql`fpp#lejm`qfbpjmd#wkfgjeefqfm`fp#jmfpwjnbwfg#wkbwfpsf`jbooz#wkf,gju=?gju#jg>!tbp#fufmwvboozwkqlvdklvw#kjpwkf#gjeefqfm`fplnfwkjmd#wkbwpsbm=?,psbm=?,pjdmjej`bmwoz#=?,p`qjsw=\x0E\t\x0E\tfmujqlmnfmwbo#wl#sqfufmw#wkfkbuf#affm#vpfgfpsf`jbooz#elqvmgfqpwbmg#wkfjp#fppfmwjbooztfqf#wkf#ejqpwjp#wkf#obqdfpwkbuf#affm#nbgf!#pq`>!kwws9,,jmwfqsqfwfg#bppf`lmg#kboe#le`qloojmd>!ml!#jp#`lnslpfg#leJJ/#Kloz#Qlnbmjp#f{sf`wfg#wlkbuf#wkfjq#ltmgfejmfg#bp#wkfwqbgjwjlmbooz#kbuf#gjeefqfmwbqf#lewfm#vpfgwl#fmpvqf#wkbwbdqffnfmw#tjwk`lmwbjmjmd#wkfbqf#eqfrvfmwozjmelqnbwjlm#lmf{bnsof#jp#wkfqfpvowjmd#jm#b?,b=?,oj=?,vo=#`obpp>!ellwfqbmg#fpsf`jboozwzsf>!avwwlm!#?,psbm=?,psbm=tkj`k#jm`ovgfg=\t?nfwb#mbnf>!`lmpjgfqfg#wkf`bqqjfg#lvw#azKltfufq/#jw#jpaf`bnf#sbqw#lejm#qfobwjlm#wlslsvobq#jm#wkfwkf#`bsjwbo#letbp#leej`jbooztkj`k#kbp#affmwkf#Kjpwlqz#lebowfqmbwjuf#wlgjeefqfmw#eqlnwl#pvsslqw#wkfpvddfpwfg#wkbwjm#wkf#sql`fpp##?gju#`obpp>!wkf#elvmgbwjlmaf`bvpf#le#kjp`lm`fqmfg#tjwkwkf#vmjufqpjwzlsslpfg#wl#wkfwkf#`lmwf{w#le?psbm#`obpp>!swf{w!#mbnf>!r!\n\n?gju#`obpp>!wkf#p`jfmwjej`qfsqfpfmwfg#aznbwkfnbwj`jbmpfof`wfg#az#wkfwkbw#kbuf#affm=?gju#`obpp>!`gju#jg>!kfbgfqjm#sbqwj`vobq/`lmufqwfg#jmwl*8\t?,p`qjsw=\t?skjolplskj`bo#pqsphlkqubwphjwj\rVSmd#Uj\rWkw!kwws9,,!=?psbm#`obpp>!nfnafqp#le#wkf#tjmglt-ol`bwjlmufqwj`bo.bojdm9,b=#\x7F#?b#kqfe>!?\"gl`wzsf#kwno=nfgjb>!p`qffm!#?lswjlm#ubovf>!ebuj`lm-j`l!#,=\t\n\n?gju#`obpp>!`kbqb`wfqjpwj`p!#nfwklg>!dfw!#,algz=\t?,kwno=\tpklqw`vw#j`lm!#gl`vnfmw-tqjwf+sbggjmd.alwwln9qfsqfpfmwbwjufppvanjw!#ubovf>!bojdm>!`fmwfq!#wkqlvdklvw#wkf#p`jfm`f#ej`wjlm\t##?gju#`obpp>!pvanjw!#`obpp>!lmf#le#wkf#nlpw#ubojdm>!wls!=?tbp#fpwbaojpkfg*8\x0E\t?,p`qjsw=\x0E\tqfwvqm#ebopf8!=*-pwzof-gjpsobzaf`bvpf#le#wkf#gl`vnfmw-`llhjf?elqn#b`wjlm>!,~algzxnbqdjm938Fm`z`olsfgjb#leufqpjlm#le#wkf#-`qfbwfFofnfmw+mbnf!#`lmwfmw>!?,gju=\t?,gju=\t\tbgnjmjpwqbwjuf#?,algz=\t?,kwno=kjpwlqz#le#wkf#!=?jmsvw#wzsf>!slqwjlm#le#wkf#bp#sbqw#le#wkf#%maps8?b#kqfe>!lwkfq#`lvmwqjfp!=\t?gju#`obpp>!?,psbm=?,psbm=?Jm#lwkfq#tlqgp/gjpsobz9#aol`h8`lmwqlo#le#wkf#jmwqlgv`wjlm#le,=\t?nfwb#mbnf>!bp#tfoo#bp#wkf#jm#qf`fmw#zfbqp\x0E\t\n?gju#`obpp>!?,gju=\t\n?,gju=\tjmpsjqfg#az#wkfwkf#fmg#le#wkf#`lnsbwjaof#tjwkaf`bnf#hmltm#bp#pwzof>!nbqdjm9-ip!=?,p`qjsw=?#Jmwfqmbwjlmbo#wkfqf#kbuf#affmDfqnbm#obmdvbdf#pwzof>!`lolq9 @lnnvmjpw#Sbqwz`lmpjpwfmw#tjwkalqgfq>!3!#`foo#nbqdjmkfjdkw>!wkf#nbilqjwz#le!#bojdm>!`fmwfqqfobwfg#wl#wkf#nbmz#gjeefqfmw#Lqwklgl{#@kvq`kpjnjobq#wl#wkf#,=\t?ojmh#qfo>!ptbp#lmf#le#wkf#vmwjo#kjp#gfbwk~*+*8\t?,p`qjsw=lwkfq#obmdvbdfp`lnsbqfg#wl#wkfslqwjlmp#le#wkfwkf#Mfwkfqobmgpwkf#nlpw#`lnnlmab`hdqlvmg9vqo+bqdvfg#wkbw#wkfp`qloojmd>!ml!#jm`ovgfg#jm#wkfMlqwk#Bnfqj`bm#wkf#mbnf#le#wkfjmwfqsqfwbwjlmpwkf#wqbgjwjlmbogfufolsnfmw#le#eqfrvfmwoz#vpfgb#`loof`wjlm#leufqz#pjnjobq#wlpvqqlvmgjmd#wkff{bnsof#le#wkjpbojdm>!`fmwfq!=tlvog#kbuf#affmjnbdf\\`bswjlm#>bwwb`kfg#wl#wkfpvddfpwjmd#wkbwjm#wkf#elqn#le#jmuloufg#jm#wkfjp#gfqjufg#eqlnmbnfg#bewfq#wkfJmwqlgv`wjlm#wlqfpwqj`wjlmp#lm#pwzof>!tjgwk9#`bm#af#vpfg#wl#wkf#`qfbwjlm#lenlpw#jnslqwbmw#jmelqnbwjlm#bmgqfpvowfg#jm#wkf`loobspf#le#wkfWkjp#nfbmp#wkbwfofnfmwp#le#wkftbp#qfsob`fg#azbmbozpjp#le#wkfjmpsjqbwjlm#elqqfdbqgfg#bp#wkfnlpw#pv``fppevohmltm#bp#%rvlw8b#`lnsqfkfmpjufKjpwlqz#le#wkf#tfqf#`lmpjgfqfgqfwvqmfg#wl#wkfbqf#qfefqqfg#wlVmplvq`fg#jnbdf=\t\n?gju#`obpp>!`lmpjpwp#le#wkfpwlsSqlsbdbwjlmjmwfqfpw#jm#wkfbubjobajojwz#lebssfbqp#wl#kbuffof`wqlnbdmfwj`fmbaofPfquj`fp+evm`wjlm#le#wkfJw#jp#jnslqwbmw?,p`qjsw=?,gju=evm`wjlm+*xubq#qfobwjuf#wl#wkfbp#b#qfpvow#le#wkf#slpjwjlm#leElq#f{bnsof/#jm#nfwklg>!slpw!#tbp#elooltfg#az%bns8ngbpk8#wkfwkf#bssoj`bwjlmip!=?,p`qjsw=\x0E\tvo=?,gju=?,gju=bewfq#wkf#gfbwktjwk#qfpsf`w#wlpwzof>!sbggjmd9jp#sbqwj`vobqozgjpsobz9jmojmf8#wzsf>!pvanjw!#jp#gjujgfg#jmwl\bTA\nzk#+\x0BBl\bQ\x7F*qfpslmpbajojgbgbgnjmjpwqb`j/_mjmwfqmb`jlmbofp`lqqfpslmgjfmwf\fHe\fHF\fHC\fIg\fH{\fHF\fIn\fH\\\fIa\fHY\fHU\fHB\fHR\fH\\\fIk\fH^\fIg\fH{\fIg\fHn\fHv\fIm\fHD\fHR\fHY\fH^\fIk\fHy\fHS\fHD\fHT\fH\\\fHy\fHR\fH\\\fHF\fIm\fH^\fHS\fHT\fHz\fIg\fHp\fIk\fHn\fHv\fHR\fHU\fHS\fHc\fHA\fIk\fHp\fIk\fHn\fHZ\fHR\fHB\fHS\fH^\fHU\fHB\fHR\fH\\\fIl\fHp\fHR\fH{\fH\\\fHO\fH@\fHD\fHR\fHD\fIk\fHy\fIm\fHB\fHR\fH\\\fH@\fIa\fH^\fIe\fH{\fHB\fHR\fH^\fHS\fHy\fHB\fHU\fHS\fH^\fHR\fHF\fIo\fH[\fIa\fHL\fH@\fHN\fHP\fHH\fIk\fHA\fHR\fHp\fHF\fHR\fHy\fIa\fH^\fHS\fHy\fHs\fIa\fH\\\fIk\fHD\fHz\fHS\fH^\fHR\fHG\fHJ\fI`\fH\\\fHR\fHD\fHB\fHR\fHB\fH^\fIk\fHB\fHH\fHJ\fHR\fHD\fH@\fHR\fHp\fHR\fH\\\fHY\fHS\fHy\fHR\fHT\fHy\fIa\fHC\fIg\fHn\fHv\fHR\fHU\fHH\fIk\fHF\fHU\fIm\fHm\fHv\fH@\fHH\fHR\fHC\fHR\fHT\fHn\fHY\fHR\fHJ\fHJ\fIk\fHz\fHD\fIk\fHF\fHS\fHw\fH^\fIk\fHY\fHS\fHZ\fIk\fH[\fH\\\fHR\fHp\fIa\fHC\fHe\fHH\fIa\fHH\fH\\\fHB\fIm\fHn\fH@\fHd\fHJ\fIg\fHD\fIg\fHn\fHe\fHF\fHy\fH\\\fHO\fHF\fHN\fHP\fIk\fHn\fHT\fIa\fHI\fHS\fHH\fHG\fHS\fH^\fIa\fHB\fHB\fIm\fHz\fIa\fHC\fHi\fHv\fIa\fHw\fHR\fHw\fIn\fHs\fHH\fIl\fHT\fHn\fH{\fIl\fHH\fHp\fHR\fHc\fH{\fHR\fHY\fHS\fHA\fHR\fH{\fHt\fHO\fIa\fHs\fIk\fHJ\fIn\fHT\fH\\\fIk\fHJ\fHS\fHD\fIg\fHn\fHU\fHH\fIa\fHC\fHR\fHT\fIk\fHy\fIa\fHT\fH{\fHR\fHn\fHK\fIl\fHY\fHS\fHZ\fIa\fHY\fH\\\fHR\fHH\fIk\fHn\fHJ\fId\fHs\fIa\fHT\fHD\fHy\fIa\fHZ\fHR\fHT\fHR\fHB\fHD\fIk\fHi\fHJ\fHR\fH^\fHH\fH@\fHS\fHp\fH^\fIl\fHF\fIm\fH\\\fIn\fH[\fHU\fHS\fHn\fHJ\fIl\fHB\fHS\fHH\fIa\fH\\\fHy\fHY\fHS\fHH\fHR\fH\\\fIm\fHF\fHC\fIk\fHT\fIa\fHI\fHR\fHD\fHy\fH\\\fIg\fHM\fHP\fHB\fIm\fHy\fIa\fHH\fHC\fIg\fHp\fHD\fHR\fHy\fIo\fHF\fHC\fHR\fHF\fIg\fHT\fIa\fHs\fHt\fH\\\fIk\fH^\fIn\fHy\fHR\fH\\\fIa\fHC\fHY\fHS\fHv\fHR\fH\\\fHT\fIn\fHv\fHD\fHR\fHB\fIn\fH^\fIa\fHC\fHJ\fIk\fHz\fIk\fHn\fHU\fHB\fIk\fHZ\fHR\fHT\fIa\fHy\fIn\fH^\fHB\fId\fHn\fHD\fIk\fHH\fId\fHC\fHR\fH\\\fHp\fHS\fHT\fHy\fIkqpp({no!#wjwof>!.wzsf!#`lmwfmw>!wjwof!#`lmwfmw>!bw#wkf#pbnf#wjnf-ip!=?,p`qjsw=\t?!#nfwklg>!slpw!#?,psbm=?,b=?,oj=ufqwj`bo.bojdm9w,irvfqz-njm-ip!=-`oj`h+evm`wjlm+#pwzof>!sbggjmd.~*+*8\t?,p`qjsw=\t?,psbm=?b#kqfe>!?b#kqfe>!kwws9,,*8#qfwvqm#ebopf8wf{w.gf`lqbwjlm9#p`qloojmd>!ml!#alqgfq.`loobspf9bppl`jbwfg#tjwk#Abkbpb#JmglmfpjbFmdojpk#obmdvbdf?wf{w#{no9psb`f>-dje!#alqgfq>!3!?,algz=\t?,kwno=\tlufqeolt9kjggfm8jnd#pq`>!kwws9,,bggFufmwOjpwfmfqqfpslmpjaof#elq#p-ip!=?,p`qjsw=\t,ebuj`lm-j`l!#,=lsfqbwjmd#pzpwfn!#pwzof>!tjgwk92wbqdfw>!\\aobmh!=Pwbwf#Vmjufqpjwzwf{w.bojdm9ofew8\tgl`vnfmw-tqjwf+/#jm`ovgjmd#wkf#bqlvmg#wkf#tlqog*8\x0E\t?,p`qjsw=\x0E\t?!#pwzof>!kfjdkw98lufqeolt9kjggfmnlqf#jmelqnbwjlmbm#jmwfqmbwjlmbob#nfnafq#le#wkf#lmf#le#wkf#ejqpw`bm#af#elvmg#jm#?,gju=\t\n\n?,gju=\tgjpsobz9#mlmf8!=!#,=\t?ojmh#qfo>!\t##+evm`wjlm+*#xwkf#26wk#`fmwvqz-sqfufmwGfebvow+obqdf#mvnafq#le#Azybmwjmf#Fnsjqf-isd\x7Fwkvna\x7Fofew\x7Fubpw#nbilqjwz#lenbilqjwz#le#wkf##bojdm>!`fmwfq!=Vmjufqpjwz#Sqfppglnjmbwfg#az#wkfPf`lmg#Tlqog#Tbqgjpwqjavwjlm#le#pwzof>!slpjwjlm9wkf#qfpw#le#wkf#`kbqb`wfqjyfg#az#qfo>!mleloolt!=gfqjufp#eqln#wkfqbwkfq#wkbm#wkf#b#`lnajmbwjlm#lepwzof>!tjgwk9233Fmdojpk.psfbhjmd`lnsvwfq#p`jfm`falqgfq>!3!#bow>!wkf#f{jpwfm`f#leGfnl`qbwj`#Sbqwz!#pwzof>!nbqdjm.Elq#wkjp#qfbplm/-ip!=?,p`qjsw=\t\npAzWbdMbnf+p*X3^ip!=?,p`qjsw=\x0E\t?-ip!=?,p`qjsw=\x0E\tojmh#qfo>!j`lm!#$#bow>$$#`obpp>$elqnbwjlm#le#wkfufqpjlmp#le#wkf#?,b=?,gju=?,gju=,sbdf=\t##?sbdf=\t?gju#`obpp>!`lmwaf`bnf#wkf#ejqpwabkbpb#Jmglmfpjbfmdojpk#+pjnsof*\"y\"W\"W\"[\"Q\"U\"V\"@=i=l<^<\\=n=m!?gju#jg>!ellwfq!=wkf#Vmjwfg#Pwbwfp?jnd#pq`>!kwws9,,-isd\x7Fqjdkw\x7Fwkvna\x7F-ip!=?,p`qjsw=\x0E\t?ol`bwjlm-sqlwl`loeqbnfalqgfq>!3!#p!#,=\t?nfwb#mbnf>!?,b=?,gju=?,gju=?elmw.tfjdkw9alog8%rvlw8#bmg#%rvlw8gfsfmgjmd#lm#wkf#nbqdjm938sbggjmd9!#qfo>!mleloolt!#Sqfpjgfmw#le#wkf#wtfmwjfwk#`fmwvqzfujpjlm=\t##?,sbdfJmwfqmfw#F{solqfqb-bpzm`#>#wqvf8\x0E\tjmelqnbwjlm#balvw?gju#jg>!kfbgfq!=!#b`wjlm>!kwws9,,?b#kqfe>!kwwsp9,,?gju#jg>!`lmwfmw!?,gju=\x0E\t?,gju=\x0E\t?gfqjufg#eqln#wkf#?jnd#pq`>$kwws9,,b``lqgjmd#wl#wkf#\t?,algz=\t?,kwno=\tpwzof>!elmw.pjyf9p`qjsw#obmdvbdf>!Bqjbo/#Kfoufwj`b/?,b=?psbm#`obpp>!?,p`qjsw=?p`qjsw#slojwj`bo#sbqwjfpwg=?,wq=?,wbaof=?kqfe>!kwws9,,ttt-jmwfqsqfwbwjlm#leqfo>!pwzofpkffw!#gl`vnfmw-tqjwf+$?`kbqpfw>!vwe.;!=\tafdjmmjmd#le#wkf#qfufbofg#wkbw#wkfwfofujpjlm#pfqjfp!#qfo>!mleloolt!=#wbqdfw>!\\aobmh!=`objnjmd#wkbw#wkfkwws&0B&1E&1Ettt-nbmjefpwbwjlmp#leSqjnf#Njmjpwfq#lejmeovfm`fg#az#wkf`obpp>!`ofbqej{!=,gju=\x0E\t?,gju=\x0E\t\x0E\twkqff.gjnfmpjlmbo@kvq`k#le#Fmdobmgle#Mlqwk#@bqlojmbprvbqf#hjolnfwqfp-bggFufmwOjpwfmfqgjpwjm`w#eqln#wkf`lnnlmoz#hmltm#bpSklmfwj`#Boskbafwgf`obqfg#wkbw#wkf`lmwqloofg#az#wkfAfmibnjm#Eqbmhojmqlof.sobzjmd#dbnfwkf#Vmjufqpjwz#lejm#Tfpwfqm#Fvqlsfsfqplmbo#`lnsvwfqSqlif`w#Dvwfmafqdqfdbqgofpp#le#wkfkbp#affm#sqlslpfgwldfwkfq#tjwk#wkf=?,oj=?oj#`obpp>!jm#plnf#`lvmwqjfpnjm-ip!=?,p`qjsw=le#wkf#slsvobwjlmleej`jbo#obmdvbdf?jnd#pq`>!jnbdfp,jgfmwjejfg#az#wkfmbwvqbo#qfplvq`fp`obppjej`bwjlm#le`bm#af#`lmpjgfqfgrvbmwvn#nf`kbmj`pMfufqwkfofpp/#wkfnjoojlm#zfbqp#bdl?,algz=\x0E\t?,kwno=\x0E\"y\"W\"W\"[\"Q\"U\"V\"@\twbhf#bgubmwbdf#lebmg/#b``lqgjmd#wlbwwqjavwfg#wl#wkfNj`qlplew#Tjmgltpwkf#ejqpw#`fmwvqzvmgfq#wkf#`lmwqlogju#`obpp>!kfbgfqpklqwoz#bewfq#wkfmlwbaof#f{`fswjlmwfmp#le#wklvpbmgppfufqbo#gjeefqfmwbqlvmg#wkf#tlqog-qfb`kjmd#njojwbqzjplobwfg#eqln#wkflsslpjwjlm#wl#wkfwkf#Log#WfpwbnfmwBeqj`bm#Bnfqj`bmpjmpfqwfg#jmwl#wkfpfsbqbwf#eqln#wkfnfwqlslojwbm#bqfbnbhfp#jw#slppjaofb`hmltofgdfg#wkbwbqdvbaoz#wkf#nlpwwzsf>!wf{w,`pp!=\twkf#JmwfqmbwjlmboB``lqgjmd#wl#wkf#sf>!wf{w,`pp!#,=\t`ljm`jgf#tjwk#wkfwtl.wkjqgp#le#wkfGvqjmd#wkjp#wjnf/gvqjmd#wkf#sfqjlgbmmlvm`fg#wkbw#kfwkf#jmwfqmbwjlmbobmg#nlqf#qf`fmwozafojfufg#wkbw#wkf`lmp`jlvpmfpp#bmgelqnfqoz#hmltm#bppvqqlvmgfg#az#wkfejqpw#bssfbqfg#jml``bpjlmbooz#vpfgslpjwjlm9baplovwf8!#wbqdfw>!\\aobmh!#slpjwjlm9qfobwjuf8wf{w.bojdm9`fmwfq8ib{,ojap,irvfqz,2-ab`hdqlvmg.`lolq9 wzsf>!bssoj`bwjlm,bmdvbdf!#`lmwfmw>!?nfwb#kwws.frvju>!Sqjub`z#Sloj`z?,b=f+!&0@p`qjsw#pq`>$!#wbqdfw>!\\aobmh!=Lm#wkf#lwkfq#kbmg/-isd\x7Fwkvna\x7Fqjdkw\x7F1?,gju=?gju#`obpp>!?gju#pwzof>!eolbw9mjmfwffmwk#`fmwvqz?,algz=\x0E\t?,kwno=\x0E\t?jnd#pq`>!kwws9,,p8wf{w.bojdm9`fmwfqelmw.tfjdkw9#alog8#B``lqgjmd#wl#wkf#gjeefqfm`f#afwtffm!#eqbnfalqgfq>!3!#!#pwzof>!slpjwjlm9ojmh#kqfe>!kwws9,,kwno7,ollpf-gwg!=\tgvqjmd#wkjp#sfqjlg?,wg=?,wq=?,wbaof=`olpfoz#qfobwfg#wlelq#wkf#ejqpw#wjnf8elmw.tfjdkw9alog8jmsvw#wzsf>!wf{w!#?psbm#pwzof>!elmw.lmqfbgzpwbwf`kbmdf\n?gju#`obpp>!`ofbqgl`vnfmw-ol`bwjlm-#Elq#f{bnsof/#wkf#b#tjgf#ubqjfwz#le#?\"GL@WZSF#kwno=\x0E\t?%maps8%maps8%maps8!=?b#kqfe>!kwws9,,pwzof>!eolbw9ofew8`lm`fqmfg#tjwk#wkf>kwws&0B&1E&1Ettt-jm#slsvobq#`vowvqfwzsf>!wf{w,`pp!#,=jw#jp#slppjaof#wl#Kbqubqg#Vmjufqpjwzwzofpkffw!#kqfe>!,wkf#nbjm#`kbqb`wfqL{elqg#Vmjufqpjwz##mbnf>!hfztlqgp!#`pwzof>!wf{w.bojdm9wkf#Vmjwfg#Hjmdglnefgfqbo#dlufqmnfmw?gju#pwzof>!nbqdjm#gfsfmgjmd#lm#wkf#gfp`qjswjlm#le#wkf?gju#`obpp>!kfbgfq-njm-ip!=?,p`qjsw=gfpwqv`wjlm#le#wkfpojdkwoz#gjeefqfmwjm#b``lqgbm`f#tjwkwfof`lnnvmj`bwjlmpjmgj`bwfp#wkbw#wkfpklqwoz#wkfqfbewfqfpsf`jbooz#jm#wkf#Fvqlsfbm#`lvmwqjfpKltfufq/#wkfqf#bqfpq`>!kwws9,,pwbwj`pvddfpwfg#wkbw#wkf!#pq`>!kwws9,,ttt-b#obqdf#mvnafq#le#Wfof`lnnvmj`bwjlmp!#qfo>!mleloolt!#wKloz#Qlnbm#Fnsfqlqbonlpw#f{`ovpjufoz!#alqgfq>!3!#bow>!Pf`qfwbqz#le#Pwbwf`vonjmbwjmd#jm#wkf@JB#Tlqog#Eb`wallhwkf#nlpw#jnslqwbmwbmmjufqpbqz#le#wkfpwzof>!ab`hdqlvmg.?oj=?fn=?b#kqfe>!,wkf#Bwobmwj`#L`fbmpwqj`woz#psfbhjmd/pklqwoz#afelqf#wkfgjeefqfmw#wzsfp#lewkf#Lwwlnbm#Fnsjqf=?jnd#pq`>!kwws9,,Bm#Jmwqlgv`wjlm#wl`lmpfrvfm`f#le#wkfgfsbqwvqf#eqln#wkf@lmefgfqbwf#Pwbwfpjmgjdfmlvp#sflsofpSql`ffgjmdp#le#wkfjmelqnbwjlm#lm#wkfwkflqjfp#kbuf#affmjmuloufnfmw#jm#wkfgjujgfg#jmwl#wkqffbgib`fmw#`lvmwqjfpjp#qfpslmpjaof#elqgjpplovwjlm#le#wkf`loobalqbwjlm#tjwktjgfoz#qfdbqgfg#bpkjp#`lmwfnslqbqjfpelvmgjmd#nfnafq#leGlnjmj`bm#Qfsvaoj`dfmfqbooz#b``fswfgwkf#slppjajojwz#lebqf#bopl#bubjobaofvmgfq#`lmpwqv`wjlmqfpwlqbwjlm#le#wkfwkf#dfmfqbo#svaoj`jp#bonlpw#fmwjqfozsbppfp#wkqlvdk#wkfkbp#affm#pvddfpwfg`lnsvwfq#bmg#ujgflDfqnbmj`#obmdvbdfp#b``lqgjmd#wl#wkf#gjeefqfmw#eqln#wkfpklqwoz#bewfqtbqgpkqfe>!kwwsp9,,ttt-qf`fmw#gfufolsnfmwAlbqg#le#Gjqf`wlqp?gju#`obpp>!pfbq`k\x7F#?b#kqfe>!kwws9,,Jm#sbqwj`vobq/#wkfNvowjsof#ellwmlwfplq#lwkfq#pvapwbm`fwklvpbmgp#le#zfbqpwqbmpobwjlm#le#wkf?,gju=\x0E\t?,gju=\x0E\t\x0E\t?b#kqfe>!jmgf{-skstbp#fpwbaojpkfg#jmnjm-ip!=?,p`qjsw=\tsbqwj`jsbwf#jm#wkfb#pwqlmd#jmeovfm`fpwzof>!nbqdjm.wls9qfsqfpfmwfg#az#wkfdqbgvbwfg#eqln#wkfWqbgjwjlmbooz/#wkfFofnfmw+!p`qjsw!*8Kltfufq/#pjm`f#wkf,gju=\t?,gju=\t?gju#ofew8#nbqdjm.ofew9sqlwf`wjlm#bdbjmpw38#ufqwj`bo.bojdm9Vmelqwvmbwfoz/#wkfwzsf>!jnbdf,{.j`lm,gju=\t?gju#`obpp>!#`obpp>!`ofbqej{!=?gju#`obpp>!ellwfq\n\n?,gju=\t\n\n?,gju=\twkf#nlwjlm#sj`wvqf<}=f!t0-lqd,2:::,{kwno!=?b#wbqdfw>!\\aobmh!#wf{w,kwno8#`kbqpfw>!#wbqdfw>!\\aobmh!=?wbaof#`foosbggjmd>!bvwl`lnsofwf>!lee!#wf{w.bojdm9#`fmwfq8wl#obpw#ufqpjlm#az#ab`hdqlvmg.`lolq9# !#kqfe>!kwws9,,ttt-,gju=?,gju=?gju#jg>?b#kqfe>! !#`obpp>!!=?jnd#pq`>!kwws9,,`qjsw!#pq`>!kwws9,,\t?p`qjsw#obmdvbdf>!,,FM!#!kwws9,,ttt-tfm`lgfVQJ@lnslmfmw+!#kqfe>!ibubp`qjsw9?gju#`obpp>!`lmwfmwgl`vnfmw-tqjwf+$?p`slpjwjlm9#baplovwf8p`qjsw#pq`>!kwws9,,#pwzof>!nbqdjm.wls9-njm-ip!=?,p`qjsw=\t?,gju=\t?gju#`obpp>!t0-lqd,2:::,{kwno!#\t\x0E\t?,algz=\x0E\t?,kwno=gjpwjm`wjlm#afwtffm,!#wbqdfw>!\\aobmh!=?ojmh#kqfe>!kwws9,,fm`lgjmd>!vwe.;!<=\tt-bggFufmwOjpwfmfq!kwws9,,ttt-j`lm!#kqfe>!kwws9,,#pwzof>!ab`hdqlvmg9wzsf>!wf{w,`pp!#,=\tnfwb#sqlsfqwz>!ld9w?jmsvw#wzsf>!wf{w!##pwzof>!wf{w.bojdm9wkf#gfufolsnfmw#le#wzofpkffw!#wzsf>!wfkwno8#`kbqpfw>vwe.;jp#`lmpjgfqfg#wl#afwbaof#tjgwk>!233&!#Jm#bggjwjlm#wl#wkf#`lmwqjavwfg#wl#wkf#gjeefqfm`fp#afwtffmgfufolsnfmw#le#wkf#Jw#jp#jnslqwbmw#wl#?,p`qjsw=\t\t?p`qjsw##pwzof>!elmw.pjyf92=?,psbm=?psbm#jg>daOjaqbqz#le#@lmdqfpp?jnd#pq`>!kwws9,,jnFmdojpk#wqbmpobwjlmB`bgfnz#le#P`jfm`fpgju#pwzof>!gjpsobz9`lmpwqv`wjlm#le#wkf-dfwFofnfmwAzJg+jg*jm#`lmivm`wjlm#tjwkFofnfmw+$p`qjsw$*8#?nfwb#sqlsfqwz>!ld9<}=f!wf{w!#mbnf>!=Sqjub`z#Sloj`z?,b=bgnjmjpwfqfg#az#wkffmbaofPjmdofQfrvfpwpwzof>%rvlw8nbqdjm9?,gju=?,gju=?,gju=?=?jnd#pq`>!kwws9,,j#pwzof>%rvlw8eolbw9qfefqqfg#wl#bp#wkf#wlwbo#slsvobwjlm#lejm#Tbpkjmdwlm/#G-@-#pwzof>!ab`hdqlvmg.bnlmd#lwkfq#wkjmdp/lqdbmjybwjlm#le#wkfsbqwj`jsbwfg#jm#wkfwkf#jmwqlgv`wjlm#lejgfmwjejfg#tjwk#wkfej`wjlmbo#`kbqb`wfq#L{elqg#Vmjufqpjwz#njpvmgfqpwbmgjmd#leWkfqf#bqf/#kltfufq/pwzofpkffw!#kqfe>!,@lovnajb#Vmjufqpjwzf{sbmgfg#wl#jm`ovgfvpvbooz#qfefqqfg#wljmgj`bwjmd#wkbw#wkfkbuf#pvddfpwfg#wkbwbeejojbwfg#tjwk#wkf`lqqfobwjlm#afwtffmmvnafq#le#gjeefqfmw=?,wg=?,wq=?,wbaof=Qfsvaoj`#le#Jqfobmg\t?,p`qjsw=\t?p`qjsw#vmgfq#wkf#jmeovfm`f`lmwqjavwjlm#wl#wkfLeej`jbo#tfapjwf#lekfbgrvbqwfqp#le#wkf`fmwfqfg#bqlvmg#wkfjnsoj`bwjlmp#le#wkfkbuf#affm#gfufolsfgEfgfqbo#Qfsvaoj`#leaf`bnf#jm`qfbpjmdoz`lmwjmvbwjlm#le#wkfMlwf/#kltfufq/#wkbwpjnjobq#wl#wkbw#le#`bsbajojwjfp#le#wkfb``lqgbm`f#tjwk#wkfsbqwj`jsbmwp#jm#wkfevqwkfq#gfufolsnfmwvmgfq#wkf#gjqf`wjlmjp#lewfm#`lmpjgfqfgkjp#zlvmdfq#aqlwkfq?,wg=?,wq=?,wbaof=?b#kwws.frvju>![.VB.skzpj`bo#sqlsfqwjfple#Aqjwjpk#@lovnajbkbp#affm#`qjwj`jyfg+tjwk#wkf#f{`fswjlmrvfpwjlmp#balvw#wkfsbppjmd#wkqlvdk#wkf3!#`foosbggjmd>!3!#wklvpbmgp#le#sflsofqfgjqf`wp#kfqf-#Elqkbuf#`kjogqfm#vmgfq&0F&0@,p`qjsw&0F!**8?b#kqfe>!kwws9,,ttt-?oj=?b#kqfe>!kwws9,,pjwf\\mbnf!#`lmwfmw>!wf{w.gf`lqbwjlm9mlmfpwzof>!gjpsobz9#mlmf?nfwb#kwws.frvju>![.mft#Gbwf+*-dfwWjnf+*#wzsf>!jnbdf,{.j`lm!?,psbm=?psbm#`obpp>!obmdvbdf>!ibubp`qjswtjmglt-ol`bwjlm-kqfe?b#kqfe>!ibubp`qjsw9..=\x0E\t?p`qjsw#wzsf>!w?b#kqfe>$kwws9,,ttt-klqw`vw#j`lm!#kqfe>!?,gju=\x0E\t?gju#`obpp>!?p`qjsw#pq`>!kwws9,,!#qfo>!pwzofpkffw!#w?,gju=\t?p`qjsw#wzsf>,b=#?b#kqfe>!kwws9,,#booltWqbmpsbqfm`z>![.VB.@lnsbwjaof!#`lmqfobwjlmpkjs#afwtffm\t?,p`qjsw=\x0E\t?p`qjsw#?,b=?,oj=?,vo=?,gju=bppl`jbwfg#tjwk#wkf#sqldqbnnjmd#obmdvbdf?,b=?b#kqfe>!kwws9,,?,b=?,oj=?oj#`obpp>!elqn#b`wjlm>!kwws9,,?gju#pwzof>!gjpsobz9wzsf>!wf{w!#mbnf>!r!?wbaof#tjgwk>!233&!#ab`hdqlvmg.slpjwjlm9!#alqgfq>!3!#tjgwk>!qfo>!pklqw`vw#j`lm!#k5=?vo=?oj=?b#kqfe>!##?nfwb#kwws.frvju>!`pp!#nfgjb>!p`qffm!#qfpslmpjaof#elq#wkf#!#wzsf>!bssoj`bwjlm,!#pwzof>!ab`hdqlvmg.kwno8#`kbqpfw>vwe.;!#booltwqbmpsbqfm`z>!pwzofpkffw!#wzsf>!wf\x0E\t?nfwb#kwws.frvju>!=?,psbm=?psbm#`obpp>!3!#`foopsb`jmd>!3!=8\t?,p`qjsw=\t?p`qjsw#plnfwjnfp#`boofg#wkfglfp#mlw#mf`fppbqjozElq#nlqf#jmelqnbwjlmbw#wkf#afdjmmjmd#le#?\"GL@WZSF#kwno=?kwnosbqwj`vobqoz#jm#wkf#wzsf>!kjggfm!#mbnf>!ibubp`qjsw9uljg+3*8!feef`wjufmfpp#le#wkf#bvwl`lnsofwf>!lee!#dfmfqbooz#`lmpjgfqfg=?jmsvw#wzsf>!wf{w!#!=?,p`qjsw=\x0E\t?p`qjswwkqlvdklvw#wkf#tlqog`lnnlm#njp`lm`fswjlmbppl`jbwjlm#tjwk#wkf?,gju=\t?,gju=\t?gju#`gvqjmd#kjp#ojefwjnf/`lqqfpslmgjmd#wl#wkfwzsf>!jnbdf,{.j`lm!#bm#jm`qfbpjmd#mvnafqgjsolnbwj`#qfobwjlmpbqf#lewfm#`lmpjgfqfgnfwb#`kbqpfw>!vwe.;!#?jmsvw#wzsf>!wf{w!#f{bnsofp#jm`ovgf#wkf!=?jnd#pq`>!kwws9,,jsbqwj`jsbwjlm#jm#wkfwkf#fpwbaojpknfmw#le\t?,gju=\t?gju#`obpp>!%bns8maps8%bns8maps8wl#gfwfqnjmf#tkfwkfqrvjwf#gjeefqfmw#eqlnnbqhfg#wkf#afdjmmjmdgjpwbm`f#afwtffm#wkf`lmwqjavwjlmp#wl#wkf`lmeoj`w#afwtffm#wkftjgfoz#`lmpjgfqfg#wltbp#lmf#le#wkf#ejqpwtjwk#ubqzjmd#gfdqffpkbuf#psf`vobwfg#wkbw+gl`vnfmw-dfwFofnfmwsbqwj`jsbwjmd#jm#wkflqjdjmbooz#gfufolsfgfwb#`kbqpfw>!vwe.;!=#wzsf>!wf{w,`pp!#,=\tjmwfq`kbmdfbaoz#tjwknlqf#`olpfoz#qfobwfgpl`jbo#bmg#slojwj`bowkbw#tlvog#lwkfqtjpfsfqsfmgj`vobq#wl#wkfpwzof#wzsf>!wf{w,`ppwzsf>!pvanjw!#mbnf>!ebnjojfp#qfpjgjmd#jmgfufolsjmd#`lvmwqjfp`lnsvwfq#sqldqbnnjmdf`lmlnj`#gfufolsnfmwgfwfqnjmbwjlm#le#wkfelq#nlqf#jmelqnbwjlmlm#pfufqbo#l``bpjlmpslqwvdv/Fp#+Fvqlsfv*VWE.;!#pfwWjnflvw+evm`wjlm+*gjpsobz9jmojmf.aol`h8?jmsvw#wzsf>!pvanjw!#wzsf#>#$wf{w,ibubp`qj?jnd#pq`>!kwws9,,ttt-!#!kwws9,,ttt-t0-lqd,pklqw`vw#j`lm!#kqfe>!!#bvwl`lnsofwf>!lee!#?,b=?,gju=?gju#`obpp>?,b=?,oj=\t?oj#`obpp>!`pp!#wzsf>!wf{w,`pp!#?elqn#b`wjlm>!kwws9,,{w,`pp!#kqfe>!kwws9,,ojmh#qfo>!bowfqmbwf!#\x0E\t?p`qjsw#wzsf>!wf{w,#lm`oj`h>!ibubp`qjsw9+mft#Gbwf*-dfwWjnf+*~kfjdkw>!2!#tjgwk>!2!#Sflsof$p#Qfsvaoj`#le##?b#kqfe>!kwws9,,ttt-wf{w.gf`lqbwjlm9vmgfqwkf#afdjmmjmd#le#wkf#?,gju=\t?,gju=\t?,gju=\tfpwbaojpknfmw#le#wkf#?,gju=?,gju=?,gju=?,g ujftslqwxnjm.kfjdkw9\t?p`qjsw#pq`>!kwws9,,lswjlm=?lswjlm#ubovf>lewfm#qfefqqfg#wl#bp#,lswjlm=\t?lswjlm#ubov?\"GL@WZSF#kwno=\t?\"..XJmwfqmbwjlmbo#Bjqslqw=\t?b#kqfe>!kwws9,,ttt?,b=?b#kqfe>!kwws9,,t\fTL\fT^\fTE\fT^\fUh\fT{\fTN\roI\ro|\roL\ro{\roO\rov\rot\nAO\x05Gx\bTA\nzk#+\x0BUm\x05Gx*\fHD\fHS\fH\\\fIa\fHJ\fIk\fHZ\fHM\fHR\fHe\fHD\fH^\fIg\fHM\fHy\fIa\fH[\fIk\fHH\fIa\fH\\\fHp\fHR\fHD\fHy\fHR\fH\\\fIl\fHT\fHn\fH@\fHn\fHK\fHS\fHH\fHT\fIa\fHI\fHR\fHF\fHD\fHR\fHT\fIa\fHY\fIl\fHy\fHR\fH\\\fHT\fHn\fHT\fIa\fHy\fH\\\fHO\fHT\fHR\fHB\fH{\fIa\fH\\\fIl\fHv\fHS\fHs\fIa\fHL\fIg\fHn\fHY\fHS\fHp\fIa\fHr\fHR\fHD\fHi\fHB\fIk\fH\\\fHS\fHy\fHR\fHY\fHS\fHA\fHS\fHD\fIa\fHD\fH{\fHR\fHM\fHS\fHC\fHR\fHm\fHy\fIa\fHC\fIg\fHn\fHy\fHS\fHT\fIm\fH\\\fHy\fIa\fH[\fHR\fHF\fHU\fIm\fHm\fHv\fHH\fIl\fHF\fIa\fH\\\fH@\fHn\fHK\fHD\fHs\fHS\fHF\fIa\fHF\fHO\fIl\fHy\fIa\fH\\\fHS\fHy\fIk\fHs\fHF\fIa\fH\\\fHR\fH\\\fHn\fHA\fHF\fIa\fH\\\fHR\fHF\fIa\fHH\fHB\fHR\fH^\fHS\fHy\fIg\fHn\fH\\\fHG\fHP\fIa\fHH\fHR\fH\\\fHD\fHS\fH\\\fIa\fHB\fHR\fHO\fH^\fHS\fHB\fHS\fHs\fIk\fHMgfp`qjswjlm!#`lmwfmw>!gl`vnfmw-ol`bwjlm-sqlw-dfwFofnfmwpAzWbdMbnf+?\"GL@WZSF#kwno=\t?kwno#?nfwb#`kbqpfw>!vwe.;!=9vqo!#`lmwfmw>!kwws9,,-`pp!#qfo>!pwzofpkffw!pwzof#wzsf>!wf{w,`pp!=wzsf>!wf{w,`pp!#kqfe>!t0-lqd,2:::,{kwno!#{nowzsf>!wf{w,ibubp`qjsw!#nfwklg>!dfw!#b`wjlm>!ojmh#qfo>!pwzofpkffw!##>#gl`vnfmw-dfwFofnfmwwzsf>!jnbdf,{.j`lm!#,=`foosbggjmd>!3!#`foops-`pp!#wzsf>!wf{w,`pp!#?,b=?,oj=?oj=?b#kqfe>!!#tjgwk>!2!#kfjdkw>!2!!=?b#kqfe>!kwws9,,ttt-pwzof>!gjpsobz9mlmf8!=bowfqmbwf!#wzsf>!bssoj.,,T0@,,GWG#[KWNO#2-3#foopsb`jmd>!3!#`foosbg#wzsf>!kjggfm!#ubovf>!,b=%maps8?psbm#qlof>!p\t?jmsvw#wzsf>!kjggfm!#obmdvbdf>!IbubP`qjsw!##gl`vnfmw-dfwFofnfmwpAd>!3!#`foopsb`jmd>!3!#zsf>!wf{w,`pp!#nfgjb>!wzsf>$wf{w,ibubp`qjsw$tjwk#wkf#f{`fswjlm#le#zsf>!wf{w,`pp!#qfo>!pw#kfjdkw>!2!#tjgwk>!2!#>$(fm`lgfVQJ@lnslmfmw+?ojmh#qfo>!bowfqmbwf!#\talgz/#wq/#jmsvw/#wf{wnfwb#mbnf>!qlalwp!#`lmnfwklg>!slpw!#b`wjlm>!=\t?b#kqfe>!kwws9,,ttt-`pp!#qfo>!pwzofpkffw!#?,gju=?,gju=?gju#`obppobmdvbdf>!ibubp`qjsw!=bqjb.kjggfm>!wqvf!=.[?qjsw!#wzsf>!wf{w,ibubpo>38~*+*8\t+evm`wjlm+*xab`hdqlvmg.jnbdf9#vqo+,b=?,oj=?oj=?b#kqfe>!k\n\n?oj=?b#kqfe>!kwws9,,bwlq!#bqjb.kjggfm>!wqv=#?b#kqfe>!kwws9,,ttt-obmdvbdf>!ibubp`qjsw!#,lswjlm=\t?lswjlm#ubovf,gju=?,gju=?gju#`obpp>qbwlq!#bqjb.kjggfm>!wqf>+mft#Gbwf*-dfwWjnf+*slqwvdv/Fp#+gl#Aqbpjo*!wf{w,?nfwb#kwws.frvju>!@lmwfqbmpjwjlmbo,,FM!#!kwws9?kwno#{nomp>!kwws9,,ttt.,,T0@,,GWG#[KWNO#2-3#WGWG,{kwno2.wqbmpjwjlmbo,,ttt-t0-lqd,WQ,{kwno2,sf#>#$wf{w,ibubp`qjsw$8?nfwb#mbnf>!gfp`qjswjlmsbqfmwMlgf-jmpfqwAfelqf?jmsvw#wzsf>!kjggfm!#mbip!#wzsf>!wf{w,ibubp`qj+gl`vnfmw*-qfbgz+evm`wjp`qjsw#wzsf>!wf{w,ibubpjnbdf!#`lmwfmw>!kwws9,,VB.@lnsbwjaof!#`lmwfmw>wno8#`kbqpfw>vwe.;!#,=\tojmh#qfo>!pklqw`vw#j`lm?ojmh#qfo>!pwzofpkffw!#?,p`qjsw=\t?p`qjsw#wzsf>>#gl`vnfmw-`qfbwfFofnfm?b#wbqdfw>!\\aobmh!#kqfe>#gl`vnfmw-dfwFofnfmwpAjmsvw#wzsf>!wf{w!#mbnf>b-wzsf#>#$wf{w,ibubp`qjmsvw#wzsf>!kjggfm!#mbnfkwno8#`kbqpfw>vwe.;!#,=gwg!=\t?kwno#{nomp>!kwws.,,T0@,,GWG#KWNO#7-32#WfmwpAzWbdMbnf+$p`qjsw$*jmsvw#wzsf>!kjggfm!#mbn?p`qjsw#wzsf>!wf{w,ibubp!#pwzof>!gjpsobz9mlmf8!=gl`vnfmw-dfwFofnfmwAzJg+>gl`vnfmw-`qfbwfFofnfmw+$#wzsf>$wf{w,ibubp`qjsw$jmsvw#wzsf>!wf{w!#mbnf>!g-dfwFofnfmwpAzWbdMbnf+pmj`bo!#kqfe>!kwws9,,ttt-@,,GWG#KWNO#7-32#Wqbmpjw?pwzof#wzsf>!wf{w,`pp!=\t\t?pwzof#wzsf>!wf{w,`pp!=jlmbo-gwg!=\t?kwno#{nomp>kwws.frvju>!@lmwfmw.Wzsfgjmd>!3!#`foopsb`jmd>!3!kwno8#`kbqpfw>vwe.;!#,=\t#pwzof>!gjpsobz9mlmf8!=??oj=?b#kqfe>!kwws9,,ttt-#wzsf>$wf{w,ibubp`qjsw$=&*&'&^&\x88\u0178\u0C3E&\u01AD&\u0192&)&^&%&'&\x82&P&1&\xB1&3&]&m&u&E&t&C&\xCF&V&V&/&>&6&\u0F76\u177Co&p&@&E&M&P&x&@&F&e&\xCC&7&:&(&D&0&C&)&.&F&-&1&(&L&F&1\u025E*\u03EA\u21F3&\u1372&K&;&)&E&H&P&0&?&9&V&\x81&-&v&a&,&E&)&?&=&'&'&B&\u0D2E&\u0503&\u0316*&*8&%&%&&&%,)&\x9A&>&\x86&7&]&F&2&>&J&6&n&2&%&?&\x8E&2&6&J&g&-&0&,&*&J&*&O&)&6&(&<&B&N&.&P&@&2&.&W&M&%\u053C\x84(,(<&,&\u03DA&\u18C7&-&,(%&(&%&(\u013B0&X&D&\x81&j&'&J&(&.&B&3&Z&R&h&3&E&E&<\xC6-\u0360\u1EF3&%8?&@&,&Z&@&0&J&,&^&x&_&6&C&6&C\u072C\u2A25&f&-&-&-&-&,&J&2&8&z&8&C&Y&8&-&d&\u1E78\xCC-&7&1&F&7&t&W&7&I&.&.&^&=\u0F9C\u19D3&8(>&/&/&\u077B')'\u1065')'%@/&0&%\u043E\u09C0*&*@&C\u053D\u05D4\u0274\u05EB4\u0DD7\u071A\u04D16\u0D84&/\u0178\u0303Z&*%\u0246\u03FF&\u0134&1\xA8\u04B4\u0174", dictionarySizeBits, "AAAAKKLLKKKKKJJIHHIHHGGFF"); + setData(dictionaryData, dictionarySizeBits); + function InputStream(data) { + this.data = new Int8Array(0); + this.offset = 0; + this.data = data; + } + function readInput(s, dst, offset, length) { + if (s.input === null) { + return -1; + } + const src = s.input; + const end = Math.min(src.offset + length, src.data.length); + const bytesRead = end - src.offset; + dst.set(src.data.subarray(src.offset, end), offset); + src.offset += bytesRead; + return bytesRead; + } + function closeInput(s) { + s.input = new InputStream(new Int8Array(0)); + } + function toUsAsciiBytes(src) { + const n = src.length; + const result = new Int8Array(n); + for (let i = 0; i < n; ++i) { + result[i] = src.charCodeAt(i); + } + return result; + } + function toUtf8Runes(src) { + const n = src.length; + const result = new Int32Array(n); + for (let i = 0; i < n; ++i) { + result[i] = src.charCodeAt(i); + } + return result; + } + function makeError(s, code) { + if (code >= 0) { + return code; + } + if (s.runningState >= 0) { + s.runningState = code; + } + throw new Error("Brotli error code: " + code); + } + let ByteBuffer; + function decode(bytes, options) { + let s = new State(); + s.input = new InputStream(bytes); + initState(s); + if (options) { + let customDictionary = options["customDictionary"]; + if (customDictionary) attachDictionaryChunk(s, customDictionary); + } + let totalOutput = 0; + let chunks = []; + while (true) { + let chunk = new Int8Array(16384); + chunks.push(chunk); + s.output = chunk; + s.outputOffset = 0; + s.outputLength = 16384; + s.outputUsed = 0; + decompress(s); + totalOutput += s.outputUsed; + if (s.outputUsed < 16384) break; + } + close(s); + closeInput(s); + let result = new Int8Array(totalOutput); + let offset = 0; + for (let i = 0; i < chunks.length; ++i) { + let chunk = chunks[i]; + let end = Math.min(totalOutput, offset + 16384); + let len = end - offset; + if (len < 16384) { + result.set(chunk.subarray(0, len), offset); + } else { + result.set(chunk, offset); + } + offset += len; + } + return result; + } + return decode; +}; +let BrotliDecode = makeBrotliDecode(); +;// ./src/core/brotli_stream.js + + + + + + + + +class BrotliStream extends DecodeStream { + #isAsync = true; + constructor(stream, maybeLength) { + super(maybeLength); + this.stream = stream; + this.dict = stream.dict; + } + readBlock() { + const bytes = this.stream.getBytes(); + const decodedData = BrotliDecode(new Int8Array(bytes.buffer, bytes.byteOffset, bytes.length)); + this.buffer = new Uint8Array(decodedData.buffer, decodedData.byteOffset, decodedData.length); + this.bufferLength = this.buffer.length; + this.eof = true; + } + async getImageData(length, _decoderOptions) { + const data = await this.asyncGetBytes(); + if (!data) { + return this.getBytes(length); + } + return data.length <= length ? data : data.subarray(0, length); + } + async asyncGetBytes() { + const { + decompressed, + compressed + } = await this.asyncGetBytesFromDecompressionStream("brotli"); + if (decompressed) { + return decompressed; + } + this.#isAsync = false; + this.stream = new Stream(compressed, 0, compressed.length, this.stream.dict); + this.reset(); + return null; + } + get isAsync() { + return this.#isAsync; + } +} + +;// ./external/jbig2/jbig2.js + + + + + + +async function JBig2(moduleArg = {}) { + var Module = moduleArg; + var ENVIRONMENT_IS_WEB = true; + var ENVIRONMENT_IS_WORKER = false; + var programArgs = []; + var thisProgram = "./this.program"; + var quit_ = (status, toThrow) => { + throw toThrow; + }; + var _scriptName = import.meta.url; + var scriptDirectory = ""; + var readAsync, readBinary; + if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { + try { + scriptDirectory = new URL(".", _scriptName).href; + } catch {} + readAsync = async url => { + var response = await fetch(url, { + credentials: "same-origin" + }); + if (response.ok) { + return response.arrayBuffer(); + } + throw new Error(response.status + " : " + response.url); + }; + } else {} + var out = console.log.bind(console); + var err = console.error.bind(console); + var wasmBinary; + var ABORT = false; + var EXITSTATUS; + class EmscriptenEH {} + class EmscriptenSjLj extends EmscriptenEH {} + var runtimeInitialized = false; + function getMemoryBuffer() { + return wasmMemory.buffer; + } + function updateMemoryViews() { + if (HEAP8?.buffer?.resizable) return; + var b = getMemoryBuffer(); + HEAP8 = new Int8Array(b); + HEAPU8 = new Uint8Array(b); + } + function preRun() { + var preRun = Module["preRun"]; + if (preRun) { + if (typeof preRun == "function") preRun = [preRun]; + onPreRuns.push(...preRun); + } + callRuntimeCallbacks(onPreRuns); + } + function initRuntime() { + runtimeInitialized = true; + wasmExports["j"](); + } + function postRun() { + var postRun = Module["postRun"]; + if (postRun) { + if (typeof postRun == "function") postRun = [postRun]; + onPostRuns.push(...postRun); + } + callRuntimeCallbacks(onPostRuns); + } + function abort(what) { + Module["onAbort"]?.(what); + what = `Aborted(${what})`; + err(what); + ABORT = true; + what += ". Build with -sASSERTIONS for more info."; + var e = new WebAssembly.RuntimeError(what); + throw e; + } + var wasmBinaryFile; + function getWasmImports() { + var imports = { + a: wasmImports + }; + return imports; + } + async function createWasm() { + function receiveInstance(instance) { + wasmExports = instance.exports; + assignWasmExports(wasmExports); + updateMemoryViews(); + return wasmExports; + } + var info = getWasmImports(); + var instantiateWasm = Module["instantiateWasm"]; + return new Promise(resolve => { + instantiateWasm(info, inst => resolve(receiveInstance(inst))); + }); + } + class ExitStatus { + name = "ExitStatus"; + constructor(status) { + this.message = `Program terminated with exit(${status})`; + this.status = status; + } + } + var HEAP8; + var callRuntimeCallbacks = callbacks => { + while (callbacks.length > 0) { + callbacks.shift()(Module); + } + }; + var onPostRuns = []; + var onPreRuns = []; + var noExitRuntime = true; + var __abort_js = () => abort(""); + var runtimeKeepaliveCounter = 0; + var __emscripten_runtime_keepalive_clear = () => { + noExitRuntime = false; + runtimeKeepaliveCounter = 0; + }; + var timers = {}; + var handleException = e => { + if (e instanceof ExitStatus || e == "unwind") { + return EXITSTATUS; + } + quit_(1, e); + }; + var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0; + var _proc_exit = code => { + EXITSTATUS = code; + if (!keepRuntimeAlive()) { + Module["onExit"]?.(code); + ABORT = true; + } + quit_(code, new ExitStatus(code)); + }; + var exitJS = (status, implicit) => { + EXITSTATUS = status; + _proc_exit(status); + }; + var _exit = exitJS; + var maybeExit = () => { + if (!keepRuntimeAlive()) { + try { + _exit(EXITSTATUS); + } catch (e) { + handleException(e); + } + } + }; + var callUserCallback = func => { + if (ABORT) { + return; + } + try { + return func(); + } catch (e) { + handleException(e); + } finally { + maybeExit(); + } + }; + var _emscripten_get_now = () => performance.now(); + var __setitimer_js = (which, timeout_ms) => { + if (timers[which]) { + clearTimeout(timers[which].id); + delete timers[which]; + } + if (!timeout_ms) return 0; + var id = setTimeout(() => { + delete timers[which]; + callUserCallback(() => __emscripten_timeout(which, _emscripten_get_now())); + }, timeout_ms); + timers[which] = { + id, + timeout_ms + }; + return 0; + }; + function _createImageData(size) { + Module.imageData = new Uint8Array(size); + } + var getHeapMax = () => 2147483648; + var alignMemory = (size, alignment) => Math.ceil(size / alignment) * alignment; + var growMemory = size => { + var oldHeapSize = wasmMemory.buffer.byteLength; + var pages = (size - oldHeapSize + 65535) / 65536 | 0; + try { + wasmMemory.grow(pages); + updateMemoryViews(); + return 1; + } catch (e) {} + }; + var HEAPU8; + var _emscripten_resize_heap = requestedSize => { + var oldSize = HEAPU8.length; + requestedSize >>>= 0; + var maxHeapSize = getHeapMax(); + if (requestedSize > maxHeapSize) { + return false; + } + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + .2 / cutDown); + overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296); + var newSize = Math.min(maxHeapSize, alignMemory(Math.max(requestedSize, overGrownHeapSize), 65536)); + var replacement = growMemory(newSize); + if (replacement) { + return true; + } + } + return false; + }; + function _setImageData(array_ptr, pitch8, pitch32, height) { + if (pitch32 === pitch8) { + Module.imageData = new Uint8ClampedArray(HEAPU8.subarray(array_ptr, array_ptr + pitch32 * height)); + return; + } + const destSize = pitch8 * height; + const imageData = Module.imageData = new Uint8ClampedArray(destSize); + for (let srcStart = array_ptr, destStart = 0; destStart < destSize; srcStart += pitch32, destStart += pitch8) { + imageData.set(HEAPU8.subarray(srcStart, srcStart + pitch8), destStart); + } + } + function _setLineData(line_ptr, pitch8, offset) { + Module.imageData.set(HEAPU8.subarray(line_ptr, line_ptr + pitch8), offset); + } + var writeArrayToMemory = (array, buffer) => { + HEAP8.set(array, buffer); + }; + if (Module["noExitRuntime"]) noExitRuntime = Module["noExitRuntime"]; + if (Module["print"]) out = Module["print"]; + if (Module["printErr"]) err = Module["printErr"]; + if (Module["arguments"]) programArgs = Module["arguments"]; + if (Module["thisProgram"]) thisProgram = Module["thisProgram"]; + var preInit = Module["preInit"]; + if (preInit) { + if (typeof preInit == "function") Module["preInit"] = preInit = [preInit]; + while (preInit.length > 0) { + preInit.shift()(); + } + } + Module["writeArrayToMemory"] = writeArrayToMemory; + var _malloc, _free, _jbig2_decode, _ccitt_decode, __emscripten_timeout, memory, __indirect_function_table, wasmMemory; + function assignWasmExports(wasmExports) { + _malloc = Module["_malloc"] = wasmExports["k"]; + _free = Module["_free"] = wasmExports["l"]; + _jbig2_decode = Module["_jbig2_decode"] = wasmExports["m"]; + _ccitt_decode = Module["_ccitt_decode"] = wasmExports["n"]; + __emscripten_timeout = wasmExports["o"]; + memory = wasmMemory = wasmExports["i"]; + __indirect_function_table = wasmExports["__indirect_function_table"]; + } + var wasmImports = { + e: __abort_js, + d: __emscripten_runtime_keepalive_clear, + a: __setitimer_js, + g: _createImageData, + b: _emscripten_resize_heap, + c: _proc_exit, + h: _setImageData, + f: _setLineData + }; + async function run() { + preRun(); + var setStatus = Module["setStatus"]; + if (setStatus) { + setStatus("Running..."); + await new Promise(resolve => setTimeout(resolve, 1)); + setTimeout(setStatus, 1, ""); + } + if (ABORT) return; + initRuntime(); + Module["onRuntimeInitialized"]?.(); + postRun(); + } + var wasmExports; + wasmExports = await createWasm(); + await run(); + return Module; +} +/* harmony default export */ const jbig2 = (JBig2); +;// ./src/core/wasm_image.js + + + + + + + + + + +class WasmImage { + static #handler = null; + static #instances = new Set(); + static #useWasm = true; + static #useWorkerFetch = true; + static #wasmUrl = null; + #buffer = null; + #modulePromise = null; + _filename = null; + _noWasmFilename = null; + static setOptions({ + handler, + useWasm, + useWorkerFetch, + wasmUrl + }) { + WasmImage.#useWasm = useWasm; + WasmImage.#useWorkerFetch = useWorkerFetch; + WasmImage.#wasmUrl = wasmUrl; + if (!useWorkerFetch) { + WasmImage.#handler = handler; + } + } + static get instance() { + unreachable("Abstract getter `instance` accessed"); + } + static cleanup() { + for (const instance of WasmImage.#instances) { + instance.#modulePromise = null; + } + } + constructor(trackInstance = false) { + if (trackInstance) { + WasmImage.#instances.add(this); + } + } + async #getJsModule(fallbackCallback) { + let instance = null; + try { + const mod = await import( + /*webpackIgnore: true*/ + /*@vite-ignore*/ + `${WasmImage.#wasmUrl}${this._noWasmFilename}`); + instance = mod.default(); + } catch (ex) { + warn(`#getJsModule: ${ex}`); + } + fallbackCallback(instance); + } + async #instantiateWasm(fallbackCallback, imports, successCallback) { + try { + if (!this.#buffer) { + if (WasmImage.#useWorkerFetch) { + this.#buffer = await fetchBinaryData(`${WasmImage.#wasmUrl}${this._filename}`); + } else { + this.#buffer = await WasmImage.#handler.sendWithPromise("FetchBinaryData", { + kind: "wasmUrl", + filename: this._filename + }); + } + } + const results = await WebAssembly.instantiate(this.#buffer, imports); + return successCallback(results.instance); + } catch (ex) { + warn(`#instantiateWasm: ${ex}`); + this.#getJsModule(fallbackCallback); + return null; + } + } + _getModule(ImageDecoder) { + if (!this.#modulePromise) { + const { + promise, + resolve + } = Promise.withResolvers(); + const promises = [promise]; + if (!WasmImage.#useWasm) { + this.#getJsModule(resolve); + } else { + promises.push(ImageDecoder({ + warn: warn, + instantiateWasm: this.#instantiateWasm.bind(this, resolve) + })); + } + this.#modulePromise = Promise.race(promises); + } + return this.#modulePromise; + } + async decode(bytes, _params) { + unreachable("Abstract method `decode` called"); + } +} + +;// ./src/core/jbig2_ccittFax.js + + + +class Jbig2Error extends BaseException { + constructor(msg) { + super(msg, "Jbig2Error"); + } +} +class JBig2CCITTFaxImage extends WasmImage { + _filename = "jbig2.wasm"; + _noWasmFilename = "jbig2_nowasm_fallback.js"; + static get instance() { + return util_shadow(this, "instance", new JBig2CCITTFaxImage(true)); + } + async decode(bytes, width, height, globals, CCITTOptions) { + const module = await this._getModule(jbig2); + if (!module) { + throw new Jbig2Error("JBig2 failed to initialize"); + } + let ptr, globalsPtr; + try { + const size = bytes.length; + ptr = module._malloc(size); + module.writeArrayToMemory(bytes, ptr); + if (CCITTOptions) { + module._ccitt_decode(ptr, size, width, height, CCITTOptions.K, CCITTOptions.EndOfLine ? 1 : 0, CCITTOptions.EncodedByteAlign ? 1 : 0, CCITTOptions.BlackIs1 ? 1 : 0, CCITTOptions.Columns, CCITTOptions.Rows); + } else { + const globalsSize = globals ? globals.length : 0; + if (globalsSize > 0) { + globalsPtr = module._malloc(globalsSize); + module.writeArrayToMemory(globals, globalsPtr); + } + module._jbig2_decode(ptr, size, width, height, globalsPtr, globalsSize); + } + if (!module.imageData) { + throw new Jbig2Error("Unknown error"); + } + const { + imageData + } = module; + module.imageData = null; + return imageData; + } finally { + if (ptr) { + module._free(ptr); + } + if (globalsPtr) { + module._free(globalsPtr); + } + } + } +} + +;// ./src/core/ccitt_stream.js + + + + +class CCITTFaxStream extends DecodeStream { + constructor(str, maybeLength, params) { + super(maybeLength); + this.stream = str; + this.maybeLength = maybeLength; + this.dict = str.dict; + if (!(params instanceof Dict)) { + params = Dict.empty; + } + this.params = { + K: params.get("K") || 0, + EndOfLine: !!params.get("EndOfLine"), + EncodedByteAlign: !!params.get("EncodedByteAlign"), + Columns: params.get("Columns") || 1728, + Rows: params.get("Rows") || 0, + EndOfBlock: !!(params.get("EndOfBlock") ?? true), + BlackIs1: !!params.get("BlackIs1") + }; + } + get bytes() { + return util_shadow(this, "bytes", this.stream.getBytes(this.maybeLength)); + } + get isImageStream() { + return true; + } + get isAsyncDecoder() { + return true; + } + async decodeImage(bytes, length, _decoderOptions) { + if (this.eof) { + return this.buffer; + } + bytes ??= this.stream.isAsync ? (await this.stream.asyncGetBytes()) || this.bytes : this.bytes; + this.buffer = await JBig2CCITTFaxImage.instance.decode(bytes, this.dict.get("W", "Width"), this.dict.get("H", "Height"), null, this.params); + this.bufferLength = this.buffer.length; + this.eof = true; + return this.buffer; + } +} + +;// ./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]), 9]; +const fixedDistCodeTab = [new Int32Array([0x50000, 0x50010, 0x50008, 0x50018, 0x50004, 0x50014, 0x5000c, 0x5001c, 0x50002, 0x50012, 0x5000a, 0x5001a, 0x50006, 0x50016, 0x5000e, 0x00000, 0x50001, 0x50011, 0x50009, 0x50019, 0x50005, 0x50015, 0x5000d, 0x5001d, 0x50003, 0x50013, 0x5000b, 0x5001b, 0x50007, 0x50017, 0x5000f, 0x00000]), 5]; +class FlateStream extends DecodeStream { + #isAsync = true; + constructor(str, maybeLength) { + super(maybeLength); + this.stream = 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: ${cmf}, ${flg}`); + } + 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(length, _decoderOptions) { + const data = await this.asyncGetBytes(); + if (!data) { + return this.getBytes(length); + } + return data.length <= length ? data : data.subarray(0, length); + } + async asyncGetBytes() { + const { + decompressed, + compressed + } = await this.asyncGetBytesFromDecompressionStream("deflate"); + if (decompressed) { + return decompressed; + } + this.#isAsync = false; + this.stream = new Stream(compressed, 2, compressed.length, this.stream.dict); + this.reset(); + return null; + } + get isAsync() { + return this.#isAsync; + } + getBits(bits) { + const str = this.stream; + 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"); + } + codeBuf |= b << codeSize; + codeSize += 8; + } + b = codeBuf & (1 << bits) - 1; + this.codeBuf = codeBuf >> bits; + this.codeSize = codeSize -= bits; + return b; + } + getCode(table) { + const str = this.stream; + 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 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(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 = code2; i < size; i += skip) { + codes[i] = len << 16 | val; + } + ++code; + } + } + } + return [codes, maxLen]; + } + #endsStreamOnError(err) { + info(err); + this.eof = true; + } + readBlock() { + let buffer, hdr, len; + const str = this.stream; + try { + hdr = this.getBits(3); + } catch (ex) { + this.#endsStreamOnError(ex.message); + return; + } + 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 blockLen = b; + if ((b = str.getByte()) === -1) { + this.#endsStreamOnError("Bad block header in flate stream"); + return; + } + blockLen |= b << 8; + if ((b = str.getByte()) === -1) { + this.#endsStreamOnError("Bad block header in flate stream"); + return; + } + let check = b; + if ((b = str.getByte()) === -1) { + this.#endsStreamOnError("Bad block header in flate stream"); + return; + } + 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 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 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); + } + 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; + } + 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 (code1 === 256) { + this.bufferLength = pos; + return; + } + 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]; + } + } + } +} + +;// ./src/core/jbig2_stream.js + + + + + +class Jbig2Stream extends DecodeStream { + constructor(stream, maybeLength, params) { + super(maybeLength); + this.stream = stream; + this.dict = stream.dict; + this.maybeLength = maybeLength; + this.params = params; + } + get bytes() { + return util_shadow(this, "bytes", this.stream.getBytes(this.maybeLength)); + } + ensureBuffer(requested) {} + get isAsyncDecoder() { + return true; + } + get isImageStream() { + return true; + } + static stripFileHeader(bytes) { + if (bytes.length >= 9 && bytes[0] === 0x97 && bytes[1] === 0x4a && bytes[2] === 0x42 && bytes[3] === 0x32 && bytes[4] === 0x0d && bytes[5] === 0x0a && bytes[6] === 0x1a && bytes[7] === 0x0a) { + const headerLength = (bytes[8] & 2) === 0 ? 13 : 9; + return bytes.subarray(headerLength); + } + return bytes; + } + async decodeImage(bytes, length, _decoderOptions) { + if (this.eof) { + return this.buffer; + } + bytes = Jbig2Stream.stripFileHeader(bytes || this.bytes); + let globals = null; + if (this.params instanceof Dict) { + const globalsStream = this.params.get("JBIG2Globals"); + if (globalsStream instanceof BaseStream) { + globals = Jbig2Stream.stripFileHeader(globalsStream.getBytes()); + } + } + this.buffer = await JBig2CCITTFaxImage.instance.decode(bytes, this.dict.get("Width"), this.dict.get("Height"), globals); + this.bufferLength = this.buffer.length; + this.eof = true; + return this.buffer; + } + get canAsyncDecodeImageFromBuffer() { + return this.stream.isAsync; + } +} + +;// ./external/openjpeg/openjpeg.js + + + + + + +async function OpenJPEG(moduleArg = {}) { + var Module = moduleArg; + var ENVIRONMENT_IS_WEB = true; + var ENVIRONMENT_IS_WORKER = false; + var programArgs = []; + var thisProgram = "./this.program"; + var quit_ = (status, toThrow) => { + throw toThrow; + }; + var _scriptName = import.meta.url; + var scriptDirectory = ""; + var readAsync, readBinary; + if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { + try { + scriptDirectory = new URL(".", _scriptName).href; + } catch {} + readAsync = async url => { + var response = await fetch(url, { + credentials: "same-origin" + }); + if (response.ok) { + return response.arrayBuffer(); + } + throw new Error(response.status + " : " + response.url); + }; + } else {} + var out = console.log.bind(console); + var err = console.error.bind(console); + var wasmBinary; + var ABORT = false; + var EXITSTATUS; + class EmscriptenEH {} + class EmscriptenSjLj extends EmscriptenEH {} + var runtimeInitialized = false; + function getMemoryBuffer() { + return wasmMemory.buffer; + } + function updateMemoryViews() { + if (HEAP8?.buffer?.resizable) return; + var b = getMemoryBuffer(); + HEAP8 = new Int8Array(b); + HEAPU8 = new Uint8Array(b); + HEAP32 = new Int32Array(b); + HEAPU32 = new Uint32Array(b); + } + function preRun() { + var preRun = Module["preRun"]; + if (preRun) { + if (typeof preRun == "function") preRun = [preRun]; + onPreRuns.push(...preRun); + } + callRuntimeCallbacks(onPreRuns); + } + function initRuntime() { + runtimeInitialized = true; + wasmExports["s"](); + } + function postRun() { + var postRun = Module["postRun"]; + if (postRun) { + if (typeof postRun == "function") postRun = [postRun]; + onPostRuns.push(...postRun); + } + callRuntimeCallbacks(onPostRuns); + } + function abort(what) { + Module["onAbort"]?.(what); + what = `Aborted(${what})`; + err(what); + ABORT = true; + what += ". Build with -sASSERTIONS for more info."; + var e = new WebAssembly.RuntimeError(what); + throw e; + } + var wasmBinaryFile; + function getWasmImports() { + var imports = { + a: wasmImports + }; + return imports; + } + async function createWasm() { + function receiveInstance(instance) { + wasmExports = instance.exports; + assignWasmExports(wasmExports); + updateMemoryViews(); + return wasmExports; + } + var info = getWasmImports(); + var instantiateWasm = Module["instantiateWasm"]; + return new Promise(resolve => { + instantiateWasm(info, inst => resolve(receiveInstance(inst))); + }); + } + class ExitStatus { + name = "ExitStatus"; + constructor(status) { + this.message = `Program terminated with exit(${status})`; + this.status = status; + } + } + var HEAP8; + var callRuntimeCallbacks = callbacks => { + while (callbacks.length > 0) { + callbacks.shift()(Module); + } + }; + var onPostRuns = []; + var onPreRuns = []; + var noExitRuntime = true; + var __abort_js = () => abort(""); + var runtimeKeepaliveCounter = 0; + var __emscripten_runtime_keepalive_clear = () => { + noExitRuntime = false; + runtimeKeepaliveCounter = 0; + }; + var timers = {}; + var handleException = e => { + if (e instanceof ExitStatus || e == "unwind") { + return EXITSTATUS; + } + quit_(1, e); + }; + var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0; + var _proc_exit = code => { + EXITSTATUS = code; + if (!keepRuntimeAlive()) { + Module["onExit"]?.(code); + ABORT = true; + } + quit_(code, new ExitStatus(code)); + }; + var exitJS = (status, implicit) => { + EXITSTATUS = status; + _proc_exit(status); + }; + var _exit = exitJS; + var maybeExit = () => { + if (!keepRuntimeAlive()) { + try { + _exit(EXITSTATUS); + } catch (e) { + handleException(e); + } + } + }; + var callUserCallback = func => { + if (ABORT) { + return; + } + try { + return func(); + } catch (e) { + handleException(e); + } finally { + maybeExit(); + } + }; + var _emscripten_get_now = () => performance.now(); + var __setitimer_js = (which, timeout_ms) => { + if (timers[which]) { + clearTimeout(timers[which].id); + delete timers[which]; + } + if (!timeout_ms) return 0; + var id = setTimeout(() => { + delete timers[which]; + callUserCallback(() => __emscripten_timeout(which, _emscripten_get_now())); + }, timeout_ms); + timers[which] = { + id, + timeout_ms + }; + return 0; + }; + var HEAP32; + function _copy_pixels_1(compG_ptr, nb_pixels) { + compG_ptr >>= 2; + const imageData = Module.imageData = new Uint8ClampedArray(nb_pixels); + const compG = 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 = HEAP32.subarray(compR_ptr, compR_ptr + nb_pixels); + const compG = HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels); + const compB = 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 = HEAP32.subarray(compR_ptr, compR_ptr + nb_pixels); + const compG = HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels); + const compB = HEAP32.subarray(compB_ptr, compB_ptr + nb_pixels); + const compA = 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 alignMemory = (size, alignment) => Math.ceil(size / alignment) * alignment; + var growMemory = size => { + var oldHeapSize = wasmMemory.buffer.byteLength; + var pages = (size - oldHeapSize + 65535) / 65536 | 0; + try { + wasmMemory.grow(pages); + updateMemoryViews(); + return 1; + } catch (e) {} + }; + var HEAPU8; + var _emscripten_resize_heap = requestedSize => { + var oldSize = HEAPU8.length; + requestedSize >>>= 0; + var maxHeapSize = getHeapMax(); + if (requestedSize > maxHeapSize) { + return false; + } + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + .2 / cutDown); + overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296); + var newSize = Math.min(maxHeapSize, alignMemory(Math.max(requestedSize, overGrownHeapSize), 65536)); + var replacement = growMemory(newSize); + if (replacement) { + return true; + } + } + return false; + }; + var ENV = {}; + var getExecutableName = () => thisProgram; + var getEnvStrings = () => { + if (!getEnvStrings.strings) { + var lang = (globalThis.navigator?.language ?? "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 stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => { + if (!(maxBytesToWrite > 0)) return 0; + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; + for (var i = 0; i < str.length; ++i) { + var u = str.codePointAt(i); + if (u <= 127) { + if (outIdx >= endIdx) break; + heap[outIdx++] = u; + } else if (u <= 2047) { + if (outIdx + 1 >= endIdx) break; + heap[outIdx++] = 192 | u >> 6; + heap[outIdx++] = 128 | u & 63; + } else if (u <= 65535) { + if (outIdx + 2 >= endIdx) break; + heap[outIdx++] = 224 | u >> 12; + heap[outIdx++] = 128 | u >> 6 & 63; + heap[outIdx++] = 128 | u & 63; + } else { + if (outIdx + 3 >= endIdx) break; + heap[outIdx++] = 240 | u >> 18; + heap[outIdx++] = 128 | u >> 12 & 63; + heap[outIdx++] = 128 | u >> 6 & 63; + heap[outIdx++] = 128 | u & 63; + i++; + } + } + heap[outIdx] = 0; + return outIdx - startIdx; + }; + var stringToUTF8 = (str, outPtr, maxBytesToWrite) => stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); + var HEAPU32; + var _environ_get = (__environ, environ_buf) => { + var bufSize = 0; + var envp = 0; + for (var string of getEnvStrings()) { + var ptr = environ_buf + bufSize; + HEAPU32[__environ + envp >> 2] = ptr; + bufSize += stringToUTF8(string, ptr, Infinity) + 1; + envp += 4; + } + return 0; + }; + var lengthBytesUTF8 = str => { + var len = 0; + for (var i = 0; i < str.length; ++i) { + var c = str.charCodeAt(i); + if (c <= 127) { + len++; + } else if (c <= 2047) { + len += 2; + } else if (c >= 55296 && c <= 57343) { + len += 4; + ++i; + } else { + len += 3; + } + } + return len; + }; + var _environ_sizes_get = (penviron_count, penviron_buf_size) => { + var strings = getEnvStrings(); + HEAPU32[penviron_count >> 2] = strings.length; + var bufSize = 0; + for (var string of strings) { + bufSize += lengthBytesUTF8(string) + 1; + } + HEAPU32[penviron_buf_size >> 2] = bufSize; + return 0; + }; + var INT53_MAX = 9007199254740992; + var INT53_MIN = -9007199254740992; + var bigintToI53Checked = num => num < INT53_MIN || num > INT53_MAX ? NaN : Number(num); + function _fd_seek(fd, offset, whence, newOffset) { + offset = bigintToI53Checked(offset); + return 70; + } + var printCharBuffers = [null, [], []]; + var UTF8Decoder = globalThis.TextDecoder && new TextDecoder(); + var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { + var maxIdx = idx + maxBytesToRead; + if (ignoreNul) return maxIdx; + while (heapOrArray[idx] && !(idx >= maxIdx)) ++idx; + return idx; + }; + var UTF8ArrayToString = (heapOrArray, idx = 0, maxBytesToRead, ignoreNul) => { + var endPtr = findStringEnd(heapOrArray, idx, maxBytesToRead, ignoreNul); + 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 || curr === 10) { + (stream === 1 ? out : err)(UTF8ArrayToString(buffer)); + buffer.length = 0; + } else { + buffer.push(curr); + } + }; + var UTF8ToString = (ptr, maxBytesToRead, ignoreNul) => ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead, ignoreNul) : ""; + 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 = 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 = HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels); + const compA = 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 = HEAP32.subarray(compR_ptr, compR_ptr + nb_pixels); + const compG = HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels); + const compB = 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 writeArrayToMemory = (array, buffer) => { + HEAP8.set(array, buffer); + }; + if (Module["noExitRuntime"]) noExitRuntime = Module["noExitRuntime"]; + if (Module["print"]) out = Module["print"]; + if (Module["printErr"]) err = Module["printErr"]; + if (Module["arguments"]) programArgs = Module["arguments"]; + if (Module["thisProgram"]) thisProgram = Module["thisProgram"]; + var preInit = Module["preInit"]; + if (preInit) { + if (typeof preInit == "function") Module["preInit"] = preInit = [preInit]; + while (preInit.length > 0) { + preInit.shift()(); + } + } + Module["writeArrayToMemory"] = writeArrayToMemory; + var _malloc, _free, _jp2_decode, __emscripten_timeout, memory, __indirect_function_table, wasmMemory; + function assignWasmExports(wasmExports) { + _malloc = Module["_malloc"] = wasmExports["t"]; + _free = Module["_free"] = wasmExports["u"]; + _jp2_decode = Module["_jp2_decode"] = wasmExports["v"]; + __emscripten_timeout = wasmExports["w"]; + memory = wasmMemory = wasmExports["r"]; + __indirect_function_table = wasmExports["__indirect_function_table"]; + } + var wasmImports = { + m: __abort_js, + l: __emscripten_runtime_keepalive_clear, + i: __setitimer_js, + f: _copy_pixels_1, + e: _copy_pixels_3, + d: _copy_pixels_4, + j: _emscripten_resize_heap, + o: _environ_get, + p: _environ_sizes_get, + n: _fd_seek, + b: _fd_write, + q: _gray_to_rgba, + h: _graya_to_rgba, + c: _jsPrintWarning, + k: _proc_exit, + g: _rgb_to_rgba, + a: _storeErrorMessage + }; + async function run() { + preRun(); + var setStatus = Module["setStatus"]; + if (setStatus) { + setStatus("Running..."); + await new Promise(resolve => setTimeout(resolve, 1)); + setTimeout(setStatus, 1, ""); + } + if (ABORT) return; + initRuntime(); + Module["onRuntimeInitialized"]?.(); + postRun(); + } + var wasmExports; + wasmExports = await createWasm(); + await run(); + return Module; +} +/* harmony default export */ const openjpeg = (OpenJPEG); +;// ./src/core/jpx.js + + + + +class JpxError extends BaseException { + constructor(msg) { + super(msg, "JpxError"); + } +} +class JpxImage extends WasmImage { + _filename = "openjpeg.wasm"; + _noWasmFilename = "openjpeg_nowasm_fallback.js"; + static get instance() { + return util_shadow(this, "instance", new JpxImage(true)); + } + async decode(bytes, { + numComponents = 4, + isIndexedColormap = false, + smaskInData = false, + reducePower = 0 + } = {}) { + const module = await this._getModule(openjpeg); + if (!module) { + throw new JpxError("OpenJPEG failed to initialize"); + } + let ptr; + try { + const size = bytes.length; + ptr = module._malloc(size); + module.writeArrayToMemory(bytes, ptr); + const ret = module._jp2_decode(ptr, size, numComponents > 0 ? numComponents : 0, !!isIndexedColormap, !!smaskInData, reducePower); + if (ret) { + const { + errorMessages + } = module; + if (errorMessages) { + delete module.errorMessages; + throw new JpxError(errorMessages); + } + throw new JpxError("Unknown error"); + } + const { + imageData + } = module; + module.imageData = null; + return imageData; + } finally { + if (ptr) { + module._free(ptr); + } + } + } + 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: Xsiz - XOsiz, + height: Ysiz - YOsiz, + bitsPerComponent: 8, + componentsCount: Csiz + }; + } + } + throw new JpxError("No size marker found in JPX stream"); + } +} + +;// ./src/core/jpx_stream.js + + + +class JpxStream extends DecodeStream { + constructor(stream, maybeLength) { + super(maybeLength); + this.stream = stream; + this.dict = stream.dict; + this.maybeLength = maybeLength; + } + get bytes() { + return util_shadow(this, "bytes", this.stream.getBytes(this.maybeLength)); + } + ensureBuffer(requested) {} + get isAsyncDecoder() { + return true; + } + async decodeImage(bytes, _length, decoderOptions) { + if (this.eof) { + return this.buffer; + } + bytes ||= this.bytes; + this.buffer = await JpxImage.instance.decode(bytes, decoderOptions); + this.bufferLength = this.buffer.length; + this.eof = true; + return this.buffer; + } + get canAsyncDecodeImageFromBuffer() { + return this.stream.isAsync; + } + get isImageStream() { + return true; + } +} + +;// ./src/core/lzw_stream.js + + + + + + +class LZWStream extends DecodeStream { + constructor(str, maybeLength, earlyChange) { + super(maybeLength); + this.stream = str; + this.dict = str.dict; + this.cachedData = 0; + this.bitsCached = 0; + const maxLzwDictionarySize = 4096; + const lzwState = { + earlyChange, + codeLength: 9, + nextCode: 258, + dictionaryValues: new Uint8Array(maxLzwDictionarySize), + dictionaryLengths: new Uint16Array(maxLzwDictionarySize).fill(1, 0, 256), + dictionaryPrevCodes: new Uint16Array(maxLzwDictionarySize), + currentSequence: new Uint8Array(maxLzwDictionarySize), + currentSequenceLength: 0 + }; + for (let i = 0; i < 256; ++i) { + lzwState.dictionaryValues[i] = i; + } + this.lzwState = lzwState; + } + readBits(n) { + let bitsCached = this.bitsCached; + let cachedData = this.cachedData; + while (bitsCached < n) { + const c = this.stream.getByte(); + if (c === -1) { + this.eof = true; + return null; + } + cachedData = cachedData << 8 | c; + bitsCached += 8; + } + this.bitsCached = bitsCached -= n; + this.cachedData = cachedData; + return cachedData >>> bitsCached & (1 << n) - 1; + } + readBlock() { + const blockSize = 512, + decodedSizeDelta = blockSize; + let estimatedDecodedSize = blockSize * 2; + let i, j, q; + const { + lzwState + } = this; + 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(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.stream = 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 rowBytes = this.rowBytes; + const bufferLength = this.bufferLength; + const buffer = this.ensureBuffer(bufferLength + rowBytes); + const bits = this.bits; + const colors = this.colors; + const rawBytes = this.stream.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 (bits === 8) { + for (i = 0; i < colors; ++i) { + buffer[pos++] = rawBytes[i]; + } + 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 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; + } + 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; + } + } + } + if (outbits > 0) { + buffer[k++] = (outbuf << 8 - outbits) + (inbuf & (1 << 8 - outbits) - 1); + } + } + this.bufferLength += rowBytes; + } + readBlockPng() { + const rowBytes = this.rowBytes; + const pixBytes = this.pixBytes; + const predictor = this.stream.getByte(); + const rawBytes = this.stream.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 (i = 0; i < rowBytes; ++i) { + buffer[j++] = rawBytes[i]; + } + break; + case 1: + 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 (i = 0; i < rowBytes; ++i) { + buffer[j++] = prevRow[i] + rawBytes[i] & 0xff; + } + break; + case 3: + 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 (i = 0; i < pixBytes; ++i) { + up = prevRow[i]; + c = rawBytes[i]; + buffer[j++] = up + 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: ${predictor}`); + } + this.bufferLength += rowBytes; + } +} + +;// ./src/core/run_length_stream.js + +class RunLengthStream extends DecodeStream { + constructor(str, maybeLength) { + super(maybeLength); + this.stream = str; + this.dict = str.dict; + } + readBlock() { + const repeatHeader = this.stream.getBytes(2); + if (repeatHeader.length < 2 || repeatHeader[0] === 128) { + this.eof = true; + return; + } + 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.stream.getBytes(n); + buffer.set(source, bufferLength); + bufferLength += n; + } + } else { + n = 257 - n; + buffer = this.ensureBuffer(bufferLength + n + 1); + buffer.fill(repeatHeader[1], bufferLength, bufferLength + n); + bufferLength += n; + } + 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 { + #imageCache = null; + #imageId = 0; + constructor({ + lexer, + xref, + allowStreams = false, + recoveryMode = false + }) { + this.lexer = lexer; + this.xref = xref; + this.allowStreams = allowStreams; + this.recoveryMode = recoveryMode; + this.refill(); + } + refill() { + this.buf1 = this.lexer.getObj(); + this.buf2 = this.lexer.getObj(); + } + shift() { + if (this.buf2 instanceof Cmd && this.buf2.cmd === "ID") { + this.buf1 = this.buf2; + this.buf2 = null; + } else { + this.buf1 = this.buf2; + this.buf2 = this.lexer.getObj(); + } + } + tryShift() { + try { + this.shift(); + return true; + } catch (e) { + if (e instanceof MissingDataException) { + throw e; + } + return false; + } + } + getObj(cipherTransform = null) { + const buf1 = this.buf1; + this.shift(); + if (buf1 instanceof Cmd) { + switch (buf1.cmd) { + case "BI": + return this.makeInlineImage(cipherTransform); + case "[": + 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 array; + case "<<": + 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 key = this.buf1.name; + this.shift(); + if (this.buf1 === EOF) { + break; + } + 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") { + return cipherTransform ? cipherTransform.decryptString(buf1) : 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(stream.peekBytes(5 * n)), 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 (ch === -1) { + warn("findDefaultInlineStreamEnd: " + "Reached the end of the stream without finding a valid EI marker"); + if (maybeEIPos) { + warn('... trying to recover by using the last "EI" occurrence.'); + stream.skip(-(stream.pos - maybeEIPos)); + } + } + let endOffset = 4; + stream.skip(-endOffset); + ch = stream.peekByte(); + stream.skip(endOffset); + if (!isWhiteSpace(ch)) { + endOffset--; + } + return stream.pos - endOffset - startPos; + } + findDCTDecodeInlineStreamEnd(stream) { + const startPos = stream.pos; + let foundEOI = false, + b, + markerLength; + while ((b = stream.getByte()) !== -1) { + if (b !== 0xff) { + continue; + } + 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."); + stream.skip(-length); + return this.findDefaultInlineStreamEnd(stream); + } + this.inlineStreamSkipEI(stream); + return length; + } + findASCII85DecodeInlineStreamEnd(stream) { + const TILDE = 0x7e, + GT = 0x3e; + const startPos = stream.pos; + let ch; + while ((ch = stream.getByte()) !== -1) { + if (ch === TILDE) { + const tildePos = stream.pos; + ch = stream.peekByte(); + while (isWhiteSpace(ch)) { + stream.skip(); + ch = stream.peekByte(); + } + if (ch === GT) { + stream.skip(); + break; + } + if (stream.pos > tildePos) { + const maybeEI = stream.peekBytes(2); + if (maybeEI[0] === 0x45 && maybeEI[1] === 0x49) { + break; + } + } + } + } + const length = stream.pos - startPos; + if (ch === -1) { + warn("Inline ASCII85Decode image stream: " + "EOD marker not found, searching for /EI/ instead."); + stream.skip(-length); + return this.findDefaultInlineStreamEnd(stream); + } + this.inlineStreamSkipEI(stream); + return length; + } + 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; + } + 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 dict = new Dict(this.xref); + 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 key = this.buf1.name; + this.shift(); + if (this.buf1 === EOF) { + break; + } + dict.set(key, this.getObj(cipherTransform)); + } + if (lexer.beginInlineImagePos !== -1) { + dictLength = stream.pos - lexer.beginInlineImagePos; + } + const filter = dict.get("F", "Filter"); + let filterName; + if (filter instanceof Name) { + filterName = filter.name; + } else if (Array.isArray(filter)) { + const filterZero = this.#fetchIfRef(filter[0]); + if (filterZero instanceof Name) { + filterName = filterZero.name; + } + } + const startPos = stream.pos; + let length; + switch (filterName) { + case "DCT": + case "DCTDecode": + length = this.findDCTDecodeInlineStreamEnd(stream); + break; + case "A85": + case "ASCII85Decode": + length = this.findASCII85DecodeInlineStreamEnd(stream); + break; + case "AHx": + case "ASCIIHexDecode": + length = this.findASCIIHexDecodeInlineStreamEnd(stream); + break; + default: + length = this.findDefaultInlineStreamEnd(stream); + } + 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?.get(cacheKey); + if (cacheEntry) { + this.buf2 = Cmd.get("EI"); + this.shift(); + cacheEntry.reset(); + return cacheEntry; + } + } + let imageStream = stream.makeSubStream(startPos, length, dict); + if (cipherTransform && !this.#hasCryptFilter(filter)) { + imageStream = cipherTransform.createStream(imageStream, length); + } + imageStream = this.filter(imageStream, dict, length, cipherTransform); + imageStream.dict = dict; + if (cacheKey) { + imageStream.cacheKey = `inline_img_${++this.#imageId}`; + (this.#imageCache ??= new Map()).set(cacheKey, imageStream); + } + this.buf2 = Cmd.get("EI"); + this.shift(); + return imageStream; + } + #fetchIfRef(obj) { + return this.xref ? this.xref.fetchIfRef(obj) : obj; + } + #hasCryptFilter(filter) { + return Array.isArray(filter) ? filter.some(f => isName(this.#fetchIfRef(f), "Crypt")) : isName(filter, "Crypt"); + } + #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 (k >= partLen) { + const lastByte = scanBytes[pos + j + k]; + if (isWhiteSpace(lastByte)) { + info(`Found "${bytesToString([...END_SIGNATURE, ...part])}" when ` + "searching for endstream command."); + found = true; + } + break; + } + } + if (found) { + stream.pos += pos; + return stream.pos - startPos; + } + } + pos++; + } + stream.pos += scanLength; + } + return -1; + } + 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; + } + 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(); + stream = stream.makeSubStream(startPos, length, dict); + const filter = dict.get("F", "Filter"); + if (cipherTransform && !this.#hasCryptFilter(filter)) { + stream = cipherTransform.createStream(stream, length); + } + stream = this.filter(stream, dict, length, cipherTransform); + stream.dict = dict; + return stream; + } + filter(stream, dict, length, cipherTransform = null) { + 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, cipherTransform); + } + 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.#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.#fetchIfRef(paramsArray[i]); + } + stream = this.makeFilter(stream, filter.name, maybeLength, params, cipherTransform); + maybeLength = null; + } + } + return stream; + } + makeFilter(stream, name, maybeLength, params, cipherTransform = null) { + if (maybeLength === 0) { + warn(`Empty "${name}" stream.`); + return new NullStream(); + } + try { + switch (name) { + case "Fl": + case "FlateDecode": + if (params) { + return new PredictorStream(new FlateStream(stream, maybeLength), maybeLength, params); + } + return new FlateStream(stream, maybeLength); + case "LZW": + case "LZWDecode": + 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(stream, maybeLength, earlyChange); + case "DCT": + case "DCTDecode": + return new JpegStream(stream, maybeLength, params); + case "JPX": + case "JPXDecode": + return new JpxStream(stream, maybeLength); + case "A85": + case "ASCII85Decode": + return new Ascii85Stream(stream, maybeLength); + case "AHx": + case "ASCIIHexDecode": + return new AsciiHexStream(stream, maybeLength); + case "CCF": + case "CCITTFaxDecode": + return new CCITTFaxStream(stream, maybeLength, params); + case "RL": + case "RunLengthDecode": + return new RunLengthStream(stream, maybeLength); + case "JBIG2Decode": + return new Jbig2Stream(stream, maybeLength, params); + case "BrotliDecode": + return new BrotliStream(stream, maybeLength); + case "Crypt": + { + if (!cipherTransform) { + warn('Filter "Crypt" is missing a cipher transform.'); + return stream; + } + const param = params instanceof Dict ? params.get("Name") : null; + const cryptName = param instanceof Name ? param : Name.get("Identity"); + return cipherTransform.createStream(stream, maybeLength, cryptName); + } + } + warn(`Filter "${name}" is not supported.`); + return stream; + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn(`Invalid stream: "${ex}"`); + return new NullStream(); + } + } +} +const specialChars = [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; +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(stream, knownCommands = null) { + this.stream = stream; + this.nextChar(); + this.strBuf = []; + this.knownCommands = knownCommands; + this._hexStringNumWarn = 0; + this.beginInlineImagePos = -1; + } + nextChar() { + return this.currentChar = this.stream.getByte(); + } + peekChar() { + return this.stream.peekByte(); + } + getNumber() { + let ch = this.currentChar; + 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 (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 === 0x28 || ch === 0x3c || ch === -1) { + info(`Lexer.getNumber - "${msg}".`); + return 0; + } + throw new FormatError(msg); + } + let baseValue = ch - 0x30; + while ((ch = this.nextChar()) >= 0) { + if (ch >= 0x30 && ch <= 0x39) { + const currentDigit = ch - 0x30; + if (divideBy !== 0) { + divideBy *= 10; + } + baseValue = baseValue * 10 + currentDigit; + } 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 { + break; + } + } + if (divideBy !== 0) { + baseValue /= divideBy; + } + return sign * baseValue; + } + getString() { + 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"); + done = true; + break; + case 0x28: + ++numParen; + strBuf.push("("); + break; + case 0x29: + if (--numParen === 0) { + this.nextChar(); + done = true; + } else { + strBuf.push(")"); + } + break; + case 0x5c: + ch = this.nextChar(); + switch (ch) { + case -1: + warn("Unterminated string"); + done = true; + break; + case 0x6e: + strBuf.push("\n"); + break; + case 0x72: + strBuf.push("\r"); + break; + case 0x74: + strBuf.push("\t"); + break; + case 0x62: + strBuf.push("\b"); + break; + case 0x66: + strBuf.push("\f"); + break; + case 0x5c: + case 0x28: + case 0x29: + strBuf.push(String.fromCharCode(ch)); + break; + case 0x30: + case 0x31: + case 0x32: + case 0x33: + case 0x34: + case 0x35: + case 0x36: + case 0x37: + let x = ch & 0x0f; + ch = this.nextChar(); + charBuffered = true; + 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); + } + } + strBuf.push(String.fromCharCode(x)); + break; + case 0x0d: + if (this.peekChar() === 0x0a) { + this.nextChar(); + } + break; + case 0x0a: + break; + default: + strBuf.push(String.fromCharCode(ch)); + break; + } + break; + default: + strBuf.push(String.fromCharCode(ch)); + break; + } + if (done) { + break; + } + if (!charBuffered) { + ch = this.nextChar(); + } + } + return strBuf.join(""); + } + getName() { + 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."); + strBuf.push("#"); + break; + } + 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(ch)}) ` + "in hexadecimal number."); + strBuf.push("#", String.fromCharCode(previousCh)); + if (specialChars[ch]) { + break; + } + strBuf.push(String.fromCharCode(ch)); + continue; + } + 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(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 strBuf = this.strBuf; + strBuf.length = 0; + let ch = this.currentChar; + let firstDigit = -1, + digit = -1; + this._hexStringNumWarn = 0; + while (true) { + if (ch < 0) { + warn("Unterminated hex string"); + break; + } else if (ch === 0x3e) { + this.nextChar(); + break; + } 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 { + strBuf.push(String.fromCharCode(firstDigit << 4 | digit)); + firstDigit = -1; + } + ch = this.nextChar(); + } + } + if (firstDigit !== -1) { + strBuf.push(String.fromCharCode(firstDigit << 4)); + } + return strBuf.join(""); + } + getObj() { + 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 (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 0x28: + return this.getString(); + case 0x2f: + return this.getName(); + case 0x5b: + this.nextChar(); + return Cmd.get("["); + case 0x5d: + this.nextChar(); + return Cmd.get("]"); + case 0x3c: + ch = this.nextChar(); + if (ch === 0x3c) { + this.nextChar(); + return Cmd.get("<<"); + } + return this.getHexString(); + case 0x3e: + ch = this.nextChar(); + if (ch === 0x3e) { + this.nextChar(); + return Cmd.get(">>"); + } + return Cmd.get(">"); + case 0x7b: + this.nextChar(); + return Cmd.get("{"); + case 0x7d: + this.nextChar(); + return Cmd.get("}"); + case 0x29: + this.nextChar(); + throw new FormatError(`Illegal character: ${ch}`); + } + let str = String.fromCharCode(ch); + if (ch < 0x20 || ch > 0x7f) { + const nextCh = this.peekChar(); + if (nextCh >= 0x20 && nextCh <= 0x7f) { + this.nextChar(); + return Cmd.get(str); + } + } + 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 (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 ch = this.currentChar; + while (ch >= 0) { + if (ch === 0x0d) { + ch = this.nextChar(); + if (ch === 0x0a) { + this.nextChar(); + } + break; + } else if (ch === 0x0a) { + this.nextChar(); + break; + } + ch = this.nextChar(); + } + } +} +class Linearization { + 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 "${name}" parameter in the linearization ` + "dictionary is invalid."); + } + 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(obj1) && Number.isInteger(obj2) && isCmd(obj3, "obj") && linDict instanceof Dict && typeof (obj = linDict.get("Linearized")) === "number" && obj > 0)) { + return null; + } else if ((length = getInt(linDict, "L")) !== stream.length) { + throw new Error('The "L" parameter in the linearization dictionary ' + "does not equal the stream length."); + } + return { + length, + hints: getHints(linDict), + objectNumberFirst: getInt(linDict, "O"), + endFirst: getInt(linDict, "E"), + numPages: getInt(linDict, "N"), + mainXRefEntriesOffset: getInt(linDict, "T"), + pageFirst: linDict.has("P") ? getInt(linDict, "P", true) : 0 + }; + } +} + +;// ./src/core/cmap.js + + + + + + + + + + + + + + + + + + + +const BUILT_IN_CMAPS = new Set(["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 { + #map = new Map(); + #mappedEntries = 0; + constructor(builtInCMap = false) { + this.codespaceRanges = [[], [], [], []]; + this.numCodespaceRanges = 0; + this.name = ""; + this.vertical = false; + this.useCMap = null; + this.builtInCMap = builtInCMap; + } + addCodespaceRange(n, low, high) { + this.codespaceRanges[n - 1].push(low, high); + this.numCodespaceRanges++; + } + #consumeBudget(count, name) { + if (count <= 0) { + return; + } + if (this.#mappedEntries + count > MAX_MAP_RANGE) { + throw new Error(`${name} - ignoring data above MAX_MAP_RANGE.`); + } + this.#mappedEntries += count; + } + mapCidRange(low, high, dstLow) { + this.#consumeBudget(high - low + 1, "mapCidRange"); + while (low <= high) { + this.#map.set(low++, dstLow++); + } + } + mapBfRange(low, high, dstLow) { + this.#consumeBudget(high - low + 1, "mapBfRange"); + const lastByte = dstLow.length - 1; + while (low <= high) { + this.#map.set(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(low, high, array) { + const ii = array.length; + this.#consumeBudget(Math.min(high - low + 1, ii), "mapBfRangeToArray"); + let i = 0; + while (low <= high && i < ii) { + this.#map.set(low++, array[i++]); + } + } + mapOne(src, dst) { + this.#map.set(src, dst); + } + lookup(code) { + return this.#map.get(code); + } + contains(code) { + return this.#map.has(code); + } + forEach(callback) { + for (const [charCode, entry] of this.#map) { + callback(charCode, entry); + } + } + charCodeOf(value) { + for (const [charCode, entry] of this.#map) { + if (entry === value) { + return charCode; + } + } + return -1; + } + getMap() { + return new Map(this.#map); + } + 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; + } + } + } + out.charcode = 0; + out.length = 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; + } + get size() { + return this.#map.size; + } + get isIdentityCMap() { + if (!(this.name === "Identity-H" || this.name === "Identity-V")) { + return false; + } + if (this.#map.size !== 0x10000) { + return false; + } + for (let i = 0; i < 0x10000; i++) { + if (this.#map.get(i) !== i) { + return false; + } + } + return true; + } +} +class IdentityCMap extends CMap { + constructor(vertical, n) { + super(); + this.vertical = vertical; + this.addCodespaceRange(n, 0, 0xffff); + } + mapCidRange(low, high, dstLow) { + unreachable("should not call mapCidRange"); + } + mapBfRange(low, high, dstLow) { + unreachable("should not call mapBfRange"); + } + mapBfRangeToArray(low, high, array) { + unreachable("should not call mapBfRangeToArray"); + } + mapOne(src, dst) { + unreachable("should not call mapCidOne"); + } + lookup(code) { + return Number.isInteger(code) && code <= 0xffff ? code : undefined; + } + contains(code) { + return Number.isInteger(code) && code <= 0xffff; + } + forEach(callback) { + for (let i = 0; i <= 0xffff; i++) { + callback(i, i); + } + } + charCodeOf(value) { + return Number.isInteger(value) && value <= 0xffff ? value : -1; + } + getMap() { + unreachable("should not call getMap"); + } + get size() { + return 0x10000; + } + get isIdentityCMap() { + unreachable("should not access .isIdentityCMap"); + } +} +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(obj) { + if (typeof obj !== "string") { + throw new FormatError("Malformed CMap: expected string."); + } +} +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(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(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(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(cMap, lexer) { + const obj = lexer.getObj(); + if (Number.isInteger(obj)) { + cMap.vertical = !!obj; + } +} +function parseCMapName(cMap, lexer) { + const obj = lexer.getObj(); + if (obj instanceof Name) { + cMap.name = obj.name; + } +} +async function parseCMap(cMap, lexer, fetchBuiltInCMap, useCMap) { + let previous, embeddedUseCMap; + objLoop: while (true) { + try { + 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 objLoop; + case "usecmap": + if (previous instanceof Name) { + embeddedUseCMap = previous.name; + } + break; + case "begincodespacerange": + parseCodespaceRange(cMap, lexer); + break; + case "beginbfchar": + parseBfChar(cMap, lexer); + break; + case "begincidchar": + parseCidChar(cMap, lexer); + break; + case "beginbfrange": + parseBfRange(cMap, lexer); + break; + case "begincidrange": + parseCidRange(cMap, lexer); + break; + } + } + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn("Invalid cMap data: " + ex); + continue; + } + } + if (!useCMap && embeddedUseCMap) { + useCMap = embeddedUseCMap; + } + return useCMap ? extendCMap(cMap, fetchBuiltInCMap, useCMap) : 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((key, value) => { + if (!cMap.contains(key)) { + cMap.mapOne(key, value); + } + }); + return cMap; +} +async function createBuiltInCMap(name, fetchBuiltInCMap) { + if (name === "Identity-H") { + return new IdentityCMap(false, 2); + } else if (name === "Identity-V") { + return new IdentityCMap(true, 2); + } + if (!BUILT_IN_CMAPS.has(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, + fetchBuiltInCMap, + useCMap + }) { + if (encoding instanceof Name) { + return createBuiltInCMap(encoding.name, fetchBuiltInCMap); + } else if (encoding instanceof BaseStream) { + if (encoding.isAsync) { + const bytes = await encoding.asyncGetBytes(); + if (bytes) { + encoding = new Stream(bytes, 0, bytes.length, encoding.dict); + } + } + const parsedCMap = await parseCMap(new CMap(), new Lexer(encoding), fetchBuiltInCMap, useCMap); + return parsedCMap.isIdentityCMap ? createBuiltInCMap(parsedCMap.name, fetchBuiltInCMap) : parsedCMap; + } + throw new Error("Encoding required."); + } +} + +;// ./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 WinAnsiEncoding; + case "StandardEncoding": + return StandardEncoding; + case "MacRomanEncoding": + return MacRomanEncoding; + case "SymbolSetEncoding": + return SymbolSetEncoding; + case "ZapfDingbatsEncoding": + return ZapfDingbatsEncoding; + case "ExpertEncoding": + return ExpertEncoding; + case "MacExpertEncoding": + return MacExpertEncoding; + default: + return null; + } +} + +;// ./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[63718] = 0x23d0; + t[63719] = 0x23af; + t[63733] = 0x23ae; + t[63729] = 0x23a7; + t[63730] = 0x23a8; + t[63731] = 0x23a9; + t[63740] = 0x23ab; + t[63741] = 0x23ac; + t[63742] = 0x23ad; + t[63726] = 0x23a1; + t[63727] = 0x23a2; + t[63728] = 0x23a3; + t[63737] = 0x23a4; + t[63738] = 0x23a5; + t[63739] = 0x23a6; + t[63723] = 0x239b; + t[63724] = 0x239c; + t[63725] = 0x239d; + t[63734] = 0x239e; + t[63735] = 0x239f; + t[63736] = 0x23a0; +}); +function mapSpecialUnicodeValues(code) { + if (code >= 0xfff0 && code <= 0xffff) { + return 0; + } else if (code >= 0xf600 && code <= 0xf8ff) { + return getSpecialPUASymbols()[code] || code; + } else if (code === 0x00ad) { + return 0x002d; + } + return code; +} +function getUnicodeForGlyph(name, glyphsUnicodeMap) { + let unicode = glyphsUnicodeMap[name]; + if (unicode !== undefined) { + return unicode; + } + if (!name) { + return -1; + } + if (name[0] === "u") { + const nameLen = name.length; + let hexStr; + if (nameLen === 7 && name[1] === "n" && name[2] === "i") { + hexStr = name.substring(3); + } else if (nameLen >= 5 && nameLen <= 7) { + hexStr = name.substring(1); + } else { + return -1; + } + if (hexStr === hexStr.toUpperCase()) { + unicode = parseInt(hexStr, 16); + if (unicode >= 0) { + return unicode; + } + } + } + return -1; +} +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; +} +const SpecialCharRegExp = /^(\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 = new Map(); + let glyphId, baseEncoding; + const isSymbolicFont = !!(properties.flags & FontFlags.Symbolic); + if (properties.isInternalFont) { + baseEncoding = builtInEncoding; + for (let charCode = 0; charCode < baseEncoding.length; charCode++) { + glyphId = glyphNames.indexOf(baseEncoding[charCode]); + charCodeToGlyphId.set(charCode, glyphId >= 0 ? glyphId : 0); + } + } else if (properties.baseEncodingName) { + baseEncoding = getEncoding(properties.baseEncodingName); + for (let charCode = 0; charCode < baseEncoding.length; charCode++) { + glyphId = glyphNames.indexOf(baseEncoding[charCode]); + charCodeToGlyphId.set(charCode, glyphId >= 0 ? glyphId : 0); + } + } else if (isSymbolicFont) { + for (const charCode in builtInEncoding) { + charCodeToGlyphId.set(+charCode, builtInEncoding[charCode]); + } + } else { + baseEncoding = StandardEncoding; + for (let charCode = 0; charCode < baseEncoding.length; charCode++) { + glyphId = glyphNames.indexOf(baseEncoding[charCode]); + charCodeToGlyphId.set(charCode, glyphId >= 0 ? glyphId : 0); + } + } + let glyphsUnicodeMap; + if (properties.differences) { + for (const [charCode, glyphName] of properties.differences) { + glyphId = glyphNames.indexOf(glyphName); + if (glyphId === -1) { + glyphsUnicodeMap ??= getGlyphsUnicode(); + const standardGlyphName = recoverGlyphName(glyphName, glyphsUnicodeMap); + if (standardGlyphName !== glyphName) { + glyphId = glyphNames.indexOf(standardGlyphName); + } + } + charCodeToGlyphId.set(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; +}); +const MAX_SIZE_TO_COMPILE = 1000; +function compileType3Glyph({ + data: img, + width, + height +}) { + if (width > MAX_SIZE_TO_COMPILE || height > MAX_SIZE_TO_COMPILE) { + return null; + } + const POINT_TO_PROCESS_LIMIT = 1000; + const POINT_TYPES = new Uint8Array([0, 2, 4, 0, 1, 0, 5, 4, 8, 10, 0, 8, 0, 2, 1, 0]); + const width1 = width + 1; + const points = new Uint8Array(width1 * (height + 1)); + let i, j, j0; + const lineSize = width + 7 & ~7; + const data = new Uint8Array(lineSize * height); + let pos = 0; + for (const elem of img) { + let mask = 128; + while (mask > 0) { + data[pos++] = elem & mask ? 0 : 255; + mask >>= 1; + } + } + let count = 0; + pos = 0; + if (data[pos] !== 0) { + points[0] = 1; + ++count; + } + for (j = 1; j < width; j++) { + if (data[pos] !== data[pos + 1]) { + points[j] = data[pos] ? 2 : 1; + ++count; + } + pos++; + } + if (data[pos] !== 0) { + points[j] = 2; + ++count; + } + for (i = 1; i < height; i++) { + pos = i * lineSize; + j0 = i * width1; + if (data[pos - lineSize] !== data[pos]) { + points[j0] = data[pos] ? 1 : 8; + ++count; + } + let sum = (data[pos] ? 4 : 0) + (data[pos - lineSize] ? 8 : 0); + for (j = 1; j < width; j++) { + sum = (sum >> 2) + (data[pos + 1] ? 4 : 0) + (data[pos - lineSize + 1] ? 8 : 0); + if (POINT_TYPES[sum]) { + points[j0 + j] = POINT_TYPES[sum]; + ++count; + } + pos++; + } + if (data[pos - lineSize] !== data[pos]) { + points[j0 + j] = data[pos] ? 2 : 4; + ++count; + } + if (count > POINT_TO_PROCESS_LIMIT) { + return null; + } + } + pos = lineSize * (height - 1); + j0 = i * width1; + if (data[pos] !== 0) { + points[j0] = 8; + ++count; + } + for (j = 1; j < width; j++) { + if (data[pos] !== data[pos + 1]) { + points[j0 + j] = data[pos] ? 4 : 8; + ++count; + } + pos++; + } + if (data[pos] !== 0) { + points[j0 + j] = 4; + ++count; + } + if (count > POINT_TO_PROCESS_LIMIT) { + return null; + } + const steps = new Int32Array([0, width1, -1, 0, -width1, 0, 0, 0, 1]); + const pathBuf = []; + const { + a, + b, + c, + d, + e, + f + } = new DOMMatrix().scaleSelf(1 / width, -1 / height).translateSelf(0, -height); + for (i = 0; count && i <= height; i++) { + let p = i * width1; + const end = p + width; + while (p < end && !points[p]) { + p++; + } + if (p === end) { + continue; + } + let x = p % width1; + let y = i; + pathBuf.push(DrawOPS.moveTo, a * x + c * y + e, b * x + d * y + f); + const p0 = p; + let type = points[p]; + do { + const step = steps[type]; + do { + p += step; + } while (!points[p]); + const pp = points[p]; + if (pp !== 5 && pp !== 10) { + type = pp; + points[p] = 0; + } else { + type = pp & 0x33 * type >> 4; + points[p] &= type >> 2 | type << 2; + } + x = p % width1; + y = p / width1 | 0; + pathBuf.push(DrawOPS.lineTo, a * x + c * y + e, b * x + d * y + f); + if (!points[p]) { + --count; + } + } while (p0 !== p); + --i; + } + return [OPS.rawFillPath, [new Float32Array(pathBuf)], new Float32Array([0, 0, width, height])]; +} + +;// ./node_modules/core-js/modules/es.iterator.to-array.js +es_iterator_to_array_namespaceFn(); + +;// ./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/data_builder.js + + + + + + + +class DataBuilder { + #buf; + #bufLength = 1024; + #hasExactLength = false; + #pos = 0; + #view; + constructor({ + exactLength = 0, + minLength = 0 + }) { + this.#hasExactLength = !!exactLength; + this.#initBuf(exactLength || minLength); + } + #initBuf(minLength) { + if (this.#hasExactLength) { + this.#bufLength = minLength; + } else { + while (this.#bufLength < minLength) { + this.#bufLength *= 2; + } + } + const newBuf = new Uint8Array(this.#bufLength); + if (this.#buf) { + newBuf.set(this.#buf, 0); + } + this.#buf = newBuf; + this.#view = new DataView(newBuf.buffer); + } + get data() { + return this.#buf.subarray(0, this.#pos); + } + get length() { + return this.#pos; + } + skip(n) { + this.#pos += n; + } + setArray(arr) { + const newPos = this.#pos + arr.length; + if (!this.#hasExactLength && newPos > this.#bufLength) { + this.#initBuf(newPos); + } + this.#buf.set(arr, this.#pos); + this.#pos = newPos; + } + setInt16(val) { + const newPos = this.#pos + 2; + if (!this.#hasExactLength && newPos > this.#bufLength) { + this.#initBuf(newPos); + } + this.#view.setInt16(this.#pos, val); + this.#pos = newPos; + } + setSafeInt16(val) { + const newPos = this.#pos + 2; + if (!this.#hasExactLength && newPos > this.#bufLength) { + this.#initBuf(newPos); + } + this.#view.setInt16(this.#pos, MathClamp(val, -0x8000, 0x7fff)); + this.#pos = newPos; + } + setInt32(val) { + const newPos = this.#pos + 4; + if (!this.#hasExactLength && newPos > this.#bufLength) { + this.#initBuf(newPos); + } + this.#view.setInt32(this.#pos, val); + this.#pos = newPos; + } +} + +;// ./src/core/cff_parser.js + + + + + + + + + + + + + + + + + +const MAX_SUBR_NESTING = 10; +const MAX_FD_ARRAY_COUNT = 256; +function looksLikeUnsigned16BitNegative(coord) { + return coord > 0x7fff && coord <= 0xffff; +} +function recoverSigned16BitBBox(bbox, onlyLowerLeft = false) { + return Util.normalizeRect(bbox.map((coord, i) => (!onlyLowerLeft || i < 2) && looksLikeUnsigned16BitNegative(coord) ? coord - 0x10000 : coord)); +} +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 DEFAULT_BLUE_SCALE = 0.039625; +const DEFAULT_BLUE_SHIFT = 7; +const DEFAULT_BLUE_FUZZ = 1; +const DEFAULT_EXPANSION_FACTOR = 0.06; +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 +}, { + id: "return", + min: 0 +}, 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 +}, { + 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(stack, index) { + stack[index - 2] = stack[index - 2] - stack[index - 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(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(stack, index) { + stack[index - 2] = stack[index - 2] * stack[index - 1]; + } +}, null, { + id: "sqrt", + min: 1, + stackDelta: 0 +}, { + id: "dup", + min: 1, + stackDelta: 1 +}, { + id: "exch", + min: 2, + stackDelta: 0 +}, { + id: "index", + min: 2, + stackDelta: 0 +}, { + id: "roll", + min: 3, + stackDelta: -2 +}, null, null, null, { + id: "hflex", + min: 7, + resetStack: true +}, { + id: "flex", + min: 13, + resetStack: true +}, { + id: "hflex1", + min: 9, + resetStack: true +}, { + id: "flex1", + min: 11, + resetStack: true +}]; +class CFFParser { + constructor(file, properties, seacAnalysisEnabled) { + this.bytes = file.getBytes(); + this.properties = properties; + this.seacAnalysisEnabled = !!seacAnalysisEnabled; + } + parse() { + const properties = this.properties; + const cff = new CFF(this.bytes.length); + 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; + cff.charStringCount = charStringIndex.count; + const fontMatrix = topDict.getByName("FontMatrix"); + if (fontMatrix) { + properties.fontMatrix = fontMatrix; + } + let fontBBox = topDict.getByName("FontBBox"); + const descriptorBBox = properties.bbox?.some(coord => coord !== 0) ? recoverSigned16BitBBox(properties.bbox) : null; + const cffBBoxHasUnsignedLowerLeft = fontBBox?.slice(0, 2).some(looksLikeUnsigned16BitNegative); + const cffBBoxHasUnsignedCoords = fontBBox?.some(looksLikeUnsigned16BitNegative); + if (fontBBox?.every(coord => coord === 0) && descriptorBBox) { + fontBBox = descriptorBBox; + topDict.setByName("FontBBox", fontBBox); + } else if (cffBBoxHasUnsignedCoords) { + const recoveredFontBBox = recoverSigned16BitBBox(fontBBox); + const descriptorCorroborates = descriptorBBox && properties.bbox.some(coord => coord < 0) && !properties.bbox.some(looksLikeUnsigned16BitNegative) && isArrayEqual(recoveredFontBBox, descriptorBBox); + if (descriptorCorroborates || cffBBoxHasUnsignedLowerLeft) { + fontBBox = descriptorCorroborates ? recoveredFontBBox : recoverSigned16BitBBox(fontBBox, true); + topDict.setByName("FontBBox", fontBBox); + } + } + if (fontBBox?.some(coord => coord !== 0)) { + 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; + let fdArrayCount = fdArrayIndex.count; + if (fdArrayCount > MAX_FD_ARRAY_COUNT) { + warn(`CFFParser.parse: too many FDArray entries (${fdArrayCount}).`); + fdArrayCount = MAX_FD_ARRAY_COUNT; + } + for (let i = 0; i < fdArrayCount; ++i) { + const dictRaw = fdArrayIndex.get(i); + const fontDict = this.createDict(CFFTopDict, this.parseDict(dictRaw), cff.strings); + this.parsePrivateDict(fontDict); + cff.fdArray.push(fontDict); + } + encoding = null; + charset = this.parseCharsets(topDict.getByName("charset"), charStringIndex.count, cff.strings, true); + cff.fdSelect = this.parseFDSelect(topDict.getByName("FDSelect"), charStringIndex.count); + } else { + charset = this.parseCharsets(topDict.getByName("charset"), charStringIndex.count, cff.strings, false); + encoding = this.parseEncoding(topDict.getByName("Encoding"), properties, cff.strings, charset.charset); + } + cff.charset = charset; + cff.encoding = encoding; + const charStringsAndSeacs = this.parseCharStrings({ + charStrings: charStringIndex, + localSubrIndex: topDict.privateDict.subrsIndex, + globalSubrIndex: globalSubrIndex.obj, + fdSelect: cff.fdSelect, + fdArray: cff.fdArray, + privateDict: topDict.privateDict + }); + cff.charStrings = charStringsAndSeacs.charStrings; + cff.seacs = charStringsAndSeacs.seacs; + cff.widths = charStringsAndSeacs.widths; + return cff; + } + parseHeader() { + let bytes = this.bytes; + const bytesLength = bytes.length; + let offset = 0; + while (offset < bytesLength && bytes[offset] !== 1) { + ++offset; + } + 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(dict) { + const view = new DataView(dict.buffer, dict.byteOffset, dict.bytesLength); + let pos = 0; + function parseOperand() { + let value = dict[pos++]; + if (value === 30) { + return parseFloatOperand(); + } else if (value === 28) { + value = view.getInt16(pos); + pos += 2; + return value; + } else if (value === 29) { + value = view.getInt32(pos); + pos += 4; + 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; + } + warn(`CFFParser.parseDict: "${value}" is a reserved command.`); + return NaN; + } + 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; + } + str += lookup[b1]; + if (b2 === eof) { + break; + } + str += lookup[b2]; + } + return parseFloat(str); + } + 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]; + } + entries.push([b, operands]); + operands = []; + ++pos; + } else { + 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++]; + if (offsetSize < 1 || offsetSize > 4) { + throw new FormatError(`Invalid CFF INDEX offset size: ${offsetSize}`); + } + const startPos = pos + (count + 1) * offsetSize - 1; + const bytesLength = bytes.length; + let prevOffset = startPos; + for (i = 0, ii = count + 1; i < ii; ++i) { + let offset = 0; + for (let j = 0; j < offsetSize; ++j) { + offset = offset << 8 | bytes[pos++]; + } + prevOffset = MathClamp(startPos + offset, prevOffset, bytesLength); + offsets.push(prevOffset); + } + 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; + } + const view = new DataView(data.buffer, data.byteOffset, data.bytesLength); + 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] = view.getInt16(j); + j += 2; + stackSize++; + } else if (value === 14) { + if (stackSize >= 4) { + stackSize -= 4; + if (this.seacAnalysisEnabled) { + state.seac = stack.slice(stackSize, stackSize + 4); + return false; + } + } + validationCommand = CharstringValidationData[value]; + } else if (value >= 32 && value <= 246) { + stack[stackSize] = value - 139; + stackSize++; + } else if (value >= 247 && value <= 254) { + stack[stackSize] = value < 251 ? (value - 247 << 8) + data[j] + 108 : -(value - 251 << 8) - data[j] - 108; + j++; + stackSize++; + } else if (value === 255) { + stack[stackSize] = view.getInt32(j) / 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; + } + 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; + } + 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 (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"); + data[j - 1] = value === 1 ? 3 : 23; + } + } + if (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; + } + 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 validationCommand) { + if ("stackFn" in validationCommand) { + validationCommand.stackFn(stack, stackSize); + } + stackSize += validationCommand.stackDelta; + } else if (validationCommand.stackClearing || validationCommand.resetStack) { + stackSize = 0; + } + } + } + if (length < data.length) { + data.fill(14, length); + } + state.stackSize = stackSize; + return true; + } + parseCharStrings({ + charStrings, + localSubrIndex, + globalSubrIndex, + fdSelect, + fdArray, + privateDict + }) { + const seacs = new Map(); + 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: [], + 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."); + valid = false; + } + if (fdIndex >= fdArray.length) { + warn("Invalid fd index for glyph index."); + valid = false; + } + if (valid) { + privateDictToUse = fdArray[fdIndex].privateDict; + localSubrToUse = privateDictToUse.subrsIndex; + } + } else if (localSubrIndex) { + localSubrToUse = localSubrIndex; + } + 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.set(i, state.seac); + } + if (!valid) { + charStrings.set(i, new Uint8Array([14])); + } + } + return { + charStrings, + seacs, + widths + }; + } + emptyPrivateDictionary(parentDict) { + const privateDict = this.createDict(CFFPrivateDict, [], parentDict.strings); + parentDict.setByKey(18, [0, 0]); + parentDict.privateDict = privateDict; + } + parsePrivateDict(parentDict) { + if (!parentDict.hasName("Private")) { + this.emptyPrivateDictionary(parentDict); + return; + } + const privateOffset = parentDict.getByName("Private"); + if (!Array.isArray(privateOffset) || privateOffset.length !== 2) { + parentDict.removeByName("Private"); + return; + } + const size = privateOffset[0]; + const offset = privateOffset[1]; + if (size === 0 || offset >= this.bytes.length) { + this.emptyPrivateDictionary(parentDict); + return; + } + if (offset + size > this.bytes.length) { + throw new FormatError("CFF Private DICT extends past end of font"); + } + 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; + const blueScale = privateDict.getByName("BlueScale"); + const blueShift = privateDict.getByName("BlueShift"); + const blueFuzz = privateDict.getByName("BlueFuzz"); + const expansionFactor = privateDict.getByName("ExpansionFactor"); + if (blueScale === 0 && blueShift === 0 && blueFuzz === 0 && expansionFactor === 0) { + privateDict.setByName("BlueScale", DEFAULT_BLUE_SCALE); + privateDict.setByName("BlueShift", DEFAULT_BLUE_SHIFT); + privateDict.setByName("BlueFuzz", DEFAULT_BLUE_FUZZ); + } + if (expansionFactor === 0) { + privateDict.setByName("ExpansionFactor", DEFAULT_EXPANSION_FACTOR); + } + if (blueScale > 0) { + let maxZoneHeight = 0; + for (const zones of [privateDict.getByName("BlueValues"), privateDict.getByName("OtherBlues")]) { + if (!zones) { + continue; + } + for (let i = 1; i < zones.length; i += 2) { + if (zones[i] > maxZoneHeight) { + maxZoneHeight = zones[i]; + } + } + } + if (maxZoneHeight > 0) { + const PRECISION = 1e5; + const lowerBound = 0.5 / maxZoneHeight; + const minBlueScale = lowerBound <= DEFAULT_BLUE_SCALE ? Math.ceil(lowerBound * PRECISION) / PRECISION : -Infinity; + const maxBlueScale = Math.floor(PRECISION / maxZoneHeight) / PRECISION; + const clamped = MathClamp(blueScale, minBlueScale, maxBlueScale); + if (clamped !== blueScale) { + privateDict.setByName("BlueScale", clamped); + } + } + } + if (!privateDict.getByName("Subrs")) { + return; + } + 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(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; + const format = bytes[pos++]; + const charset = [cid ? 0 : ".notdef"]; + let id, count, i; + length -= 1; + switch (format) { + case 0: + for (i = 0; i < length; i++) { + id = bytes[pos++] << 8 | bytes[pos++]; + charset.push(cid ? id : strings.get(id)); + } + break; + case 1: + while (charset.length <= length) { + id = bytes[pos++] << 8 | bytes[pos++]; + count = bytes[pos++]; + for (i = 0; i <= count; i++) { + charset.push(cid ? id++ : strings.get(id++)); + } + } + break; + case 2: + while (charset.length <= length) { + id = bytes[pos++] << 8 | bytes[pos++]; + count = bytes[pos++] << 8 | bytes[pos++]; + for (i = 0; i <= count; i++) { + charset.push(cid ? id++ : strings.get(id++)); + } + } + break; + default: + throw new FormatError("Unknown charset format"); + } + return new CFFCharset(false, format, charset); + } + 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 dataStart = pos; + format = bytes[pos++]; + switch (format & 0x7f) { + case 0: + const glyphsCount = bytes[pos++]; + for (i = 1; i <= glyphsCount; i++) { + encoding[bytes[pos++]] = i; + } + break; + case 1: + 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: ${format} in CFF`); + } + const dataEnd = pos; + if (format & 0x80) { + bytes[dataStart] &= 0x7f; + readSupplement(); + } + raw = bytes.subarray(dataStart, dataEnd); + } + format &= 0x7f; + return new CFFEncoding(predefined, format, encoding, raw); + } + parseFDSelect(pos, length) { + const bytes = this.bytes; + const format = bytes[pos++]; + const fdSelect = []; + let i; + switch (format) { + case 0: + for (i = 0; i < length; ++i) { + const id = bytes[pos++]; + fdSelect.push(id); + } + break; + case 3: + 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."); + first = 0; + } + const fdIndex = bytes[pos++]; + const next = bytes[pos] << 8 | bytes[pos + 1]; + if (next - first > length - fdSelect.length) { + throw new FormatError("parseFDSelect: Invalid font data."); + } + for (let j = first; j < next; ++j) { + fdSelect.push(fdIndex); + } + } + pos += 2; + break; + default: + throw new FormatError(`parseFDSelect: Unknown format "${format}".`); + } + if (fdSelect.length !== length) { + throw new FormatError("parseFDSelect: Invalid font data."); + } + return new CFFFDSelect(format, fdSelect); + } +} +class CFF { + header = null; + names = []; + topDict = null; + strings = new CFFStrings(); + globalSubrIndex = null; + encoding = null; + charset = null; + charStrings = null; + fdArray = []; + fdSelect = null; + isCIDFont = false; + charStringCount = 0; + constructor(rawFileLength = 0) { + this.rawFileLength = rawFileLength; + } + duplicateFirstGlyph() { + if (this.charStrings.count >= 65535) { + warn("Not enough space in charstrings to duplicate first glyph."); + return; + } + const glyphZero = this.charStrings.get(0); + this.charStrings.add(glyphZero); + if (this.isCIDFont) { + this.fdSelect.fdSelect.push(this.fdSelect.fdSelect[0]); + } + } + hasGlyphId(id) { + if (id < 0 || id >= this.charStrings.count) { + return false; + } + const glyph = this.charStrings.get(id); + return glyph.length > 0; + } +} +class CFFHeader { + constructor(major, minor, hdrSize, offSize) { + this.major = major; + this.minor = minor; + this.hdrSize = hdrSize; + this.offSize = offSize; + } +} +class CFFStrings { + strings = []; + get(index) { + if (index >= 0 && index <= NUM_STANDARD_CFF_STRINGS - 1) { + return CFFStandardStrings[index]; + } + return index - NUM_STANDARD_CFF_STRINGS <= this.strings.length ? this.strings[index - NUM_STANDARD_CFF_STRINGS] : CFFStandardStrings[0]; + } + getSID(str) { + let index = CFFStandardStrings.indexOf(str); + if (index !== -1) { + return index; + } + index = this.strings.indexOf(str); + return index !== -1 ? index + NUM_STANDARD_CFF_STRINGS : -1; + } + add(value) { + this.strings.push(value); + } + get count() { + return this.strings.length; + } +} +class CFFIndex { + objects = []; + length = 0; + add(data) { + this.length += data.length; + this.objects.push(data); + } + set(index, data) { + this.length += data.length - this.objects[index].length; + this.objects[index] = data; + } + get(index) { + return this.objects[index]; + } + get count() { + return this.objects.length; + } +} +class CFFDict { + values = new Map(); + 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; + } + setByKey(key, value) { + if (!this.keyToNameMap.has(key)) { + 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 type = this.types.get(key); + if (type === "num" || type === "sid" || type === "offset") { + value = value[0]; + } + this.values.set(key, value); + return true; + } + setByName(name, value) { + if (!this.nameToKeyMap.has(name)) { + throw new FormatError(`Invalid dictionary name "${name}"`); + } + const key = this.nameToKeyMap.get(name); + this.values.set(key, value); + } + hasName(name) { + const key = this.nameToKeyMap.get(name); + return this.values.has(key); + } + getByName(name) { + if (!this.nameToKeyMap.has(name)) { + throw new FormatError(`Invalid dictionary name ${name}"`); + } + const key = this.nameToKeyMap.get(name); + return this.values.has(key) ? this.values.get(key) : this.defaults.get(key); + } + removeByName(name) { + const key = this.nameToKeyMap.get(name); + this.values.delete(key); + } + static createTables(layout) { + const tables = { + keyToNameMap: new Map(), + nameToKeyMap: new Map(), + defaults: new Map(), + types: new Map(), + opcodes: new Map(), + order: [] + }; + for (const entry of layout) { + const key = Array.isArray(entry[0]) ? (entry[0][0] << 8) + entry[0][1] : entry[0]; + tables.keyToNameMap.set(key, entry[1]); + tables.nameToKeyMap.set(entry[1], key); + tables.types.set(key, entry[2]); + tables.defaults.set(key, entry[3]); + tables.opcodes.set(key, Array.isArray(entry[0]) ? entry[0] : [entry[0]]); + tables.order.push(key); + } + return tables; + } +} +const CFFTopDictLayout = [[[12, 30], "ROS", ["sid", "sid", "num"], null], [[12, 20], "SyntheticBase", "num", null], [0, "version", "sid", null], [1, "Notice", "sid", null], [[12, 0], "Copyright", "sid", null], [2, "FullName", "sid", null], [3, "FamilyName", "sid", null], [4, "Weight", "sid", null], [[12, 1], "isFixedPitch", "num", 0], [[12, 2], "ItalicAngle", "num", 0], [[12, 3], "UnderlinePosition", "num", -100], [[12, 4], "UnderlineThickness", "num", 50], [[12, 5], "PaintType", "num", 0], [[12, 6], "CharstringType", "num", 2], [[12, 7], "FontMatrix", ["num", "num", "num", "num", "num", "num"], [0.001, 0, 0, 0.001, 0, 0]], [13, "UniqueID", "num", null], [5, "FontBBox", ["num", "num", "num", "num"], [0, 0, 0, 0]], [[12, 8], "StrokeWidth", "num", 0], [14, "XUID", "array", null], [15, "charset", "offset", 0], [16, "Encoding", "offset", 0], [17, "CharStrings", "offset", 0], [18, "Private", ["offset", "offset"], null], [[12, 21], "PostScript", "sid", null], [[12, 22], "BaseFontName", "sid", null], [[12, 23], "BaseFontBlend", "delta", null], [[12, 31], "CIDFontVersion", "num", 0], [[12, 32], "CIDFontRevision", "num", 0], [[12, 33], "CIDFontType", "num", 0], [[12, 34], "CIDCount", "num", 8720], [[12, 35], "UIDBase", "num", null], [[12, 37], "FDSelect", "offset", null], [[12, 36], "FDArray", "offset", null], [[12, 38], "FontName", "sid", null]]; +class CFFTopDict extends CFFDict { + static get tables() { + return util_shadow(this, "tables", this.createTables(CFFTopDictLayout)); + } + privateDict = null; + constructor(strings) { + super(CFFTopDict.tables, strings); + } +} +const CFFPrivateDictLayout = [[6, "BlueValues", "delta", null], [7, "OtherBlues", "delta", null], [8, "FamilyBlues", "delta", null], [9, "FamilyOtherBlues", "delta", null], [[12, 9], "BlueScale", "num", DEFAULT_BLUE_SCALE], [[12, 10], "BlueShift", "num", DEFAULT_BLUE_SHIFT], [[12, 11], "BlueFuzz", "num", DEFAULT_BLUE_FUZZ], [10, "StdHW", "num", null], [11, "StdVW", "num", null], [[12, 12], "StemSnapH", "delta", null], [[12, 13], "StemSnapV", "delta", null], [[12, 14], "ForceBold", "num", 0], [[12, 17], "LanguageGroup", "num", 0], [[12, 18], "ExpansionFactor", "num", DEFAULT_EXPANSION_FACTOR], [[12, 19], "initialRandomSeed", "num", 0], [20, "defaultWidthX", "num", 0], [21, "nominalWidthX", "num", 0], [19, "Subrs", "offset", null]]; +class CFFPrivateDict extends CFFDict { + static get tables() { + return util_shadow(this, "tables", this.createTables(CFFPrivateDictLayout)); + } + subrsIndex = null; + constructor(strings) { + super(CFFPrivateDict.tables, strings); + } +} +const CFFCharsetPredefinedTypes = { + ISO_ADOBE: 0, + EXPERT: 1, + EXPERT_SUBSET: 2 +}; +class CFFCharset { + constructor(predefined, format, charset) { + this.predefined = predefined; + this.format = format; + this.charset = charset; + } +} +class CFFEncoding { + constructor(predefined, format, encoding, raw) { + this.predefined = predefined; + this.format = format; + this.encoding = encoding; + this.raw = raw; + } +} +class CFFFDSelect { + constructor(format, fdSelect) { + this.format = format; + this.fdSelect = fdSelect; + } + getFDIndex(glyphIndex) { + return glyphIndex < 0 || glyphIndex >= this.fdSelect.length ? -1 : this.fdSelect[glyphIndex]; + } +} +class CFFOffsetTracker { + #offsets = new Map(); + isTracking(key) { + return this.#offsets.has(key); + } + track(key, location) { + if (this.#offsets.has(key)) { + throw new FormatError(`Already tracking location of ${key}`); + } + this.#offsets.set(key, location); + } + offset(value) { + for (const [key, val] of this.#offsets) { + this.#offsets.set(key, val + value); + } + } + setEntryLocation(key, values, output) { + if (!this.#offsets.has(key)) { + throw new FormatError(`Not tracking location of ${key}`); + } + const data = output.data; + const dataOffset = this.#offsets.get(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 value = values[i]; + data[offset0] = 0x1d; + data[offset1] = value >> 24 & 0xff; + data[offset2] = value >> 16 & 0xff; + data[offset3] = value >> 8 & 0xff; + data[offset4] = value & 0xff; + } + } +} +class CFFCompiler { + constructor(cff) { + this.cff = cff; + } + compile() { + const cff = this.cff; + const output = new DataBuilder({ + minLength: cff.rawFileLength + }); + const header = this.compileHeader(cff.header); + output.setArray(header); + const nameIndex = this.compileNameIndex(cff.names); + output.setArray(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 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); + output.setArray(compiled.output); + const topDictTracker = compiled.trackers[0]; + const stringIndex = this.compileStringIndex(cff.strings.strings); + output.setArray(stringIndex); + const globalSubrIndex = this.compileIndex(cff.globalSubrIndex); + output.setArray(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.setArray(encoding); + } + } + const charset = this.compileCharset(cff.charset, cff.charStrings.count, cff.strings, cff.isCIDFont); + topDictTracker.setEntryLocation("charset", [output.length], output); + output.setArray(charset); + const charStrings = this.compileCharStrings(cff.charStrings); + topDictTracker.setEntryLocation("CharStrings", [output.length], output); + output.setArray(charStrings); + if (cff.isCIDFont) { + topDictTracker.setEntryLocation("FDSelect", [output.length], output); + const fdSelect = this.compileFDSelect(cff.fdSelect); + output.setArray(fdSelect); + compiled = this.compileTopDicts(cff.fdArray, output.length, true); + topDictTracker.setEntryLocation("FDArray", [output.length], output); + output.setArray(compiled.output); + const fontDictTrackers = compiled.trackers; + this.compilePrivateDicts(cff.fdArray, fontDictTrackers, output); + } + this.compilePrivateDicts([cff.topDict], [topDictTracker], output); + output.setArray([0]); + return output.data; + } + encodeNumber(value) { + return Number.isInteger(value) ? this.encodeInteger(value) : this.encodeFloat(value); + } + static get EncodeFloatRegExp() { + return util_shadow(this, "EncodeFloatRegExp", /\.(\d*?)(?:9{5,20}|0{5,20})\d{0,2}(?:e(.+)|$)/); + } + 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 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; + } + 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 = "_"; + } + 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.setArray(privateDictData); + if (privateDict.subrsIndex && privateDict.hasName("Subrs")) { + const subrs = this.compileIndex(privateDict.subrsIndex); + privateDictTracker.setEntryLocation("Subrs", [privateDictData.length], output); + output.setArray(subrs); + } + } + } + compileDict(dict, offsetTracker) { + const out = []; + for (const key of dict.order) { + if (!dict.values.has(key)) { + continue; + } + let values = dict.values.get(key); + let types = dict.types.get(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.get(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.get(key)); + } + return out; + } + 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) { + const nLeft = numGlyphsLessNotDef - 1; + out = new Uint8Array([2, 0, 1, nLeft >> 8 & 0xff, nLeft & 0xff]); + } else { + const length = 1 + numGlyphsLessNotDef * 2; + out = new Uint8Array(length); + 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`); + } + } + } + out[i] = sid >> 8 & 0xff; + out[i + 1] = sid & 0xff; + } + } + return out; + } + compileEncoding(encoding) { + return encoding.raw; + } + compileFDSelect(fdSelect) { + const format = fdSelect.format; + let out, i; + switch (format) { + case 0: + out = new Uint8Array(1 + fdSelect.fdSelect.length); + out[0] = format; + out.set(fdSelect.fdSelect, 1); + break; + case 3: + const start = 0; + let lastFD = fdSelect.fdSelect[0]; + const ranges = [format, 0, 0, start >> 8 & 0xff, start & 0xff, lastFD]; + for (i = 1; i < fdSelect.fdSelect.length; i++) { + const currentFD = fdSelect.fdSelect[i]; + if (currentFD !== lastFD) { + ranges.push(i >> 8 & 0xff, i & 0xff, currentFD); + lastFD = currentFD; + } + } + const numRanges = (ranges.length - 3) / 3; + ranges[1] = numRanges >> 8 & 0xff; + ranges[2] = numRanges & 0xff; + ranges.push(i >> 8 & 0xff, i & 0xff); + out = new Uint8Array(ranges); + break; + } + return out; + } + compileIndex(index, trackers = []) { + const objects = index.objects; + const count = objects.length; + if (count === 0) { + return new Uint8Array(2); + } + let lastOffset = 1, + i; + for (i = 0; i < count; ++i) { + lastOffset += objects[i].length; + } + let offsetSize; + if (lastOffset < 0x100) { + offsetSize = 1; + } else if (lastOffset < 0x10000) { + offsetSize = 2; + } else if (lastOffset < 0x1000000) { + offsetSize = 3; + } else { + offsetSize = 4; + } + const data = new Uint8Array(2 + offsetSize * (count + 1) + lastOffset); + let pos = 0; + data[pos++] = count >> 8 & 0xff; + data[pos++] = count & 0xff; + data[pos++] = offsetSize; + let relativeOffset = 1; + for (i = 0; i < count + 1; i++) { + if (offsetSize === 1) { + data[pos++] = relativeOffset & 0xff; + } else if (offsetSize === 2) { + data[pos++] = relativeOffset >> 8 & 0xff; + data[pos++] = relativeOffset & 0xff; + } else if (offsetSize === 3) { + data[pos++] = relativeOffset >> 16 & 0xff; + data[pos++] = relativeOffset >> 8 & 0xff; + data[pos++] = relativeOffset & 0xff; + } else { + data[pos++] = relativeOffset >>> 24 & 0xff; + data[pos++] = relativeOffset >> 16 & 0xff; + data[pos++] = relativeOffset >> 8 & 0xff; + data[pos++] = relativeOffset & 0xff; + } + if (objects[i]) { + relativeOffset += objects[i].length; + } + } + for (i = 0; i < count; i++) { + trackers[i]?.offset(pos); + data.set(objects[i], pos); + pos += objects[i].length; + } + return data; + } +} + +;// ./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["HelveticaLTStd-Bold"] = "Helvetica-Bold"; + 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"; + t.TrebuchetMS = "Helvetica"; + t["TrebuchetMS-Bold"] = "Helvetica-Bold"; + t["TrebuchetMS-BoldItalic"] = "Helvetica-BoldOblique"; + t["TrebuchetMS-Italic"] = "Helvetica-Oblique"; +}); +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 getGlyphMapForMacOrderedFonts = getLookupTableFactory(function (t) { + const glyphsUnicode = getGlyphsUnicode(); + t[2] = 10; + for (let gid = 3; gid < MacStandardGlyphOrdering.length; gid++) { + const unicode = glyphsUnicode[MacStandardGlyphOrdering[gid]]; + if (unicode !== undefined) { + t[gid] = unicode; + } + } +}); +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[570] = 1040; + t[571] = 1041; + t[572] = 1042; + t[573] = 1043; + t[574] = 1044; + t[575] = 1045; + t[576] = 1046; + t[577] = 1047; + t[578] = 1048; + t[579] = 1049; + t[580] = 1050; + t[581] = 1051; + t[582] = 1052; + t[583] = 1053; + t[584] = 1054; + t[585] = 1055; + t[586] = 1056; + t[587] = 1057; + t[588] = 1058; + t[589] = 1059; + t[590] = 1060; + t[591] = 1061; + t[592] = 1062; + t[593] = 1063; + t[594] = 1064; + t[595] = 1065; + t[596] = 1066; + t[597] = 1067; + t[598] = 1068; + t[599] = 1069; + t[600] = 1070; + t[601] = 1071; + t[602] = 1072; + t[603] = 1073; + t[604] = 1074; + t[605] = 1075; + t[606] = 1076; + t[607] = 1077; + t[608] = 1078; + t[609] = 1079; + t[610] = 1080; + t[611] = 1081; + t[612] = 1082; + t[613] = 1083; + t[614] = 1084; + t[615] = 1085; + t[616] = 1086; + t[617] = 1087; + t[618] = 1088; + t[619] = 1089; + t[620] = 1090; + t[621] = 1091; + t[622] = 1092; + t[623] = 1093; + t[624] = 1094; + t[625] = 1095; + t[626] = 1096; + t[627] = 1097; + t[628] = 1098; + t[629] = 1099; + t[630] = 1100; + t[631] = 1101; + t[632] = 1102; + t[633] = 1103; + 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 getSupplementalGlyphMapForTrebuchetMS = getLookupTableFactory(function (t) { + t[151] = 956; + t[159] = 937; + t[168] = 916; + t[189] = 8364; + t[195] = 8729; + t[218] = 713; + t[236] = 222; + t[237] = 254; + t[238] = 8722; + t[239] = 185; + t[240] = 178; + t[241] = 179; + t[242] = 189; + t[243] = 188; + t[244] = 190; + t[245] = 181; + t[246] = 8486; + t[247] = 8710; + t[248] = 253; + t[249] = 215; + t[250] = 173; + t[253] = 8355; + t[254] = 286; + t[255] = 287; + t[256] = 304; + t[257] = 350; + t[258] = 351; + t[259] = 262; + t[260] = 263; + t[261] = 268; + t[262] = 269; + t[263] = 273; + t[264] = 175; + t[266] = 183; + t[267] = 258; + t[268] = 259; + t[269] = 260; + t[270] = 261; + t[271] = 270; + t[272] = 271; + t[273] = 272; + t[274] = 280; + t[275] = 281; + t[276] = 282; + t[277] = 283; + t[278] = 313; + t[279] = 314; + t[280] = 317; + t[281] = 318; + t[282] = 319; + t[283] = 320; + t[284] = 323; + t[285] = 324; + t[286] = 327; + t[287] = 328; + t[288] = 336; + t[289] = 337; + t[290] = 340; + t[291] = 341; + t[292] = 344; + t[293] = 345; + t[294] = 346; + t[295] = 347; + t[296] = 538; + t[297] = 539; + t[298] = 356; + t[299] = 357; + t[300] = 366; + t[301] = 367; + t[302] = 368; + t[303] = 369; + t[304] = 377; + t[305] = 378; + t[306] = 379; + t[307] = 380; +}); +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[940] = 163; + 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/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; +const GLYPH_HEADER_SIZE = 10; +class GlyfTable { + constructor({ + glyfTable, + isGlyphLocationsLong, + locaTable, + numGlyphs + }) { + this.glyphs = []; + const loca = new DataView(locaTable.buffer, locaTable.byteOffset, locaTable.byteLength); + const glyf = new DataView(glyfTable.buffer, glyfTable.byteOffset, glyfTable.byteLength); + const offsetSize = isGlyphLocationsLong ? 4 : 2; + let prev = isGlyphLocationsLong ? loca.getUint32(0) : 2 * loca.getUint16(0); + let pos = 0; + for (let i = 0; i < numGlyphs; i++) { + pos += offsetSize; + const next = isGlyphLocationsLong ? loca.getUint32(pos) : 2 * loca.getUint16(pos); + if (next === prev) { + this.glyphs.push(new Glyph({})); + continue; + } + const glyph = Glyph.parse(prev, glyf); + this.glyphs.push(glyph); + prev = next; + } + } + getSize() { + return Math.sumPrecise(this.glyphs.map(g => g.getSize() + 3 & ~3)); + } + write() { + const totalSize = this.getSize(); + const glyfTable = new DataView(new ArrayBuffer(totalSize)); + const isLocationLong = totalSize > 0x1fffe; + const offsetSize = isLocationLong ? 4 : 2; + const locaTable = new DataView(new ArrayBuffer((this.glyphs.length + 1) * offsetSize)); + if (isLocationLong) { + locaTable.setUint32(0, 0); + } else { + locaTable.setUint16(0, 0); + } + let pos = 0; + let locaIndex = 0; + for (const glyph of this.glyphs) { + pos += glyph.write(pos, glyfTable); + pos = pos + 3 & ~3; + locaIndex += offsetSize; + if (isLocationLong) { + locaTable.setUint32(locaIndex, pos); + } else { + locaTable.setUint16(locaIndex, pos >> 1); + } + } + return { + isLocationLong, + loca: new Uint8Array(locaTable.buffer), + glyf: new Uint8Array(glyfTable.buffer) + }; + } + scale(factors) { + for (let i = 0, ii = this.glyphs.length; i < ii; i++) { + this.glyphs[i].scale(factors[i]); + } + } +} +class Glyph { + constructor({ + header = null, + simple = null, + composites = null + }) { + this.header = header; + this.simple = simple; + this.composites = composites; + } + static parse(pos, glyf) { + const [read, header] = GlyphHeader.parse(pos, glyf); + pos += read; + if (header.numberOfContours < 0) { + const composites = []; + while (true) { + const [n, composite] = CompositeGlyph.parse(pos, glyf); + pos += n; + composites.push(composite); + if (!(composite.flags & MORE_COMPONENTS)) { + break; + } + } + return new Glyph({ + header, + composites + }); + } + const simple = SimpleGlyph.parse(pos, glyf, header.numberOfContours); + return new Glyph({ + header, + simple + }); + } + getSize() { + if (!this.header) { + return 0; + } + const size = this.simple ? this.simple.getSize() : Math.sumPrecise(this.composites.map(c => c.getSize())); + return this.header.getSize() + size; + } + 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(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, + xMin, + yMin, + xMax, + yMax + }) { + this.numberOfContours = numberOfContours; + this.xMin = xMin; + this.yMin = yMin; + this.xMax = xMax; + this.yMax = yMax; + } + static parse(pos, glyf) { + return [GLYPH_HEADER_SIZE, new GlyphHeader({ + numberOfContours: glyf.getInt16(pos), + xMin: glyf.getInt16(pos + 2), + yMin: glyf.getInt16(pos + 4), + xMax: glyf.getInt16(pos + 6), + yMax: glyf.getInt16(pos + 8) + })]; + } + getSize() { + return GLYPH_HEADER_SIZE; + } + 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 GLYPH_HEADER_SIZE; + } + scale(x, factor) { + this.xMin = Math.round(x + (this.xMin - x) * factor); + this.xMax = Math.round(x + (this.xMax - x) * factor); + } +} +class Contour { + constructor({ + flags, + xCoordinates, + yCoordinates + }) { + this.xCoordinates = xCoordinates; + this.yCoordinates = yCoordinates; + this.flags = flags; + } +} +class SimpleGlyph { + constructor({ + contours, + instructions + }) { + this.contours = contours; + this.instructions = instructions; + } + static parse(pos, glyf, numberOfContours) { + const endPtsOfContours = []; + for (let i = 0; i < numberOfContours; i++) { + const endPt = glyf.getUint16(pos); + pos += 2; + endPtsOfContours.push(endPt); + } + 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 allXCoordinates = []; + let xCoordinates = []; + let yCoordinates = []; + let pointFlags = []; + const contours = []; + let endPtsOfContoursIndex = 0; + let lastCoordinate = 0; + for (let i = 0; i < numberOfPt; i++) { + const flag = flags[i]; + if (flag & X_SHORT_VECTOR) { + const x = glyf.getUint8(pos++); + lastCoordinate += flag & X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR ? x : -x; + xCoordinates.push(lastCoordinate); + } else if (flag & X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR) { + xCoordinates.push(lastCoordinate); + } else { + lastCoordinate += glyf.getInt16(pos); + pos += 2; + xCoordinates.push(lastCoordinate); + } + if (endPtsOfContours[endPtsOfContoursIndex] === i) { + endPtsOfContoursIndex++; + allXCoordinates.push(xCoordinates); + xCoordinates = []; + } + } + 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); + } + pointFlags.push(flag & ON_CURVE_POINT | flag & OVERLAP_SIMPLE); + if (endPtsOfContours[endPtsOfContoursIndex] === i) { + xCoordinates = allXCoordinates[endPtsOfContoursIndex]; + endPtsOfContoursIndex++; + contours.push(new Contour({ + flags: pointFlags, + xCoordinates, + yCoordinates + })); + yCoordinates = []; + pointFlags = []; + } + } + return new SimpleGlyph({ + contours, + instructions + }); + } + getSize() { + let size = this.contours.length * 2 + 2 + this.instructions.length; + let lastX = 0; + let lastY = 0; + for (const contour of this.contours) { + size += contour.flags.length; + for (let i = 0, ii = contour.xCoordinates.length; i < ii; i++) { + const x = contour.xCoordinates[i]; + const y = contour.yCoordinates[i]; + let abs = Math.abs(x - lastX); + if (abs > 255) { + size += 2; + } else if (abs > 0) { + size += 1; + } + lastX = x; + abs = Math.abs(y - lastY); + if (abs > 255) { + size += 2; + } else if (abs > 0) { + size += 1; + } + lastY = y; + } + } + return size; + } + write(pos, buf) { + const spos = pos; + const xCoordinates = []; + const yCoordinates = []; + const flags = []; + let lastX = 0; + let lastY = 0; + for (const contour of this.contours) { + for (let i = 0, ii = contour.xCoordinates.length; i < ii; i++) { + let flag = contour.flags[i]; + const x = contour.xCoordinates[i]; + let delta = x - lastX; + if (delta === 0) { + flag |= X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR; + xCoordinates.push(0); + } else { + 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); + } + } + 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 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); + } + } + lastY = y; + flags.push(flag); + } + buf.setUint16(pos, xCoordinates.length - 1); + pos += 2; + } + buf.setUint16(pos, this.instructions.length); + pos += 2; + if (this.instructions.length) { + new Uint8Array(buf.buffer, 0, buf.buffer.byteLength).set(this.instructions, pos); + pos += this.instructions.length; + } + for (const flag of flags) { + buf.setUint8(pos++, flag); + } + for (let i = 0, ii = xCoordinates.length; i < ii; i++) { + const x = xCoordinates[i]; + const flag = flags[i]; + if (flag & X_SHORT_VECTOR) { + buf.setUint8(pos++, x); + } else if (!(flag & X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR)) { + buf.setInt16(pos, x); + pos += 2; + } + } + for (let i = 0, ii = yCoordinates.length; i < ii; i++) { + const y = yCoordinates[i]; + const flag = flags[i]; + if (flag & Y_SHORT_VECTOR) { + buf.setUint8(pos++, y); + } else if (!(flag & Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR)) { + buf.setInt16(pos, y); + pos += 2; + } + } + return pos - spos; + } + scale(x, factor) { + for (const contour of this.contours) { + if (contour.xCoordinates.length === 0) { + continue; + } + for (let i = 0, ii = contour.xCoordinates.length; i < ii; i++) { + contour.xCoordinates[i] = Math.round(x + (contour.xCoordinates[i] - x) * factor); + } + } + } +} +class CompositeGlyph { + constructor({ + flags, + glyphIndex, + argument1, + argument2, + transf, + instructions + }) { + this.flags = flags; + this.glyphIndex = glyphIndex; + this.argument1 = argument1; + this.argument2 = argument2; + this.transf = transf; + this.instructions = instructions; + } + static parse(pos, glyf) { + const spos = pos; + const transf = []; + let flags = glyf.getUint16(pos); + const glyphIndex = glyf.getUint16(pos + 2); + pos += 4; + let argument1, argument2; + if (flags & ARG_1_AND_2_ARE_WORDS) { + if (flags & ARGS_ARE_XY_VALUES) { + argument1 = glyf.getInt16(pos); + argument2 = glyf.getInt16(pos + 2); + } else { + argument1 = glyf.getUint16(pos); + argument2 = glyf.getUint16(pos + 2); + } + pos += 4; + flags ^= ARG_1_AND_2_ARE_WORDS; + } else { + if (flags & ARGS_ARE_XY_VALUES) { + argument1 = glyf.getInt8(pos); + argument2 = glyf.getInt8(pos + 1); + } else { + argument1 = glyf.getUint8(pos); + argument2 = glyf.getUint8(pos + 1); + } + pos += 2; + } + if (flags & WE_HAVE_A_SCALE) { + transf.push(glyf.getUint16(pos)); + pos += 2; + } else if (flags & WE_HAVE_AN_X_AND_Y_SCALE) { + transf.push(glyf.getUint16(pos), glyf.getUint16(pos + 2)); + pos += 4; + } else if (flags & WE_HAVE_A_TWO_BY_TWO) { + transf.push(glyf.getUint16(pos), glyf.getUint16(pos + 2), glyf.getUint16(pos + 4), glyf.getUint16(pos + 6)); + pos += 8; + } + 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 [pos - spos, new CompositeGlyph({ + flags, + glyphIndex, + argument1, + argument2, + transf, + instructions + })]; + } + getSize() { + 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)) { + size += 2; + } + } else if (!(this.argument1 >= 0 && this.argument1 <= 255 && this.argument2 >= 0 && this.argument2 <= 255)) { + size += 2; + } + return size; + } + 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 |= 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 { + buf.setUint16(pos, this.argument1); + buf.setUint16(pos + 2, this.argument2); + } + pos += 4; + } else { + buf.setUint8(pos, this.argument1); + buf.setUint8(pos + 1, this.argument2); + pos += 2; + } + if (this.flags & WE_HAVE_INSTRUCTIONS) { + buf.setUint16(pos, this.instructions.length); + pos += 2; + if (this.instructions.length) { + new Uint8Array(buf.buffer, 0, buf.buffer.byteLength).set(this.instructions, pos); + pos += this.instructions.length; + } + } + return pos - spos; + } + scale(x, factor) {} +} +function pruneCompositeGlyphCycles(glyfTable, locaEntries, numGlyphs) { + const glyf = new DataView(glyfTable.buffer, glyfTable.byteOffset, glyfTable.byteLength); + const components = new Array(numGlyphs); + for (let i = 0; i < numGlyphs; i++) { + const offset = locaEntries[i].offset; + const endOffset = Math.min(locaEntries[i].endOffset, glyf.byteLength); + if (endOffset - offset <= GLYPH_HEADER_SIZE || glyf.getInt16(offset) >= 0) { + continue; + } + const comps = []; + let p = offset + GLYPH_HEADER_SIZE; + while (p + 4 <= endOffset) { + const flags = glyf.getUint16(p); + const gid = glyf.getUint16(p + 2); + let size = 4 + (flags & ARG_1_AND_2_ARE_WORDS ? 4 : 2); + if (flags & WE_HAVE_A_SCALE) { + size += 2; + } else if (flags & WE_HAVE_AN_X_AND_Y_SCALE) { + size += 4; + } else if (flags & WE_HAVE_A_TWO_BY_TWO) { + size += 8; + } + comps.push({ + gid, + offset: p, + size, + flags + }); + p += size; + if (!(flags & MORE_COMPONENTS)) { + break; + } + } + if (comps.length) { + components[i] = comps; + } + } + const WHITE = 0, + GRAY = 1, + BLACK = 2; + const state = new Uint8Array(numGlyphs); + const backEdges = new Map(); + for (let start = 0; start < numGlyphs; start++) { + if (state[start] !== WHITE || !components[start]) { + continue; + } + const stack = [{ + node: start, + idx: 0 + }]; + state[start] = GRAY; + while (stack.length > 0) { + const top = stack.at(-1); + const comps = components[top.node]; + if (!comps || top.idx >= comps.length) { + state[top.node] = BLACK; + stack.pop(); + continue; + } + const compIdx = top.idx++; + const next = comps[compIdx].gid; + if (next >= numGlyphs || state[next] === BLACK) { + continue; + } + if (state[next] === WHITE) { + state[next] = GRAY; + stack.push({ + node: next, + idx: 0 + }); + continue; + } + backEdges.getOrInsertComputed(top.node, makeSet).add(compIdx); + } + } + const droppedGlyphs = new Set(); + for (const [gIdx, removeSet] of backEdges) { + const comps = components[gIdx]; + const remaining = []; + for (let ci = 0; ci < comps.length; ci++) { + if (!removeSet.has(ci)) { + remaining.push(comps[ci]); + } + } + if (remaining.length === 0) { + droppedGlyphs.add(gIdx); + continue; + } + const start = locaEntries[gIdx].offset; + const endOffset = Math.min(locaEntries[gIdx].endOffset, glyf.byteLength); + let writePos = start + GLYPH_HEADER_SIZE; + for (let ci = 0; ci < remaining.length; ci++) { + const c = remaining[ci]; + const isLast = ci === remaining.length - 1; + let newFlags = c.flags & ~WE_HAVE_INSTRUCTIONS; + newFlags = isLast ? newFlags & ~MORE_COMPONENTS : newFlags | MORE_COMPONENTS; + if (writePos !== c.offset) { + glyfTable.copyWithin(writePos, c.offset, c.offset + c.size); + } + glyf.setUint16(writePos, newFlags); + writePos += c.size; + } + if (writePos < endOffset) { + glyfTable.fill(0, writePos, endOffset); + } + } + return droppedGlyphs; +} + +;// ./src/core/to_unicode_map.js + +class ToUnicodeMap { + #map; + constructor(cmap) { + this.#map = cmap; + } + get size() { + return this.#map.size; + } + forEach(callback) { + for (const [charCode, entry] of this.#map) { + callback(charCode, entry.codePointAt(0)); + } + } + has(i) { + return this.#map.has(i); + } + get(i) { + return this.#map.get(i); + } + charCodeOf(value) { + for (const [charCode, entry] of this.#map) { + if (entry === value) { + return charCode; + } + } + return -1; + } + amend(map) { + for (const [charCode, entry] of map) { + this.#map.set(charCode, entry); + } + } +} +class IdentityToUnicodeMap { + constructor(firstChar, lastChar) { + this.firstChar = firstChar; + this.lastChar = lastChar; + } + get size() { + return this.lastChar + 1 - this.firstChar; + } + forEach(callback) { + for (let i = this.firstChar, ii = this.lastChar; i <= ii; i++) { + callback(i, i); + } + } + has(i) { + return this.firstChar <= i && i <= this.lastChar; + } + get(i) { + return this.firstChar <= i && i <= this.lastChar ? String.fromCharCode(i) : undefined; + } + charCodeOf(v) { + return Number.isInteger(v) && v >= this.firstChar && v <= this.lastChar ? v : -1; + } + amend(map) { + unreachable("Should not call amend()"); + } +} + +;// ./src/core/cff_font.js + + + + + +class CFFFont { + constructor(file, properties) { + this.properties = properties; + const parser = new CFFParser(file, properties, (/* inlined export .SEAC_ANALYSIS_ENABLED */true)); + this.cff = parser.parse(); + this.cff.duplicateFirstGlyph(); + const compiler = new CFFCompiler(this.cff); + this.seacs = this.cff.seacs; + try { + this.data = compiler.compile(); + } catch (ex) { + warn(`Failed to compile font "${properties.loadedName}": "${ex}".`); + file.reset(); + this.data = file.getBytes(); + } + this._createBuiltInEncoding(); + } + get numGlyphs() { + return this.cff.charStrings.count; + } + getCharset() { + return this.cff.charset.charset; + } + getGlyphMapping() { + const cff = this.cff; + const properties = this.properties; + const { + cidToGidMap, + cMap + } = properties; + const charsets = cff.charset.charset; + if (properties.composite) { + let invCidToGidMap; + if (cidToGidMap?.size) { + invCidToGidMap = new Map(); + for (const [i, gid] of cidToGidMap) { + invCidToGidMap.set(gid, i); + } + } + const charCodeToGlyphId = new Map(); + let charCode, glyphId; + if (cff.isCIDFont) { + for (glyphId = 0; glyphId < charsets.length; glyphId++) { + const cid = charsets[glyphId]; + charCode = cMap.charCodeOf(cid); + if (invCidToGidMap?.has(charCode)) { + charCode = invCidToGidMap.get(charCode); + } + charCodeToGlyphId.set(charCode, glyphId); + } + } else { + for (glyphId = 0; glyphId < cff.charStrings.count; glyphId++) { + charCode = cMap.charCodeOf(glyphId); + charCodeToGlyphId.set(charCode, glyphId); + } + } + return charCodeToGlyphId; + } + let encoding = cff.encoding ? cff.encoding.encoding : null; + if (properties.isInternalFont) { + encoding = properties.defaultEncoding; + } + return type1FontGlyphMapping(properties, encoding, charsets); + } + hasGlyphId(id) { + return this.cff.hasGlyphId(id); + } + _createBuiltInEncoding() { + const { + charset, + encoding + } = this.cff; + if (!charset || !encoding) { + return; + } + const charsets = charset.charset, + encodings = encoding.encoding; + const map = []; + for (const charCode in encodings) { + const glyphId = encodings[charCode]; + if (glyphId >= 0) { + const glyphName = charsets[glyphId]; + if (glyphName) { + map[charCode] = glyphName; + } + } + } + if (map.length > 0) { + this.properties.builtInEncoding = map; + } + } +} + +;// ./src/shared/obj_bin_transform_utils.js + +class CSS_FONT_INFO { + static strings = ["fontFamily", "fontWeight", "italicAngle"]; +} +class SYSTEM_FONT_INFO { + static strings = ["css", "loadedName", "baseFontName", "src"]; +} +class FONT_INFO { + static bools = ["black", "bold", "disableFontFace", "fontExtraProperties", "isInvalidPDFjsFont", "isType3Font", "italic", "missingFile", "remeasure", "vertical"]; + static strings = ["fallbackName", "loadedName"]; + static OFFSET_BBOX = Math.ceil(this.bools.length * 2 / 8); + static OFFSET_FONT_MATRIX = this.OFFSET_BBOX + 1 + 2 * 4; + static OFFSET_STRINGS = this.OFFSET_FONT_MATRIX + 1 + 8 * 6; +} +class PATTERN_INFO { + static KIND = 0; + static HAS_BBOX = 1; + static HAS_BACKGROUND = 2; + static SHADING_TYPE = 3; + static N_COORD = 4; + static N_COLOR = 8; + static N_STOP = 12; + static N_FIGURES = 16; +} +class InfoUtils { + static get decoder() { + return util_shadow(this, "decoder", new TextDecoder()); + } + static get encoder() { + return util_shadow(this, "encoder", new TextEncoder()); + } +} + +;// ./src/core/obj_bin_transform_core.js + + + + + + + + + + +function encodeStrings(strings, obj) { + const { + encoder + } = InfoUtils; + const encodedStrings = new Map(); + let stringsLength = 0; + for (const prop of strings) { + const encoded = encoder.encode(obj[prop]), + len = encoded.length; + encodedStrings.set(encoded, len); + stringsLength += 4 + len; + } + return { + encodedStrings, + stringsLength + }; +} +function writeStrings(encodedStrings, data, view, offset = 0) { + for (const [encoded, len] of encodedStrings) { + view.setUint32(offset, len); + data.set(encoded, offset + 4); + offset += 4 + len; + } + return offset; +} +function compileCssFontInfo(info) { + const { + encodedStrings, + stringsLength + } = encodeStrings(CSS_FONT_INFO.strings, info); + const buffer = new ArrayBuffer(stringsLength); + const data = new Uint8Array(buffer); + const view = new DataView(buffer); + const offset = writeStrings(encodedStrings, data, view); + util_assert(offset === buffer.byteLength, "compileCssFontInfo: Buffer overflow"); + return buffer; +} +function compileSystemFontInfo(info) { + const { + encodedStrings, + stringsLength + } = encodeStrings(SYSTEM_FONT_INFO.strings, info); + let encodedStyleStrings, + styleStringsLength = 0; + if (info.style) { + ({ + encodedStrings: encodedStyleStrings, + stringsLength: styleStringsLength + } = encodeStrings(["style", "weight"], info.style)); + } + const lengthEstimate = 4 + stringsLength + styleStringsLength; + const buffer = new ArrayBuffer(lengthEstimate); + const data = new Uint8Array(buffer); + const view = new DataView(buffer); + let offset = 0; + view.setUint32(offset, stringsLength); + offset = writeStrings(encodedStrings, data, view, offset + 4); + if (encodedStyleStrings) { + offset = writeStrings(encodedStyleStrings, data, view, offset); + } + util_assert(offset <= buffer.byteLength, "compileSystemFontInfo: Buffer overflow"); + return buffer.transferToFixedLength(offset); +} +function compileFontInfo(font) { + function writeArray(arr, arrLen, writerName, increment) { + if (arr) { + view.setUint8(offset++, arrLen); + for (const val of arr) { + view[writerName](offset, val, true); + offset += increment; + } + } else { + view.setUint8(offset++, 0); + offset += increment * arrLen; + } + } + function writeBuffer(buf, name) { + if (!buf) { + view.setUint32(offset, 0); + offset += 4; + return; + } + const length = buf.byteLength; + view.setUint32(offset, length); + util_assert(offset + 4 + length <= buffer.byteLength, `compileFontInfo: Buffer overflow at ${name}`); + data.set(new Uint8Array(buf), offset + 4); + offset += 4 + length; + } + const systemFontInfoBuffer = font.systemFontInfo ? compileSystemFontInfo(font.systemFontInfo) : null; + const cssFontInfoBuffer = font.cssFontInfo ? compileCssFontInfo(font.cssFontInfo) : null; + const { + encodedStrings, + stringsLength + } = encodeStrings(FONT_INFO.strings, font); + const lengthEstimate = FONT_INFO.OFFSET_STRINGS + 4 + stringsLength + 4 + (systemFontInfoBuffer?.byteLength ?? 0) + 4 + (cssFontInfoBuffer?.byteLength ?? 0) + 4 + (font.data?.length ?? 0); + const buffer = new ArrayBuffer(lengthEstimate); + const data = new Uint8Array(buffer); + const view = new DataView(buffer); + let offset = 0; + const numBools = FONT_INFO.bools.length; + let boolByte = 0, + boolBit = 0; + for (let i = 0; i < numBools; i++) { + const value = font[FONT_INFO.bools[i]]; + const bits = value === undefined ? 0x00 : value ? 0x02 : 0x01; + boolByte |= bits << boolBit; + boolBit += 2; + if (boolBit === 8 || i === numBools - 1) { + view.setUint8(offset++, boolByte); + boolByte = 0; + boolBit = 0; + } + } + util_assert(offset === FONT_INFO.OFFSET_BBOX, "compileFontInfo: Boolean properties offset mismatch"); + writeArray(font.bbox, 4, "setInt16", 2); + util_assert(offset === FONT_INFO.OFFSET_FONT_MATRIX, "compileFontInfo: BBox properties offset mismatch"); + writeArray(font.fontMatrix, 6, "setFloat64", 8); + util_assert(offset === FONT_INFO.OFFSET_STRINGS, "compileFontInfo: FontMatrix properties offset mismatch"); + view.setUint32(offset, stringsLength); + offset = writeStrings(encodedStrings, data, view, offset + 4); + writeBuffer(systemFontInfoBuffer, "systemFontInfo"); + writeBuffer(cssFontInfoBuffer, "cssFontInfo"); + if (font.data === undefined) { + view.setUint32(offset, 0); + offset += 4; + } else { + view.setUint32(offset, font.data.length); + data.set(font.data, offset + 4); + offset += 4 + font.data.length; + } + util_assert(offset <= buffer.byteLength, "compileFontInfo: Buffer overflow"); + return buffer.transferToFixedLength(offset); +} +function compilePatternInfo(ir) { + let kind, + bbox = null, + coords = [], + colors = [], + colorStops = [], + shadingType = null, + background = null; + switch (ir[0]) { + case "RadialAxial": + kind = ir[1] === "axial" ? 1 : 2; + bbox = ir[2]; + colorStops = ir[3]; + if (kind === 1) { + coords.push(...ir[4], ...ir[5]); + } else { + coords.push(ir[4][0], ir[4][1], ir[6], ir[5][0], ir[5][1], ir[7]); + } + break; + case "Mesh": + kind = 3; + shadingType = ir[1]; + coords = ir[2]; + colors = ir[3]; + bbox = ir[6]; + background = ir[7]; + break; + default: + throw new Error(`Unsupported pattern type: ${ir[0]}`); + } + const nCoord = Math.floor(coords.length / 2); + const nColor = Math.floor(colors.length / 4); + const nStop = colorStops.length; + const byteLen = 20 + nCoord * 8 + nColor * 4 + nStop * 8 + (bbox ? 16 : 0) + (background ? 3 : 0); + const buffer = new ArrayBuffer(byteLen); + const dataView = new DataView(buffer); + const u8data = new Uint8Array(buffer); + dataView.setUint8(PATTERN_INFO.KIND, kind); + dataView.setUint8(PATTERN_INFO.HAS_BBOX, bbox ? 1 : 0); + dataView.setUint8(PATTERN_INFO.HAS_BACKGROUND, background ? 1 : 0); + dataView.setUint8(PATTERN_INFO.SHADING_TYPE, shadingType); + dataView.setUint32(PATTERN_INFO.N_COORD, nCoord, true); + dataView.setUint32(PATTERN_INFO.N_COLOR, nColor, true); + dataView.setUint32(PATTERN_INFO.N_STOP, nStop, true); + dataView.setUint32(PATTERN_INFO.N_FIGURES, 0, true); + let offset = 20; + const coordsView = new Float32Array(buffer, offset, nCoord * 2); + coordsView.set(coords); + offset += nCoord * 8; + u8data.set(colors, offset); + offset += nColor * 4; + for (const [pos, hex] of colorStops) { + dataView.setFloat32(offset, pos, true); + offset += 4; + dataView.setUint32(offset, parseInt(hex.slice(1), 16), true); + offset += 4; + } + if (bbox) { + for (const v of bbox) { + dataView.setFloat32(offset, v, true); + offset += 4; + } + } + if (background) { + u8data.set(background, offset); + } + return buffer; +} +function compileFontPathInfo(path) { + return path.slice().buffer; +} + +;// ./src/core/font_renderer.js + + + + + + + + + + + + + + + + + + + + + + +function getFloat214(view, offset) { + return view.getInt16(offset) / 16384; +} +function getSubroutineBias(subrs) { + const numSubrs = subrs.length; + if (numSubrs >= 33900) { + return 32768; + } + return numSubrs < 1240 ? 107 : 1131; +} +function parseCmap(data, start, end) { + const view = new DataView(data.buffer, data.byteOffset, data.byteLength); + const offset = view.getUint16(start + 2) === 1 ? view.getUint32(start + 8) : view.getUint32(start + 16); + const format = view.getUint16(start + offset); + let ranges, p, i; + if (format === 4) { + const segCount = view.getUint16(start + offset + 6) >> 1; + p = start + offset + 14; + ranges = []; + for (i = 0; i < segCount; i++, p += 2) { + ranges[i] = { + end: view.getUint16(p) + }; + } + p += 2; + for (i = 0; i < segCount; i++, p += 2) { + ranges[i].start = view.getUint16(p); + } + for (i = 0; i < segCount; i++, p += 2) { + ranges[i].idDelta = view.getUint16(p); + } + for (i = 0; i < segCount; i++, p += 2) { + let idOffset = view.getUint16(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] = view.getUint16(p + idOffset); + idOffset += 2; + } + } + return ranges; + } else if (format === 12) { + const groups = view.getUint32(start + offset + 12); + p = start + offset + 16; + ranges = []; + for (i = 0; i < groups; i++) { + start = view.getUint32(p); + ranges.push({ + start, + end: view.getUint32(p + 4), + idDelta: view.getUint32(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: cff.charStrings.objects, + subrs: cff.topDict.privateDict?.subrsIndex?.objects, + gsubrs: cff.globalSubrIndex?.objects, + isCFFCIDFont: cff.isCIDFont, + fdSelect: cff.fdSelect, + fdArray: cff.fdArray + }; +} +function parseGlyfTable(glyf, loca, isGlyphLocationsLong) { + const view = new DataView(loca.buffer, loca.byteOffset, loca.byteLength); + let itemSize, itemDecode; + if (isGlyphLocationsLong) { + itemSize = 4; + itemDecode = (dv, offset) => dv.getUint32(offset); + } else { + itemSize = 2; + itemDecode = (dv, offset) => 2 * dv.getUint16(offset); + } + const glyphs = []; + let startOffset = itemDecode(view, 0); + for (let j = itemSize; j < loca.length; j += itemSize) { + const endOffset = itemDecode(view, j); + glyphs.push(glyf.subarray(startOffset, endOffset)); + startOffset = endOffset; + } + return glyphs; +} +function lookupCmap(ranges, unicode) { + const code = unicode.codePointAt(0); + let gid = 0, + l = 0, + r = ranges.length - 1; + while (l < r) { + const c = l + r + 1 >> 1; + if (code < ranges[c].start) { + r = c - 1; + } else { + l = c; + } + } + if (ranges[l].start <= code && code <= ranges[l].end) { + gid = ranges[l].idDelta + (ranges[l].ids ? ranges[l].ids[code - ranges[l].start] : code) & 0xffff; + } + return { + charCode: code, + glyphId: gid + }; +} +function compileGlyf(code, cmds, font, visitedGlyphs = new Set()) { + if (!code?.length) { + return; + } + if (visitedGlyphs.has(code)) { + warn("compileGlyf: skipping recursive composite glyph reference."); + return; + } + visitedGlyphs.add(code); + function moveTo(x, y) { + if (firstPoint) { + cmds.add(DrawOPS.lineTo, firstPoint); + } + firstPoint = [x, y]; + cmds.add(DrawOPS.moveTo, [x, y]); + } + function lineTo(x, y) { + cmds.add(DrawOPS.lineTo, [x, y]); + } + function quadraticCurveTo(xa, ya, x, y) { + cmds.add(DrawOPS.quadraticCurveTo, [xa, ya, x, y]); + } + const view = new DataView(code.buffer, code.byteOffset, code.byteLength); + let i = 0; + const numberOfContours = view.getInt16(i); + let flags; + let firstPoint = null; + let x = 0, + y = 0; + i += 10; + if (numberOfContours < 0) { + do { + flags = view.getUint16(i); + const glyphIndex = view.getUint16(i + 2); + i += 4; + let arg1, arg2; + if (flags & 0x01) { + if (flags & 0x02) { + arg1 = view.getInt16(i); + arg2 = view.getInt16(i + 2); + } else { + arg1 = view.getUint16(i); + arg2 = view.getUint16(i + 2); + } + i += 4; + } else if (flags & 0x02) { + arg1 = view.getInt8(i++); + arg2 = view.getInt8(i++); + } else { + arg1 = code[i++]; + arg2 = code[i++]; + } + if (flags & 0x02) { + x = arg1; + y = arg2; + } else { + x = 0; + y = 0; + } + let scaleX = 1, + scaleY = 1, + scale01 = 0, + scale10 = 0; + if (flags & 0x08) { + scaleX = scaleY = getFloat214(view, i); + i += 2; + } else if (flags & 0x40) { + scaleX = getFloat214(view, i); + scaleY = getFloat214(view, i + 2); + i += 4; + } else if (flags & 0x80) { + scaleX = getFloat214(view, i); + scale01 = getFloat214(view, i + 2); + scale10 = getFloat214(view, i + 4); + scaleY = getFloat214(view, i + 6); + i += 8; + } + const subglyph = font.glyphs[glyphIndex]; + if (subglyph) { + cmds.save(); + cmds.transform([scaleX, scale01, scale10, scaleY, x, y]); + if (!(flags & 0x02)) {} + compileGlyf(subglyph, cmds, font, visitedGlyphs); + cmds.restore(); + } + } while (flags & 0x20); + } else { + const endPtsOfContours = []; + let j, jj; + for (j = 0; j < numberOfContours; j++) { + endPtsOfContours.push(view.getUint16(i)); + i += 2; + } + const instructionLength = view.getUint16(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++]; + } + while (repeat-- > 0) { + points.push({ + flags + }); + } + } + for (j = 0; j < numberOfPoints; j++) { + switch (points[j].flags & 0x12) { + case 0x00: + x += view.getInt16(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 += view.getInt16(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: (contour[0].x + contour.at(-1).x) / 2, + y: (contour[0].y + contour.at(-1).y) / 2 + }; + contour.unshift(p); + contour.push(p); + } + moveTo(contour[0].x, contour[0].y); + for (j = 1, jj = contour.length; j < jj; j++) { + if (contour[j].flags & 1) { + lineTo(contour[j].x, contour[j].y); + } else if (contour[j + 1].flags & 1) { + quadraticCurveTo(contour[j].x, contour[j].y, contour[j + 1].x, contour[j + 1].y); + j++; + } else { + quadraticCurveTo(contour[j].x, contour[j].y, (contour[j].x + contour[j + 1].x) / 2, (contour[j].y + contour[j + 1].y) / 2); + } + } + startPoint = endPoint + 1; + } + } + visitedGlyphs.delete(code); +} +function compileCharString(charStringCode, cmds, font, glyphId) { + function moveTo(x, y) { + if (firstPoint) { + cmds.add(DrawOPS.lineTo, firstPoint); + } + firstPoint = [x, y]; + cmds.add(DrawOPS.moveTo, [x, y]); + } + function lineTo(x, y) { + cmds.add(DrawOPS.lineTo, [x, y]); + } + function bezierCurveTo(x1, y1, x2, y2, x, y) { + cmds.add(DrawOPS.curveTo, [x1, y1, x2, y2, x, y]); + } + const stack = []; + let x = 0, + y = 0; + let stems = 0; + let firstPoint = null; + function parse(code) { + const view = new DataView(code.buffer, code.byteOffset, code.byteLength); + 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: + stems += stack.length >> 1; + stackClean = true; + break; + case 4: + y += stack.pop(); + moveTo(x, y); + stackClean = true; + break; + case 5: + while (stack.length > 0) { + x += stack.shift(); + y += stack.shift(); + lineTo(x, y); + } + break; + case 6: + while (stack.length > 0) { + x += stack.shift(); + lineTo(x, y); + if (stack.length === 0) { + break; + } + y += stack.shift(); + lineTo(x, y); + } + break; + case 7: + while (stack.length > 0) { + y += stack.shift(); + lineTo(x, y); + if (stack.length === 0) { + break; + } + x += stack.shift(); + lineTo(x, y); + } + break; + case 8: + while (stack.length > 0) { + xa = x + stack.shift(); + ya = y + stack.shift(); + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb + stack.shift(); + y = yb + stack.shift(); + bezierCurveTo(xa, ya, xb, yb, x, y); + } + break; + case 10: + n = stack.pop(); + subrCode = null; + if (font.isCFFCIDFont) { + const fdIndex = font.fdSelect.getFDIndex(glyphId); + if (fdIndex >= 0 && fdIndex < font.fdArray.length) { + const fontDict = font.fdArray[fdIndex]; + let subrs; + if (fontDict.privateDict?.subrsIndex) { + subrs = fontDict.privateDict.subrsIndex.objects; + } + 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: + v = code[i++]; + switch (v) { + case 34: + xa = x + stack.shift(); + xb = xa + stack.shift(); + y1 = y + stack.shift(); + x = xb + stack.shift(); + bezierCurveTo(xa, y, xb, y1, x, y1); + xa = x + stack.shift(); + xb = xa + stack.shift(); + x = xb + stack.shift(); + bezierCurveTo(xa, y1, xb, y, x, y); + break; + case 35: + xa = x + stack.shift(); + ya = y + stack.shift(); + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb + stack.shift(); + y = yb + stack.shift(); + bezierCurveTo(xa, ya, xb, yb, x, y); + xa = x + stack.shift(); + ya = y + stack.shift(); + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb + stack.shift(); + y = yb + stack.shift(); + bezierCurveTo(xa, ya, xb, yb, x, y); + stack.pop(); + break; + case 36: + xa = x + stack.shift(); + y1 = y + stack.shift(); + xb = xa + stack.shift(); + y2 = y1 + stack.shift(); + x = xb + stack.shift(); + bezierCurveTo(xa, y1, xb, y2, x, y2); + xa = x + stack.shift(); + xb = xa + stack.shift(); + y3 = y2 + stack.shift(); + x = xb + stack.shift(); + bezierCurveTo(xa, y2, xb, y3, x, y); + break; + case 37: + const x0 = x, + y0 = y; + xa = x + stack.shift(); + ya = y + stack.shift(); + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb + stack.shift(); + y = yb + stack.shift(); + bezierCurveTo(xa, ya, xb, yb, x, y); + xa = x + stack.shift(); + ya = y + stack.shift(); + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb; + y = yb; + if (Math.abs(x - x0) > Math.abs(y - y0)) { + x += stack.shift(); + } else { + y += stack.shift(); + } + bezierCurveTo(xa, ya, xb, yb, x, y); + break; + default: + throw new FormatError(`unknown operator: 12 ${v}`); + } + break; + case 14: + if (stack.length >= 4) { + const achar = stack.pop(); + const bchar = stack.pop(); + y = stack.pop(); + x = stack.pop(); + cmds.save(); + cmds.translate(x, y); + let cmap = lookupCmap(font.cmap, String.fromCharCode(font.glyphNameMap[StandardEncoding[achar]])); + compileCharString(font.glyphs[cmap.glyphId], cmds, font, cmap.glyphId); + cmds.restore(); + cmap = lookupCmap(font.cmap, String.fromCharCode(font.glyphNameMap[StandardEncoding[bchar]])); + compileCharString(font.glyphs[cmap.glyphId], cmds, font, cmap.glyphId); + } + return; + case 18: + stems += stack.length >> 1; + stackClean = true; + break; + case 19: + stems += stack.length >> 1; + i += stems + 7 >> 3; + stackClean = true; + break; + case 20: + stems += stack.length >> 1; + i += stems + 7 >> 3; + stackClean = true; + break; + case 21: + y += stack.pop(); + x += stack.pop(); + moveTo(x, y); + stackClean = true; + break; + case 22: + x += stack.pop(); + moveTo(x, y); + stackClean = true; + break; + case 23: + stems += stack.length >> 1; + stackClean = true; + break; + case 24: + while (stack.length > 2) { + xa = x + stack.shift(); + ya = y + stack.shift(); + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb + stack.shift(); + y = yb + stack.shift(); + bezierCurveTo(xa, ya, xb, yb, x, y); + } + x += stack.shift(); + y += stack.shift(); + lineTo(x, y); + break; + case 25: + while (stack.length > 6) { + x += stack.shift(); + y += stack.shift(); + lineTo(x, y); + } + xa = x + stack.shift(); + ya = y + stack.shift(); + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb + stack.shift(); + y = yb + stack.shift(); + bezierCurveTo(xa, ya, xb, yb, x, y); + break; + case 26: + if (stack.length % 2) { + x += stack.shift(); + } + while (stack.length > 0) { + xa = x; + ya = y + stack.shift(); + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb; + y = yb + stack.shift(); + bezierCurveTo(xa, ya, xb, yb, x, y); + } + break; + case 27: + if (stack.length % 2) { + y += stack.shift(); + } + while (stack.length > 0) { + xa = x + stack.shift(); + ya = y; + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb + stack.shift(); + y = yb; + bezierCurveTo(xa, ya, xb, yb, x, y); + } + break; + case 28: + stack.push(view.getInt16(i)); + i += 2; + break; + case 29: + n = stack.pop() + font.gsubrsBias; + subrCode = font.gsubrs[n]; + if (subrCode) { + parse(subrCode); + } + break; + case 30: + while (stack.length > 0) { + xa = x; + ya = y + stack.shift(); + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb + stack.shift(); + y = yb + (stack.length === 1 ? stack.shift() : 0); + bezierCurveTo(xa, ya, xb, yb, x, y); + if (stack.length === 0) { + break; + } + xa = x + stack.shift(); + ya = y; + xb = xa + stack.shift(); + yb = ya + stack.shift(); + y = yb + stack.shift(); + x = xb + (stack.length === 1 ? stack.shift() : 0); + bezierCurveTo(xa, ya, xb, yb, x, y); + } + break; + case 31: + while (stack.length > 0) { + xa = x + stack.shift(); + ya = y; + xb = xa + stack.shift(); + yb = ya + stack.shift(); + y = yb + stack.shift(); + x = xb + (stack.length === 1 ? stack.shift() : 0); + bezierCurveTo(xa, ya, xb, yb, x, y); + if (stack.length === 0) { + break; + } + xa = x; + ya = y + stack.shift(); + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb + stack.shift(); + y = yb + (stack.length === 1 ? stack.shift() : 0); + bezierCurveTo(xa, ya, xb, yb, x, y); + } + break; + default: + if (v < 32) { + throw new 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(view.getInt32(i) / 65536); + i += 4; + } + break; + } + if (stackClean) { + stack.length = 0; + } + } + } + parse(charStringCode); +} +class Commands { + cmds = []; + transformStack = []; + currentTransform = [1, 0, 0, 1, 0, 0]; + add(cmd, args) { + if (args) { + const { + currentTransform + } = this; + for (let i = 0, ii = args.length; i < ii; i += 2) { + Util.applyTransform(args, currentTransform, i); + } + this.cmds.push(cmd, ...args); + } else { + this.cmds.push(cmd); + } + } + transform(transf) { + this.currentTransform = Util.transform(this.currentTransform, transf); + } + translate(x, y) { + this.transform([1, 0, 0, 1, x, y]); + } + save() { + this.transformStack.push(this.currentTransform.slice()); + } + restore() { + this.currentTransform = this.transformStack.pop() || [1, 0, 0, 1, 0, 0]; + } + getPath() { + if (FeatureTest.isFloat16ArraySupported) { + return new Float16Array(this.cmds); + } + return new Float32Array(this.cmds); + } +} +class CompiledFont { + #compiledCharCodes = new Set(); + #compiledGlyphs = new Map(); + constructor(fontMatrix) { + this.fontMatrix = fontMatrix; + } + static get NOOP() { + return util_shadow(this, "NOOP", FeatureTest.isFloat16ArraySupported ? new Float16Array(0) : new Float32Array(0)); + } + getPath(unicode) { + const { + charCode, + glyphId + } = lookupCmap(this.cmap, unicode); + if (this.#compiledGlyphs.has(glyphId) && this.#compiledCharCodes.has(charCode)) { + return null; + } + const path = this.#compiledGlyphs.getOrInsertComputed(glyphId, () => { + try { + return this.compileGlyph(this.glyphs[glyphId], glyphId); + } catch (ex) { + return ex; + } + }); + this.#compiledCharCodes.add(charCode); + if (path instanceof Error) { + throw path; + } + return compileFontPathInfo(path); + } + compileGlyph(code, glyphId) { + if (!code?.length || code[0] === 14) { + return CompiledFont.NOOP; + } + 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."); + } + } + util_assert(isNumberArray(fontMatrix, 6), "Expected a valid fontMatrix."); + const cmds = new Commands(); + cmds.transform(fontMatrix.slice()); + this.compileGlyphImpl(code, cmds, glyphId); + cmds.add(DrawOPS.closePath); + return cmds.getPath(); + } + compileGlyphImpl() { + unreachable("Children classes should implement this."); + } +} +class TrueTypeCompiled extends CompiledFont { + constructor(glyphs, cmap, fontMatrix) { + super(fontMatrix || [0.000488, 0, 0, 0.000488, 0, 0]); + this.glyphs = glyphs; + this.cmap = cmap; + } + compileGlyphImpl(code, cmds) { + compileGlyf(code, cmds, this); + } +} +class Type2Compiled extends CompiledFont { + constructor(cffInfo, cmap, fontMatrix) { + 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 = getGlyphsUnicode(); + this.gsubrsBias = getSubroutineBias(this.gsubrs); + this.subrsBias = getSubroutineBias(this.subrs); + this.isCFFCIDFont = cffInfo.isCFFCIDFont; + this.fdSelect = cffInfo.fdSelect; + this.fdArray = cffInfo.fdArray; + } + compileGlyphImpl(code, cmds, glyphId) { + compileCharString(code, cmds, this, glyphId); + } +} +class FontRendererFactory { + static create(font, seacAnalysisEnabled) { + const data = new Uint8Array(font.data), + view = new DataView(data.buffer); + let cmap, glyf, loca, cff, indexToLocFormat, unitsPerEm; + const numTables = view.getUint16(4); + for (let i = 0, p = 12; i < numTables; i++, p += 16) { + const tag = bytesToString(data.subarray(p, p + 4)); + const offset = view.getUint32(p + 8); + const length = view.getUint32(p + 12); + switch (tag) { + case "cmap": + cmap = parseCmap(data, offset, offset + length); + break; + case "glyf": + glyf = data.subarray(offset, offset + length); + break; + case "loca": + loca = data.subarray(offset, offset + length); + break; + case "head": + unitsPerEm = view.getUint16(offset + 18); + indexToLocFormat = view.getUint16(offset + 50); + break; + case "CFF ": + cff = parseCff(data, offset, offset + length, seacAnalysisEnabled); + break; + } + } + if (glyf) { + const fontMatrix = !unitsPerEm ? font.fontMatrix : [1 / unitsPerEm, 0, 0, 1 / unitsPerEm, 0, 0]; + return new TrueTypeCompiled(parseGlyfTable(glyf, loca, indexToLocFormat), cmap, fontMatrix); + } + return new Type2Compiled(cff, cmap, font.fontMatrix); + } +} + +;// ./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/opentype_file_builder.js + + + + + + + + + +const OTF_HEADER_SIZE = 12; +const OTF_TABLE_ENTRY_SIZE = 16; +class OpenTypeFileBuilder { + #tables = new Map(); + constructor(sfnt) { + this.sfnt = sfnt; + } + static getSearchParams(entriesCount, entrySize) { + let maxPower2 = 1, + log2 = 0; + while ((maxPower2 ^ entriesCount) > maxPower2) { + maxPower2 <<= 1; + log2++; + } + const searchRange = maxPower2 * entrySize; + return { + range: searchRange, + entry: log2, + rangeShift: entrySize * entriesCount - searchRange + }; + } + toArray() { + let sfnt = this.sfnt; + const tables = this.#tables; + const tablesNames = [...tables.keys()].sort(); + const numTables = tablesNames.length; + let offset = OTF_HEADER_SIZE + numTables * OTF_TABLE_ENTRY_SIZE; + const tableOffsets = [offset]; + for (let i = 0; i < numTables; i++) { + const table = tables.get(tablesNames[i]); + const paddedLength = (table.length + 3 & ~3) >>> 0; + offset += paddedLength; + tableOffsets.push(offset); + } + const file = new Uint8Array(offset), + view = new DataView(file.buffer); + for (let i = 0; i < numTables; i++) { + const table = tables.get(tablesNames[i]); + file.set(table, tableOffsets[i]); + } + if (sfnt === "true") { + sfnt = "\x00\x01\x00\x00"; + } + file.set(stringToBytes(sfnt), 0); + view.setInt16(4, numTables); + const searchParams = OpenTypeFileBuilder.getSearchParams(numTables, 16); + view.setInt16(6, searchParams.range); + view.setInt16(8, searchParams.entry); + view.setInt16(10, searchParams.rangeShift); + offset = OTF_HEADER_SIZE; + for (let i = 0; i < numTables; i++) { + const tableName = tablesNames[i]; + file.set(stringToBytes(tableName), offset); + let checksum = 0; + for (let j = tableOffsets[i], jj = tableOffsets[i + 1]; j < jj; j += 4) { + const quad = view.getUint32(j); + checksum = checksum + quad >>> 0; + } + view.setInt32(offset + 4, checksum); + view.setInt32(offset + 8, tableOffsets[i]); + view.setInt32(offset + 12, tables.get(tableName).length); + offset += OTF_TABLE_ENTRY_SIZE; + } + this.#tables.clear(); + return file; + } + addTable(tag, data) { + if (this.#tables.has(tag)) { + throw new Error(`Table ${tag} already exists`); + } + this.#tables.set(tag, data); + } +} + +;// ./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 { + width = 0; + lsb = 0; + flexing = false; + output = []; + stack = []; + 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 (true) { + this.stack = []; + break; + } + error = this.executeCommand(2, COMMAND_MAP.hstem); + break; + case 3: + if (true) { + this.stack = []; + break; + } + error = this.executeCommand(2, COMMAND_MAP.vstem); + break; + case 4: + if (this.flexing) { + if (this.stack.length < 1) { + error = true; + break; + } + const dy = this.stack.pop(); + this.stack.push(0, dy); + break; + } + error = this.executeCommand(1, COMMAND_MAP.vmoveto); + break; + case 5: + error = this.executeCommand(2, COMMAND_MAP.rlineto); + break; + case 6: + error = this.executeCommand(1, COMMAND_MAP.hlineto); + break; + case 7: + error = this.executeCommand(1, COMMAND_MAP.vlineto); + break; + case 8: + error = this.executeCommand(6, COMMAND_MAP.rrcurveto); + break; + case 9: + this.stack = []; + break; + case 10: + if (this.stack.length < 1) { + error = true; + break; + } + subrNumber = this.stack.pop(); + if (!subrs[subrNumber]) { + error = true; + break; + } + error = this.convert(subrs[subrNumber], subrs, seacAnalysisEnabled); + break; + case 11: + return error; + case 13: + if (this.stack.length < 2) { + error = true; + break; + } + 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(COMMAND_MAP.endchar[0]); + break; + case 21: + if (this.flexing) { + break; + } + error = this.executeCommand(2, COMMAND_MAP.rmoveto); + break; + case 22: + if (this.flexing) { + this.stack.push(0); + break; + } + error = this.executeCommand(1, COMMAND_MAP.hmoveto); + break; + case 30: + error = this.executeCommand(4, COMMAND_MAP.vhcurveto); + break; + case 31: + error = this.executeCommand(4, COMMAND_MAP.hvcurveto); + break; + case (12 << 8) + 0: + this.stack = []; + break; + case (12 << 8) + 1: + if (true) { + this.stack = []; + break; + } + error = this.executeCommand(2, COMMAND_MAP.vstem); + break; + case (12 << 8) + 2: + if (true) { + 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 - asb; + error = this.executeCommand(0, COMMAND_MAP.endchar); + } else { + error = this.executeCommand(4, COMMAND_MAP.endchar); + } + break; + case (12 << 8) + 7: + if (this.stack.length < 4) { + error = true; + break; + } + this.stack.pop(); + 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 (12 << 8) + 12: + if (this.stack.length < 2) { + error = true; + break; + } + const num2 = this.stack.pop(); + const num1 = this.stack.pop(); + this.stack.push(num1 / num2); + break; + case (12 << 8) + 16: + if (this.stack.length < 2) { + error = true; + break; + } + subrNumber = this.stack.pop(); + const numArgs = this.stack.pop(); + if (subrNumber === 0 && numArgs === 3) { + const flexArgs = this.stack.splice(-17, 17); + this.stack.push(flexArgs[2] + flexArgs[0], flexArgs[3] + flexArgs[1], flexArgs[4], flexArgs[5], flexArgs[6], flexArgs[7], flexArgs[8], flexArgs[9], flexArgs[10], flexArgs[11], flexArgs[12], flexArgs[13], flexArgs[14]); + error = this.executeCommand(13, COMMAND_MAP.flex, true); + this.flexing = false; + this.stack.push(flexArgs[15], flexArgs[16]); + } else if (subrNumber === 1 && numArgs === 0) { + this.flexing = true; + } + break; + case (12 << 8) + 17: + break; + case (12 << 8) + 33: + this.stack = []; + break; + default: + warn('Unknown type 1 charstring command of "' + value + '"'); + 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 { + value = (encoded[++i] & 0xff) << 24 | (encoded[++i] & 0xff) << 16 | (encoded[++i] & 0xff) << 8 | (encoded[++i] & 0xff) << 0; + } + this.stack.push(value); + } + return error; + } + 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, value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff); + } + } + this.output.push(...command); + if (keepStack) { + this.stack.splice(start, howManyArgs); + } else { + this.stack.length = 0; + } + return false; + } +} +const EEXEC_ENCRYPT_KEY = 55665; +const CHAR_STRS_ENCRYPT_KEY = 4330; +function isHexDigit(code) { + return code >= 48 && code <= 57 || code >= 65 && code <= 70 || code >= 97 && code <= 102; +} +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(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 = !!seacAnalysisEnabled; + this.stream = stream; + this.nextChar(); + } + readNumberArray() { + this.getToken(); + const array = []; + while (true) { + const token = this.getToken(); + if (token === null || token === "]" || token === "}") { + break; + } + array.push(parseFloat(token || 0)); + } + return array; + } + readNumber() { + const token = this.getToken(); + return parseFloat(token || 0); + } + readInt() { + const token = this.getToken(); + return parseInt(token || 0, 10) | 0; + } + readBoolean() { + const token = this.getToken(); + return token === "true" ? 1 : 0; + } + nextChar() { + return this.currentChar = this.stream.getByte(); + } + prevChar() { + this.stream.skip(-2); + return this.currentChar = this.stream.getByte(); + } + getToken() { + 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(ch)) { + this.nextChar(); + return String.fromCharCode(ch); + } + let token = ""; + do { + token += String.fromCharCode(ch); + ch = this.nextChar(); + } while (ch >= 0 && !isWhiteSpace(ch) && !isSpecial(ch)); + return token; + } + readCharStrings(bytes, lenIV) { + if (lenIV === -1) { + return bytes; + } + return decrypt(bytes, CHAR_STRS_ENCRYPT_KEY, lenIV); + } + extractFontProgram(properties) { + const stream = this.stream; + const subrs = [], + charstrings = []; + const privateData = new Map([["lenIV", 4]]); + const program = { + subrs: [], + charstrings: [], + properties: { + privateData + } + }; + let token, length, data; + let subrsParsed = false; + let charStringsParsed = false; + while ((token = this.getToken()) !== null) { + if (token !== "/") { + continue; + } + token = this.getToken(); + switch (token) { + case "CharStrings": + if (charStringsParsed) { + break; + } + charStringsParsed = true; + 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); + const encoded = this.readCharStrings(data, privateData.get("lenIV")); + this.nextChar(); + token = this.getToken(); + if (token === "noaccess") { + this.getToken(); + } else if (token === "/") { + this.prevChar(); + } + charstrings.push({ + glyph, + encoded + }); + } + break; + case "Subrs": + if (subrsParsed) { + break; + } + subrsParsed = true; + 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); + const encoded = this.readCharStrings(data, privateData.get("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 (false) // removed by dead control flow +{} + break; + case "StemSnapH": + case "StemSnapV": + privateData.set(token, this.readNumberArray()); + break; + case "StdHW": + case "StdVW": + privateData.set(token, this.readNumberArray()[0]); + break; + case "BlueShift": + case "lenIV": + case "BlueFuzz": + case "BlueScale": + case "LanguageGroup": + privateData.set(token, this.readNumber()); + break; + case "ExpansionFactor": + privateData.set(token, this.readNumber() || 0.06); + break; + case "ForceBold": + privateData.set(token, this.readBoolean()); + break; + } + } + for (const { + encoded, + glyph + } of charstrings) { + const charString = new Type1CharString(); + const error = charString.convert(encoded, subrs, this.seacAnalysisEnabled); + const output = !error ? charString.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; + } + extractCidKeyedFontProgram(properties) { + const stream = this.stream; + const privateData = new Map([["lenIV", 4]]); + const program = { + subrs: [], + charstrings: [], + properties: { + privateData + } + }; + let cidCount = 0; + let cidMapOffset = -1; + let fdBytes = 1; + let gdBytes = 0; + let subrMapOffset = -1; + let sdBytes = 0; + let subrCount = 0; + let startDataLength = 0; + let startDataIsHex = false; + let foundStartData = false; + const previousTokens = []; + function rememberToken(value) { + previousTokens.push(value); + if (previousTokens.length > 4) { + previousTokens.shift(); + } + } + let token; + while ((token = this.getToken()) !== null) { + if (token === "StartData") { + const dataType = previousTokens.at(-3); + const dataLength = previousTokens.at(-1); + if (previousTokens.at(-4) !== "(" || previousTokens.at(-2) !== ")" || dataType !== "Binary" && dataType !== "Hex" || !/^\d+$/.test(dataLength)) { + return null; + } + startDataLength = parseInt(dataLength, 10); + if (startDataLength <= 0) { + return null; + } + startDataIsHex = dataType === "Hex"; + foundStartData = true; + break; + } + rememberToken(token); + if (token !== "/") { + continue; + } + token = this.getToken(); + rememberToken(token); + switch (token) { + case "FontMatrix": + properties.fontMatrix = this.readNumberArray(); + 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; + case "CIDCount": + cidCount = this.readInt(); + break; + case "CIDMapOffset": + cidMapOffset = this.readInt(); + break; + case "FDBytes": + fdBytes = this.readInt(); + break; + case "GDBytes": + gdBytes = this.readInt(); + break; + case "SubrMapOffset": + subrMapOffset = this.readInt(); + break; + case "SDBytes": + sdBytes = this.readInt(); + break; + case "SubrCount": + subrCount = this.readInt(); + break; + case "BlueValues": + case "OtherBlues": + case "FamilyBlues": + case "FamilyOtherBlues": + this.readNumberArray(); + break; + case "StemSnapH": + case "StemSnapV": + privateData.set(token, this.readNumberArray()); + break; + case "StdHW": + case "StdVW": + privateData.set(token, this.readNumberArray()[0]); + break; + case "BlueShift": + case "lenIV": + case "BlueFuzz": + case "BlueScale": + case "LanguageGroup": + privateData.set(token, this.readNumber()); + break; + case "ExpansionFactor": + privateData.set(token, this.readNumber() || 0.06); + break; + case "ForceBold": + privateData.set(token, this.readBoolean()); + break; + } + } + if (!foundStartData || cidCount <= 0 || cidMapOffset < 0 || fdBytes < 0 || fdBytes > 4 || gdBytes < 1 || gdBytes > 4) { + return null; + } + const maxLength = stream.end - stream.pos; + if (startDataLength > maxLength) { + if (!startDataIsHex) { + startDataLength = maxLength; + } else if (startDataLength > 2 * maxLength) { + return null; + } + } + let binary = stream.getBytes(startDataIsHex ? undefined : startDataLength); + if (startDataIsHex) { + const decoded = new Uint8Array(startDataLength); + let digit1 = -1, + j = 0; + for (let i = 0, ii = binary.length; i < ii && j < startDataLength; i++) { + const digit = binary[i]; + if (!isHexDigit(digit)) { + continue; + } + if (digit1 < 0) { + digit1 = digit; + continue; + } + decoded[j++] = parseInt(String.fromCharCode(digit1, digit), 16); + digit1 = -1; + } + if (j !== startDataLength) { + return null; + } + binary = decoded; + } + const lenIV = privateData.get("lenIV"); + const cidEntrySize = fdBytes + gdBytes; + const subrs = []; + function readUint(offset, byteCount) { + let n = 0; + for (let i = 0; i < byteCount; i++) { + n = n << 8 | binary[offset + i]; + } + return n >>> 0; + } + if (cidMapOffset + (cidCount + 1) * cidEntrySize > binary.length || subrCount > 0 && (subrMapOffset < 0 || sdBytes < 1 || sdBytes > 4 || subrMapOffset + (subrCount + 1) * sdBytes > binary.length)) { + return null; + } + if (fdBytes > 0) { + for (let cid = 0; cid < cidCount; cid++) { + if (readUint(cidMapOffset + cid * cidEntrySize, fdBytes) !== 0) { + return null; + } + } + } + if (subrCount > 0) { + const subrOffsets = new Array(subrCount + 1); + for (let i = 0; i <= subrCount; i++) { + subrOffsets[i] = readUint(subrMapOffset + i * sdBytes, sdBytes); + } + for (let i = 0; i < subrCount; i++) { + const start = subrOffsets[i]; + const end = subrOffsets[i + 1]; + if (end > binary.length || end < start) { + subrs[i] = new Uint8Array(0); + continue; + } + subrs[i] = this.readCharStrings(binary.subarray(start, end), lenIV); + } + } + const charstrings = []; + let prevOffset = readUint(cidMapOffset + fdBytes, gdBytes); + for (let cid = 0; cid < cidCount; cid++) { + const nextOffset = readUint(cidMapOffset + (cid + 1) * cidEntrySize + fdBytes, gdBytes); + const glyphName = cid === 0 ? ".notdef" : `cid${cid}`; + if (nextOffset > prevOffset && nextOffset <= binary.length) { + const encoded = this.readCharStrings(binary.subarray(prevOffset, nextOffset), lenIV); + const charString = new Type1CharString(); + const error = charString.convert(encoded, subrs, this.seacAnalysisEnabled); + charstrings.push({ + glyphName, + charstring: error ? [14] : charString.output, + width: charString.width, + lsb: charString.lsb, + seac: charString.seac + }); + } else { + const notDef = charstrings[0]; + charstrings.push({ + glyphName, + charstring: notDef?.charstring.slice() || [0x8b, 0x0e], + width: notDef?.width || 0, + lsb: notDef?.lsb || 0 + }); + } + prevOffset = nextOffset; + } + program.subrs = subrs; + program.charstrings = charstrings; + return program; + } + 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; + } + i++; + } + 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 + }; +} +function isCidKeyedType1File(file) { + const sample = file.peekBytes(2048); + if (sample.length < 2 || sample[0] !== 0x25 || sample[1] !== 0x21) { + return false; + } + const text = bytesToString(sample); + return text.includes("Resource-CIDFont") || /\/CIDFontType\s+0\b/.test(text); +} +class Type1Font { + #rawFileLength; + constructor(name, file, properties) { + let data; + if (properties.composite && isCidKeyedType1File(file)) { + data = this.#parseCidKeyedType1(file, properties); + } + data ||= this.#parseType1(file, 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); + } + #parseType1(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 headerBlock = getHeaderBlock(file, headerBlockLength); + const headerBlockParser = new Type1Parser(headerBlock.stream, false, (/* inlined export .SEAC_ANALYSIS_ENABLED */true)); + headerBlockParser.extractFontHeader(properties); + if (pfbHeaderPresent) { + pfbHeader = file.getBytes(PFB_HEADER_SIZE); + eexecBlockLength = pfbHeader[5] << 24 | pfbHeader[4] << 16 | pfbHeader[3] << 8 | pfbHeader[2]; + } + const eexecBlock = getEexecBlock(file, eexecBlockLength); + const eexecBlockParser = new Type1Parser(eexecBlock.stream, true, (/* inlined export .SEAC_ANALYSIS_ENABLED */true)); + const data = eexecBlockParser.extractFontProgram(properties); + this.#rawFileLength = headerBlock.length + eexecBlock.length; + return data; + } + #parseCidKeyedType1(file, properties) { + const fileStart = file.pos; + const length = file.end - fileStart; + const parser = new Type1Parser(file, false, (/* inlined export .SEAC_ANALYSIS_ENABLED */true)); + const data = parser.extractCidKeyedFontProgram(properties); + if (!data) { + file.pos = fileStart; + warn("Type1Font: unable to parse CID-keyed Type 1 font."); + return null; + } + this.#rawFileLength = length; + return data; + } + get numGlyphs() { + return this.charstrings.length + 1; + } + getCharset() { + const charset = [".notdef"]; + for (const { + glyphName + } of this.charstrings) { + charset.push(glyphName); + } + return charset; + } + getGlyphMapping(properties) { + const charstrings = this.charstrings; + if (properties.composite) { + const charCodeToGlyphId = new Map(); + for (let glyphId = 0, charstringsLen = charstrings.length; glyphId < charstringsLen; glyphId++) { + const charCode = properties.cMap.charCodeOf(glyphId); + charCodeToGlyphId.set(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(properties, builtInEncoding, glyphNames); + } + hasGlyphId(id) { + if (id < 0 || id >= this.numGlyphs) { + return false; + } + if (id === 0) { + return true; + } + const glyph = this.charstrings[id - 1]; + return glyph.charstring.length > 0; + } + getSeacs(charstrings) { + const seacs = new Map(); + for (let i = 0, ii = charstrings.length; i < ii; i++) { + const { + seac + } = charstrings[i]; + if (seac) { + seacs.set(i + 1, seac); + } + } + return seacs; + } + 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(this.#rawFileLength); + 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"]; + for (let i = 0; i < count; i++) { + const { + glyphName + } = charstrings[i]; + 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 (let 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", "FamilyOtherBlues", "StemSnapH", "StemSnapV", "BlueShift", "BlueFuzz", "BlueScale", "LanguageGroup", "ExpansionFactor", "ForceBold", "StdHW", "StdVW"]; + for (const field of fields) { + if (!properties.privateData.has(field)) { + continue; + } + const value = properties.privateData.get(field); + if (Array.isArray(value)) { + for (let j = value.length - 1; j > 0; j--) { + value[j] -= value[j - 1]; + } + } + privateDict.setByName(field, value); + } + cff.topDict.privateDict = privateDict; + const subrIndex = new CFFIndex(); + for (const subr of subrs) { + subrIndex.add(subr); + } + 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 = ["bbox", "black", "bold", "cssFontInfo", "data", "disableFontFace", "fallbackName", "fontExtraProperties", "fontMatrix", "isInvalidPDFjsFont", "isType3Font", "italic", "loadedName", "missingFile", "remeasure", "systemFontInfo", "vertical"]; +const EXPORT_DATA_EXTRA_PROPERTIES = ["ascent", "composite", "defaultEncoding", "defaultVMetrics", "defaultWidth", "descent", "differences", "isMonospace", "isSerifFont", "isSymbolicFont", "name", "seacMap", "subtype", "toFontChar", "type", "vmetrics", "widths"]; +function adjustWidths(properties) { + if (!properties.fontMatrix || 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 = new Map(), + glyphsUnicodeMap = getGlyphsUnicode(); + for (const charCode in encoding) { + const glyphName = encoding[charCode]; + if (glyphName === "") { + continue; + } + const unicode = glyphsUnicodeMap[glyphName]; + if (unicode === undefined) { + continue; + } + toUnicode.set(+charCode, String.fromCharCode(unicode)); + } + properties.toUnicode.amend(toUnicode); +} +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 = new Map(), + glyphsUnicodeMap = getGlyphsUnicode(); + for (const charCode in builtInEncoding) { + if (properties.hasEncoding) { + if (properties.baseEncodingName || properties.differences.has(+charCode)) { + continue; + } + } + const glyphName = builtInEncoding[charCode]; + const unicode = getUnicodeForGlyph(glyphName, glyphsUnicodeMap); + if (unicode !== -1) { + toUnicode.set(+charCode, String.fromCharCode(unicode)); + } + } + properties.toUnicode.amend(toUnicode); +} +function amendFallbackToUnicode(properties) { + if (!properties.fallbackToUnicode || properties.toUnicode instanceof IdentityToUnicodeMap) { + return; + } + const toUnicode = new Map(); + for (const [charCode, entry] of properties.fallbackToUnicode) { + if (properties.toUnicode.has(charCode)) { + continue; + } + toUnicode.set(charCode, entry); + } + properties.toUnicode.amend(toUnicode); +} +class fonts_Glyph { + constructor(originalCharCode, fontChar, unicode, accent, width, vmetric, operatorListId, isSpace, isInFont) { + this.originalCharCode = originalCharCode; + this.fontChar = fontChar; + this.unicode = unicode; + this.accent = accent; + this.width = width; + this.vmetric = vmetric; + this.operatorListId = operatorListId; + this.isSpace = isSpace; + this.isInFont = isInFont; + } + get category() { + return util_shadow(this, "category", getCharUnicodeCategory(this.unicode), true); + } +} +function int16(b0, b1) { + return (b0 << 8) + b1; +} +function writeSignedInt16(bytes, index, value) { + bytes[index + 1] = value; + bytes[index] = value >>> 8; +} +function signedInt16(b0, b1) { + const value = (b0 << 8) + b1; + return value & 1 << 15 ? value - 0x10000 : value; +} +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 isTrueTypeFile(file) { + const header = file.peekBytes(4), + str = bytesToString(header); + return str === "\x00\x01\x00\x00" || str === "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 { + fileType = type === "MMType1" ? "MMType1" : "Type1"; + } + } 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."); + fileType = type; + fileSubtype = subtype; + } + return [fileType, fileSubtype]; +} +function applyStandardFontGlyphMap(map, glyphMap) { + for (const charCode in glyphMap) { + map.set(+charCode, glyphMap[charCode]); + } +} +const getSymbolGlyphIdEncoding = getLookupTableFactory(t => { + let glyphId = 3; + for (const [firstCharCode, lastCharCode] of [[0x20, 0x7e], [0xa1, 0xfe]]) { + for (let charCode = firstCharCode; charCode <= lastCharCode; charCode++) { + t[glyphId++] = SymbolSetEncoding[charCode]; + } + } +}, true); +function buildToFontChar(encoding, glyphsUnicodeMap, differences) { + const toFontChar = new Map(); + let unicode; + for (let i = 0, ii = encoding.length; i < ii; i++) { + unicode = getUnicodeForGlyph(encoding[i], glyphsUnicodeMap); + if (unicode !== -1) { + toFontChar.set(i, unicode); + } + } + for (const [charCode, glyphName] of differences) { + unicode = getUnicodeForGlyph(glyphName, glyphsUnicodeMap); + if (unicode !== -1) { + toFontChar.set(charCode, unicode); + } + } + return toFontChar; +} +function isMacNameRecord(r) { + return r.platform === 1 && r.encoding === 0 && r.language === 0; +} +function isWinNameRecord(r) { + return r.platform === 3 && r.encoding === 1 && r.language === 0x409; +} +function convertCidString(charCode, cid, shouldThrow = false) { + switch (cid.length) { + case 1: + return cid.charCodeAt(0); + case 2: + return cid.charCodeAt(0) << 8 | cid.charCodeAt(1); + } + const msg = `Unsupported CID string (charCode ${charCode}): "${cid}".`; + if (shouldThrow) { + throw new FormatError(msg); + } + warn(msg); + return cid; +} +function adjustMapping(charCodeToGlyphId, hasGlyph, newGlyphZeroId, toUnicode) { + const newMap = new Map(); + const toUnicodeExtraMap = new Map(); + const toFontChar = new Map(); + 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]; + let LIGATURE_TO_UNICODE = null; + for (const [charCode, gid] of charCodeToGlyphId) { + if (!hasGlyph(gid)) { + continue; + } + if (nextAvailableFontCharCode > privateUseOffetEnd) { + privateUseAreaIndex++; + if (privateUseAreaIndex >= PRIVATE_USE_AREAS.length) { + warn("Ran out of space in font private use area."); + break; + } + nextAvailableFontCharCode = PRIVATE_USE_AREAS[privateUseAreaIndex][0]; + privateUseOffetEnd = PRIVATE_USE_AREAS[privateUseAreaIndex][1]; + } + const fontCharCode = nextAvailableFontCharCode++; + const glyphId = gid === 0 ? newGlyphZeroId : gid; + let unicode = toUnicode.get(charCode); + if (typeof unicode === "string") { + if (unicode.length === 1) { + unicode = unicode.codePointAt(0); + } else { + if (!LIGATURE_TO_UNICODE) { + LIGATURE_TO_UNICODE = new Map(); + for (let i = 0xfb00; i <= 0xfb4f; i++) { + const normalized = String.fromCharCode(i).normalize("NFKD"); + if (normalized.length > 1) { + LIGATURE_TO_UNICODE.set(normalized, i); + } + } + } + unicode = LIGATURE_TO_UNICODE.get(unicode) || unicode.codePointAt(0); + } + } + if (unicode && !isInPrivateArea(unicode) && !usedGlyphIds.has(glyphId)) { + toUnicodeExtraMap.set(unicode, glyphId); + usedGlyphIds.add(glyphId); + } + newMap.set(fontCharCode, glyphId); + toFontChar.set(charCode, fontCharCode); + } + return { + toFontChar, + charCodeToGlyphId: newMap, + toUnicodeExtraMap, + nextAvailableFontCharCode + }; +} +function getRanges(charCodeToGlyphId, toUnicodeExtraMap, numGlyphs) { + const codes = []; + for (const [charCode, glyphId] of charCodeToGlyphId) { + if (glyphId >= numGlyphs) { + continue; + } + codes.push({ + fontCharCode: charCode, + glyphId + }); + } + if (toUnicodeExtraMap) { + for (const [unicode, glyphId] of toUnicodeExtraMap) { + if (glyphId >= numGlyphs) { + continue; + } + codes.push({ + fontCharCode: unicode, + glyphId + }); + } + } + if (codes.length === 0) { + codes.push({ + fontCharCode: 0, + glyphId: 0 + }); + } + codes.sort((a, b) => 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; + } + } + ranges.push([start, end, codeIndices]); + } + return ranges; +} +function createCmapTable(charCodeToGlyphId, toUnicodeExtraMap, numGlyphs) { + const ranges = getRanges(charCodeToGlyphId, toUnicodeExtraMap, numGlyphs); + const hasNonBmp = ranges.at(-1)[1] > 0xffff; + let i, 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); + const segmentsLength = bmpLength * 2 + trailingRangesCount * 2; + const startCount = new DataBuilder({ + exactLength: segmentsLength + }), + endCount = new DataBuilder({ + exactLength: segmentsLength + }), + idDeltas = new DataBuilder({ + exactLength: segmentsLength + }), + idRangeOffsets = new DataBuilder({ + exactLength: segmentsLength + }), + glyphsIds = new DataBuilder({}); + let bias = 0; + let format4Overflow = false; + for (i = 0; i < bmpLength; i++) { + const [start, end, codes] = ranges[i]; + startCount.setInt16(start); + endCount.setInt16(end); + let contiguous = true; + for (j = 1, jj = codes.length; j < jj; ++j) { + if (codes[j] !== codes[j - 1] + 1) { + contiguous = false; + break; + } + } + if (!contiguous) { + const offset = (segCount - i) * 2 + bias * 2; + bias += end - start + 1; + idDeltas.skip(2); + if (offset > 0xffff) { + format4Overflow = true; + idRangeOffsets.skip(2); + } else { + idRangeOffsets.setInt16(offset); + } + for (j = 0, jj = codes.length; j < jj; ++j) { + glyphsIds.setInt16(codes[j]); + } + } else { + const startCode = codes[0]; + idDeltas.setInt16(startCode - start & 0xffff); + idRangeOffsets.skip(2); + } + } + if (trailingRangesCount > 0) { + endCount.setArray([0xff, 0xff]); + startCount.setArray([0xff, 0xff]); + idDeltas.setArray([0x00, 0x01]); + idRangeOffsets.skip(2); + } + const format314 = new DataBuilder({ + exactLength: 12 + startCount.length + endCount.length + idDeltas.length + idRangeOffsets.length + glyphsIds.length + }); + format314.skip(2); + format314.setInt16(2 * segCount); + format314.setInt16(searchParams.range); + format314.setInt16(searchParams.entry); + format314.setInt16(searchParams.rangeShift); + format314.setArray(endCount.data); + format314.skip(2); + format314.setArray(startCount.data); + format314.setArray(idDeltas.data); + format314.setArray(idRangeOffsets.data); + format314.setArray(glyphsIds.data); + const useFormat4 = !format4Overflow && format314.length + 4 <= 0xffff; + const useFormat12 = hasNonBmp || !useFormat4; + const numTables = (useFormat4 ? 1 : 0) + (useFormat12 ? 1 : 0); + let format31012 = null, + header31012 = null; + if (useFormat12) { + format31012 = new DataBuilder({}); + for (const range of ranges) { + let start = range[0]; + const codes = range[2]; + let code = codes[0]; + for (j = 1, jj = codes.length; j < jj; ++j) { + if (codes[j] !== codes[j - 1] + 1) { + const end = range[0] + j - 1; + format31012.setInt32(start); + format31012.setInt32(end); + format31012.setInt32(code); + start = end + 1; + code = codes[j]; + } + } + format31012.setInt32(start); + format31012.setInt32(range[1]); + format31012.setInt32(code); + } + header31012 = new DataBuilder({ + exactLength: 16 + }); + header31012.setArray([0x00, 0x0c]); + header31012.skip(2); + header31012.setInt32(format31012.length + 16); + header31012.skip(4); + header31012.setInt32(format31012.length / 12); + } + const headerLength = 4 + numTables * 8; + const format4Length = useFormat4 ? 4 + format314.length : 0; + const cmap = new DataBuilder({ + exactLength: headerLength + }); + cmap.skip(2); + cmap.setInt16(numTables); + let tableOffset = headerLength; + if (useFormat4) { + cmap.setArray([0x00, 0x03]); + cmap.setArray([0x00, 0x01]); + cmap.setInt32(tableOffset); + tableOffset += format4Length; + } + if (useFormat12) { + cmap.setArray([0x00, 0x03]); + cmap.setArray([0x00, 0x0a]); + cmap.setInt32(tableOffset); + } + const table = new DataBuilder({ + exactLength: cmap.length + format4Length + (header31012?.length ?? 0) + (format31012?.length ?? 0) + }); + table.setArray(cmap.data); + if (useFormat4) { + table.setArray([0x00, 0x04]); + table.setInt16(format314.length + 4); + table.setArray(format314.data); + } + if (useFormat12) { + table.setArray(header31012.data); + table.setArray(format31012.data); + } + return table.data; +} +function validateOS2Table(os2, file) { + file.pos = (file.start || 0) + os2.offset; + const version = file.getUint16(); + const minLength = [78, 86, 96, 96, 96, 100][version]; + if (minLength === undefined || os2.length < minLength) { + return false; + } + 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, charCodeToGlyphId, 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 (charCodeToGlyphId) { + for (const code of charCodeToGlyphId.keys()) { + 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; + const os2 = new DataBuilder({ + exactLength: 96 + }); + os2.setArray([0x00, 0x03]); + os2.setArray([0x02, 0x24]); + os2.setArray([0x01, 0xf4]); + os2.setArray([0x00, 0x05]); + os2.skip(2); + os2.setArray([0x02, 0x8a]); + os2.setArray([0x02, 0xbb]); + os2.skip(2); + os2.setArray([0x00, 0x8c]); + os2.setArray([0x02, 0x8a]); + os2.setArray([0x02, 0xbb]); + os2.skip(2); + os2.setArray([0x01, 0xdf]); + os2.setArray([0x00, 0x31]); + os2.setArray([0x01, 0x02]); + os2.skip(2); + os2.setArray([0x00, 0x00, 0x06, properties.fixedPitch ? 0x09 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]); + os2.setInt32(ulUnicodeRange1); + os2.setInt32(ulUnicodeRange2); + os2.setInt32(ulUnicodeRange3); + os2.setInt32(ulUnicodeRange4); + os2.setArray([0x2a, 0x32, 0x31, 0x2a]); + os2.setInt16(properties.italicAngle ? 1 : 0); + os2.setInt16(firstCharIndex || properties.firstChar); + os2.setInt16(lastCharIndex || properties.lastChar); + os2.setInt16(typoAscent); + os2.setInt16(typoDescent); + os2.setArray([0x00, 0x64]); + os2.setInt16(winAscent); + os2.setInt16(winDescent); + os2.skip(4 + 4); + os2.setInt16(properties.xHeight); + os2.setInt16(properties.capHeight); + os2.skip(2); + os2.setInt16(firstCharIndex || properties.firstChar); + os2.setArray([0x00, 0x03]); + return os2.data; +} +function createPostTable(properties) { + const post = new DataBuilder({ + exactLength: 32 + }); + post.setArray([0x00, 0x03, 0x00, 0x00]); + post.setInt32(Math.floor(properties.italicAngle * 2 ** 16)); + post.skip(2 + 2); + post.setInt32(properties.fixedPitch ? 1 : 0); + post.skip(4 + 4 + 4 + 4); + return post.data; +} +function createPostscriptName(name) { + return name.replaceAll(/[^\x21-\x7E]|[[\](){}<>/%]/g, "").slice(0, 63); +} +function createNameTable(name, 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 stringsBytes = strings.map(stringToBytes); + const stringsUnicodeBytes = new Array(strings.length); + let i, ii, j, jj, str; + for (i = 0, ii = strings.length; i < ii; i++) { + str = proto[1][i] || strings[i]; + const strUnicode = new DataBuilder({ + exactLength: str.length * 2 + }); + for (j = 0, jj = str.length; j < jj; j++) { + strUnicode.setInt16(str.charCodeAt(j)); + } + stringsUnicodeBytes[i] = strUnicode.data; + } + const namesBytes = [stringsBytes, stringsUnicodeBytes]; + const platformsBytes = [[0x00, 0x01], [0x00, 0x03]]; + const encodingsBytes = [[0x00, 0x00], [0x00, 0x01]]; + const languagesBytes = [[0x00, 0x00], [0x04, 0x09]]; + const nameRecords = []; + let strOffset = 0; + for (i = 0, ii = platformsBytes.length; i < ii; i++) { + const strs = namesBytes[i]; + for (j = 0, jj = strs.length; j < jj; j++) { + str = strs[j]; + const nameRecord = new DataBuilder({ + exactLength: 6 + platformsBytes[i].length + encodingsBytes[i].length + languagesBytes[i].length + }); + nameRecord.setArray(platformsBytes[i]); + nameRecord.setArray(encodingsBytes[i]); + nameRecord.setArray(languagesBytes[i]); + nameRecord.setInt16(j); + nameRecord.setInt16(str.length); + nameRecord.setInt16(strOffset); + nameRecords.push(nameRecord.data); + strOffset += str.length; + } + } + const namesRecordCount = stringsBytes.length * platformsBytes.length; + const nameTable = new DataBuilder({ + exactLength: 6 + Math.sumPrecise(nameRecords.map(arr => arr.length)) + Math.sumPrecise(stringsBytes.map(arr => arr.length)) + Math.sumPrecise(stringsUnicodeBytes.map(arr => arr.length)) + }); + nameTable.skip(2); + nameTable.setInt16(namesRecordCount); + nameTable.setInt16(namesRecordCount * 12 + 6); + for (const arr of nameRecords) { + nameTable.setArray(arr); + } + for (const arr of stringsBytes) { + nameTable.setArray(arr); + } + for (const arr of stringsUnicodeBytes) { + nameTable.setArray(arr); + } + return nameTable.data; +} +class Font { + #charsCache = new Map(); + #glyphCache = new Map(); + charProcOperatorList; + toFontChar = new Map(); + constructor(name, file, properties, evaluatorOptions) { + this.name = name; + this.psName = null; + this.disableFontFace = evaluatorOptions.disableFontFace; + this.fontExtraProperties = evaluatorOptions.fontExtraProperties; + this.loadedName = properties.loadedName; + this.isType3Font = properties.isType3Font; + this.missingFile = false; + this.cssFontInfo = properties.cssFontInfo; + let isSerifFont = !!(properties.flags & FontFlags.Serif); + if (!isSerifFont && !properties.isSimulatedFlags) { + const stdFontMap = getStdFontMap(), + nonStdFontMap = getNonStdFontMap(), + serifFonts = getSerifFonts(); + for (const namePart of name.split("+")) { + let fontName = normalizeFontName(namePart); + fontName = stdFontMap[fontName] || nonStdFontMap[fontName] || fontName; + fontName = fontName.split("-", 1)[0]; + if (serifFonts[fontName]) { + 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"; + } + if (this.systemFontInfo?.guessFallback) { + this.systemFontInfo.guessFallback = false; + this.systemFontInfo.css += `,${this.fallbackName}`; + } + this.differences = properties.differences; + this.widths = properties.widths; + this.defaultWidth = properties.defaultWidth; + this.composite = properties.composite; + this.cMap = properties.cMap; + this.capHeight = properties.capHeight / PDF_GLYPH_SPACE_UNITS; + this.ascent = properties.ascent / PDF_GLYPH_SPACE_UNITS; + this.descent = properties.descent / PDF_GLYPH_SPACE_UNITS; + this.lineHeight = this.ascent - this.descent; + this.fontMatrix = properties.fontMatrix; + this.bbox = properties.bbox; + this.defaultEncoding = properties.defaultEncoding; + this.toUnicode = properties.toUnicode; + if (properties.type === "Type3") { + for (let charCode = 0; charCode < 256; charCode++) { + this.toFontChar.set(charCode, this.differences.get(charCode) || properties.defaultEncoding[charCode]); + } + return; + } + this.cidEncoding = properties.cidEncoding || ""; + this.vertical = !!properties.vertical; + if (this.vertical) { + this.vmetrics = properties.vmetrics; + this.defaultVMetrics = properties.defaultVMetrics; + } + if (!file || file.isEmpty) { + if (file) { + warn('Font file is empty in "' + name + '" (' + this.loadedName + ")"); + } + this.fallbackToSystemFont(properties); + return; + } + [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: ${type}/${subtype}.`); + } + let data; + try { + switch (type) { + case "MMType1": + info("MMType1 font (" + name + "), falling back to Type1."); + case "Type1": + case "CIDFontType0": + 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": + data = this.checkAndRepair(name, file, properties); + adjustWidths(properties); + if (this.isOpenType) { + type = "OpenType"; + } + break; + default: + throw new FormatError(`Font ${type} is not supported`); + } + } catch (e) { + warn(e); + this.fallbackToSystemFont(properties); + return; + } + 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() { + const renderer = FontRendererFactory.create(this, (/* inlined export .SEAC_ANALYSIS_ENABLED */true)); + return util_shadow(this, "renderer", renderer); + } + #getExportData(props) { + const data = Object.create(null); + for (const prop of props) { + const value = this[prop]; + if (value !== undefined) { + data[prop] = value; + } + } + return data; + } + exportData() { + return { + buffer: compileFontInfo(this.#getExportData(EXPORT_DATA_PROPERTIES)), + charProcOperatorList: this.charProcOperatorList, + extra: this.fontExtraProperties ? this.#getExportData(EXPORT_DATA_EXTRA_PROPERTIES) : undefined + }; + } + 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/i.test(fontName); + this.italic = /oblique|italic/i.test(fontName); + this.black = /Black/.test(name); + const isNarrow = /Narrow/.test(name); + this.remeasure = (!isStandardFont || isNarrow) && Object.keys(this.widths).length > 0; + if ((isStandardFont || isMappedToStandardFont) && type === "CIDFontType2" && this.cidEncoding.startsWith("Identity-")) { + const cidToGidMap = properties.cidToGidMap; + const map = new Map(); + if (/Trebuchet/i.test(name)) { + applyStandardFontGlyphMap(map, getGlyphMapForMacOrderedFonts()); + applyStandardFontGlyphMap(map, getSupplementalGlyphMapForTrebuchetMS()); + } else { + applyStandardFontGlyphMap(map, getGlyphMapForStandardFonts()); + if (/Arial-?Black/i.test(name)) { + applyStandardFontGlyphMap(map, getSupplementalGlyphMapForArialBlack()); + } else if (/Calibri/i.test(name)) { + applyStandardFontGlyphMap(map, getSupplementalGlyphMapForCalibri()); + } + } + if (cidToGidMap) { + for (const [charCode, cid] of map) { + if (cidToGidMap.has(cid)) { + map.set(charCode, cidToGidMap.get(cid)); + } + } + if (cidToGidMap.size !== this.toUnicode.size && properties.hasIncludedToUnicodeMap && this.toUnicode instanceof IdentityToUnicodeMap) { + for (const [charCode, cid] of map) { + if (!cidToGidMap.has(cid) && this.toUnicode.has(charCode)) { + map.delete(charCode); + } + } + } + } + if (!(this.toUnicode instanceof IdentityToUnicodeMap)) { + this.toUnicode.forEach((charCode, unicodeCharCode) => { + map.set(charCode, unicodeCharCode); + }); + } + this.toFontChar = map; + this.toUnicode = new ToUnicodeMap(new Map(map)); + } else if (/Symbol/i.test(fontName)) { + const isCidKeyed = this.composite && this.cidEncoding.startsWith("Identity-"); + this.toFontChar = buildToFontChar(isCidKeyed ? getSymbolGlyphIdEncoding() : 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((charCode, unicodeCharCode) => { + map.set(charCode, unicodeCharCode); + }); + } + this.toFontChar = map; + } else { + const glyphsUnicodeMap = getGlyphsUnicode(); + const map = new Map(); + this.toUnicode.forEach((charCode, unicodeCharCode) => { + if (!this.composite) { + const glyphName = this.differences.get(charCode) || this.defaultEncoding[charCode]; + const unicode = getUnicodeForGlyph(glyphName, glyphsUnicodeMap); + if (unicode !== -1) { + unicodeCharCode = unicode; + } + } + map.set(charCode, unicodeCharCode); + }); + if (this.composite && this.toUnicode instanceof IdentityToUnicodeMap) { + if (/Tahoma|Verdana/i.test(name)) { + applyStandardFontGlyphMap(map, getGlyphMapForStandardFonts()); + } + } + this.toFontChar = map; + } + amendFallbackToUnicode(properties); + this.loadedName = fontName.split("-", 1)[0]; + } + checkAndRepair(name, font, properties) { + const VALID_TABLES = ["OS/2", "cmap", "head", "hhea", "hmtx", "maxp", "name", "post", "loca", "glyf", "fpgm", "prep", "cvt ", "CFF "]; + function readTables(file, numTables) { + const tables = Object.create(null); + tables["OS/2"] = null; + tables.cmap = null; + tables.head = null; + tables.hhea = null; + tables.hmtx = null; + tables.maxp = null; + tables.name = null; + tables.post = null; + for (let i = 0; i < numTables; i++) { + const table = readTableEntry(file); + if (!VALID_TABLES.includes(table.tag)) { + continue; + } + if (table.length === 0) { + continue; + } + tables[table.tag] = table; + } + return tables; + } + 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; + } + const view = tag === "CFF " ? null : new DataView(data.buffer, data.byteOffset, data.byteLength); + return { + tag, + checksum, + length, + offset, + data, + view + }; + } + 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); + util_assert(ttcTag === "ttcf", "Must be a TrueType Collection font."); + const majorVersion = ttc.getUint16(); + const minorVersion = ttc.getUint16(); + const numFonts = ttc.getInt32() >>> 0; + const offsetTable = []; + for (let i = 0; i < numFonts; i++) { + offsetTable.push(ttc.getInt32() >>> 0); + } + 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; + } + 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 (const nameArr of nameTable) { + for (const entry of nameArr) { + const nameEntry = entry?.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 (fallbackData) { + warn(`TrueType Collection does not contain "${fontName}" font, ` + `falling back to "${fallbackData.name}" font instead.`); + return { + header: fallbackData.header, + tables: fallbackData.tables + }; + } + throw new FormatError(`TrueType Collection does not contain "${fontName}" font.`); + } + 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 + }; + } + const finalMappings = [], + seenCharCodes = new Set(); + for (const map of mappings) { + const { + charCode + } = map; + if (seenCharCodes.has(charCode)) { + continue; + } + seenCharCodes.add(charCode); + finalMappings.push(map); + } + return { + platformId: potentialTable.platformId, + encodingId: potentialTable.encodingId, + mappings: finalMappings.sort((a, b) => a.charCode - b.charCode), + 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, + view + } = head; + const version = view.getInt32(0); + if (version >> 16 !== 1) { + info("Attempting to fix invalid version in head table: " + version); + view.setInt32(0, 0x00010000); + } + const indexToLocFormat = signedInt16(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 droppedGlyphs = pruneCompositeGlyphCycles(oldGlyfData, locaEntries, numGlyphs); + const missingGlyphs = new Uint8Array(numGlyphs); + let writeOffset = 0; + itemEncode(locaData, 0, writeOffset); + for (i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize) { + const glyphProfile = droppedGlyphs.has(i) ? { + length: 0, + sizeOfInstructions: 0 + } : sanitizeGlyph(oldGlyfData, locaEntries[i].offset, locaEntries[i].endOffset, newGlyfData, writeOffset, hintsValid); + const newLength = glyphProfile.length; + if (newLength === 0) { + missingGlyphs[i] = 1; + } + 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 = []; + while (font.pos < end) { + const strLen = font.getByte(), + str = font.getString(strLen); + customNames.push(str); + } + 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, -2, -999, 0, -2, -2, 0, 0, -2, 0, -2, 0, 0, 0, -2, -1, -1, 1, 1, 0, 0, -1, -1, -1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, 0, -999, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, -999, -999, -999, -999, -999, -1, -1, -2, -2, 0, 0, 0, 0, -1, -1, -999, -2, -2, 0, 0, -1, -2, -2, 0, 0, 0, -1, -1, -1, -2]; + function sanitizeTTProgram(table, ttContext) { + let data = table.data; + let i = 0, + j, + n, + b, + funcId, + pc, + lastEndf = 0, + lastDeff = 0; + const stack = []; + const callstack = []; + const functionsCalled = []; + let tooComplexToFollowFunctions = ttContext.tooComplexToFollowFunctions; + let inFDEF = false, + ifLevel = 0, + inELSE = 0; + for (let ii = data.length; i < ii;) { + const op = data[i++]; + if (op === 0x40) { + n = data[i++]; + if (inFDEF || inELSE) { + i += n; + } else { + for (j = 0; j < n; j++) { + stack.push(data[i++]); + } + } + } else if (op === 0x41) { + n = data[i++]; + 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 & 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; + } + 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 (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 { + pc = callstack.pop(); + if (!pc) { + warn("TT: ENDF bad stack"); + ttContext.hintsValid = false; + return; + } + funcId = functionsCalled.pop(); + data = pc.data; + i = pc.i; + ttContext.functionsStackDeltas[funcId] = stack.length - pc.stackTop; + } + } else if (op === 0x89) { + if (inFDEF || inELSE) { + 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 (!inFDEF && !inELSE) { + let stackDelta = 0; + if (op <= 0x8e) { + stackDelta = TTOpsStackDeltas[op]; + } else if (op >= 0xc0 && op <= 0xdf) { + stackDelta = -1; + } else if (op >= 0xe0) { + stackDelta = -2; + } + if (op >= 0x71 && op <= 0x75) { + n = stack.pop(); + if (!isNaN(n)) { + stackDelta = -n * 2; + } + } + while (stackDelta < 0 && stack.length > 0) { + stack.pop(); + stackDelta++; + } + while (stackDelta > 0) { + stack.push(NaN); + stackDelta--; + } + } + } + ttContext.tooComplexToFollowFunctions = tooComplexToFollowFunctions; + const content = [data]; + if (i > data.length) { + content.push(new Uint8Array(i - data.length)); + } + if (lastDeff > lastEndf) { + warn("TT: complementing a missing function tail"); + content.push(new Uint8Array([0x22, 0x2d])); + } + 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; + } + if (ttContext.functionsUsed[j] && !ttContext.functionsDefined[j]) { + warn("TT: undefined function: " + j); + ttContext.hintsValid = false; + return; + } + } + } + function foldTTTable(table, content) { + if (content.length > 1) { + let newLength = 0; + let j, jj; + for (j = 0, jj = content.length; j < jj; j++) { + newLength += content[j].length; + } + newLength = newLength + 3 & ~3; + const result = new Uint8Array(newLength); + let pos = 0; + for (j = 0, jj = content.length; j < jj; j++) { + result.set(content[j], pos); + pos += content[j].length; + } + table.data = result; + table.length = newLength; + } + } + function sanitizeTTPrograms(fpgm, prep, cvt, maxFunctionDefs) { + const ttContext = { + functionsDefined: [], + functionsUsed: [], + functionsStackDeltas: [], + tooComplexToFollowFunctions: false, + hintsValid: true + }; + if (fpgm) { + sanitizeTTProgram(fpgm, ttContext); + } + if (prep) { + sanitizeTTProgram(prep, ttContext); + } + if (fpgm) { + checkInvalidFunctions(ttContext, maxFunctionDefs); + } + if (cvt && cvt.length & 1) { + const cvtData = new Uint8Array(cvt.length + 1); + cvtData.set(cvt.data); + cvt.data = cvtData; + } + return ttContext.hintsValid; + } + 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); + } + const isTrueType = !tables["CFF "]; + let parsedCff = null; + if (!isTrueType) { + try { + parsedCff = new CFFParser(new Stream(tables["CFF "].data), properties, (/* inlined export .SEAC_ANALYSIS_ENABLED */true)).parse(); + } catch { + warn("Failed to parse font " + properties.loadedName); + } + if (header.version === "OTTO" && (!properties.composite || properties.fontFileN === "FontFile3" && parsedCff?.isCIDFont) || !tables.head || !tables.hhea || !tables.maxp || !tables.post) { + return this.convert(name, new CFFFont(new Stream(tables["CFF "].data), properties), properties); + } + delete tables.glyf; + delete tables.loca; + delete tables.fpgm; + delete tables.prep; + delete tables["cvt "]; + this.isOpenType = true; + } else { + if (!tables.loca) { + throw new FormatError('Required "loca" table is not found'); + } + 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'); + } + let numGlyphsFromCFF; + if (parsedCff) { + try { + parsedCff.duplicateFirstGlyph(); + tables["CFF "].data = new CFFCompiler(parsedCff).compile(); + numGlyphsFromCFF = parsedCff.charStringCount; + } catch { + warn("Failed to compile font " + properties.loadedName); + } + } + font.pos = (font.start || 0) + tables.maxp.offset; + let version = font.getInt32(); + const numGlyphs = numGlyphsFromCFF ?? font.getUint16(); + if (version === 0x00005000 && tables.maxp.length !== 6) { + tables.maxp.data = tables.maxp.data.subarray(0, 6); + tables.maxp.length = 6; + } + 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); + } + let isGlyphLocationsLong = int16(tables.head.data[50], tables.head.data[51]); + if (tables.loca) { + const locaLength = isGlyphLocationsLong ? (numGlyphs + 1) * 4 : (numGlyphs + 1) * 2; + if (tables.loca.length !== locaLength) { + warn("Incorrect 'loca' table length -- attempting to fix it."); + const sortedTables = Object.values(tables).filter(Boolean).sort((a, b) => a.offset - b.offset); + const locaIndex = sortedTables.indexOf(tables.loca); + const nextTable = sortedTables[locaIndex + 1] || null; + if (nextTable && tables.loca.offset + locaLength < nextTable.offset) { + const previousPos = font.pos; + font.pos = font.start || 0; + font.skip(tables.loca.offset); + tables.loca.data = font.getBytes(locaLength); + tables.loca.length = locaLength; + font.pos = previousPos; + } + } + } + if (properties.scaleFactors?.length === numGlyphs && isTrueType) { + const { + scaleFactors + } = properties; + 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; + isGlyphLocationsLong = tables.head.data[51] = isLocationLong ? 1 : 0; + } + const metrics = tables.hmtx.data; + for (let i = 0; i < numGlyphs; i++) { + const j = 4 * i; + const advanceWidth = Math.round(scaleFactors[i] * int16(metrics[j], metrics[j + 1])); + metrics[j] = advanceWidth >> 8 & 0xff; + metrics[j + 1] = advanceWidth & 0xff; + const lsb = Math.round(scaleFactors[i] * signedInt16(metrics[j + 2], metrics[j + 3])); + writeSignedInt16(metrics, j + 2, lsb); + } + } + let numGlyphsOut = numGlyphs + 1; + let dupFirstEntry = true; + if (numGlyphsOut > 0xffff) { + dupFirstEntry = false; + numGlyphsOut = numGlyphs; + warn("Not enough space in glyfs to duplicate first glyph."); + } + 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(); + } else if (isTrueType && version === 0x00005000) { + const newMaxp = new Uint8Array(32); + writeUint32(newMaxp, 0, 0x00010000); + newMaxp[4] = numGlyphs >> 8 & 0xff; + newMaxp[5] = numGlyphs & 0xff; + newMaxp.fill(0xff, 6, 14); + newMaxp[15] = 2; + newMaxp[28] = 0xff; + newMaxp[29] = 0xff; + newMaxp[31] = 0x10; + tables.maxp.data = newMaxp; + tables.maxp.length = 32; + version = 0x00010000; + } + 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 = null; + if (isTrueType) { + 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 = 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; + } + if (tables.post) { + readPostScriptTable(tables.post, properties, numGlyphs); + } + tables.post = { + tag: "post", + data: createPostTable(properties) + }; + const charCodeToGlyphId = new Map(); + function hasGlyph(glyphId) { + return !missingGlyphs?.[glyphId]; + } + if (properties.composite) { + const { + cidToGidMap, + cMap + } = properties; + const isCidToGidMapEmpty = !cidToGidMap?.size; + cMap.forEach((charCode, cid) => { + if (typeof cid === "string") { + cid = convertCidString(charCode, cid, true); + } + if (cid > 0xffff) { + throw new FormatError("Max size of CID is 65,535"); + } + const glyphId = isCidToGidMapEmpty ? cid : cidToGidMap.get(cid) ?? -1; + if (glyphId >= 0 && glyphId < numGlyphs && hasGlyph(glyphId)) { + charCodeToGlyphId.set(charCode, glyphId); + } + }); + } else { + const cmapTable = readCmapTable(tables.cmap, font, this.isSymbolicFont, properties.hasEncoding); + const cmapPlatformId = cmapTable.platformId; + const cmapEncodingId = cmapTable.encodingId; + const cmapMappings = cmapTable.mappings; + let baseEncoding = [], + forcePostTable = false; + if (properties.hasEncoding && (properties.baseEncodingName === "MacRomanEncoding" || properties.baseEncodingName === "WinAnsiEncoding")) { + 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.has(charCode)) { + glyphName = this.differences.get(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 (!properties.glyphNames && properties.hasIncludedToUnicodeMap && !(this.toUnicode instanceof IdentityToUnicodeMap)) { + const unicode = this.toUnicode.get(charCode); + if (unicode) { + unicodeOrCharCode = unicode.codePointAt(0); + } + } + if (unicodeOrCharCode === undefined) { + continue; + } + } + for (const mapping of cmapMappings) { + if (mapping.charCode !== unicodeOrCharCode) { + continue; + } + charCodeToGlyphId.set(charCode, mapping.glyphId); + break; + } + } + } else if (cmapPlatformId === 0) { + for (const mapping of cmapMappings) { + charCodeToGlyphId.set(mapping.charCode, mapping.glyphId); + } + 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.set(charCode, mapping.glyphId); + } + } else { + for (const mapping of cmapMappings) { + charCodeToGlyphId.set(mapping.charCode, mapping.glyphId); + } + } + if (properties.glyphNames && (baseEncoding.length || this.differences.size)) { + for (let i = 0; i < 256; ++i) { + if (!forcePostTable && charCodeToGlyphId.has(i)) { + continue; + } + const glyphName = this.differences.get(i) || baseEncoding[i]; + if (!glyphName) { + continue; + } + const glyphId = properties.glyphNames.indexOf(glyphName); + if (glyphId > 0 && hasGlyph(glyphId)) { + charCodeToGlyphId.set(i, glyphId); + } + } + } + if (!properties.isInternalFont && !charCodeToGlyphId.has(0) && hasGlyph(0)) { + charCodeToGlyphId.set(0, 0); + } + } + if (!charCodeToGlyphId.size) { + charCodeToGlyphId.set(0, 0); + } + const glyphZeroId = dupFirstEntry ? numGlyphsOut - 1 : 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 (!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); + } + const glyphZeroId = font instanceof CFFFont ? font.numGlyphs - 1 : 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, + seacs + } = font; + function getCharCodes(charCodeToGlyphId, glyphId) { + let charCodes = null; + for (const [charCode, gid] of charCodeToGlyphId) { + if (glyphId === gid) { + (charCodes ??= []).push(charCode); + } + } + return charCodes; + } + function createCharCode(charCodeToGlyphId, glyphId) { + for (const [charCode, gid] of charCodeToGlyphId) { + if (glyphId === gid) { + return charCode; + } + } + newMapping.charCodeToGlyphId.set(newMapping.nextAvailableFontCharCode, glyphId); + return newMapping.nextAvailableFontCharCode++; + } + if (newMapping && (/* inlined export .SEAC_ANALYSIS_ENABLED */true) && seacs?.size) { + const matrix = properties.fontMatrix || FONT_IDENTITY_MATRIX; + const charset = font.getCharset(); + const seacMap = new Map(); + for (const [glyphId, seac] of seacs) { + 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; + const baseFontCharCode = createCharCode(charCodeToGlyphId, baseGlyphId); + const accentFontCharCode = createCharCode(charCodeToGlyphId, accentGlyphId); + seacMap.set(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", function fontTableHead() { + const dateArr = [0x00, 0x00, 0x00, 0x00, 0x9e, 0x0b, 0x7e, 0x27]; + const head = new DataBuilder({ + exactLength: 54 + }); + head.setArray([0x00, 0x01, 0x00, 0x00]); + head.setArray([0x00, 0x00, 0x10, 0x00]); + head.skip(4); + head.setArray([0x5f, 0x0f, 0x3c, 0xf5]); + head.skip(2); + head.setSafeInt16(unitsPerEm); + head.setArray(dateArr); + head.setArray(dateArr); + head.skip(2); + head.setSafeInt16(properties.descent); + head.setArray([0x0f, 0xff]); + head.setSafeInt16(properties.ascent); + head.setInt16(properties.italicAngle ? 2 : 0); + head.setArray([0x00, 0x11]); + head.skip(2 + 2 + 2); + return head.data; + }()); + builder.addTable("hhea", function fontTableHhea() { + const hhea = new DataBuilder({ + exactLength: 36 + }); + hhea.setArray([0x00, 0x01, 0x00, 0x00]); + hhea.setSafeInt16(properties.ascent); + hhea.setSafeInt16(properties.descent); + hhea.skip(2); + hhea.setArray([0xff, 0xff]); + hhea.skip(2 + 2 + 2); + hhea.setSafeInt16(properties.capHeight); + hhea.setSafeInt16(Math.tan(properties.italicAngle) * properties.xHeight); + hhea.skip(2 + 2 + 2 + 2 + 2 + 2); + hhea.setInt16(numGlyphs); + return hhea.data; + }()); + builder.addTable("hmtx", function fontTableHmtx() { + const charstrings = font.charstrings; + const cffWidths = font.cff?.widths ?? null; + const hmtx = new DataBuilder({ + exactLength: numGlyphs * 4 + }); + hmtx.skip(4); + for (let i = 1; i < numGlyphs; i++) { + let width = 0; + if (charstrings) { + width = charstrings[i - 1].width || 0; + } else if (cffWidths) { + width = Math.ceil(cffWidths[i] || 0); + } + hmtx.setInt16(width); + hmtx.skip(2); + } + return hmtx.data; + }()); + builder.addTable("maxp", function fontTableMaxp() { + const maxp = new DataBuilder({ + exactLength: 6 + }); + maxp.setArray([0x00, 0x00, 0x50, 0x00]); + maxp.setInt16(numGlyphs); + return maxp.data; + }()); + builder.addTable("name", createNameTable(fontName)); + builder.addTable("post", createPostTable(properties)); + return builder.toArray(); + } + 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; + } + } + return util_shadow(this, "_spaceWidth", width || this.defaultWidth); + } + _charToGlyph(charcode, isSpace = false) { + let glyph = this.#glyphCache.get(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; + } + let vmetric = this.vmetrics?.[widthCode]; + if (!vmetric && this.defaultVMetrics) { + const [w1y,, vy] = this.defaultVMetrics; + vmetric = [w1y, width * 0.5, vy]; + } + let unicode = this.toUnicode.get(charcode) || charcode; + if (typeof unicode === "number") { + unicode = String.fromCharCode(unicode); + } + let isInFont = this.toFontChar.has(charcode); + fontCharCode = this.toFontChar.get(charcode) || charcode; + if (this.missingFile) { + const glyphName = this.differences.get(charcode) || this.defaultEncoding[charcode]; + if ((glyphName === ".notdef" || glyphName === "") && this.type === "Type1") { + fontCharCode = 0x20; + if (glyphName === "") { + width ||= this._spaceWidth; + if (!this.toUnicode.has(charcode)) { + unicode = String.fromCharCode(fontCharCode); + } + } + } + fontCharCode = mapSpecialUnicodeValues(fontCharCode); + } + if (this.isType3Font) { + operatorListId = fontCharCode; + } + let accent = null; + const seac = this.seacMap?.get(charcode); + if (seac) { + isInFont = true; + fontCharCode = seac.baseFontCharCode; + accent = { + fontChar: String.fromCodePoint(seac.accentFontCharCode), + offset: seac.accentOffset + }; + } + let fontChar = ""; + if (typeof fontCharCode === "number") { + if (fontCharCode <= 0x10ffff) { + fontChar = String.fromCodePoint(fontCharCode); + } else { + 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); + this.#glyphCache.set(charcode, glyph); + return glyph; + } + charsToGlyphs(chars) { + let glyphs = this.#charsCache.get(chars); + if (glyphs) { + return glyphs; + } + glyphs = []; + if (this.cMap) { + const c = Object.create(null), + ii = chars.length; + let i = 0; + while (i < ii) { + this.cMap.readCharCode(chars, i, c); + const { + charcode, + length + } = c; + i += length; + const glyph = this._charToGlyph(charcode, length === 1 && chars.charCodeAt(i - 1) === 0x20); + glyphs.push(glyph); + } + } else { + for (let i = 0, ii = chars.length; i < ii; ++i) { + const charcode = chars.charCodeAt(i); + const glyph = this._charToGlyph(charcode, charcode === 0x20); + glyphs.push(glyph); + } + } + this.#charsCache.set(chars, glyphs); + return glyphs; + } + getCharPositions(chars) { + const positions = []; + if (this.cMap) { + 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, ii = chars.length; i < ii; ++i) { + positions.push([i, i + 1]); + } + } + return positions; + } + get glyphCacheValues() { + return this.#glyphCache.values(); + } + 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 > 0xffff) { + i++; + } + if (this.toUnicode) { + const charCode = getCharCode(unicode); + if (charCode !== -1) { + if (hasCurrentBufErrors()) { + 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)); + } + continue; + } + } + if (!hasCurrentBufErrors()) { + buffers.push(currentBuf.join("")); + currentBuf.length = 0; + } + currentBuf.push(String.fromCodePoint(unicode)); + } + buffers.push(currentBuf.join("")); + return buffers; + } +} +class ErrorFont { + constructor(error) { + this.error = error; + this.loadedName = "g_font_error"; + this.missingFile = true; + } + charsToGlyphs() { + return []; + } + encodeString(chars) { + return [chars]; + } + exportData() { + return { + error: this.error + }; + } +} + +;// ./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]; +} +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/postscript/lexer.js +const TOKEN = { + number: 0, + lbrace: 1, + rbrace: 2, + true: 3, + false: 4, + add: 5, + sub: 6, + mul: 7, + div: 8, + idiv: 9, + mod: 10, + exp: 11, + eq: 12, + ne: 13, + gt: 14, + ge: 15, + lt: 16, + le: 17, + and: 18, + or: 19, + xor: 20, + bitshift: 21, + abs: 22, + neg: 23, + ceiling: 24, + floor: 25, + round: 26, + truncate: 27, + not: 28, + sqrt: 29, + sin: 30, + cos: 31, + ln: 32, + log: 33, + atan: 34, + cvi: 35, + cvr: 36, + dup: 37, + exch: 38, + pop: 39, + copy: 40, + index: 41, + roll: 42, + if: 43, + ifelse: 44, + eof: 45, + min: 46, + max: 47 +}; +class Token { + constructor(id, value = null) { + this.id = id; + this.value = value; + } +} +class lexer_Lexer { + static #singletons = null; + static #operatorSingletons = null; + static #initSingletons() { + const singletons = Object.create(null); + const operatorSingletons = Object.create(null); + for (const [name, id] of Object.entries(TOKEN)) { + if (name === "number") { + continue; + } + const isOperator = id >= TOKEN.true && id <= TOKEN.ifelse; + const token = new Token(id, isOperator ? name : null); + singletons[name] = token; + if (isOperator) { + operatorSingletons[name] = token; + } + } + this.#singletons = singletons; + this.#operatorSingletons = operatorSingletons; + } + constructor(data) { + if (!lexer_Lexer.#singletons) { + lexer_Lexer.#initSingletons(); + } + this.data = data; + this.pos = 0; + this.len = data.length; + this._numberPattern = /[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?/iy; + this._identifierPattern = /[a-z]+/y; + } + _skipComment() { + const lf = this.data.indexOf("\n", this.pos); + const cr = this.data.indexOf("\r", this.pos); + const eol = Math.min(lf < 0 ? this.len : lf, cr < 0 ? this.len : cr); + this.pos = Math.min(eol + 1, this.len); + } + _getNumber() { + this._numberPattern.lastIndex = this.pos; + const match = this._numberPattern.exec(this.data); + if (!match) { + return new Token(TOKEN.number, 0); + } + const number = parseFloat(match[0]); + if (!Number.isFinite(number)) { + return new Token(TOKEN.number, 0); + } + this.pos = this._numberPattern.lastIndex; + return new Token(TOKEN.number, number); + } + _getOperator() { + this._identifierPattern.lastIndex = this.pos; + const match = this._identifierPattern.exec(this.data); + if (!match) { + return new Token(TOKEN.number, 0); + } + this.pos = this._identifierPattern.lastIndex; + const op = match[0]; + const token = lexer_Lexer.#operatorSingletons[op]; + return token ?? new Token(TOKEN.number, 0); + } + next() { + while (this.pos < this.len) { + const ch = this.data.charCodeAt(this.pos++); + switch (ch) { + case 0x00: + case 0x09: + case 0x0a: + case 0x0c: + case 0x0d: + case 0x20: + break; + case 0x25: + this._skipComment(); + break; + case 0x7b: + return lexer_Lexer.#singletons.lbrace; + case 0x7d: + return lexer_Lexer.#singletons.rbrace; + case 0x2b: + case 0x2d: + this.pos--; + return this._getNumber(); + case 0x2e: + this.pos--; + return this._getNumber(); + default: + if (ch >= 0x30 && ch <= 0x39) { + this.pos--; + return this._getNumber(); + } + if (ch >= 0x61 && ch <= 0x7a) { + this.pos--; + return this._getOperator(); + } + return new Token(TOKEN.number, 0); + } + } + return lexer_Lexer.#singletons.eof; + } +} + +;// ./src/core/postscript/ast.js + + + + + + + + + + + + +const PS_VALUE_TYPE = { + numeric: 0, + boolean: 1, + unknown: 2 +}; +const PS_NODE = { + program: 0, + block: 1, + number: 2, + operator: 3, + if: 4, + ifelse: 5, + arg: 6, + const: 7, + unary: 8, + binary: 9, + ternary: 10 +}; +class PsNode { + constructor(type) { + this.type = type; + } +} +class PsProgram extends PsNode { + constructor(body) { + super(PS_NODE.program); + this.body = body; + } +} +class PsBlock extends PsNode { + constructor(instructions) { + super(PS_NODE.block); + this.instructions = instructions; + } +} +class PsNumber extends PsNode { + constructor(value) { + super(PS_NODE.number); + this.value = value; + } +} +class PsOperator extends PsNode { + constructor(op) { + super(PS_NODE.operator); + this.op = op; + } +} +class PsIf extends PsNode { + constructor(then) { + super(PS_NODE.if); + this.then = then; + } +} +class PsIfElse extends PsNode { + constructor(then, otherwise) { + super(PS_NODE.ifelse); + this.then = then; + this.otherwise = otherwise; + } +} +class PsArgNode extends PsNode { + constructor(index) { + super(PS_NODE.arg); + this.index = index; + this.valueType = PS_VALUE_TYPE.numeric; + } +} +class PsConstNode extends PsNode { + constructor(value) { + super(PS_NODE.const); + this.value = value; + this.valueType = typeof value === "boolean" ? PS_VALUE_TYPE.boolean : PS_VALUE_TYPE.numeric; + } +} +class PsUnaryNode extends PsNode { + constructor(op, operand, valueType = PS_VALUE_TYPE.unknown) { + super(PS_NODE.unary); + this.op = op; + this.operand = operand; + this.valueType = valueType; + } +} +class PsBinaryNode extends PsNode { + constructor(op, first, second, valueType = PS_VALUE_TYPE.unknown) { + super(PS_NODE.binary); + this.op = op; + this.first = first; + this.second = second; + this.valueType = valueType; + } +} +class PsTernaryNode extends PsNode { + constructor(cond, then, otherwise, valueType = PS_VALUE_TYPE.unknown) { + super(PS_NODE.ternary); + this.cond = cond; + this.then = then; + this.otherwise = otherwise; + this.valueType = valueType; + } +} +class ast_Parser { + constructor(lexer) { + this.lexer = lexer; + this._token = null; + } + static _isRegularOperator(id) { + return id >= TOKEN.true && id < TOKEN.if; + } + _advance() { + this._token = this.lexer.next(); + } + _expect(id) { + if (this._token.id !== id) { + throw new FormatError(`PostScript function: expected token id ${id}, got ${this._token.id}.`); + } + const tok = this._token; + this._advance(); + return tok; + } + parse() { + this._advance(); + this._expect(TOKEN.lbrace); + const block = this._parseBlock(); + this._expect(TOKEN.rbrace); + if (this._token.id !== TOKEN.eof) { + warn("PostScript function: unexpected content after closing brace."); + } + return new PsProgram(block); + } + _parseBlock() { + const instructions = []; + while (true) { + const tok = this._token; + switch (tok.id) { + case TOKEN.number: + instructions.push(new PsNumber(tok.value)); + this._advance(); + break; + case TOKEN.lbrace: + { + this._advance(); + const thenBlock = this._parseBlock(); + this._expect(TOKEN.rbrace); + if (this._token.id === TOKEN.if) { + this._advance(); + instructions.push(new PsIf(thenBlock)); + } else if (this._token.id === TOKEN.lbrace) { + this._advance(); + const elseBlock = this._parseBlock(); + this._expect(TOKEN.rbrace); + this._expect(TOKEN.ifelse); + instructions.push(new PsIfElse(thenBlock, elseBlock)); + } else { + throw new FormatError("PostScript function: a procedure block must be followed by 'if' or '{…} ifelse'."); + } + break; + } + case TOKEN.rbrace: + case TOKEN.eof: + return new PsBlock(instructions); + case TOKEN.if: + case TOKEN.ifelse: + throw new FormatError(`PostScript function: unexpected '${tok.value}' operator.`); + default: + if (ast_Parser._isRegularOperator(tok.id)) { + instructions.push(new PsOperator(tok.id)); + this._advance(); + break; + } + throw new FormatError(`PostScript function: unexpected token id ${tok.id}.`); + } + } + } +} +function parsePostScriptFunction(source) { + return new ast_Parser(new lexer_Lexer(source)).parse(); +} +function _nodesEqual(a, b) { + if (a === b) { + return true; + } + if (a.type !== b.type) { + return false; + } + switch (a.type) { + case PS_NODE.arg: + return a.index === b.index; + case PS_NODE.const: + return a.value === b.value; + case PS_NODE.unary: + return a.op === b.op && _nodesEqual(a.operand, b.operand); + case PS_NODE.binary: + return a.op === b.op && _nodesEqual(a.first, b.first) && _nodesEqual(a.second, b.second); + case PS_NODE.ternary: + return _nodesEqual(a.cond, b.cond) && _nodesEqual(a.then, b.then) && _nodesEqual(a.otherwise, b.otherwise); + default: + return false; + } +} +function _evalBinaryConst(op, a, b) { + switch (op) { + case TOKEN.add: + return a + b; + case TOKEN.sub: + return a - b; + case TOKEN.mul: + return a * b; + case TOKEN.div: + return b !== 0 ? a / b : 0; + case TOKEN.idiv: + return b !== 0 ? Math.trunc(a / b) : 0; + case TOKEN.mod: + return b !== 0 ? a - Math.trunc(a / b) * b : 0; + case TOKEN.exp: + { + const r = a ** b; + return Number.isFinite(r) ? r : undefined; + } + case TOKEN.atan: + { + let deg = Math.atan2(a, b) * (180 / Math.PI); + if (deg < 0) { + deg += 360; + } + return deg; + } + case TOKEN.eq: + return a === b; + case TOKEN.ne: + return a !== b; + case TOKEN.gt: + return a > b; + case TOKEN.ge: + return a >= b; + case TOKEN.lt: + return a < b; + case TOKEN.le: + return a <= b; + case TOKEN.and: + return typeof a === "boolean" ? a && b : a & b | 0; + case TOKEN.or: + return typeof a === "boolean" ? a || b : a | b | 0; + case TOKEN.xor: + return typeof a === "boolean" ? a !== b : a ^ b | 0; + case TOKEN.bitshift: + return b >= 0 ? a << b | 0 : a >> -b | 0; + case TOKEN.min: + return Math.min(a, b); + case TOKEN.max: + return Math.max(a, b); + default: + return undefined; + } +} +function _evalUnaryConst(op, v) { + switch (op) { + case TOKEN.abs: + return Math.abs(v); + case TOKEN.neg: + return -v; + case TOKEN.ceiling: + return Math.ceil(v); + case TOKEN.floor: + return Math.floor(v); + case TOKEN.round: + return Math.round(v); + case TOKEN.truncate: + return Math.trunc(v); + case TOKEN.sqrt: + { + const r = Math.sqrt(v); + return Number.isFinite(r) ? r : undefined; + } + case TOKEN.sin: + return Math.sin(v % 360 * Math.PI / 180); + case TOKEN.cos: + return Math.cos(v % 360 * Math.PI / 180); + case TOKEN.ln: + { + const r = Math.log(v); + return Number.isFinite(r) ? r : undefined; + } + case TOKEN.log: + { + const r = Math.log10(v); + return Number.isFinite(r) ? r : undefined; + } + case TOKEN.cvi: + return Math.trunc(v); + case TOKEN.cvr: + return v; + case TOKEN.not: + return typeof v === "boolean" ? !v : ~v; + default: + return undefined; + } +} +const MAX_STACK_SIZE = 100; +function _unaryValueType(op, operandType) { + return op === TOKEN.not ? operandType : PS_VALUE_TYPE.numeric; +} +function _binaryValueType(op, firstType, secondType) { + switch (op) { + case TOKEN.eq: + case TOKEN.ne: + case TOKEN.gt: + case TOKEN.ge: + case TOKEN.lt: + case TOKEN.le: + return PS_VALUE_TYPE.boolean; + case TOKEN.and: + case TOKEN.or: + case TOKEN.xor: + return firstType === secondType && firstType !== PS_VALUE_TYPE.unknown ? firstType : PS_VALUE_TYPE.unknown; + default: + return PS_VALUE_TYPE.numeric; + } +} +class PSStackToTree { + static #binaryOps = null; + static #unaryOps = null; + static #idempotentUnary = null; + static #negatedComparison = null; + static #init() { + this.#binaryOps = new Set([TOKEN.add, TOKEN.sub, TOKEN.mul, TOKEN.div, TOKEN.idiv, TOKEN.mod, TOKEN.exp, TOKEN.atan, TOKEN.eq, TOKEN.ne, TOKEN.gt, TOKEN.ge, TOKEN.lt, TOKEN.le, TOKEN.and, TOKEN.or, TOKEN.xor, TOKEN.bitshift]); + this.#unaryOps = new Set([TOKEN.abs, TOKEN.neg, TOKEN.ceiling, TOKEN.floor, TOKEN.round, TOKEN.truncate, TOKEN.sqrt, TOKEN.sin, TOKEN.cos, TOKEN.ln, TOKEN.log, TOKEN.cvi, TOKEN.cvr, TOKEN.not]); + this.#idempotentUnary = new Set([TOKEN.abs, TOKEN.ceiling, TOKEN.cvi, TOKEN.cvr, TOKEN.floor, TOKEN.round, TOKEN.truncate]); + this.#negatedComparison = new Map([[TOKEN.eq, TOKEN.ne], [TOKEN.ne, TOKEN.eq], [TOKEN.lt, TOKEN.ge], [TOKEN.le, TOKEN.gt], [TOKEN.gt, TOKEN.le], [TOKEN.ge, TOKEN.lt]]); + } + evaluate(program, numInputs) { + if (!PSStackToTree.#binaryOps) { + PSStackToTree.#init(); + } + this._failed = false; + if (numInputs > MAX_STACK_SIZE) { + return null; + } + const stack = []; + for (let i = 0; i < numInputs; i++) { + stack.push(new PsArgNode(i)); + } + this._evalBlock(program.body, stack); + if (this._failed) { + return null; + } + PSStackToTree.#markShared(stack); + return stack; + } + static #markShared(outputs) { + const refCount = new Map(); + const visit = node => { + if (!node || node.type === PS_NODE.arg || node.type === PS_NODE.const) { + return; + } + const prev = refCount.get(node) ?? 0; + refCount.set(node, prev + 1); + if (prev > 0) { + return; + } + switch (node.type) { + case PS_NODE.unary: + visit(node.operand); + break; + case PS_NODE.binary: + visit(node.first); + visit(node.second); + break; + case PS_NODE.ternary: + visit(node.cond); + visit(node.then); + visit(node.otherwise); + break; + } + }; + for (const output of outputs) { + visit(output); + } + for (const [node, count] of refCount) { + if (count > 1) { + node.shared = true; + node.sharedCount = count; + } + } + } + _evalBlock(block, stack) { + this._evalBlockFrom(block.instructions, 0, stack); + } + _evalBlockFrom(instructions, startIdx, stack) { + for (let idx = startIdx; idx < instructions.length; idx++) { + if (this._failed) { + break; + } + const instr = instructions[idx]; + switch (instr.type) { + case PS_NODE.number: + stack.push(new PsConstNode(instr.value)); + if (stack.length > MAX_STACK_SIZE) { + this._failed = true; + } + break; + case PS_NODE.operator: + this._evalOp(instr.op, stack); + break; + case PS_NODE.if: + { + if (stack.length < 1) { + this._failed = true; + break; + } + const cond = stack.pop(); + const saved = stack.slice(); + this._evalBlock(instr.then, stack); + if (this._failed) { + break; + } + if (stack.length === saved.length) { + for (let i = 0; i < stack.length; i++) { + if (stack[i] !== saved[i]) { + stack[i] = this._makeTernary(cond, stack[i], saved[i]); + } + } + } else if (stack.length > saved.length) { + if (cond.type === PS_NODE.const) { + if (!cond.value) { + stack.length = 0; + stack.push(...saved); + } + break; + } + const trueStack = stack.slice(); + this._evalBlockFrom(instructions, idx + 1, trueStack); + if (this._failed) { + break; + } + const falseStack = saved; + this._evalBlockFrom(instructions, idx + 1, falseStack); + if (this._failed) { + break; + } + if (trueStack.length !== falseStack.length) { + const zero = new PsConstNode(0); + while (trueStack.length < falseStack.length) { + trueStack.push(zero); + } + while (falseStack.length < trueStack.length) { + falseStack.push(zero); + } + } + stack.length = 0; + for (let i = 0; i < trueStack.length; i++) { + stack.push(this._makeTernary(cond, trueStack[i], falseStack[i])); + } + return; + } else { + this._failed = true; + } + break; + } + case PS_NODE.ifelse: + { + if (stack.length < 1) { + this._failed = true; + break; + } + const cond = stack.pop(); + const snapshot = stack.slice(); + const thenStack = snapshot.slice(); + this._evalBlock(instr.then, thenStack); + if (this._failed) { + break; + } + const elseStack = snapshot.slice(); + this._evalBlock(instr.otherwise, elseStack); + if (this._failed) { + break; + } + if (thenStack.length !== elseStack.length) { + const zero = new PsConstNode(0); + while (thenStack.length < elseStack.length) { + thenStack.push(zero); + } + while (elseStack.length < thenStack.length) { + elseStack.push(zero); + } + } + stack.length = 0; + for (let i = 0; i < thenStack.length; i++) { + stack.push(this._makeTernary(cond, thenStack[i], elseStack[i])); + } + break; + } + } + } + } + _evalOp(op, stack) { + if (PSStackToTree.#binaryOps.has(op)) { + if (stack.length < 2) { + this._failed = true; + return; + } + const first = stack.pop(); + const second = stack.pop(); + stack.push(this._makeBinary(op, first, second)); + return; + } + if (PSStackToTree.#unaryOps.has(op)) { + if (stack.length < 1) { + this._failed = true; + return; + } + stack.push(this._makeUnary(op, stack.pop())); + return; + } + switch (op) { + case TOKEN.true: + stack.push(new PsConstNode(true)); + if (stack.length > MAX_STACK_SIZE) { + this._failed = true; + } + break; + case TOKEN.false: + stack.push(new PsConstNode(false)); + if (stack.length > MAX_STACK_SIZE) { + this._failed = true; + } + break; + case TOKEN.dup: + if (stack.length < 1) { + this._failed = true; + break; + } + stack.push(stack.at(-1)); + if (stack.length > MAX_STACK_SIZE) { + this._failed = true; + } + break; + case TOKEN.exch: + { + if (stack.length < 2) { + this._failed = true; + break; + } + const a = stack.pop(); + const b = stack.pop(); + stack.push(a, b); + break; + } + case TOKEN.pop: + if (stack.length < 1) { + this._failed = true; + break; + } + stack.pop(); + break; + case TOKEN.copy: + { + if (stack.length < 1) { + this._failed = true; + break; + } + const nNode = stack.pop(); + if (nNode.type === PS_NODE.const) { + const n = nNode.value | 0; + if (n === 0) {} else if (n < 0 || n > stack.length) { + this._failed = true; + } else { + stack.push(...stack.slice(-n)); + if (stack.length > MAX_STACK_SIZE) { + this._failed = true; + } + } + } else { + this._failed = true; + } + break; + } + case TOKEN.index: + { + if (stack.length < 1) { + this._failed = true; + break; + } + const nNode = stack.pop(); + if (nNode.type === PS_NODE.const) { + const n = nNode.value | 0; + if (n < 0 || n >= stack.length) { + this._failed = true; + } else { + stack.push(stack.at(-n - 1)); + } + } else { + this._failed = true; + } + break; + } + case TOKEN.roll: + { + if (stack.length < 2) { + this._failed = true; + break; + } + const jNode = stack.pop(); + const nNode = stack.pop(); + if (nNode.type === PS_NODE.const && jNode.type === PS_NODE.const) { + const n = nNode.value | 0; + if (n === 0) {} else if (n < 0 || n > stack.length) { + this._failed = true; + } else { + const j = ((jNode.value | 0) % n + n) % n; + if (j > 0) { + const slice = stack.splice(-n, n); + stack.push(...slice.slice(n - j), ...slice.slice(0, n - j)); + } + } + } else { + this._failed = true; + } + break; + } + default: + this._failed = true; + break; + } + } + _makeBinary(op, first, second) { + if (first.type === PS_NODE.const && second.type === PS_NODE.const) { + const v = _evalBinaryConst(op, second.value, first.value); + if (v !== undefined) { + return new PsConstNode(v); + } + } + if (_nodesEqual(first, second)) { + switch (op) { + case TOKEN.sub: + return new PsConstNode(0); + case TOKEN.xor: + return new PsConstNode(first.valueType === PS_VALUE_TYPE.boolean ? false : 0); + case TOKEN.and: + case TOKEN.or: + return first; + case TOKEN.min: + case TOKEN.max: + return first; + case TOKEN.eq: + case TOKEN.ge: + case TOKEN.le: + return new PsConstNode(true); + case TOKEN.ne: + case TOKEN.gt: + case TOKEN.lt: + return new PsConstNode(false); + } + } + if (first.type === PS_NODE.const) { + const b = first.value; + switch (op) { + case TOKEN.add: + if (b === 0) { + return second; + } + break; + case TOKEN.sub: + if (b === 0) { + return second; + } + break; + case TOKEN.mul: + if (b === 1) { + return second; + } + if (b === 0) { + return first; + } + if (b === -1) { + return this._makeUnary(TOKEN.neg, second); + } + break; + case TOKEN.div: + if (b !== 0) { + return this._makeBinary(TOKEN.mul, new PsConstNode(1 / b), second); + } + break; + case TOKEN.idiv: + if (b === 1) { + return second; + } + break; + case TOKEN.exp: + if (b === 1) { + return second; + } + if (b === -1) { + return this._makeBinary(TOKEN.div, second, new PsConstNode(1)); + } + if (b === 0.5) { + return this._makeUnary(TOKEN.sqrt, second); + } + if (b === 0.25) { + const sqrtOnce = this._makeUnary(TOKEN.sqrt, second); + return this._makeUnary(TOKEN.sqrt, sqrtOnce); + } + if (b === 2) { + return this._makeBinary(TOKEN.mul, second, second); + } + if (b === 3) { + return this._makeBinary(TOKEN.mul, this._makeBinary(TOKEN.mul, second, second), second); + } + if (b === 4) { + const square = this._makeBinary(TOKEN.mul, second, second); + return this._makeBinary(TOKEN.mul, square, square); + } + if (b === 0) { + return new PsConstNode(1); + } + break; + case TOKEN.and: + if (b === true) { + return second; + } + if (b === false) { + return first; + } + break; + case TOKEN.or: + if (b === false) { + return second; + } + if (b === true) { + return first; + } + break; + case TOKEN.min: + if (second.type === PS_NODE.binary && second.op === TOKEN.max && second.first.type === PS_NODE.const && second.first.value >= b) { + return first; + } + break; + case TOKEN.max: + if (second.type === PS_NODE.binary && second.op === TOKEN.min && second.first.type === PS_NODE.const && second.first.value <= b) { + return first; + } + break; + } + } + if (second.type === PS_NODE.const) { + const a = second.value; + switch (op) { + case TOKEN.add: + if (a === 0) { + return first; + } + break; + case TOKEN.sub: + if (a === 0) { + return this._makeUnary(TOKEN.neg, first); + } + break; + case TOKEN.mul: + if (a === 1) { + return first; + } + if (a === 0) { + return second; + } + if (a === -1) { + return this._makeUnary(TOKEN.neg, first); + } + break; + case TOKEN.and: + if (a === true) { + return first; + } + if (a === false) { + return second; + } + break; + case TOKEN.or: + if (a === false) { + return first; + } + if (a === true) { + return second; + } + break; + } + } + return new PsBinaryNode(op, first, second, _binaryValueType(op, first.valueType, second.valueType)); + } + _makeUnary(op, operand) { + if (operand.type === PS_NODE.const) { + const v = _evalUnaryConst(op, operand.value); + if (v !== undefined) { + return new PsConstNode(v); + } + } + if (op === TOKEN.not && operand.type === PS_NODE.binary) { + const negated = PSStackToTree.#negatedComparison.get(operand.op); + if (negated !== undefined) { + return new PsBinaryNode(negated, operand.first, operand.second, PS_VALUE_TYPE.boolean); + } + } + if (op === TOKEN.neg && operand.type === PS_NODE.binary && operand.op === TOKEN.sub) { + return this._makeBinary(TOKEN.sub, operand.second, operand.first); + } + if (operand.type === PS_NODE.unary) { + if (op === TOKEN.neg && operand.op === TOKEN.neg || op === TOKEN.not && operand.op === TOKEN.not) { + return operand.operand; + } + if (op === TOKEN.abs && operand.op === TOKEN.neg) { + return this._makeUnary(TOKEN.abs, operand.operand); + } + if (PSStackToTree.#idempotentUnary.has(op) && op === operand.op) { + return operand; + } + } + return new PsUnaryNode(op, operand, _unaryValueType(op, operand.valueType)); + } + _makeTernary(cond, then, otherwise) { + if (cond.type === PS_NODE.const) { + return cond.value ? then : otherwise; + } + if (_nodesEqual(then, otherwise)) { + return then; + } + if (then.type === PS_NODE.const && otherwise.type === PS_NODE.const) { + if (then.value === true && otherwise.value === false) { + return cond; + } + if (then.value === false && otherwise.value === true) { + return this._makeUnary(TOKEN.not, cond); + } + } + if (cond.type === PS_NODE.binary) { + const { + op: cop, + first: cf, + second: cs + } = cond; + if (cop === TOKEN.gt || cop === TOKEN.ge) { + if (_nodesEqual(then, cf) && _nodesEqual(otherwise, cs)) { + return this._makeBinary(TOKEN.min, cf, cs); + } + if (_nodesEqual(then, cs) && _nodesEqual(otherwise, cf)) { + return this._makeBinary(TOKEN.max, cf, cs); + } + } else if (cop === TOKEN.lt || cop === TOKEN.le) { + if (_nodesEqual(then, cf) && _nodesEqual(otherwise, cs)) { + return this._makeBinary(TOKEN.max, cf, cs); + } + if (_nodesEqual(then, cs) && _nodesEqual(otherwise, cf)) { + return this._makeBinary(TOKEN.min, cf, cs); + } + } + } + return new PsTernaryNode(cond, then, otherwise, then.valueType === otherwise.valueType ? then.valueType : PS_VALUE_TYPE.unknown); + } +} + +;// ./src/core/postscript/js_evaluator.js + + + + + + + +const OP = { + ARG: 0, + CONST: 1, + STORE: 2, + IF: 3, + JUMP: 4, + ABS: 5, + NEG: 6, + CEIL: 7, + FLOOR: 8, + ROUND: 9, + TRUNC: 10, + NOT_B: 11, + NOT_N: 12, + SQRT: 13, + SIN: 14, + COS: 15, + LN: 16, + LOG10: 17, + CVI: 18, + SHIFT: 19, + ADD: 20, + SUB: 21, + MUL: 22, + DIV: 23, + IDIV: 24, + MOD: 25, + POW: 26, + EQ: 27, + NE: 28, + GT: 29, + GE: 30, + LT: 31, + LE: 32, + AND: 33, + OR: 34, + XOR: 35, + ATAN: 36, + MIN: 37, + MAX: 38, + TEE_TMP: 39, + LOAD_TMP: 40 +}; +const _DEG_TO_RAD = Math.PI / 180; +const _RAD_TO_DEG = 180 / Math.PI; +class PsJsCompiler { + static #stack = new Float64Array(64); + static #tmp = new Float64Array(64); + constructor(domain, range) { + this.nIn = domain.length >> 1; + this.nOut = range.length >> 1; + this.range = range; + this.ir = []; + this._tmpMap = new Map(); + this._nextTmp = 0; + } + _compileNode(node) { + if (node.shared) { + const cached = this._tmpMap.get(node); + if (cached !== undefined) { + this.ir.push(OP.LOAD_TMP, cached); + return true; + } + if (!this._compileNodeImpl(node)) { + return false; + } + const slot = this._nextTmp++; + this._tmpMap.set(node, slot); + this.ir.push(OP.TEE_TMP, slot); + return true; + } + return this._compileNodeImpl(node); + } + _compileNodeImpl(node) { + switch (node.type) { + case PS_NODE.arg: + this.ir.push(OP.ARG, node.index); + return true; + case PS_NODE.const: + { + const v = node.value; + this.ir.push(OP.CONST, typeof v === "boolean" ? Number(v) : v); + return true; + } + case PS_NODE.unary: + return this._compileUnary(node); + case PS_NODE.binary: + return this._compileBinary(node); + case PS_NODE.ternary: + return this._compileTernary(node); + default: + return false; + } + } + _compileUnary(node) { + const { + op, + operand, + valueType + } = node; + if (op === TOKEN.cvr) { + return this._compileNode(operand); + } + if (!this._compileNode(operand)) { + return false; + } + switch (op) { + case TOKEN.abs: + this.ir.push(OP.ABS); + break; + case TOKEN.neg: + this.ir.push(OP.NEG); + break; + case TOKEN.ceiling: + this.ir.push(OP.CEIL); + break; + case TOKEN.floor: + this.ir.push(OP.FLOOR); + break; + case TOKEN.round: + this.ir.push(OP.ROUND); + break; + case TOKEN.truncate: + this.ir.push(OP.TRUNC); + break; + case TOKEN.sqrt: + this.ir.push(OP.SQRT); + break; + case TOKEN.sin: + this.ir.push(OP.SIN); + break; + case TOKEN.cos: + this.ir.push(OP.COS); + break; + case TOKEN.ln: + this.ir.push(OP.LN); + break; + case TOKEN.log: + this.ir.push(OP.LOG10); + break; + case TOKEN.cvi: + this.ir.push(OP.CVI); + break; + case TOKEN.not: + if (valueType === PS_VALUE_TYPE.boolean) { + this.ir.push(OP.NOT_B); + } else if (valueType === PS_VALUE_TYPE.numeric) { + this.ir.push(OP.NOT_N); + } else { + return false; + } + break; + default: + return false; + } + return true; + } + _compileBinary(node) { + const { + op, + first, + second + } = node; + if (op === TOKEN.bitshift) { + if (first.type !== PS_NODE.const || !Number.isInteger(first.value) || !this._compileNode(second)) { + return false; + } + this.ir.push(OP.SHIFT, first.value); + return true; + } + if (!this._compileNode(second) || !this._compileNode(first)) { + return false; + } + switch (op) { + case TOKEN.add: + this.ir.push(OP.ADD); + break; + case TOKEN.sub: + this.ir.push(OP.SUB); + break; + case TOKEN.mul: + this.ir.push(OP.MUL); + break; + case TOKEN.div: + this.ir.push(OP.DIV); + break; + case TOKEN.idiv: + this.ir.push(OP.IDIV); + break; + case TOKEN.mod: + this.ir.push(OP.MOD); + break; + case TOKEN.exp: + this.ir.push(OP.POW); + break; + case TOKEN.eq: + this.ir.push(OP.EQ); + break; + case TOKEN.ne: + this.ir.push(OP.NE); + break; + case TOKEN.gt: + this.ir.push(OP.GT); + break; + case TOKEN.ge: + this.ir.push(OP.GE); + break; + case TOKEN.lt: + this.ir.push(OP.LT); + break; + case TOKEN.le: + this.ir.push(OP.LE); + break; + case TOKEN.and: + this.ir.push(OP.AND); + break; + case TOKEN.or: + this.ir.push(OP.OR); + break; + case TOKEN.xor: + this.ir.push(OP.XOR); + break; + case TOKEN.atan: + this.ir.push(OP.ATAN); + break; + case TOKEN.min: + this.ir.push(OP.MIN); + break; + case TOKEN.max: + this.ir.push(OP.MAX); + break; + default: + return false; + } + return true; + } + _compileTernary(node) { + if (!this._compileNode(node.cond)) { + return false; + } + this.ir.push(OP.IF, 0); + const ifPatch = this.ir.length - 1; + if (!this._compileNode(node.then)) { + return false; + } + this.ir.push(OP.JUMP, 0); + const jumpPatch = this.ir.length - 1; + this.ir[ifPatch] = this.ir.length; + if (!this._compileNode(node.otherwise)) { + return false; + } + this.ir[jumpPatch] = this.ir.length; + return true; + } + compile(program) { + const outputs = new PSStackToTree().evaluate(program, this.nIn); + if (!outputs || outputs.length < this.nOut) { + return null; + } + for (let i = 0; i < this.nOut; i++) { + if (!this._compileNode(outputs[i])) { + return null; + } + const min = this.range[i * 2]; + const max = this.range[i * 2 + 1]; + this.ir.push(OP.STORE, i, min, max); + } + return new Float64Array(this.ir); + } + static execute(ir, src, srcOffset, dest, destOffset) { + let ip = 0, + sp = 0; + const n = ir.length; + const stack = this.#stack; + const tmp = this.#tmp; + while (ip < n) { + switch (ir[ip++] | 0) { + case OP.ARG: + stack[sp++] = src[srcOffset + (ir[ip++] | 0)]; + break; + case OP.CONST: + stack[sp++] = ir[ip++]; + break; + case OP.STORE: + { + const slot = ir[ip++] | 0; + const min = ir[ip++]; + const max = ir[ip++]; + dest[destOffset + slot] = MathClamp(stack[--sp], min, max); + break; + } + case OP.IF: + { + const tgt = ir[ip++]; + if (stack[--sp] === 0) { + ip = tgt; + } + break; + } + case OP.JUMP: + ip = ir[ip]; + break; + case OP.ABS: + stack[sp - 1] = Math.abs(stack[sp - 1]); + break; + case OP.NEG: + stack[sp - 1] = -stack[sp - 1]; + break; + case OP.CEIL: + stack[sp - 1] = Math.ceil(stack[sp - 1]); + break; + case OP.FLOOR: + stack[sp - 1] = Math.floor(stack[sp - 1]); + break; + case OP.ROUND: + stack[sp - 1] = Math.floor(stack[sp - 1] + 0.5); + break; + case OP.TRUNC: + stack[sp - 1] = Math.trunc(stack[sp - 1]); + break; + case OP.NOT_B: + stack[sp - 1] = stack[sp - 1] !== 0 ? 0 : 1; + break; + case OP.NOT_N: + stack[sp - 1] = ~(stack[sp - 1] | 0); + break; + case OP.SQRT: + stack[sp - 1] = Math.sqrt(stack[sp - 1]); + break; + case OP.SIN: + stack[sp - 1] = Math.sin(stack[sp - 1] % 360 * _DEG_TO_RAD); + break; + case OP.COS: + stack[sp - 1] = Math.cos(stack[sp - 1] % 360 * _DEG_TO_RAD); + break; + case OP.LN: + stack[sp - 1] = Math.log(stack[sp - 1]); + break; + case OP.LOG10: + stack[sp - 1] = Math.log10(stack[sp - 1]); + break; + case OP.CVI: + stack[sp - 1] = Math.trunc(stack[sp - 1]) | 0; + break; + case OP.SHIFT: + { + const amt = ir[ip++]; + const v = stack[sp - 1] | 0; + if (amt > 0) { + stack[sp - 1] = v << amt; + } else if (amt < 0) { + stack[sp - 1] = v >> -amt; + } else { + stack[sp - 1] = v; + } + break; + } + case OP.ADD: + { + const b = stack[--sp]; + stack[sp - 1] += b; + break; + } + case OP.SUB: + { + const b = stack[--sp]; + stack[sp - 1] -= b; + break; + } + case OP.MUL: + { + const b = stack[--sp]; + stack[sp - 1] *= b; + break; + } + case OP.DIV: + { + const b = stack[--sp]; + stack[sp - 1] = b !== 0 ? stack[sp - 1] / b : 0; + break; + } + case OP.IDIV: + { + const b = stack[--sp]; + stack[sp - 1] = b !== 0 ? Math.trunc(stack[sp - 1] / b) : 0; + break; + } + case OP.MOD: + { + const b = stack[--sp]; + stack[sp - 1] = b !== 0 ? stack[sp - 1] % b : 0; + break; + } + case OP.POW: + { + const b = stack[--sp]; + stack[sp - 1] **= b; + break; + } + case OP.EQ: + { + const b = stack[--sp]; + stack[sp - 1] = stack[sp - 1] === b ? 1 : 0; + break; + } + case OP.NE: + { + const b = stack[--sp]; + stack[sp - 1] = stack[sp - 1] !== b ? 1 : 0; + break; + } + case OP.GT: + { + const b = stack[--sp]; + stack[sp - 1] = stack[sp - 1] > b ? 1 : 0; + break; + } + case OP.GE: + { + const b = stack[--sp]; + stack[sp - 1] = stack[sp - 1] >= b ? 1 : 0; + break; + } + case OP.LT: + { + const b = stack[--sp]; + stack[sp - 1] = stack[sp - 1] < b ? 1 : 0; + break; + } + case OP.LE: + { + const b = stack[--sp]; + stack[sp - 1] = stack[sp - 1] <= b ? 1 : 0; + break; + } + case OP.AND: + { + const b = stack[--sp] | 0; + stack[sp - 1] = (stack[sp - 1] | 0) & b; + break; + } + case OP.OR: + { + const b = stack[--sp] | 0; + stack[sp - 1] = stack[sp - 1] | 0 | b; + break; + } + case OP.XOR: + { + const b = stack[--sp] | 0; + stack[sp - 1] = (stack[sp - 1] | 0) ^ b; + break; + } + case OP.ATAN: + { + const b = stack[--sp]; + const deg = Math.atan2(stack[sp - 1], b) * _RAD_TO_DEG; + stack[sp - 1] = deg < 0 ? deg + 360 : deg; + break; + } + case OP.MIN: + { + const b = stack[--sp]; + stack[sp - 1] = Math.min(stack[sp - 1], b); + break; + } + case OP.MAX: + { + const b = stack[--sp]; + stack[sp - 1] = Math.max(stack[sp - 1], b); + break; + } + case OP.TEE_TMP: + tmp[ir[ip++] | 0] = stack[sp - 1]; + break; + case OP.LOAD_TMP: + stack[sp++] = tmp[ir[ip++] | 0]; + break; + } + } + } +} +class PSStackBasedInterpreter { + static #stack = new Float64Array(100); + static #sp = 0; + static #push(v) { + if (this.#sp < this.#stack.length) { + this.#stack[this.#sp++] = v; + } + } + static #execOp(op) { + const stack = this.#stack; + switch (op) { + case TOKEN.true: + this.#push(1); + break; + case TOKEN.false: + this.#push(0); + break; + case TOKEN.abs: + stack[this.#sp - 1] = Math.abs(stack[this.#sp - 1]); + break; + case TOKEN.neg: + stack[this.#sp - 1] = -stack[this.#sp - 1]; + break; + case TOKEN.ceiling: + stack[this.#sp - 1] = Math.ceil(stack[this.#sp - 1]); + break; + case TOKEN.floor: + stack[this.#sp - 1] = Math.floor(stack[this.#sp - 1]); + break; + case TOKEN.round: + stack[this.#sp - 1] = Math.floor(stack[this.#sp - 1] + 0.5); + break; + case TOKEN.truncate: + stack[this.#sp - 1] = Math.trunc(stack[this.#sp - 1]); + break; + case TOKEN.sqrt: + stack[this.#sp - 1] = Math.sqrt(stack[this.#sp - 1]); + break; + case TOKEN.sin: + stack[this.#sp - 1] = Math.sin(stack[this.#sp - 1] % 360 * _DEG_TO_RAD); + break; + case TOKEN.cos: + stack[this.#sp - 1] = Math.cos(stack[this.#sp - 1] % 360 * _DEG_TO_RAD); + break; + case TOKEN.ln: + stack[this.#sp - 1] = Math.log(stack[this.#sp - 1]); + break; + case TOKEN.log: + stack[this.#sp - 1] = Math.log10(stack[this.#sp - 1]); + break; + case TOKEN.cvi: + stack[this.#sp - 1] = Math.trunc(stack[this.#sp - 1]) | 0; + break; + case TOKEN.cvr: + break; + case TOKEN.not: + { + const v = stack[this.#sp - 1]; + stack[this.#sp - 1] = v === 0 || v === 1 ? 1 - v : ~(v | 0); + break; + } + case TOKEN.add: + { + const b = stack[--this.#sp]; + stack[this.#sp - 1] += b; + break; + } + case TOKEN.sub: + { + const b = stack[--this.#sp]; + stack[this.#sp - 1] -= b; + break; + } + case TOKEN.mul: + { + const b = stack[--this.#sp]; + stack[this.#sp - 1] *= b; + break; + } + case TOKEN.div: + { + const b = stack[--this.#sp]; + stack[this.#sp - 1] = b !== 0 ? stack[this.#sp - 1] / b : 0; + break; + } + case TOKEN.idiv: + { + const b = stack[--this.#sp]; + stack[this.#sp - 1] = b !== 0 ? Math.trunc(stack[this.#sp - 1] / b) : 0; + break; + } + case TOKEN.mod: + { + const b = stack[--this.#sp]; + stack[this.#sp - 1] = b !== 0 ? stack[this.#sp - 1] % b : 0; + break; + } + case TOKEN.exp: + { + const b = stack[--this.#sp]; + stack[this.#sp - 1] **= b; + break; + } + case TOKEN.atan: + { + const dx = stack[--this.#sp]; + const deg = Math.atan2(stack[this.#sp - 1], dx) * _RAD_TO_DEG; + stack[this.#sp - 1] = deg < 0 ? deg + 360 : deg; + break; + } + case TOKEN.eq: + { + const b = stack[--this.#sp]; + stack[this.#sp - 1] = stack[this.#sp - 1] === b ? 1 : 0; + break; + } + case TOKEN.ne: + { + const b = stack[--this.#sp]; + stack[this.#sp - 1] = stack[this.#sp - 1] !== b ? 1 : 0; + break; + } + case TOKEN.gt: + { + const b = stack[--this.#sp]; + stack[this.#sp - 1] = stack[this.#sp - 1] > b ? 1 : 0; + break; + } + case TOKEN.ge: + { + const b = stack[--this.#sp]; + stack[this.#sp - 1] = stack[this.#sp - 1] >= b ? 1 : 0; + break; + } + case TOKEN.lt: + { + const b = stack[--this.#sp]; + stack[this.#sp - 1] = stack[this.#sp - 1] < b ? 1 : 0; + break; + } + case TOKEN.le: + { + const b = stack[--this.#sp]; + stack[this.#sp - 1] = stack[this.#sp - 1] <= b ? 1 : 0; + break; + } + case TOKEN.and: + { + const b = stack[--this.#sp] | 0; + stack[this.#sp - 1] = (stack[this.#sp - 1] | 0) & b; + break; + } + case TOKEN.or: + { + const b = stack[--this.#sp] | 0; + stack[this.#sp - 1] = stack[this.#sp - 1] | 0 | b; + break; + } + case TOKEN.xor: + { + const b = stack[--this.#sp] | 0; + stack[this.#sp - 1] = (stack[this.#sp - 1] | 0) ^ b; + break; + } + case TOKEN.bitshift: + { + const amt = stack[--this.#sp] | 0; + const v = stack[this.#sp - 1] | 0; + stack[this.#sp - 1] = amt > 0 ? v << amt : v >> -amt; + break; + } + case TOKEN.min: + { + const b = stack[--this.#sp]; + stack[this.#sp - 1] = Math.min(stack[this.#sp - 1], b); + break; + } + case TOKEN.max: + { + const b = stack[--this.#sp]; + stack[this.#sp - 1] = Math.max(stack[this.#sp - 1], b); + break; + } + case TOKEN.dup: + this.#push(stack[this.#sp - 1]); + break; + case TOKEN.exch: + { + const a = stack[--this.#sp]; + const b = stack[--this.#sp]; + this.#push(a); + this.#push(b); + break; + } + case TOKEN.pop: + this.#sp--; + break; + case TOKEN.copy: + { + const n = Math.trunc(stack[--this.#sp]); + const base = this.#sp - n; + for (let k = 0; k < n; k++) { + this.#push(stack[base + k]); + } + break; + } + case TOKEN.index: + { + const i = Math.trunc(stack[--this.#sp]); + this.#push(stack[this.#sp - 1 - i]); + break; + } + case TOKEN.roll: + { + const j = Math.trunc(stack[--this.#sp]); + const n = Math.trunc(stack[--this.#sp]); + if (n > 1 && j !== 0) { + const mod = (j % n + n) % n; + if (mod !== 0) { + const base = this.#sp - n; + const sub = stack.slice(base, this.#sp); + for (let k = 0; k < n; k++) { + stack[base + k] = sub[(k - mod + n) % n]; + } + } + } + break; + } + } + } + static #execBlock(instructions) { + for (const instr of instructions) { + switch (instr.type) { + case PS_NODE.number: + this.#push(instr.value); + break; + case PS_NODE.operator: + this.#execOp(instr.op); + break; + case PS_NODE.if: + if (this.#stack[--this.#sp] !== 0) { + this.#execBlock(instr.then.instructions); + } + break; + case PS_NODE.ifelse: + if (this.#stack[--this.#sp] !== 0) { + this.#execBlock(instr.then.instructions); + } else { + this.#execBlock(instr.otherwise.instructions); + } + break; + } + } + } + static build(program, domain, range) { + const nIn = domain.length >> 1; + const nOut = range.length >> 1; + const { + instructions + } = program.body; + return (src, srcOffset, dest, destOffset) => { + this.#sp = 0; + for (let i = 0; i < nIn; i++) { + this.#push(src[srcOffset + i]); + } + this.#execBlock(instructions); + const base = this.#sp - nOut; + for (let i = 0; i < nOut; i++) { + const v = base + i >= 0 ? this.#stack[base + i] : 0; + dest[destOffset + i] = MathClamp(v, range[i * 2], range[i * 2 + 1]); + } + }; + } +} +function buildPostScriptJsFunction(source, domain, range, forceInterpreter = false) { + const program = parsePostScriptFunction(source); + const ir = !forceInterpreter && new PsJsCompiler(domain, range).compile(program); + if (ir) { + return (src, srcOffset, dest, destOffset) => { + PsJsCompiler.execute(ir, src, srcOffset, dest, destOffset); + }; + } + return PSStackBasedInterpreter.build(program, domain, range); +} + +;// ./src/core/postscript/wasm_compiler.js + + + + + + + + + + + +const wasm_compiler_OP = { + if: 0x04, + else: 0x05, + end: 0x0b, + select: 0x1b, + call: 0x10, + local_get: 0x20, + local_set: 0x21, + local_tee: 0x22, + i32_const: 0x41, + i32_eqz: 0x45, + i32_and: 0x71, + i32_or: 0x72, + i32_xor: 0x73, + i32_shl: 0x74, + i32_shr_s: 0x75, + i32_trunc_f64_s: 0xaa, + f64_const: 0x44, + f64_eq: 0x61, + f64_ne: 0x62, + f64_lt: 0x63, + f64_gt: 0x64, + f64_le: 0x65, + f64_ge: 0x66, + f64_abs: 0x99, + f64_neg: 0x9a, + f64_ceil: 0x9b, + f64_floor: 0x9c, + f64_trunc: 0x9d, + f64_nearest: 0x9e, + f64_sqrt: 0x9f, + f64_add: 0xa0, + f64_sub: 0xa1, + f64_mul: 0xa2, + f64_div: 0xa3, + f64_min: 0xa4, + f64_max: 0xa5, + f64_convert_i32_s: 0xb7, + f64_store: 0x39 +}; +const FUNC_TYPE = 0x60; +const F64 = 0x7c; +const SECTION = { + type: 0x01, + import: 0x02, + function: 0x03, + memory: 0x05, + export: 0x07, + code: 0x0a +}; +const EXTERN_FUNC = 0x00; +const EXTERN_MEM = 0x02; +function unsignedLEB128(n) { + const out = []; + do { + let byte = n & 0x7f; + n >>>= 7; + if (n !== 0) { + byte |= 0x80; + } + out.push(byte); + } while (n !== 0); + return out; +} +function encodeASCIIString(s) { + return [...unsignedLEB128(s.length), ...stringToBytes(s)]; +} +function section(id, data) { + return [id, ...unsignedLEB128(data.length), ...data]; +} +function vec(items) { + const out = unsignedLEB128(items.length); + for (const item of items) { + if (typeof item === "number") { + out.push(item); + continue; + } + for (const byte of item) { + out.push(byte); + } + } + return out; +} +const MATH_IMPORTS = [["sin", "Math", "sin", [F64], [F64]], ["cos", "Math", "cos", [F64], [F64]], ["atan2", "Math", "atan2", [F64, F64], [F64]], ["log", "Math", "log", [F64], [F64]], ["log10", "Math", "log10", [F64], [F64]], ["pow", "Math", "pow", [F64, F64], [F64]]]; +const _mathImportObject = { + Math: Object.fromEntries(MATH_IMPORTS.map(([name]) => [name, Math[name]])) +}; +class PsWasmCompiler { + static #initialized = false; + static #comparisonToOp = null; + static #importIdx = null; + static #degToRad = 0; + static #radToDeg = 0; + static #importTypeEntries = null; + static #importSection = null; + static #functionSection = null; + static #memorySection = null; + static #exportSection = null; + static #wasmMagicVersion = null; + static #f64View = null; + static #f64Arr = null; + static #init() { + this.#comparisonToOp = new Map([[TOKEN.eq, wasm_compiler_OP.f64_eq], [TOKEN.ne, wasm_compiler_OP.f64_ne], [TOKEN.lt, wasm_compiler_OP.f64_lt], [TOKEN.le, wasm_compiler_OP.f64_le], [TOKEN.gt, wasm_compiler_OP.f64_gt], [TOKEN.ge, wasm_compiler_OP.f64_ge]]); + this.#importIdx = Object.create(null); + for (let i = 0; i < MATH_IMPORTS.length; i++) { + this.#importIdx[MATH_IMPORTS[i][0]] = i; + } + this.#degToRad = Math.PI / 180; + this.#radToDeg = 180 / Math.PI; + this.#importTypeEntries = MATH_IMPORTS.map(([,,, params, results]) => [FUNC_TYPE, ...vec(params), ...vec(results)]); + this.#importSection = new Uint8Array(section(SECTION.import, vec(MATH_IMPORTS.map(([, mod, field], i) => [...encodeASCIIString(mod), ...encodeASCIIString(field), EXTERN_FUNC, ...unsignedLEB128(i + 1)])))); + this.#functionSection = new Uint8Array(section(SECTION.function, vec([[0]]))); + this.#memorySection = new Uint8Array(section(SECTION.memory, vec([[0x00, 0x01]]))); + this.#exportSection = new Uint8Array(section(SECTION.export, vec([[...encodeASCIIString("fn"), EXTERN_FUNC, ...unsignedLEB128(MATH_IMPORTS.length)], [...encodeASCIIString("mem"), EXTERN_MEM, 0x00]]))); + this.#wasmMagicVersion = new Uint8Array([0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00]); + const f64Buf = new ArrayBuffer(8); + this.#f64View = new DataView(f64Buf); + this.#f64Arr = new Uint8Array(f64Buf); + this.#initialized = true; + } + constructor(domain, range) { + if (!PsWasmCompiler.#initialized) { + PsWasmCompiler.#init(); + } + this._nIn = domain.length >> 1; + this._nOut = range.length >> 1; + this._range = range; + this._code = []; + this._nextLocal = this._nIn; + this._freeLocals = []; + this._sharedLocals = new Map(); + } + _allocLocal() { + return this._freeLocals.pop() ?? this._nextLocal++; + } + _releaseLocal(idx) { + this._freeLocals.push(idx); + } + _emitULEB128(n) { + do { + let b = n & 0x7f; + n >>>= 7; + if (n !== 0) { + b |= 0x80; + } + this._code.push(b); + } while (n !== 0); + } + _emitSLEB128(n) { + for (;;) { + const b = n & 0x7f; + n >>= 7; + if (n === 0 && (b & 0x40) === 0 || n === -1 && (b & 0x40) !== 0) { + this._code.push(b); + return; + } + this._code.push(b | 0x80); + } + } + _emitF64Const(value) { + this._code.push(wasm_compiler_OP.f64_const); + PsWasmCompiler.#f64View.setFloat64(0, value, true); + for (let i = 0; i < 8; i++) { + this._code.push(PsWasmCompiler.#f64Arr[i]); + } + } + _emitLocalGet(idx) { + this._code.push(wasm_compiler_OP.local_get); + this._emitULEB128(idx); + } + _emitLocalSet(idx) { + this._code.push(wasm_compiler_OP.local_set); + this._emitULEB128(idx); + } + _emitLocalTee(idx) { + this._code.push(wasm_compiler_OP.local_tee); + this._emitULEB128(idx); + } + _compileNode(node) { + if (node.shared) { + const entry = this._sharedLocals.get(node); + if (entry !== undefined) { + this._emitLocalGet(entry.local); + if (--entry.remaining === 0) { + this._releaseLocal(entry.local); + } + return true; + } + if (!this._compileNodeImpl(node)) { + return false; + } + const local = this._allocLocal(); + this._sharedLocals.set(node, { + local, + remaining: node.sharedCount - 1 + }); + this._emitLocalTee(local); + return true; + } + return this._compileNodeImpl(node); + } + _compileNodeImpl(node) { + switch (node.type) { + case PS_NODE.arg: + this._emitLocalGet(node.index); + return true; + case PS_NODE.const: + { + let v = node.value; + if (typeof v === "boolean") { + v = v ? 1 : 0; + } + this._emitF64Const(v); + return true; + } + case PS_NODE.unary: + return this._compileUnaryNode(node); + case PS_NODE.binary: + return this._compileBinaryNode(node); + case PS_NODE.ternary: + return this._compileTernaryNode(node); + default: + return false; + } + } + _compileSinCosNode(node) { + const local = this._allocLocal(); + try { + if (!this._compileNode(node.operand)) { + return false; + } + const code = this._code; + this._emitLocalSet(local); + this._emitLocalGet(local); + this._emitLocalGet(local); + this._emitF64Const(360); + code.push(wasm_compiler_OP.f64_div, wasm_compiler_OP.f64_trunc); + this._emitF64Const(360); + code.push(wasm_compiler_OP.f64_mul, wasm_compiler_OP.f64_sub); + this._emitF64Const(PsWasmCompiler.#degToRad); + code.push(wasm_compiler_OP.f64_mul, wasm_compiler_OP.call); + this._emitULEB128(PsWasmCompiler.#importIdx[node.op === TOKEN.sin ? "sin" : "cos"]); + return true; + } finally { + this._releaseLocal(local); + } + } + _compileUnaryNode(node) { + const code = this._code; + if (node.op === TOKEN.sin || node.op === TOKEN.cos) { + return this._compileSinCosNode(node); + } + if (node.op === TOKEN.not) { + if (node.valueType === PS_VALUE_TYPE.boolean) { + if (!this._compileNodeAsBoolI32(node.operand)) { + return false; + } + code.push(wasm_compiler_OP.i32_eqz, wasm_compiler_OP.f64_convert_i32_s); + return true; + } + if (node.valueType === PS_VALUE_TYPE.numeric) { + if (!this._compileNode(node.operand)) { + return false; + } + code.push(wasm_compiler_OP.i32_trunc_f64_s, wasm_compiler_OP.i32_const, 0x7f, wasm_compiler_OP.i32_xor, wasm_compiler_OP.f64_convert_i32_s); + return true; + } + return false; + } + if (!this._compileNode(node.operand)) { + return false; + } + switch (node.op) { + case TOKEN.abs: + code.push(wasm_compiler_OP.f64_abs); + break; + case TOKEN.neg: + code.push(wasm_compiler_OP.f64_neg); + break; + case TOKEN.sqrt: + code.push(wasm_compiler_OP.f64_sqrt); + break; + case TOKEN.floor: + code.push(wasm_compiler_OP.f64_floor); + break; + case TOKEN.ceiling: + code.push(wasm_compiler_OP.f64_ceil); + break; + case TOKEN.round: + this._emitF64Const(0.5); + code.push(wasm_compiler_OP.f64_add, wasm_compiler_OP.f64_floor); + break; + case TOKEN.truncate: + code.push(wasm_compiler_OP.f64_trunc); + break; + case TOKEN.cvi: + code.push(wasm_compiler_OP.i32_trunc_f64_s, wasm_compiler_OP.f64_convert_i32_s); + break; + case TOKEN.cvr: + break; + case TOKEN.ln: + code.push(wasm_compiler_OP.call); + this._emitULEB128(PsWasmCompiler.#importIdx.log); + break; + case TOKEN.log: + code.push(wasm_compiler_OP.call); + this._emitULEB128(PsWasmCompiler.#importIdx.log10); + break; + default: + return false; + } + return true; + } + _compileSafeDivNode(first, second) { + const tmp = this._allocLocal(); + try { + if (!this._compileNode(second) || !this._compileNode(first)) { + return false; + } + const code = this._code; + this._emitLocalTee(tmp); + code.push(wasm_compiler_OP.f64_div); + this._emitF64Const(0); + this._emitLocalGet(tmp); + this._emitF64Const(0); + code.push(wasm_compiler_OP.f64_ne, wasm_compiler_OP.select); + return true; + } finally { + this._releaseLocal(tmp); + } + } + _compileSafeIdivNode(first, second) { + const tmp = this._allocLocal(); + try { + if (!this._compileNode(second) || !this._compileNode(first)) { + return false; + } + const code = this._code; + this._emitLocalTee(tmp); + code.push(wasm_compiler_OP.f64_div, wasm_compiler_OP.f64_trunc); + this._emitF64Const(0); + this._emitLocalGet(tmp); + this._emitF64Const(0); + code.push(wasm_compiler_OP.f64_ne, wasm_compiler_OP.select); + return true; + } finally { + this._releaseLocal(tmp); + } + } + _compileBitshiftNode(first, second) { + if (first.type !== PS_NODE.const || !Number.isInteger(first.value) || !this._compileNode(second)) { + return false; + } + const code = this._code; + code.push(wasm_compiler_OP.i32_trunc_f64_s); + const shift = first.value; + if (shift > 0) { + code.push(wasm_compiler_OP.i32_const); + this._emitSLEB128(shift); + code.push(wasm_compiler_OP.i32_shl); + } else if (shift < 0) { + code.push(wasm_compiler_OP.i32_const); + this._emitSLEB128(-shift); + code.push(wasm_compiler_OP.i32_shr_s); + } + code.push(wasm_compiler_OP.f64_convert_i32_s); + return true; + } + _compileModNode(first, second) { + if (first.type === PS_NODE.const && first.value === 0) { + if (!this._compileNode(second)) { + return false; + } + this._code.push(wasm_compiler_OP.drop); + this._emitF64Const(0); + return true; + } + const localA = this._allocLocal(); + try { + if (!this._compileNode(second)) { + return false; + } + this._emitLocalTee(localA); + const code = this._code; + if (first.type === PS_NODE.const) { + this._emitLocalGet(localA); + this._emitF64Const(first.value); + code.push(wasm_compiler_OP.f64_div, wasm_compiler_OP.f64_trunc); + this._emitF64Const(first.value); + code.push(wasm_compiler_OP.f64_mul, wasm_compiler_OP.f64_sub); + } else { + const localB = this._allocLocal(); + try { + if (!this._compileNode(first)) { + return false; + } + this._emitLocalSet(localB); + this._emitLocalGet(localA); + this._emitLocalGet(localB); + code.push(wasm_compiler_OP.f64_div, wasm_compiler_OP.f64_trunc); + this._emitLocalGet(localB); + code.push(wasm_compiler_OP.f64_mul, wasm_compiler_OP.f64_sub); + this._emitF64Const(0); + this._emitLocalGet(localB); + this._emitF64Const(0); + code.push(wasm_compiler_OP.f64_ne, wasm_compiler_OP.select); + } finally { + this._releaseLocal(localB); + } + } + return true; + } finally { + this._releaseLocal(localA); + } + } + _compileAtanNode(first, second) { + const localR = this._allocLocal(); + try { + if (!this._compileNode(second) || !this._compileNode(first)) { + return false; + } + const code = this._code; + code.push(wasm_compiler_OP.call); + this._emitULEB128(PsWasmCompiler.#importIdx.atan2); + this._emitF64Const(PsWasmCompiler.#radToDeg); + code.push(wasm_compiler_OP.f64_mul); + this._emitLocalTee(localR); + this._emitF64Const(0); + code.push(wasm_compiler_OP.f64_lt, wasm_compiler_OP.if, F64); + this._emitLocalGet(localR); + this._emitF64Const(360); + code.push(wasm_compiler_OP.f64_add, wasm_compiler_OP.else); + this._emitLocalGet(localR); + code.push(wasm_compiler_OP.end); + return true; + } finally { + this._releaseLocal(localR); + } + } + _compileBitwiseNode(op, first, second) { + if (!this._compileBitwiseOperandI32(second) || !this._compileBitwiseOperandI32(first)) { + return false; + } + const code = this._code; + switch (op) { + case TOKEN.and: + code.push(wasm_compiler_OP.i32_and); + break; + case TOKEN.or: + code.push(wasm_compiler_OP.i32_or); + break; + case TOKEN.xor: + code.push(wasm_compiler_OP.i32_xor); + break; + default: + return false; + } + code.push(wasm_compiler_OP.f64_convert_i32_s); + return true; + } + _compileBitwiseOperandI32(node) { + if (node.valueType === PS_VALUE_TYPE.boolean) { + return this._compileNodeAsBoolI32(node); + } + if (!this._compileNode(node)) { + return false; + } + this._code.push(wasm_compiler_OP.i32_trunc_f64_s); + return true; + } + _compileStandardBinaryNode(op, first, second) { + if (first === second && first.type !== PS_NODE.arg && first.type !== PS_NODE.const && !first.shared) { + const tmp = this._allocLocal(); + try { + if (!this._compileNode(first)) { + return false; + } + this._emitLocalTee(tmp); + this._emitLocalGet(tmp); + } finally { + this._releaseLocal(tmp); + } + } else if (!this._compileNode(second) || !this._compileNode(first)) { + return false; + } + const code = this._code; + switch (op) { + case TOKEN.add: + code.push(wasm_compiler_OP.f64_add); + break; + case TOKEN.sub: + code.push(wasm_compiler_OP.f64_sub); + break; + case TOKEN.mul: + code.push(wasm_compiler_OP.f64_mul); + break; + case TOKEN.exp: + code.push(wasm_compiler_OP.call); + this._emitULEB128(PsWasmCompiler.#importIdx.pow); + break; + case TOKEN.eq: + code.push(wasm_compiler_OP.f64_eq, wasm_compiler_OP.f64_convert_i32_s); + break; + case TOKEN.ne: + code.push(wasm_compiler_OP.f64_ne, wasm_compiler_OP.f64_convert_i32_s); + break; + case TOKEN.lt: + code.push(wasm_compiler_OP.f64_lt, wasm_compiler_OP.f64_convert_i32_s); + break; + case TOKEN.le: + code.push(wasm_compiler_OP.f64_le, wasm_compiler_OP.f64_convert_i32_s); + break; + case TOKEN.gt: + code.push(wasm_compiler_OP.f64_gt, wasm_compiler_OP.f64_convert_i32_s); + break; + case TOKEN.ge: + code.push(wasm_compiler_OP.f64_ge, wasm_compiler_OP.f64_convert_i32_s); + break; + case TOKEN.min: + code.push(wasm_compiler_OP.f64_min); + break; + case TOKEN.max: + code.push(wasm_compiler_OP.f64_max); + break; + default: + return false; + } + return true; + } + _compileBinaryNode(node) { + const { + op, + first, + second + } = node; + if (op === TOKEN.bitshift) { + return this._compileBitshiftNode(first, second); + } + if (op === TOKEN.div) { + return this._compileSafeDivNode(first, second); + } + if (op === TOKEN.idiv) { + return this._compileSafeIdivNode(first, second); + } + if (op === TOKEN.mod) { + return this._compileModNode(first, second); + } + if (op === TOKEN.atan) { + return this._compileAtanNode(first, second); + } + return op === TOKEN.and || op === TOKEN.or || op === TOKEN.xor ? this._compileBitwiseNode(op, first, second) : this._compileStandardBinaryNode(op, first, second); + } + _compileNodeAsBoolI32(node) { + if (node.type === PS_NODE.binary) { + const wasmOp = PsWasmCompiler.#comparisonToOp.get(node.op); + if (wasmOp !== undefined) { + if (!this._compileNode(node.second) || !this._compileNode(node.first)) { + return false; + } + this._code.push(wasmOp); + return true; + } + if (node.valueType === PS_VALUE_TYPE.boolean && (node.op === TOKEN.and || node.op === TOKEN.or || node.op === TOKEN.xor)) { + if (!this._compileNodeAsBoolI32(node.second) || !this._compileNodeAsBoolI32(node.first)) { + return false; + } + switch (node.op) { + case TOKEN.and: + this._code.push(wasm_compiler_OP.i32_and); + break; + case TOKEN.or: + this._code.push(wasm_compiler_OP.i32_or); + break; + case TOKEN.xor: + this._code.push(wasm_compiler_OP.i32_xor); + break; + } + return true; + } + } + if (node.type === PS_NODE.unary && node.op === TOKEN.not && node.valueType === PS_VALUE_TYPE.boolean) { + if (!this._compileNodeAsBoolI32(node.operand)) { + return false; + } + this._code.push(wasm_compiler_OP.i32_eqz); + return true; + } + if (!this._compileNode(node)) { + return false; + } + if (node.valueType === PS_VALUE_TYPE.boolean) { + this._code.push(wasm_compiler_OP.i32_trunc_f64_s); + } else { + this._emitF64Const(0); + this._code.push(wasm_compiler_OP.f64_ne); + } + return true; + } + _compileTernaryNode(node) { + if (!this._compileNodeAsBoolI32(node.cond)) { + return false; + } + this._code.push(wasm_compiler_OP.if, F64); + if (!this._compileNode(node.then)) { + return false; + } + this._code.push(wasm_compiler_OP.else); + if (!this._compileNode(node.otherwise)) { + return false; + } + this._code.push(wasm_compiler_OP.end); + return true; + } + compile(program) { + const outputs = new PSStackToTree().evaluate(program, this._nIn); + if (!outputs || outputs.length < this._nOut) { + return null; + } + const code = this._code; + for (let i = 0; i < this._nOut; i++) { + const min = this._range[i * 2]; + const max = this._range[i * 2 + 1]; + code.push(wasm_compiler_OP.i32_const); + this._emitSLEB128(i * 8); + if (!this._compileNode(outputs[i])) { + return null; + } + this._emitF64Const(max); + code.push(wasm_compiler_OP.f64_min); + this._emitF64Const(min); + code.push(wasm_compiler_OP.f64_max, wasm_compiler_OP.f64_store, 0x03, 0x00); + } + code.push(wasm_compiler_OP.end); + const nIn = this._nIn; + const nLocals = this._nextLocal - nIn; + const paramTypes = Array(nIn).fill(F64); + const resultTypes = []; + const funcType = [FUNC_TYPE, ...vec(paramTypes), ...vec(resultTypes)]; + const typeSectionBytes = new Uint8Array(section(SECTION.type, vec([funcType, ...PsWasmCompiler.#importTypeEntries]))); + const localDecls = nLocals > 0 ? vec([[...unsignedLEB128(nLocals), F64]]) : vec([]); + const funcBodyLen = localDecls.length + code.length; + const codeSectionBytes = new Uint8Array(section(SECTION.code, vec([[...unsignedLEB128(funcBodyLen), ...localDecls, ...code]]))); + const magicVersion = PsWasmCompiler.#wasmMagicVersion; + const importSection = PsWasmCompiler.#importSection; + const functionSection = PsWasmCompiler.#functionSection; + const memorySection = PsWasmCompiler.#memorySection; + const exportSection = PsWasmCompiler.#exportSection; + const totalLen = magicVersion.length + typeSectionBytes.length + importSection.length + functionSection.length + memorySection.length + exportSection.length + codeSectionBytes.length; + const result = new Uint8Array(totalLen); + let off = 0; + result.set(magicVersion, off); + off += magicVersion.length; + result.set(typeSectionBytes, off); + off += typeSectionBytes.length; + result.set(importSection, off); + off += importSection.length; + result.set(functionSection, off); + off += functionSection.length; + result.set(memorySection, off); + off += memorySection.length; + result.set(exportSection, off); + off += exportSection.length; + result.set(codeSectionBytes, off); + return result; + } +} +function compilePostScriptToWasm(source, domain, range) { + return new PsWasmCompiler(domain, range).compile(parsePostScriptFunction(source)); +} +function _makeWrapper(exports, nIn, nOut) { + const { + fn, + mem + } = exports; + const outView = new Float64Array(mem.buffer, 0, nOut); + let writeOut; + switch (nOut) { + case 1: + writeOut = (dest, destOffset) => { + dest[destOffset] = outView[0]; + }; + break; + case 2: + writeOut = (dest, destOffset) => { + dest[destOffset] = outView[0]; + dest[destOffset + 1] = outView[1]; + }; + break; + case 3: + writeOut = (dest, destOffset) => { + dest[destOffset] = outView[0]; + dest[destOffset + 1] = outView[1]; + dest[destOffset + 2] = outView[2]; + }; + break; + case 4: + writeOut = (dest, destOffset) => { + dest[destOffset] = outView[0]; + dest[destOffset + 1] = outView[1]; + dest[destOffset + 2] = outView[2]; + dest[destOffset + 3] = outView[3]; + }; + break; + default: + writeOut = (dest, destOffset) => { + for (let i = 0; i < nOut; i++) { + dest[destOffset + i] = outView[i]; + } + }; + } + switch (nIn) { + case 1: + return (src, srcOffset, dest, destOffset) => { + fn(src[srcOffset]); + writeOut(dest, destOffset); + }; + case 2: + return (src, srcOffset, dest, destOffset) => { + fn(src[srcOffset], src[srcOffset + 1]); + writeOut(dest, destOffset); + }; + case 3: + return (src, srcOffset, dest, destOffset) => { + fn(src[srcOffset], src[srcOffset + 1], src[srcOffset + 2]); + writeOut(dest, destOffset); + }; + case 4: + return (src, srcOffset, dest, destOffset) => { + fn(src[srcOffset], src[srcOffset + 1], src[srcOffset + 2], src[srcOffset + 3]); + writeOut(dest, destOffset); + }; + default: + { + const inBuf = new Float64Array(nIn); + return (src, srcOffset, dest, destOffset) => { + for (let i = 0; i < nIn; i++) { + inBuf[i] = src[srcOffset + i]; + } + fn(...inBuf); + writeOut(dest, destOffset); + }; + } + } +} +function buildPostScriptWasmFunction(source, domain, range) { + const bytes = compilePostScriptToWasm(source, domain, range); + if (!bytes) { + return null; + } + try { + const instance = new WebAssembly.Instance(new WebAssembly.Module(bytes), _mathImportObject); + return _makeWrapper(instance.exports, domain.length >> 1, range.length >> 1); + } catch { + return null; + } +} + +;// ./src/core/image_utils.js + + + + +class BaseLocalCache { + constructor(options) { + this._onlyRefs = options?.onlyRefs === true; + if (!this._onlyRefs) { + this._nameRefMap = new Map(); + this._imageMap = new Map(); + } + this._imageCache = new RefMap(); + } + getByName(name) { + if (this._onlyRefs) { + unreachable("Should not call `getByName` method."); + } + const ref = this._nameRefMap.get(name); + return ref ? this.getByRef(ref) : this._imageMap.get(name) || null; + } + getByRef(ref) { + return this._imageCache.get(ref) || null; + } + set(name, ref, data) { + unreachable("Abstract method `set` called."); + } +} +class LocalImageCache extends BaseLocalCache { + set(name, ref = null, data) { + if (typeof name !== "string") { + throw new Error('LocalImageCache.set - expected "name" argument.'); + } + if (ref) { + if (this._imageCache.has(ref)) { + return; + } + this._nameRefMap.set(name, ref); + this._imageCache.put(ref, data); + return; + } + if (this._imageMap.has(name)) { + return; + } + this._imageMap.set(name, data); + } +} +class LocalColorSpaceCache extends BaseLocalCache { + set(name = null, ref = null, data) { + if (typeof name !== "string" && !ref) { + throw new Error('LocalColorSpaceCache.set - expected "name" and/or "ref" argument.'); + } + if (ref) { + if (this._imageCache.has(ref)) { + return; + } + if (name !== null) { + this._nameRefMap.set(name, ref); + } + this._imageCache.put(ref, data); + return; + } + if (this._imageMap.has(name)) { + return; + } + this._imageMap.set(name, data); + } +} +class LocalFunctionCache extends BaseLocalCache { + constructor(options) { + super({ + onlyRefs: true + }); + } + set(name = null, ref, data) { + if (!ref) { + throw new Error('LocalFunctionCache.set - expected "ref" argument.'); + } + if (this._imageCache.has(ref)) { + return; + } + this._imageCache.put(ref, data); + } +} +class LocalGStateCache extends BaseLocalCache { + set(name, ref = null, data) { + if (typeof name !== "string") { + throw new Error('LocalGStateCache.set - expected "name" argument.'); + } + if (ref) { + if (this._imageCache.has(ref)) { + return; + } + this._nameRefMap.set(name, ref); + this._imageCache.put(ref, data); + return; + } + if (this._imageMap.has(name)) { + return; + } + this._imageMap.set(name, data); + } +} +class LocalTilingPatternCache extends BaseLocalCache { + constructor(options) { + super({ + onlyRefs: true + }); + } + set(name = null, ref, data) { + if (!ref) { + throw new Error('LocalTilingPatternCache.set - expected "ref" argument.'); + } + if (this._imageCache.has(ref)) { + return; + } + this._imageCache.put(ref, data); + } +} +class RegionalImageCache extends BaseLocalCache { + constructor(options) { + super({ + onlyRefs: true + }); + } + set(name = null, ref, data) { + if (!ref) { + throw new Error('RegionalImageCache.set - expected "ref" argument.'); + } + if (this._imageCache.has(ref)) { + return; + } + this._imageCache.put(ref, data); + } +} +class GlobalColorSpaceCache extends BaseLocalCache { + constructor(options) { + super({ + onlyRefs: true + }); + } + set(name = null, ref, data) { + if (!ref) { + throw new Error('GlobalColorSpaceCache.set - expected "ref" argument.'); + } + if (this._imageCache.has(ref)) { + return; + } + this._imageCache.put(ref, data); + } + clear() { + this._imageCache.clear(); + } +} +class GlobalImageCache { + static NUM_PAGES_THRESHOLD = 2; + static MIN_IMAGES_TO_CACHE = 10; + static MAX_BYTE_SIZE = 5e7; + #decodeFailedSet = new RefSet(); + constructor() { + this._refCache = new RefMap(); + this._imageCache = new RefMap(); + } + get #byteSize() { + let byteSize = 0; + for (const imageData of this._imageCache) { + byteSize += imageData.byteSize; + } + return byteSize; + } + get #cacheLimitReached() { + return this._imageCache.size >= GlobalImageCache.MIN_IMAGES_TO_CACHE && this.#byteSize >= GlobalImageCache.MAX_BYTE_SIZE; + } + shouldCache(ref, pageIndex) { + const pageIndexSet = this._refCache.getOrPutComputed(ref, makeSet); + pageIndexSet.add(pageIndex); + if (pageIndexSet.size < GlobalImageCache.NUM_PAGES_THRESHOLD) { + return false; + } + if (!this._imageCache.has(ref) && this.#cacheLimitReached) { + return false; + } + return true; + } + addDecodeFailed(ref) { + this.#decodeFailedSet.put(ref); + } + hasDecodeFailed(ref) { + return this.#decodeFailedSet.has(ref); + } + 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 || 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.'); + } + if (this._imageCache.has(ref)) { + return; + } + if (this.#cacheLimitReached) { + warn("GlobalImageCache.setData - cache limit reached."); + return; + } + this._imageCache.put(ref, data); + } + clear(onlyData = false) { + if (!onlyData) { + this.#decodeFailedSet.clear(); + this._refCache.clear(); + } + this._imageCache.clear(); + } +} + +;// ./src/core/function.js + + + + + + + + + + + + +const FunctionType = { + SAMPLED: 0, + EXPONENTIAL_INTERPOLATION: 2, + STITCHING: 3, + POSTSCRIPT_CALCULATOR: 4 +}; +class PDFFunctionFactory { + static #useWasm = true; + static setOptions({ + useWasm + }) { + this.#useWasm = useWasm; + } + constructor({ + xref + }) { + this.xref = xref; + } + get useWasm() { + return PDFFunctionFactory.#useWasm; + } + create(fn, parseArray = false) { + let fnRef, parsedFn; + if (fn instanceof Ref) { + fnRef = fn; + } else if (fn instanceof Dict) { + fnRef = fn.objId; + } else if (fn instanceof BaseStream) { + fnRef = fn.dict?.objId; + } + if (fnRef) { + const cachedFn = this._localFunctionCache.getByRef(fnRef); + if (cachedFn) { + return cachedFn; + } + } + const fnObj = this.xref.fetchIfRef(fn); + if (Array.isArray(fnObj)) { + if (!parseArray) { + throw new Error('PDFFunctionFactory.create - expected "parseArray" argument.'); + } + parsedFn = PDFFunction.parseArray(this, fnObj); + } else { + parsedFn = PDFFunction.parse(this, fnObj); + } + if (fnRef) { + this._localFunctionCache.set(null, fnRef, parsedFn); + } + return parsedFn; + } + get _localFunctionCache() { + return util_shadow(this, "_localFunctionCache", new LocalFunctionCache()); + } +} +function toNumberArray(arr) { + if (!Array.isArray(arr)) { + return null; + } + if (!isNumberArray(arr, null)) { + return arr.map(x => +x); + } + return arr; +} +function setArity(fn, numInputs, numOutputs) { + fn.numInputs = numInputs; + fn.numOutputs = numOutputs; + return fn; +} +function interpolate(x, xmin, xmax, ymin, ymax) { + return xmin === xmax ? ymin : ymin + (x - xmin) * ((ymax - ymin) / (xmax - xmin)); +} +class PDFFunction { + static MAX_MULTILINEAR_INPUTS = 8; + static getSampleArray(size, outputSize, bps, stream) { + let length = outputSize; + for (const s of size) { + length *= s; + } + 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 (let 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(factory, fn) { + const dict = fn.dict || fn; + const typeNum = dict.get("FunctionType"); + switch (typeNum) { + case FunctionType.SAMPLED: + return this.constructSampled(factory, fn, dict); + case FunctionType.EXPONENTIAL_INTERPOLATION: + return this.constructInterpolated(factory, dict); + case FunctionType.STITCHING: + return this.constructStitched(factory, dict); + case FunctionType.POSTSCRIPT_CALCULATOR: + return this.constructPostScript(factory, fn, dict); + } + throw new FormatError(`Unknown function type: ${typeNum}`); + } + static parseArray(factory, fnObj) { + const { + xref + } = factory; + const fnArray = []; + for (const fn of fnObj) { + fnArray.push(this.parse(factory, xref.fetchIfRef(fn))); + } + if (fnArray.length === 1) { + return fnArray[0]; + } + const numInputs = fnArray[0]?.numInputs ?? 0; + if (fnArray.some(fn => fn.numInputs !== numInputs || fn.numOutputs !== 1)) { + throw new FormatError("Invalid array of functions."); + } + return setArity(function (src, srcOffset, dest, destOffset) { + for (let i = 0, ii = fnArray.length; i < ii; i++) { + fnArray[i](src, srcOffset, dest, destOffset + i); + } + }, numInputs, fnArray.length); + } + static constructSampled(factory, fn, dict) { + const domain = toNumberArray(dict.getArray("Domain")); + const range = toNumberArray(dict.getArray("Range")); + if (!domain || !range) { + throw new FormatError("No domain or range"); + } + const inputSize = domain.length / 2; + const outputSize = range.length / 2; + 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); + } + } + const decode = toNumberArray(dict.getArray("Decode")) || range; + const samples = this.getSampleArray(size, outputSize, bps, fn); + const useSimplex = inputSize > PDFFunction.MAX_MULTILINEAR_INPUTS; + const steps = new Float64Array(inputSize); + const weights0 = new Float64Array(inputSize); + const weights1 = new Float64Array(inputSize); + const sorted = useSimplex ? new Uint32Array(inputSize) : null; + const maxVertices = useSimplex ? inputSize + 1 : 1 << inputSize; + const vertices = new Uint32Array(maxVertices); + const vertexWeights = new Float64Array(maxVertices); + function constructSampledFn(src, srcOffset, dest, destOffset) { + let base = 0, + k = outputSize, + numActive = 0; + for (let i = 0; i < inputSize; ++i) { + const domain_2i = domain[2 * i]; + const domain_2i_1 = domain[2 * i + 1]; + const xi = MathClamp(src[srcOffset + i], domain_2i, domain_2i_1); + let e = interpolate(xi, domain_2i, domain_2i_1, encode[2 * i], encode[2 * i + 1]); + const size_i = size[i]; + e = MathClamp(e, 0, size_i - 1); + const e0 = Math.floor(e); + base += e0 * k; + if (e !== e0) { + steps[numActive] = k; + weights0[numActive] = e0 + 1 - e; + weights1[numActive] = e - e0; + numActive++; + } + k *= size_i; + } + vertices[0] = base; + vertexWeights[0] = 1; + let numVertices = 1; + if (!useSimplex) { + for (let i = 0; i < numActive; i++) { + const step = steps[i], + w0 = weights0[i], + w1 = weights1[i]; + for (let j = 0; j < numVertices; j++) { + vertices[numVertices + j] = vertices[j] + step; + vertexWeights[numVertices + j] = vertexWeights[j] * w1; + vertexWeights[j] *= w0; + } + numVertices <<= 1; + } + } else if (numActive > 0) { + for (let i = 0; i < numActive; i++) { + const w1 = weights1[i]; + let j = i; + for (; j > 0 && weights1[sorted[j - 1]] < w1; j--) { + sorted[j] = sorted[j - 1]; + } + sorted[j] = i; + } + vertexWeights[0] = weights0[sorted[0]]; + for (let i = 0; i < numActive; i++) { + const a = sorted[i]; + vertices[i + 1] = vertices[i] + steps[a]; + vertexWeights[i + 1] = i + 1 < numActive ? weights1[a] - weights1[sorted[i + 1]] : weights1[a]; + } + numVertices = numActive + 1; + } + for (let j = 0; j < outputSize; ++j) { + let rj = 0; + for (let i = 0; i < numVertices; i++) { + rj += samples[vertices[i] + j] * vertexWeights[i]; + } + rj = interpolate(rj, 0, 1, decode[2 * j], decode[2 * j + 1]); + dest[destOffset + j] = MathClamp(rj, range[2 * j], range[2 * j + 1]); + } + } + return setArity(constructSampledFn, inputSize, outputSize); + } + static constructInterpolated(factory, dict) { + const domain = toNumberArray(dict.getArray("Domain")); + 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; + 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]; + } + } + return setArity(constructInterpolatedFn, domain ? domain.length / 2 : 1, length); + } + static constructStitched(factory, 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 stitched function"); + } + const { + xref + } = factory; + const fns = []; + for (const fn of dict.get("Functions")) { + fns.push(this.parse(factory, xref.fetchIfRef(fn))); + } + const numOutputs = fns[0]?.numOutputs ?? 0; + if (fns.length === 0 || fns.some(fn => fn.numInputs !== 1 || fn.numOutputs !== numOutputs)) { + throw new FormatError("Incompatible sub-functions for stitched function"); + } + const bounds = toNumberArray(dict.getArray("Bounds")); + const encode = toNumberArray(dict.getArray("Encode")); + const tmpBuf = new Float32Array(1); + function constructStitchedFn(src, srcOffset, dest, destOffset) { + const v = MathClamp(src[srcOffset], domain[0], domain[1]); + const length = bounds.length; + let i; + for (i = 0; i < length; ++i) { + if (v < bounds[i]) { + break; + } + } + const dmin = i > 0 ? bounds[i - 1] : domain[0]; + const dmax = i < length ? bounds[i] : domain[1]; + tmpBuf[0] = interpolate(v, dmin, dmax, encode[2 * i], encode[2 * i + 1]); + fns[i](tmpBuf, 0, dest, destOffset); + } + return setArity(constructStitchedFn, inputSize, numOutputs); + } + static constructPostScript(factory, 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 psCode = fn.getString(); + const numInputs = domain.length / 2, + numOutputs = range.length / 2; + try { + if (factory.useWasm) { + const wasmFn = buildPostScriptWasmFunction(psCode, domain, range); + if (wasmFn) { + return setArity(wasmFn, numInputs, numOutputs); + } + } + } catch {} + warn("Failed to compile PostScript function to wasm, falling back to JS"); + return setArity(buildPostScriptJsFunction(psCode, domain, range), numInputs, numOutputs); + } +} +function isPDFFunction(v) { + let fnDict; + if (v instanceof Dict) { + fnDict = v; + } else if (v instanceof BaseStream) { + fnDict = v.dict; + } else { + return false; + } + return fnDict.has("FunctionType"); +} + +;// ./src/core/evaluator_utils.js + + + +function textSinkWrapper(sink) { + const TEXT_CONTENT_CHUNK_SIZE = 100; + const resolved = sink ? null : Promise.resolve(); + return { + enqueueInvoked: false, + enqueue(chunk, size) { + this.enqueueInvoked = true; + sink?.enqueue(chunk, size); + }, + get desiredSize() { + return sink?.desiredSize ?? TEXT_CONTENT_CHUNK_SIZE; + }, + get ready() { + return sink?.ready ?? resolved; + } + }; +} +function _parseVisibilityExpression(xref, array, nestingCounter, currentResult) { + const MAX_NESTING = 10; + if (++nestingCounter > MAX_NESTING) { + warn("Visibility expression is too deeply nested"); + return; + } + const length = array.length; + const operator = xref.fetchIfRef(array[0]); + if (length < 2 || !(operator instanceof Name)) { + warn("Invalid visibility expression"); + return; + } + 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 = xref.fetchIfRef(raw); + if (Array.isArray(object)) { + const nestedResult = []; + currentResult.push(nestedResult); + _parseVisibilityExpression(xref, object, nestingCounter, nestedResult); + } else if (raw instanceof Ref) { + currentResult.push(raw.toString()); + } + } +} +function parseMarkedContentProps(xref, 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 = []; + _parseVisibilityExpression(xref, 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); + } + const p = optionalContent.get("P"); + return { + type: optionalContentType, + ids: groupIds, + policy: p instanceof Name ? p.name : null, + expression: null + }; + } else if (optionalContentGroups instanceof Ref) { + return { + type: optionalContentType, + id: optionalContentGroups.toString() + }; + } + } + return null; +} + +;// ./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 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(str, isLTR, vertical = false) { + let dir = "ltr"; + if (vertical) { + dir = "ttb"; + } else if (!isLTR) { + dir = "rtl"; + } + return { + str, + dir + }; +} +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); + } + 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 (numBidi === 0) { + isLTR = true; + return createBidiText(str, isLTR); + } + if (startLevel === -1) { + if (numBidi / strLength < 0.3 && strLength > 4) { + isLTR = true; + startLevel = 0; + } else { + isLTR = false; + startLevel = 1; + } + } + const levels = []; + for (i = 0; i < strLength; ++i) { + levels[i] = startLevel; + } + 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]; + } + } + 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 (i = 0; i < strLength; ++i) { + t = types[i]; + if (t === "AL") { + types[i] = "R"; + } + } + 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; + } + types[j] = "EN"; + } + for (let j = i + 1; j < strLength; ++j) { + if (types[j] !== "ET") { + break; + } + types[j] = "EN"; + } + } + } + for (i = 0; i < strLength; ++i) { + t = types[i]; + if (t === "WS" || t === "ES" || t === "ET" || t === "CS") { + types[i] = "ON"; + } + } + 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; + for (let j = i - 1; j >= 0; j--) { + const tt = types[j]; + if (tt === "L") { + before = "L"; + break; + } + if (tt === "R" || tt === "EN" || tt === "AN") { + before = "R"; + break; + } + } + let after = eor; + for (let j = end; j < strLength; j++) { + const tt = types[j]; + if (tt === "L") { + after = "L"; + break; + } + if (tt === "R" || tt === "EN" || tt === "AN") { + after = "R"; + break; + } + } + if (before === after) { + types.fill(before, i, end); + } + 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 font_substitutions_NORMAL = { + style: "normal", + weight: "normal" +}; +const MEDIUM = { + style: "normal", + weight: "500" +}; +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", "PT Astra Serif", "DejaVu Serif", "Bitstream Vera Serif", "Ubuntu"], + style: font_substitutions_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: font_substitutions_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: font_substitutions_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: font_substitutions_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: font_substitutions_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: font_substitutions_NORMAL +}], ["Wingdings-Regular", { + alias: "Wingdings" +}], ["Wingdings-Bold", { + alias: "Wingdings" +}], ["\xCB\xCE\xCC\xE5", { + local: ["SimSun", "SimSun Regular", "NSimSun"], + style: font_substitutions_NORMAL, + ultimate: "serif" +}], ["\xBA\xDA\xCC\xE5", { + local: ["SimHei", "SimHei Regular"], + style: font_substitutions_NORMAL, + ultimate: "sans-serif" +}], ["\xBF\xAC\xCC\xE5", { + local: ["KaiTi", "SimKai", "SimKai Regular"], + style: font_substitutions_NORMAL, + ultimate: "sans-serif" +}], ["\xB7\xC2\xCB\xCE", { + local: ["FangSong", "SimFang", "SimFang Regular"], + style: font_substitutions_NORMAL, + ultimate: "serif" +}], ["\xBF\xAC\xCC\xE5_GB2312", { + alias: "\xBF\xAC\xCC\xE5" +}], ["\xB7\xC2\xCB\xCE_GB2312", { + alias: "\xB7\xC2\xCB\xCE" +}], ["\xC1\xA5\xCA\xE9", { + local: ["SimLi", "SimLi Regular"], + style: font_substitutions_NORMAL, + ultimate: "serif" +}], ["\xD0\xC2\xCB\xCE", { + alias: "\xCB\xCE\xCC\xE5" +}], ["HeiseiMin-W3", { + local: ["Hiragino Mincho ProN", "Hiragino Mincho Pro", "Yu Mincho", "YuMincho", "Source Han Serif JP", "Noto Serif JP", "Noto Serif CJK JP", "IPAexMincho", "IPAMincho", "Takao Mincho", "MS Mincho", "MS PMincho"], + style: font_substitutions_NORMAL, + ultimate: "serif" +}], ["HeiseiKakuGo-W5", { + local: ["Hiragino Kaku Gothic ProN", "Hiragino Kaku Gothic Pro", "Hiragino Sans", "Yu Gothic", "YuGothic", "Source Han Sans JP", "Noto Sans JP", "Noto Sans CJK JP", "IPAexGothic", "IPAGothic", "Takao Gothic", "Meiryo", "MS Gothic", "MS PGothic"], + style: MEDIUM, + ultimate: "sans-serif" +}], ["HeiseiMin-W3-Acro", { + alias: "HeiseiMin-W3" +}], ["HeiseiKakuGo-W5-Acro", { + alias: "HeiseiKakuGo-W5" +}], ["KozMinPro-Regular", { + alias: "HeiseiMin-W3" +}], ["KozMinProVI-Regular", { + alias: "HeiseiMin-W3" +}], ["KozMinPr6N-Regular", { + alias: "HeiseiMin-W3" +}], ["KozGoPro-Regular", { + alias: "HeiseiKakuGo-W5" +}], ["KozGoProVI-Regular", { + alias: "HeiseiKakuGo-W5" +}], ["KozGoPr6N-Regular", { + alias: "HeiseiKakuGo-W5" +}], ["STSong-Light", { + local: ["STSong", "Songti SC", "Source Han Serif SC", "Source Han Serif CN", "Noto Serif SC", "Noto Serif CJK SC", "AR PL UMing CN", "SimSun", "NSimSun"], + style: font_substitutions_NORMAL, + ultimate: "serif" +}], ["STHeiti-Regular", { + local: ["STHeiti", "Heiti SC", "PingFang SC", "Source Han Sans SC", "Source Han Sans CN", "Noto Sans SC", "Noto Sans CJK SC", "Microsoft YaHei", "SimHei", "WenQuanYi Zen Hei"], + style: font_substitutions_NORMAL, + ultimate: "sans-serif" +}], ["STSongStd-Light", { + alias: "STSong-Light" +}], ["AdobeSongStd-Light", { + alias: "STSong-Light" +}], ["AdobeHeitiStd-Regular", { + alias: "STHeiti-Regular" +}], ["AdobeKaitiStd-Regular", { + alias: "\xBF\xAC\xCC\xE5" +}], ["AdobeFangsongStd-Regular", { + alias: "\xB7\xC2\xCB\xCE" +}], ["MSung-Light", { + local: ["Songti TC", "LiSong Pro", "Source Han Serif TC", "Source Han Serif TW", "Noto Serif TC", "Noto Serif CJK TC", "AR PL UMing TW", "PMingLiU", "MingLiU", "MingLiU_HKSCS"], + style: font_substitutions_NORMAL, + ultimate: "serif" +}], ["MHei-Medium", { + local: ["Heiti TC", "STHeiti", "Source Han Sans TC", "Source Han Sans TW", "Noto Sans TC", "Noto Sans CJK TC", "PingFang TC", "Microsoft JhengHei"], + style: MEDIUM, + ultimate: "sans-serif" +}], ["MSungStd-Light", { + alias: "MSung-Light" +}], ["AdobeMingStd-Light", { + alias: "MSung-Light" +}], ["HYSMyeongJo-Medium", { + local: ["AppleMyungjo", "Source Han Serif KR", "Noto Serif KR", "Noto Serif CJK KR", "Nanum Myeongjo", "Batang"], + style: MEDIUM, + ultimate: "serif" +}], ["HYGoThic-Medium", { + local: ["Apple SD Gothic Neo", "AppleGothic", "Source Han Sans KR", "Noto Sans KR", "Noto Sans CJK KR", "Nanum Gothic", "Malgun Gothic", "Dotum", "Gulim"], + style: MEDIUM, + ultimate: "sans-serif" +}], ["HYSMyeongJoStd-Medium", { + alias: "HYSMyeongJo-Medium" +}], ["AdobeMyungjoStd-Medium", { + alias: "HYSMyeongJo-Medium" +}], ["HYGoThic-Bold", { + alias: "HYGoThic-Medium", + style: BOLD +}], ["AdobeGothicStd-Bold", { + alias: "HYGoThic-Medium", + style: BOLD +}]]); +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 ""; +} +function getFamilyName(str) { + const keywords = new Set(["thin", "extralight", "ultralight", "demilight", "semilight", "light", "book", "regular", "normal", "medium", "demibold", "semibold", "bold", "extrabold", "ultrabold", "black", "heavy", "extrablack", "ultrablack", "roman", "italic", "oblique", "ultracondensed", "extracondensed", "condensed", "semicondensed", "normal", "semiexpanded", "expanded", "extraexpanded", "ultraexpanded", "bolditalic"]); + return str.split(/[- ,+]+/g).filter(tok => !keywords.has(tok.toLowerCase())).join(" "); +} +function generateFont({ + alias, + local, + path, + fallback, + style, + ultimate +}, src, localFontPath, useFallback = true, usePath = true, append = "") { + const result = { + style: null, + ultimate: null + }; + if (local) { + const extra = append ? ` ${append}` : ""; + for (const name of local) { + src.push(`local(${name}${extra})`); + } + } + if (alias) { + const substitution = substitutionMap.get(alias); + const aliasAppend = append || getStyleToAppend(style); + Object.assign(result, generateFont(substitution, src, localFontPath, useFallback && !fallback, usePath && !path, aliasAppend)); + } + if (style) { + result.style = style; + } + 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(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 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 bold = /bold/i.test(baseFontName); + const italic = /oblique|italic/i.test(baseFontName); + const style = bold && italic && BOLDITALIC || bold && BOLD || italic && ITALIC || font_substitutions_NORMAL; + substitutionInfo = { + css: `"${getFamilyName(baseFontName)}",${loadedName}`, + guessFallback: true, + loadedName, + baseFontName, + src: `local(${baseFontName})`, + style + }; + systemFontCache.set(key, substitutionInfo); + return substitutionInfo; + } + 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 + }; + systemFontCache.set(key, substitutionInfo); + return substitutionInfo; +} + +;// ./src/shared/murmurhash3.js + + + + + +const SEED = 0xc3d2e1f0; +const MASK_HIGH = 0xffff0000; +const MASK_LOW = 0xffff; +class MurmurHash3_64 { + constructor(seed) { + this.h1 = seed ? seed & 0xffffffff : SEED; + this.h2 = seed ? seed & 0xffffffff : SEED; + } + update(input) { + let data, length; + if (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 { + throw new Error("Invalid data format, must be a string or TypedArray."); + } + const blockCounts = length >> 2; + const tailLength = length - blockCounts * 4; + const dataUint32 = new Uint32Array(data.buffer, 0, blockCounts); + let k1 = 0, + k2 = 0; + let h1 = this.h1, + h2 = this.h2; + const C1 = 0xcc9e2d51, + C2 = 0x1b873593; + const C1_LOW = C1 & MASK_LOW, + C2_LOW = C2 & MASK_LOW; + for (let i = 0; i < blockCounts; i++) { + if (i & 1) { + k1 = dataUint32[i]; + k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW; + k1 = k1 << 15 | k1 >>> 17; + k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW; + h1 ^= k1; + h1 = h1 << 13 | h1 >>> 19; + h1 = h1 * 5 + 0xe6546b64; + } else { + k2 = dataUint32[i]; + k2 = k2 * C1 & MASK_HIGH | k2 * C1_LOW & MASK_LOW; + k2 = k2 << 15 | k2 >>> 17; + k2 = k2 * C2 & MASK_HIGH | k2 * C2_LOW & MASK_LOW; + h2 ^= k2; + h2 = h2 << 13 | h2 >>> 19; + h2 = h2 * 5 + 0xe6546b64; + } + } + k1 = 0; + switch (tailLength) { + case 3: + k1 ^= data[blockCounts * 4 + 2] << 16; + case 2: + k1 ^= data[blockCounts * 4 + 1] << 8; + case 1: + k1 ^= data[blockCounts * 4]; + k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW; + k1 = k1 << 15 | k1 >>> 17; + k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW; + if (blockCounts & 1) { + h1 ^= k1; + } else { + h2 ^= k1; + } + } + this.h1 = h1; + this.h2 = h2; + } + hexdigest() { + let h1 = this.h1, + h2 = this.h2; + h1 ^= h2 >>> 1; + h1 = h1 * 0xed558ccd & MASK_HIGH | h1 * 0x8ccd & MASK_LOW; + h2 = h2 * 0xff51afd7 & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xafd7ed55 & MASK_HIGH) >>> 16; + h1 ^= h2 >>> 1; + h1 = h1 * 0x1a85ec53 & MASK_HIGH | h1 * 0xec53 & MASK_LOW; + h2 = h2 * 0xc4ceb9fe & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xb9fe1a85 & MASK_HIGH) >>> 16; + h1 ^= h2 >>> 1; + return (h1 >>> 0).toString(16).padStart(8, "0") + (h2 >>> 0).toString(16).padStart(8, "0"); + } +} + +;// ./src/core/image.js + + + + + + + + + + + + + + + + +class PDFImage { + constructor({ + xref, + res, + image, + isInline = false, + smask = null, + mask = null, + isMask = false, + pdfFunctionFactory, + globalColorSpaceCache, + localColorSpaceCache + }) { + 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 (filterName) { + case "JPXDecode": + ({ + width: image.width, + height: image.height, + componentsCount: image.numComps, + bitsPerComponent: image.bitsPerComponent + } = JpxImage.parseImageProperties(image.stream)); + image.stream.reset(); + const reducePower = ImageResizer.getReducePowerForJPX(image.width, image.height, image.numComps); + this.jpxDecoderOptions = { + numComponents: 0, + isIndexedColormap: false, + smaskInData: dict.get("SMaskInData") >= 1, + reducePower + }; + if (reducePower) { + const factor = 2 ** reducePower; + image.width = Math.ceil(image.width / factor); + image.height = Math.ceil(image.height / factor); + } + break; + case "JBIG2Decode": + image.bitsPerComponent = 1; + image.numComps = 1; + break; + } + let width = dict.get("W", "Width"); + let height = dict.get("H", "Height"); + if (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."); + width = image.width; + height = image.height; + } else { + const validWidth = typeof width === "number" && width > 0, + validHeight = typeof height === "number" && height > 0; + if (!validWidth || !validHeight) { + if (!image.fallbackDims) { + throw new FormatError(`Invalid image width: ${width} or height: ${height}`); + } + warn("PDFImage - using the Width/Height of the parent image, for SMask/Mask data."); + if (!validWidth) { + width = image.fallbackDims.width; + } + if (!validHeight) { + height = image.fallbackDims.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}`); + } + } + } + this.bpc = bitsPerComponent; + if (!this.imageMask) { + let colorSpace = dict.getRaw("CS") || dict.getRaw("ColorSpace"); + const hasColorSpace = !!colorSpace; + if (this.jpxDecoderOptions?.smaskInData && dict.get("SMaskInData") === 2) { + this.jpxPremultiplied = true; + if (this.matte) { + const matteColorSpace = ColorSpaceUtils.parse({ + cs: hasColorSpace ? colorSpace : Name.get("DeviceRGB"), + xref, + resources: isInline ? res : null, + pdfFunctionFactory, + globalColorSpaceCache, + localColorSpaceCache + }); + this.preblendMatte = matteColorSpace.getRgb(this.matte, 0); + } + } + 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 = ColorSpaceUtils.parse({ + cs: colorSpace, + xref, + resources: isInline ? res : null, + pdfFunctionFactory, + globalColorSpaceCache, + localColorSpaceCache + }); + this.numComps = this.colorSpace.numComps; + if (this.jpxDecoderOptions) { + this.jpxDecoderOptions.numComponents = hasColorSpace ? this.numComps : 0; + this.jpxDecoderOptions.isIndexedColormap = this.colorSpace.name === "Indexed"; + } + } else { + this.numComps = 1; + } + this.decode = dict.getArray("D", "Decode"); + this.needsDecode = false; + if (this.decode && (this.colorSpace && !this.colorSpace.isDefaultDecode(this.decode, bitsPerComponent) || isMask && !ColorSpace.isDefaultDecode(this.decode, 1))) { + this.needsDecode = true; + const max = (1 << bitsPerComponent) - 1; + this.decodeCoefficients = []; + this.decodeAddends = []; + 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 (smask) { + smask.fallbackDims ??= { + width, + height + }; + this.smask = new PDFImage({ + xref, + res, + image: smask, + isInline, + pdfFunctionFactory, + globalColorSpaceCache, + localColorSpaceCache + }); + } 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 { + mask.fallbackDims ??= { + width, + height + }; + this.mask = new PDFImage({ + xref, + res, + image: mask, + isInline, + isMask: true, + pdfFunctionFactory, + globalColorSpaceCache, + localColorSpaceCache + }); + } + } else { + this.mask = mask; + } + } + } + static async buildImage({ + xref, + res, + image, + isInline = false, + pdfFunctionFactory, + globalColorSpaceCache, + localColorSpaceCache + }) { + 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, + res, + image: imageData, + isInline, + smask: smaskData, + mask: maskData, + pdfFunctionFactory, + globalColorSpaceCache, + localColorSpaceCache + }); + } + static async createMask({ + image, + isOffscreenCanvasSupported = false + }) { + const { + dict + } = image; + const width = dict.get("W", "Width"); + const height = dict.get("H", "Height"); + const interpolate = dict.get("I", "Interpolate"); + const decode = dict.getArray("D", "Decode"); + const inverseDecode = decode?.[0] > 0; + const computedLength = (width + 7 >> 3) * height; + const imgArray = await image.getImageData(computedLength); + 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: imgArray, + dest: data, + width, + height, + nonBlackColor: 0, + inverseDecode + }); + return ImageResizer.createImage({ + kind: ImageKind.RGBA_32BPP, + data, + width, + height, + interpolate + }); + } + const canvas = new OffscreenCanvas(width, height); + const ctx = canvas.getContext("2d"); + const imgData = ctx.createImageData(width, height); + convertBlackAndWhiteToRGBA({ + src: imgArray, + dest: imgData.data, + width, + height, + nonBlackColor: 0, + inverseDecode + }); + ctx.putImageData(imgData, 0, 0); + const bitmap = canvas.transferToImageBitmap(); + return { + data: null, + width, + height, + interpolate, + bitmap + }; + } + const actualLength = imgArray.byteLength; + const haveFullData = computedLength === actualLength; + let data; + if (image instanceof DecodeStream && (!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 (let i = 0; i < actualLength; i++) { + data[i] ^= 0xff; + } + } + return { + data, + width, + height, + interpolate + }; + } + get drawWidth() { + return Math.max(this.width, this.smask?.width || 0, this.mask?.width || 0); + } + get drawHeight() { + return Math.max(this.height, this.smask?.height || 0, this.mask?.height || 0); + } + decodeBuffer(buffer) { + const bpc = this.bpc; + const numComps = this.numComps; + const decodeAddends = this.decodeAddends; + const decodeCoefficients = this.decodeCoefficients; + const max = (1 << bpc) - 1; + let i, ii; + if (bpc === 1) { + for (i = 0, ii = buffer.length; i < ii; i++) { + buffer[i] = +!buffer[i]; + } + return; + } + let index = 0; + for (i = 0, ii = this.width * this.height; i < ii; i++) { + for (let j = 0; j < numComps; j++) { + buffer[index] = MathClamp(decodeAddends[j] + buffer[index] * decodeCoefficients[j], 0, max); + index++; + } + } + } + getComponents(buffer) { + const bpc = this.bpc; + if (bpc === 8) { + return buffer; + } + const width = this.width; + const height = this.height; + const numComps = this.numComps; + const length = width * height * numComps; + let bufferPos = 0; + let output; + if (bpc <= 8) { + output = new Uint8Array(length); + } else if (bpc <= 16) { + output = new Uint16Array(length); + } else { + output = new Uint32Array(length); + } + const rowComps = width * numComps; + const max = (1 << bpc) - 1; + let i = 0, + buf; + if (bpc === 1) { + let mask, loop1End, loop2End; + for (let j = 0; j < height; j++) { + loop1End = i + (rowComps & ~7); + loop2End = i + rowComps; + while (i < loop1End) { + buf = buffer[bufferPos++]; + output[i] = buf >> 7 & 1; + output[i + 1] = buf >> 6 & 1; + output[i + 2] = buf >> 5 & 1; + output[i + 3] = buf >> 4 & 1; + output[i + 4] = buf >> 3 & 1; + output[i + 5] = buf >> 2 & 1; + output[i + 6] = buf >> 1 & 1; + output[i + 7] = buf & 1; + i += 8; + } + if (i < loop2End) { + buf = buffer[bufferPos++]; + mask = 128; + while (i < loop2End) { + output[i++] = +!!(buf & mask); + mask >>= 1; + } + } + } + } else { + let bits = 0; + buf = 0; + for (i = 0; i < length; ++i) { + if (i % rowComps === 0) { + buf = 0; + bits = 0; + } + while (bits < bpc) { + buf = buf << 8 | buffer[bufferPos++]; + bits += 8; + } + const remainingBits = bits - bpc; + output[i] = MathClamp(buf >> remainingBits, 0, max); + buf &= (1 << remainingBits) - 1; + bits = remainingBits; + } + } + return output; + } + async fillOpacity(rgbaBuf, width, height, actualHeight, image) { + let apply; + if (this.smask) { + apply = (buffer, options) => this.smask.fillGrayBuffer(buffer, { + ...options, + destWidth: width, + destHeight: height + }); + } else if (this.mask) { + if (this.mask instanceof PDFImage) { + apply = (buffer, options) => this.mask.fillGrayBuffer(buffer, { + ...options, + invertOutput: true, + destWidth: width, + destHeight: height + }); + } else if (Array.isArray(this.mask)) { + apply = (buffer, { + maxRows, + offset, + stride + }) => { + for (let i = 0, ii = width * maxRows; i < ii; ++i) { + let opacity = 0; + const imageOffset = i * this.numComps; + for (let j = 0; j < this.numComps; ++j) { + const color = image[imageOffset + j]; + const maskOffset = j * 2; + if (color < this.mask[maskOffset] || color > this.mask[maskOffset + 1]) { + opacity = 255; + break; + } + } + buffer[i * stride + offset] = opacity; + } + }; + } else { + throw new FormatError("Unknown mask format."); + } + } else { + apply = (buffer, { + maxRows, + offset, + stride + }) => { + for (let i = 0, ii = width * maxRows; i < ii; ++i) { + buffer[i * stride + offset] = 255; + } + }; + } + await apply(rgbaBuf, { + maxRows: actualHeight, + offset: 3, + stride: 4 + }); + } + static #undoPreblend(buffer, length, matteR, matteG, matteB) { + for (let i = 0; i < length; i += 4) { + const alpha = buffer[i + 3]; + if (alpha === 0) { + buffer[i] = 255; + buffer[i + 1] = 255; + buffer[i + 2] = 255; + continue; + } + const k = 255 / alpha; + buffer[i] = (buffer[i] - matteR) * k + matteR; + buffer[i + 1] = (buffer[i + 1] - matteG) * k + matteG; + buffer[i + 2] = (buffer[i + 2] - matteB) * k + matteB; + } + } + undoPreblend(buffer, width, height) { + const matte = this.smask?.matte; + if (!matte) { + return; + } + const matteRgb = this.colorSpace.getRgb(matte, 0); + PDFImage.#undoPreblend(buffer, width * height * 4, matteRgb[0], matteRgb[1], matteRgb[2]); + } + 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, { + internal: isOffscreenCanvasSupported && mustBeResized + }); + if (this.jpxPremultiplied) { + const matteRgb = this.preblendMatte; + PDFImage.#undoPreblend(imgArray, imgArray.length, matteRgb?.[0] ?? 0, matteRgb?.[1] ?? 0, matteRgb?.[2] ?? 0); + } + if (isOffscreenCanvasSupported) { + if (!mustBeResized) { + return this.createBitmap(ImageKind.RGBA_32BPP, drawWidth, drawHeight, imgArray); + } + return ImageResizer.createImage(imgData, false); + } + return imgData; + } + if (!forceRGBA && !this.smask && !this.mask) { + 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 && drawWidth === originalWidth && drawHeight === originalHeight) { + const image = await this.#getImage(originalWidth, originalHeight); + if (image) { + return image; + } + const data = await this.getImageBytes(originalHeight * rowBytes, { + internal: isOffscreenCanvasSupported && mustBeResized + }); + 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) { + util_assert(kind === ImageKind.GRAYSCALE_1BPP, "PDFImage.createImageData: The image must be grayscale."); + const buffer = imgData.data; + for (let i = 0, ii = buffer.length; i < ii; i++) { + buffer[i] ^= 0xff; + } + } + return imgData; + } + if (this.image instanceof JpegStream && !this.needsDecode) { + let isHandled = false; + switch (this.colorSpace.name) { + case "DeviceGray": + case "DeviceRGB": + case "DeviceCMYK": + isHandled = true; + break; + } + if (isHandled) { + if (isOffscreenCanvasSupported) { + const image = await this.#getImage(drawWidth, drawHeight); + if (image) { + return image; + } + } + let imageLength = originalHeight * rowBytes; + if (isOffscreenCanvasSupported && !mustBeResized) { + switch (this.colorSpace.name) { + case "DeviceGray": + imageLength *= 4; + break; + case "DeviceRGB": + imageLength = imageLength / 3 * 4; + break; + } + const rgba = await this.getImageBytes(imageLength, { + drawWidth, + drawHeight, + forceRGBA: true, + internal: true + }); + return this.createBitmap(ImageKind.RGBA_32BPP, drawWidth, drawHeight, rgba); + } + if (this.colorSpace.name === "DeviceGray") { + imageLength *= 3; + } + imgData.kind = ImageKind.RGB_24BPP; + imgData.data = await this.getImageBytes(imageLength, { + drawWidth, + drawHeight, + forceRGB: true, + internal: mustBeResized + }); + return mustBeResized ? ImageResizer.createImage(imgData) : imgData; + } + } + } + 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; + } + 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 { + const arr = new Uint32Array(data.buffer); + arr.fill(FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff); + alpha01 = 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); + } + 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: drawWidth, + height: drawHeight, + bitmap, + interpolate: this.interpolate + }; + } + imgData.data = data; + return mustBeResized ? ImageResizer.createImage(imgData) : imgData; + } + async fillGrayBuffer(buffer, { + destWidth, + destHeight, + invertOutput, + maxRows, + offset = 0, + stride = 1 + } = {}) { + const numComps = this.numComps; + if (numComps !== 1) { + throw new FormatError(`Reading gray scale from a color image: ${numComps}`); + } + const srcWidth = this.width; + const srcHeight = this.height; + const bpc = this.bpc; + const rowBytes = srcWidth * numComps * bpc + 7 >> 3; + const imgArray = await this.getImageBytes(srcHeight * rowBytes, { + internal: true + }); + const comps = this.getComponents(imgArray); + const resolvedDestWidth = destWidth ?? srcWidth; + const resolvedDestHeight = destHeight ?? srcHeight; + const needsResampling = resolvedDestWidth !== srcWidth || resolvedDestHeight !== srcHeight; + const rows = maxRows === undefined ? resolvedDestHeight : Math.min(resolvedDestHeight, maxRows); + let outputWidth = srcWidth; + let yRatio = 0; + let xScaled = null; + if (needsResampling) { + outputWidth = resolvedDestWidth; + yRatio = srcHeight / resolvedDestHeight; + const xRatio = srcWidth / resolvedDestWidth; + xScaled = new Uint32Array(resolvedDestWidth); + for (let i = 0; i < resolvedDestWidth; i++) { + xScaled[i] = Math.floor(i * xRatio); + } + } + const mask = invertOutput ? 0xff : 0; + if (bpc === 1) { + if (xScaled) { + const xMap = xScaled; + let destIndex = offset; + if (this.needsDecode) { + for (let row = 0; row < rows; row++) { + const py = Math.floor(row * yRatio) * srcWidth; + for (let col = 0; col < outputWidth; col++) { + buffer[destIndex] = comps[py + xMap[col]] - 1 & 255 ^ mask; + destIndex += stride; + } + } + } else { + for (let row = 0; row < rows; row++) { + const py = Math.floor(row * yRatio) * srcWidth; + for (let col = 0; col < outputWidth; col++) { + buffer[destIndex] = -comps[py + xMap[col]] & 255 ^ mask; + destIndex += stride; + } + } + } + } else { + const length = outputWidth * rows; + if (this.needsDecode) { + for (let i = 0; i < length; ++i) { + buffer[i * stride + offset] = comps[i] - 1 & 255 ^ mask; + } + } else { + for (let i = 0; i < length; ++i) { + buffer[i * stride + offset] = -comps[i] & 255 ^ mask; + } + } + } + return; + } + if (this.needsDecode) { + this.decodeBuffer(comps); + } + const scale = 255 / ((1 << bpc) - 1); + if (xScaled) { + const xMap = xScaled; + let destIndex = offset; + for (let row = 0; row < rows; row++) { + const py = Math.floor(row * yRatio) * srcWidth; + for (let col = 0; col < outputWidth; col++) { + buffer[destIndex] = scale * comps[py + xMap[col]] ^ mask; + destIndex += stride; + } + } + } else { + const length = outputWidth * rows; + for (let i = 0; i < length; ++i) { + buffer[i * stride + offset] = scale * comps[i] ^ mask; + } + } + } + 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, + src, + dest: new Uint32Array(imgData.data.buffer), + width, + height, + inverseDecode: this.needsDecode + }); + } + ctx.putImageData(imgData, 0, 0); + const bitmap = canvas.transferToImageBitmap(); + return { + data: null, + width, + height, + bitmap, + interpolate: this.interpolate + }; + } + async #getImage(width, height) { + const bitmap = await this.image.getTransferableImage(width, height); + if (!bitmap) { + return null; + } + return { + data: null, + width: bitmap.displayWidth ?? width, + height: bitmap.displayHeight ?? height, + bitmap, + interpolate: this.interpolate + }; + } + async getImageBytes(length, { + drawWidth, + drawHeight, + forceRGBA = false, + forceRGB = false, + internal = false + }) { + this.image.reset(); + 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; + } + util_assert(imageBytes instanceof Uint8Array, 'PDFImage.getImageBytes: Unsupported "imageBytes" type.'); + return new Uint8Array(imageBytes); + } +} + +;// ./src/core/evaluator.js + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +const DefaultPartialEvaluatorOptions = Object.freeze({ + maxImageSize: -1, + disableFontFace: false, + ignoreErrors: false, + isOffscreenCanvasSupported: false, + isImageDecoderSupported: false, + canvasMaxAreaInBytes: -1, + fontExtraProperties: false, + useSystemFonts: true, + useWasm: true, + useWorkerFetch: true, + cMapUrl: null, + cMapPacked: true, + iccUrl: null, + standardFontDataUrl: null, + wasmUrl: null, + hasGPU: false +}); +const PatternType = { + TILING: 1, + SHADING: 2 +}; +const TEXT_CHUNK_BATCH_SIZE = 10; +const deferred = Promise.resolve(); +const argIsDict = arg => arg instanceof Dict; +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: ${value}`); + return "source-over"; + } + if (value instanceof Name) { + switch (value.name) { + case "Normal": + case "Compatible": + return "source-over"; + case "Multiply": + return "multiply"; + case "Screen": + return "screen"; + case "Overlay": + return "overlay"; + case "Darken": + return "darken"; + case "Lighten": + return "lighten"; + case "ColorDodge": + return "color-dodge"; + case "ColorBurn": + return "color-burn"; + case "HardLight": + return "hard-light"; + case "SoftLight": + return "soft-light"; + case "Difference": + return "difference"; + case "Exclusion": + return "exclusion"; + case "Hue": + return "hue"; + case "Saturation": + return "saturation"; + case "Color": + return "color"; + case "Luminosity": + return "luminosity"; + } + warn(`Unsupported blend mode: ${value.name}`); + } + return parsingArray ? null : "source-over"; +} +function addCachedImageOps(opList, { + objId, + fn, + args, + optionalContent, + hasMask +}) { + if (objId) { + opList.addDependency(objId); + } + opList.addImageOps(fn, args, optionalContent, hasMask); + if (fn === OPS.paintImageMaskXObject && args[0]?.count > 0) { + args[0].count++; + } +} +class TimeSlotManager { + static TIME_SLOT_DURATION_MS = 20; + static CHECK_TIME_EVERY = 100; + constructor() { + this.reset(); + } + check() { + if (++this.checked < TimeSlotManager.CHECK_TIME_EVERY) { + return false; + } + this.checked = 0; + return this.endTime <= Date.now(); + } + reset() { + this.endTime = Date.now() + TimeSlotManager.TIME_SLOT_DURATION_MS; + this.checked = 0; + } +} +class PartialEvaluator { + constructor({ + xref, + handler, + pageIndex, + pageProxyId = null, + idFactory, + fontCache, + builtInCMapCache, + standardFontDataCache, + globalColorSpaceCache, + globalImageCache, + systemFontCache, + options = null + }) { + this.xref = xref; + this.handler = handler; + this.pageIndex = pageIndex; + this.pageProxyId = pageProxyId; + this.idFactory = idFactory; + this.fontCache = fontCache; + this.builtInCMapCache = builtInCMapCache; + this.standardFontDataCache = standardFontDataCache; + this.globalColorSpaceCache = globalColorSpaceCache; + this.globalImageCache = globalImageCache; + this.systemFontCache = systemFontCache; + this.options = options || DefaultPartialEvaluatorOptions; + this.type3FontRefs = null; + this._regionalImageCache = new RegionalImageCache(); + this._fetchBuiltInCMapBound = this.fetchBuiltInCMap.bind(this); + } + get _pdfFunctionFactory() { + return util_shadow(this, "_pdfFunctionFactory", new PDFFunctionFactory({ + xref: this.xref + })); + } + get parsingType3Font() { + return !!this.type3FontRefs; + } + clone(newOptions = null) { + const newEvaluator = Object.create(this); + newEvaluator.options = Object.assign(Object.create(null), this.options, newOptions); + return newEvaluator; + } + hasBlendModes(resources, nonBlendModesSet) { + if (!(resources instanceof Dict)) { + return false; + } + 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(name) { + const cachedData = this.builtInCMapCache.get(name); + if (cachedData) { + return cachedData; + } + let data; + if (this.options.useWorkerFetch) { + data = { + cMapData: await fetchBinaryData(`${this.options.cMapUrl}${name}.bcmap`), + isCompressed: true + }; + } else { + data = { + cMapData: await this.handler.sendWithPromise("FetchBinaryData", { + kind: "cMapUrl", + filename: `${name}${this.options.cMapPacked ? ".bcmap" : ""}` + }), + isCompressed: this.options.cMapPacked + }; + } + this.builtInCMapCache.set(name, data); + return data; + } + 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 standardFontNameToFileName = getFontNameToFileMap(), + filename = standardFontNameToFileName[name]; + let data; + try { + if (this.options.useWorkerFetch) { + data = await fetchBinaryData(`${this.options.standardFontDataUrl}${filename}`); + } else { + data = await this.handler.sendWithPromise("FetchBinaryData", { + kind: "standardFontDataUrl", + filename + }); + } + } catch (ex) { + warn(ex); + return null; + } + this.standardFontDataCache.set(name, data); + return new Stream(data); + } + async buildFormXObject(resources, xobj, smask, operatorList, task, initialState, localColorSpaceCache, seenRefs) { + const { + dict + } = xobj; + const matrix = lookupMatrix(dict.getArray("Matrix"), null); + const bbox = lookupNormalRect(dict.getArray("BBox"), null); + let f32bbox = bbox && new Float32Array(bbox); + if (f32bbox?.some(x => !isFinite(x))) { + f32bbox = 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"); + let newOpList; + const f32matrix = matrix && new Float32Array(matrix); + const args = [f32matrix, !group && f32bbox || null]; + const localResources = dict.get("Resources"); + if (group) { + groupOptions = { + matrix, + bbox: f32bbox, + smask, + isolated: false, + knockout: false, + needsIsolation: false, + hasSoftMask: false, + isGray: 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 = this._getColorSpace(group.getRaw("CS"), resources, localColorSpaceCache); + colorSpace = cs instanceof ColorSpace ? cs : await this._handleColorSpace(cs); + } + } + groupOptions.isGray = colorSpace?.numComps === 1; + if (smask?.backdrop) { + colorSpace ||= ColorSpaceUtils.rgb; + smask.backdrop = colorSpace.getRgbHex(smask.backdrop, 0); + } else if (smask?.subtype === "Luminosity") { + smask.backdrop = "#000000"; + } + newOpList = new CheckedOperatorList(); + } else { + newOpList = operatorList; + operatorList.addOp(OPS.paintFormXObjectBegin, args); + } + await this.getOperatorList({ + stream: xobj, + task, + resources: localResources instanceof Dict ? localResources : resources, + operatorList: newOpList, + initialState, + prevRefs: seenRefs + }); + if (group) { + groupOptions.needsIsolation = newOpList.needsIsolation || !!smask; + groupOptions.hasSoftMask = newOpList.hasSoftMask || !!smask; + operatorList.addOp(OPS.beginGroup, [groupOptions]); + operatorList.addOp(OPS.paintFormXObjectBegin, args); + operatorList.addOpList(newOpList); + operatorList.addOp(OPS.paintFormXObjectEnd, []); + operatorList.addOp(OPS.endGroup, [groupOptions]); + } else { + operatorList.addOp(OPS.paintFormXObjectEnd, []); + } + if (optionalContent !== undefined) { + operatorList.addOp(OPS.endMarkedContent, []); + } + } + _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.pageProxyId, "Image", imgData], transfers); + } + async buildPaintImageXObject({ + resources, + image, + isInline = false, + operatorList, + cacheKey, + localImageCache, + localColorSpaceCache + }) { + const { + maxImageSize, + ignoreErrors, + isOffscreenCanvasSupported + } = this.options; + const { + dict + } = image; + 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; + } + if (maxImageSize !== -1 && w * h > maxImageSize) { + const msg = "Image exceeded maximum allowed size and was removed."; + if (!ignoreErrors) { + throw new Error(msg); + } + warn(msg); + return; + } + let optionalContent; + if (dict.has("OC")) { + optionalContent = await this.parseMarkedContentProps(dict.get("OC"), resources); + } + const imageMask = dict.get("IM", "ImageMask") || false; + let imgData, fn, args; + if (imageMask) { + imgData = await PDFImage.createMask({ + image, + isOffscreenCanvasSupported: isOffscreenCanvasSupported && !this.parsingType3Font + }); + if (imgData.isSingleOpaquePixel) { + fn = OPS.paintSolidColorImageMask; + args = []; + operatorList.addImageOps(fn, args, optionalContent); + if (cacheKey) { + const cacheData = { + fn, + args, + optionalContent + }; + localImageCache.set(cacheKey, imageRef, cacheData); + if (imageRef) { + this._regionalImageCache.set(null, imageRef, cacheData); + } + } + return; + } + if (this.parsingType3Font) { + args = compileType3Glyph(imgData); + if (args) { + operatorList.addImageOps(OPS.constructPath, args, optionalContent); + return; + } + warn("Cannot compile Type3 glyph."); + operatorList.addImageOps(OPS.paintImageMaskXObject, [imgData], optionalContent); + return; + } + 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); + fn = OPS.paintImageMaskXObject; + args = [{ + data: objId, + width: imgData.width, + height: imgData.height, + interpolate: imgData.interpolate, + count: 1 + }]; + operatorList.addImageOps(fn, args, optionalContent); + if (cacheKey) { + const cacheData = { + objId, + fn, + args, + optionalContent + }; + localImageCache.set(cacheKey, imageRef, cacheData); + if (imageRef) { + this._regionalImageCache.set(null, imageRef, cacheData); + } + } + return; + } + const SMALL_IMAGE_DIMENSIONS = 200; + const hasMask = dict.has("SMask") || dict.has("Mask"); + if (isInline && w + h < SMALL_IMAGE_DIMENSIONS && !hasMask) { + try { + const imageObj = new PDFImage({ + xref: this.xref, + res: resources, + image, + isInline, + pdfFunctionFactory: this._pdfFunctionFactory, + globalColorSpaceCache: this.globalColorSpaceCache, + localColorSpaceCache + }); + imgData = await imageObj.createImageData(true, false); + operatorList.addImageOps(OPS.paintInlineImageXObject, [imgData], optionalContent); + } catch (reason) { + const msg = `Unable to decode inline image: "${reason}".`; + if (!ignoreErrors) { + throw new Error(msg); + } + warn(msg); + } + return; + } + let objId = `img_${this.idFactory.createObjId()}`, + cacheGlobally = false, + globalCacheData = null; + if (this.parsingType3Font) { + objId = `${this.idFactory.getDocId()}_type3_${objId}`; + } else if (cacheKey && imageRef) { + cacheGlobally = this.globalImageCache.shouldCache(imageRef, this.pageIndex); + if (cacheGlobally) { + util_assert(!isInline, "Cannot cache an inline image globally."); + objId = `${this.idFactory.getDocId()}_${objId}`; + } + } + operatorList.addDependency(objId); + fn = OPS.paintImageXObject; + args = [objId, w, h]; + operatorList.addImageOps(fn, args, optionalContent, hasMask); + if (cacheGlobally) { + globalCacheData = { + objId, + fn, + args, + optionalContent, + hasMask, + byteSize: 0 + }; + if (this.globalImageCache.hasDecodeFailed(imageRef)) { + this.globalImageCache.setData(imageRef, globalCacheData); + this._sendImgData(objId, null, cacheGlobally); + return; + } + if (w * h > 250000 || hasMask) { + const localLength = await this.handler.sendWithPromise("commonobj", [objId, "CopyLocalImage", { + imageRef + }]); + if (localLength) { + this.globalImageCache.setData(imageRef, globalCacheData); + this.globalImageCache.addByteSize(imageRef, localLength); + return; + } + } + } + PDFImage.buildImage({ + xref: this.xref, + res: resources, + image, + isInline, + pdfFunctionFactory: this._pdfFunctionFactory, + globalColorSpaceCache: this.globalColorSpaceCache, + localColorSpaceCache + }).then(async imageObj => { + imgData = await imageObj.createImageData(false, isOffscreenCanvasSupported); + 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(reason => { + warn(`Unable to decode image "${objId}": "${reason}".`); + if (imageRef) { + this.globalImageCache.addDecodeFailed(imageRef); + } + return this._sendImgData(objId, null, cacheGlobally); + }); + if (cacheKey) { + const cacheData = { + objId, + fn, + args, + optionalContent, + hasMask + }; + localImageCache.set(cacheKey, imageRef, cacheData); + if (imageRef) { + this._regionalImageCache.set(null, imageRef, cacheData); + if (cacheGlobally) { + util_assert(globalCacheData, "The global cache-data must be available."); + this.globalImageCache.setData(imageRef, globalCacheData); + } + } + } + } + #createTransferMap(fn) { + const transferFn = this._pdfFunctionFactory.create(fn), + tmp = new Float32Array(1); + return Uint8Array.from({ + length: 256 + }, (_, i) => { + tmp[0] = i / 255; + transferFn(tmp, 0, tmp, 0); + return tmp[0] * 255 | 0; + }); + } + handleSMask(smask, resources, operatorList, task, stateManager, localColorSpaceCache, seenRefs) { + const smaskContent = smask.get("G"); + const smaskOptions = { + subtype: smask.get("S").name, + backdrop: smask.get("BC") + }; + const transferObj = smask.get("TR"); + if (isPDFFunction(transferObj)) { + smaskOptions.transferMap = this.#createTransferMap(transferObj); + } + return this.buildFormXObject(resources, smaskContent, smaskOptions, operatorList, task, stateManager.state.clone({ + newPath: true + }), localColorSpaceCache, seenRefs); + } + handleTransferFunction(tr) { + let transferArray; + if (Array.isArray(tr)) { + transferArray = tr.length > 1 && tr.every(map => map === tr[0]) ? [tr[0]] : tr; + } else if (isPDFFunction(tr)) { + transferArray = [tr]; + } else { + return 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; + } + transferMaps.push(this.#createTransferMap(transferObj)); + numEffectfulFns++; + } + if (!(numFns === 1 || numFns === 4)) { + return null; + } + if (numEffectfulFns === 0) { + return null; + } + return transferMaps; + } + handleTilingType(fn, color, resources, pattern, patternDict, operatorList, task, localTilingPatternCache, seenRefs) { + const tilingOpList = new CheckedOperatorList(); + const patternResources = Dict.merge({ + xref: this.xref, + dictArray: [patternDict.get("Resources"), resources] + }); + return this.getOperatorList({ + stream: pattern, + task, + resources: patternResources, + operatorList: tilingOpList, + prevRefs: seenRefs + }).then(function () { + const operatorListIR = tilingOpList.getIR(); + const { + needsIsolation + } = tilingOpList; + const tilingPatternIR = getTilingPatternIR(operatorListIR, patternDict, color, needsIsolation); + operatorList.addDependencies(tilingOpList.dependencies); + operatorList.addOp(fn, tilingPatternIR); + if (patternDict.objId) { + localTilingPatternCache.set(null, patternDict.objId, { + operatorListIR, + needsIsolation, + dict: patternDict + }); + } + }).catch(reason => { + if (reason instanceof AbortException) { + return; + } + if (this.options.ignoreErrors) { + warn(`handleTilingType - ignoring pattern: "${reason}".`); + return; + } + throw reason; + }); + } + async handleSetFont(resources, fontArgs, fontRef, operatorList, task, state, fallbackFontDict = null, cssFontInfo = null, seenRefs = null) { + const fontName = fontArgs?.[0] instanceof Name ? fontArgs[0].name : null; + const translated = await this.loadFont(fontName, fontRef, resources, task, fallbackFontDict, cssFontInfo, seenRefs); + if (translated.font.isType3Font) { + operatorList.addDependencies(translated.type3Dependencies); + } + state.font = translated.font; + translated.send(this.handler); + return translated.loadedName; + } + 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" || state.strokeColorSpace.name === "Pattern" || font.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) { + warn(`ensureStateFont: "${reason}".`); + return; + } + throw reason; + } + async setGState({ + resources, + gState, + operatorList, + cacheKey, + task, + stateManager, + localGStateCache, + localColorSpaceCache, + seenRefs + }) { + const gStateRef = gState.objId; + let isSimpleGState = true; + const gStateObj = []; + let promise = Promise.resolve(); + for (const [key, value] of gState) { + switch (key) { + case "Type": + break; + case "LW": + if (typeof value !== "number") { + warn(`Invalid LW (line width): ${value}`); + break; + } + gStateObj.push([key, Math.abs(value)]); + break; + case "LC": + case "LJ": + case "ML": + case "D": + case "RI": + case "FL": + case "CA": + case "ca": + gStateObj.push([key, value]); + break; + case "Font": + isSimpleGState = false; + promise = promise.then(() => this.handleSetFont(resources, null, value[0], operatorList, task, stateManager.state, null, null, seenRefs).then(function (loadedName) { + operatorList.addDependency(loadedName); + gStateObj.push([key, [loadedName, value[1]]]); + })); + break; + case "BM": + gStateObj.push([key, normalizeBlendMode(value)]); + break; + case "SMask": + if (isName(value, "None")) { + gStateObj.push([key, false]); + break; + } + if (value instanceof Dict) { + isSimpleGState = false; + promise = promise.then(() => this.handleSMask(value, resources, operatorList, task, stateManager, localColorSpaceCache, seenRefs)); + gStateObj.push([key, true]); + } else { + warn("Unsupported SMask type"); + } + break; + case "TR": + if (gState.has("TR2")) { + break; + } + case "TR2": + { + const transferMaps = this.handleTransferFunction(value); + gStateObj.push(["TR", transferMaps]); + break; + } + case "OP": + case "op": + case "OPM": + case "BG": + case "BG2": + case "UCR": + case "UCR2": + case "HT": + case "SM": + case "SA": + case "AIS": + case "TK": + info("graphic state operator " + key); + break; + default: + info("Unknown graphic state operator " + key); + break; + } + } + await promise; + if (gStateObj.length > 0) { + operatorList.addOp(OPS.setGState, [gStateObj]); + } + if (isSimpleGState) { + localGStateCache.set(cacheKey, gStateRef, gStateObj); + } + } + loadFont(fontName, font, resources, task, fallbackFontDict = null, cssFontInfo = null, seenRefs = null) { + const errorFont = async () => new TranslatedFont({ + loadedName: "g_font_error", + font: new ErrorFont(`Font "${fontName}" is not available.`), + dict: font + }); + let fontRef; + if (font) { + if (font instanceof Ref) { + fontRef = font; + } + } else { + const fontRes = resources.get("Font"); + if (fontRes) { + fontRef = fontRes.getRaw(fontName); + } + } + 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 "${fontName}" is not available.`); + return errorFont(); + } + warn(`Font "${fontName}" is not available -- attempting to fallback to a default font.`); + font = fallbackFontDict || PartialEvaluator.fallbackFontDict; + } + if (font.cacheKey && this.fontCache.has(font.cacheKey)) { + return this.fontCache.get(font.cacheKey); + } + const { + promise, + resolve + } = Promise.withResolvers(); + let preEvaluatedFont; + try { + preEvaluatedFont = this.preEvaluateFont(font); + preEvaluatedFont.cssFontInfo = cssFontInfo; + } catch (reason) { + warn(`loadFont - preEvaluateFont failed: "${reason}".`); + return errorFont(); + } + 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 { + fontAliases[hash] = { + fontID: this.idFactory.createFontId() + }; + } + if (fontRefIsRef) { + fontAliases[hash].aliasRef = fontRef; + } + fontID = fontAliases[hash].fontID; + } else { + fontID = this.idFactory.createFontId(); + } + util_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(async translatedFont => { + const translated = new TranslatedFont({ + loadedName: font.loadedName, + font: translatedFont, + dict: font + }); + if (translatedFont.isType3Font) { + try { + await translated.loadType3Data(this, resources, task, seenRefs); + } catch (reason) { + throw new Error(`Type3 font load error: ${reason}`); + } + } + resolve(translated); + }).catch(reason => { + warn(`loadFont - translateFont failed: "${reason}".`); + resolve(new TranslatedFont({ + loadedName: font.loadedName, + font: new ErrorFont(reason?.message), + dict: font + })); + }); + return promise; + } + buildPath(fn, args, state) { + const { + pathMinMax: minMax, + pathBuffer + } = state; + switch (fn | 0) { + case OPS.rectangle: + { + const x = state.currentPointX = args[0]; + const y = state.currentPointY = args[1]; + const width = args[2]; + const height = args[3]; + const xw = x + width; + const yh = y + height; + if (width === 0 || height === 0) { + pathBuffer.push(DrawOPS.moveTo, x, y, DrawOPS.lineTo, xw, yh, DrawOPS.closePath); + } else { + pathBuffer.push(DrawOPS.moveTo, x, y, DrawOPS.lineTo, xw, y, DrawOPS.lineTo, xw, yh, DrawOPS.lineTo, x, yh, DrawOPS.closePath); + } + Util.rectBoundingBox(x, y, xw, yh, minMax); + break; + } + case OPS.moveTo: + { + const x = state.currentPointX = args[0]; + const y = state.currentPointY = args[1]; + pathBuffer.push(DrawOPS.moveTo, x, y); + Util.pointBoundingBox(x, y, minMax); + break; + } + case OPS.lineTo: + { + const x = state.currentPointX = args[0]; + const y = state.currentPointY = args[1]; + pathBuffer.push(DrawOPS.lineTo, x, y); + Util.pointBoundingBox(x, y, minMax); + break; + } + case OPS.curveTo: + { + const startX = state.currentPointX; + const startY = state.currentPointY; + const [x1, y1, x2, y2, x, y] = args; + state.currentPointX = x; + state.currentPointY = y; + pathBuffer.push(DrawOPS.curveTo, x1, y1, x2, y2, x, y); + Util.bezierBoundingBox(startX, startY, x1, y1, x2, y2, x, y, minMax); + break; + } + case OPS.curveTo2: + { + const startX = state.currentPointX; + const startY = state.currentPointY; + const [x1, y1, x, y] = args; + state.currentPointX = x; + state.currentPointY = y; + pathBuffer.push(DrawOPS.curveTo, startX, startY, x1, y1, x, y); + Util.bezierBoundingBox(startX, startY, startX, startY, x1, y1, x, y, minMax); + break; + } + case OPS.curveTo3: + { + const startX = state.currentPointX; + const startY = state.currentPointY; + const [x1, y1, x, y] = args; + state.currentPointX = x; + state.currentPointY = y; + pathBuffer.push(DrawOPS.curveTo, x1, y1, x, y, x, y); + Util.bezierBoundingBox(startX, startY, x1, y1, x, y, x, y, minMax); + break; + } + case OPS.closePath: + pathBuffer.push(DrawOPS.closePath); + break; + } + } + _getColorSpace(cs, resources, localColorSpaceCache) { + return ColorSpaceUtils.parse({ + cs, + xref: this.xref, + resources, + pdfFunctionFactory: this._pdfFunctionFactory, + globalColorSpaceCache: this.globalColorSpaceCache, + localColorSpaceCache, + asyncIfNotCached: true + }); + } + async _handleColorSpace(csPromise) { + try { + return await csPromise; + } catch (ex) { + if (ex instanceof AbortException) { + return null; + } + if (this.options.ignoreErrors) { + warn(`_handleColorSpace - ignoring ColorSpace: "${ex}".`); + return null; + } + throw ex; + } + } + parseShading({ + shading, + resources, + localColorSpaceCache, + localShadingPatternCache + }) { + let id = localShadingPatternCache.get(shading); + if (id) { + return id; + } + let patternIR; + try { + const shadingFill = Pattern.parseShading(shading, this.xref, resources, this._pdfFunctionFactory, this.globalColorSpaceCache, localColorSpaceCache); + patternIR = shadingFill.getIR(); + } catch (reason) { + if (reason instanceof AbortException) { + return null; + } + if (this.options.ignoreErrors) { + warn(`parseShading - ignoring shading: "${reason}".`); + localShadingPatternCache.set(shading, null); + return null; + } + throw reason; + } + id = `pattern_${this.idFactory.createObjId()}`; + if (this.parsingType3Font) { + id = `${this.idFactory.getDocId()}_type3_${id}`; + } + localShadingPatternCache.set(shading, id); + if (this.parsingType3Font) { + const buffer = compilePatternInfo(patternIR); + this.handler.send("commonobj", [id, "Pattern", buffer], [buffer]); + } else { + this.handler.send("obj", [id, this.pageProxyId, "Pattern", patternIR]); + } + return id; + } + handleColorN(operatorList, fn, args, cs, patterns, resources, task, localColorSpaceCache, localTilingPatternCache, localShadingPatternCache, seenRefs) { + 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 color = cs.base ? cs.base.getRgbHex(args, 0) : null; + const tilingPatternIR = getTilingPatternIR(localTilingPattern.operatorListIR, localTilingPattern.dict, color, localTilingPattern.needsIsolation); + operatorList.addOp(fn, tilingPatternIR); + return undefined; + } catch {} + } + 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.getRgbHex(args, 0) : null; + return this.handleTilingType(fn, color, resources, pattern, dict, operatorList, task, localTilingPatternCache, seenRefs); + } 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 undefined; + } + throw new FormatError(`Unknown PatternType: ${typeNum}`); + } + } + throw new FormatError(`Unknown PatternName: ${patternName}`); + } + async parseMarkedContentProps(contentProperties, resources) { + return parseMarkedContentProps(this.xref, contentProperties, resources); + } + async getOperatorList({ + stream, + task, + resources, + operatorList, + initialState = null, + fallbackFontDict = null, + prevRefs = null + }) { + if (stream.isAsync) { + const bytes = await stream.asyncGetBytes(); + if (bytes) { + stream = new Stream(bytes, 0, bytes.length, stream.dict); + } + } + const objId = stream.dict?.objId; + const seenRefs = new RefSet(prevRefs); + if (objId) { + if (prevRefs?.has(objId)) { + throw new Error(`getOperatorList - ignoring circular reference: ${objId}`); + } + seenRefs.put(objId); + } + resources ||= Dict.empty; + initialState ||= new EvalState(); + if (!operatorList) { + throw new Error('getOperatorList: missing "operatorList" parameter'); + } + const self = this; + const xref = this.xref; + 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(); + let markedContentLevel = 0; + function closePendingRestoreOPS(argument) { + for (let i = 0, ii = preprocessor.savedStatesDepth; i < ii; i++) { + operatorList.addOp(OPS.restore, []); + } + } + function closePendingMarkedContentOPS() { + for (; markedContentLevel > 0; markedContentLevel--) { + operatorList.addOp(OPS.endMarkedContent, []); + } + } + return new Promise(function promiseBody(resolve, reject) { + const next = function (promise) { + Promise.all([promise, operatorList.ready]).then(function () { + try { + promiseBody(resolve, reject); + } catch (ex) { + reject(ex); + } + }, reject); + }; + task.ensureNotTerminated(); + timeSlotManager.reset(); + const operation = {}; + let stop, 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) { + addCachedImageOps(operatorList, localImage); + args = null; + continue; + } + } + next(new Promise(function (resolveXObject, rejectXObject) { + if (!isValidName) { + throw new FormatError("XObject must be referred to by name."); + } + let xobj = xobjs.getRaw(name); + if (xobj instanceof Ref) { + const cachedImage = localImageCache.getByRef(xobj) || self._regionalImageCache.getByRef(xobj) || self.globalImageCache.getData(xobj, self.pageIndex); + if (cachedImage) { + addCachedImageOps(operatorList, cachedImage); + resolveXObject(); + return; + } + xobj = xref.fetch(xobj); + } + if (!(xobj instanceof BaseStream)) { + throw new FormatError("XObject should be a stream"); + } + const type = xobj.dict.get("Subtype"); + if (!(type instanceof Name)) { + throw new FormatError("XObject should have a Name subtype"); + } + if (type.name === "Form") { + stateManager.save(); + self.buildFormXObject(resources, xobj, null, operatorList, task, stateManager.state.clone({ + newPath: true + }), localColorSpaceCache, seenRefs).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}`); + } + resolveXObject(); + }).catch(reason => { + if (reason instanceof AbortException) { + return; + } + if (self.options.ignoreErrors) { + warn(`getOperatorList - ignoring XObject: "${reason}".`); + return; + } + throw reason; + })); + return; + case OPS.setFont: + const fontSize = args[1]; + next(self.handleSetFont(resources, args, null, operatorList, task, stateManager.state, fallbackFontDict, null, seenRefs).then(function (loadedName) { + operatorList.addDependency(loadedName); + operatorList.addOp(OPS.setFont, [loadedName, fontSize]); + })); + return; + case OPS.endInlineImage: + const cacheKey = args[0].cacheKey; + if (cacheKey) { + const localImage = localImageCache.getByName(cacheKey); + if (localImage) { + addCachedImageOps(operatorList, localImage); + args = null; + continue; + } + } + next(self.buildPaintImageXObject({ + resources, + image: args[0], + isInline: true, + operatorList, + cacheKey, + localImageCache, + localColorSpaceCache + })); + return; + case OPS.showText: + if (!stateManager.state.font) { + self.ensureStateFont(stateManager.state); + continue; + } + args[0] = self.handleText(args[0], stateManager.state); + break; + case OPS.showSpacedText: + if (!stateManager.state.font) { + self.ensureStateFont(stateManager.state); + continue; + } + const combinedGlyphs = [], + 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); + } + } + args[0] = combinedGlyphs; + fn = OPS.showText; + break; + case OPS.nextLineShowText: + if (!stateManager.state.font) { + self.ensureStateFont(stateManager.state); + continue; + } + 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 fillCS = self._getColorSpace(args[0], resources, localColorSpaceCache); + if (fillCS instanceof ColorSpace) { + stateManager.state.fillColorSpace = fillCS; + continue; + } + next(self._handleColorSpace(fillCS).then(colorSpace => { + stateManager.state.fillColorSpace = colorSpace || ColorSpaceUtils.gray; + })); + return; + } + case OPS.setStrokeColorSpace: + { + const strokeCS = self._getColorSpace(args[0], resources, localColorSpaceCache); + if (strokeCS instanceof ColorSpace) { + stateManager.state.strokeColorSpace = strokeCS; + continue; + } + next(self._handleColorSpace(strokeCS).then(colorSpace => { + stateManager.state.strokeColorSpace = colorSpace || ColorSpaceUtils.gray; + })); + return; + } + case OPS.setFillColor: + if (!isNumberArray(args, null)) { + continue; + } + cs = stateManager.state.fillColorSpace; + args = [cs.getRgbHex(args, 0)]; + fn = OPS.setFillRGBColor; + break; + case OPS.setStrokeColor: + if (!isNumberArray(args, null)) { + continue; + } + cs = stateManager.state.strokeColorSpace; + args = [cs.getRgbHex(args, 0)]; + fn = OPS.setStrokeRGBColor; + break; + case OPS.setFillGray: + if (!isNumberArray(args, null)) { + continue; + } + stateManager.state.fillColorSpace = ColorSpaceUtils.gray; + args = [ColorSpaceUtils.gray.getRgbHex(args, 0)]; + fn = OPS.setFillRGBColor; + break; + case OPS.setStrokeGray: + if (!isNumberArray(args, null)) { + continue; + } + stateManager.state.strokeColorSpace = ColorSpaceUtils.gray; + args = [ColorSpaceUtils.gray.getRgbHex(args, 0)]; + fn = OPS.setStrokeRGBColor; + break; + case OPS.setFillCMYKColor: + if (!isNumberArray(args, null)) { + continue; + } + stateManager.state.fillColorSpace = ColorSpaceUtils.cmyk; + args = [ColorSpaceUtils.cmyk.getRgbHex(args, 0)]; + fn = OPS.setFillRGBColor; + break; + case OPS.setStrokeCMYKColor: + if (!isNumberArray(args, null)) { + continue; + } + stateManager.state.strokeColorSpace = ColorSpaceUtils.cmyk; + args = [ColorSpaceUtils.cmyk.getRgbHex(args, 0)]; + fn = OPS.setStrokeRGBColor; + break; + case OPS.setFillRGBColor: + if (!isNumberArray(args, null)) { + continue; + } + stateManager.state.fillColorSpace = ColorSpaceUtils.rgb; + args = [ColorSpaceUtils.rgb.getRgbHex(args, 0)]; + break; + case OPS.setStrokeRGBColor: + if (!isNumberArray(args, null)) { + continue; + } + stateManager.state.strokeColorSpace = ColorSpaceUtils.rgb; + args = [ColorSpaceUtils.rgb.getRgbHex(args, 0)]; + break; + case OPS.setFillColorN: + cs = stateManager.state.patternFillColorSpace; + if (!cs) { + if (isNumberArray(args, null)) { + args = [ColorSpaceUtils.gray.getRgbHex(args, 0)]; + fn = OPS.setFillRGBColor; + break; + } + args = []; + fn = OPS.setFillTransparent; + break; + } + if (cs.name === "Pattern") { + if (!Array.isArray(args)) { + continue; + } + next(self.handleColorN(operatorList, OPS.setFillColorN, args, cs, patterns, resources, task, localColorSpaceCache, localTilingPatternCache, localShadingPatternCache, seenRefs)); + return; + } + if (!isNumberArray(args, null)) { + continue; + } + args = [cs.getRgbHex(args, 0)]; + fn = OPS.setFillRGBColor; + break; + case OPS.setStrokeColorN: + cs = stateManager.state.patternStrokeColorSpace; + if (!cs) { + if (isNumberArray(args, null)) { + args = [ColorSpaceUtils.gray.getRgbHex(args, 0)]; + fn = OPS.setStrokeRGBColor; + break; + } + args = []; + fn = OPS.setStrokeTransparent; + break; + } + if (cs.name === "Pattern") { + if (!Array.isArray(args)) { + continue; + } + next(self.handleColorN(operatorList, OPS.setStrokeColorN, args, cs, patterns, resources, task, localColorSpaceCache, localTilingPatternCache, localShadingPatternCache, seenRefs)); + return; + } + if (!isNumberArray(args, null)) { + continue; + } + args = [cs.getRgbHex(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, + seenRefs + }).then(resolveGState, rejectGState); + }).catch(reason => { + if (reason instanceof AbortException) { + return; + } + if (self.options.ignoreErrors) { + warn(`getOperatorList - ignoring ExtGState: "${reason}".`); + return; + } + throw reason; + })); + return; + case OPS.setLineWidth: + { + const [thickness] = args; + if (typeof thickness !== "number") { + warn(`Invalid setLineWidth: ${thickness}`); + continue; + } + args[0] = Math.abs(thickness); + break; + } + case OPS.setDash: + { + const dashPhase = args[1]; + if (typeof dashPhase !== "number") { + warn(`Invalid setDash: ${dashPhase}`); + continue; + } + const dashArray = args[0]; + if (!Array.isArray(dashArray)) { + warn(`Invalid setDash: ${dashArray}`); + continue; + } + if (dashArray.some(x => typeof x !== "number")) { + args[0] = dashArray.filter(x => typeof x === "number"); + } + break; + } + case OPS.moveTo: + case OPS.lineTo: + case OPS.curveTo: + case OPS.curveTo2: + case OPS.curveTo3: + case OPS.closePath: + case OPS.rectangle: + self.buildPath(fn, args, stateManager.state); + continue; + case OPS.stroke: + case OPS.closeStroke: + case OPS.fill: + case OPS.eoFill: + case OPS.fillStroke: + case OPS.eoFillStroke: + case OPS.closeFillStroke: + case OPS.closeEOFillStroke: + case OPS.endPath: + { + const { + state: { + pathBuffer, + pathMinMax + } + } = stateManager; + if (fn === OPS.closeStroke || fn === OPS.closeFillStroke || fn === OPS.closeEOFillStroke) { + pathBuffer.push(DrawOPS.closePath); + } + if (pathBuffer.length === 0) { + operatorList.addOp(OPS.constructPath, [fn, [null], null]); + } else { + operatorList.addOp(OPS.constructPath, [fn, [new Float32Array(pathBuffer)], pathMinMax.slice()]); + pathBuffer.length = 0; + pathMinMax.set(BBOX_INIT, 0); + } + continue; + } + case OPS.setTextMatrix: + operatorList.addOp(fn, [new Float32Array(args)]); + continue; + case OPS.markPoint: + case OPS.markPointProps: + case OPS.beginCompat: + case OPS.endCompat: + continue; + case OPS.beginMarkedContentProps: + markedContentLevel++; + 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; + } + args = [args[0].name, args[1] instanceof Dict ? args[1].get("MCID") : null]; + break; + case OPS.beginMarkedContent: + if (args?.some(argIsDict)) { + warn(`getOperatorList - ignoring operator: ${fn}`); + continue; + } + markedContentLevel++; + break; + case OPS.endMarkedContent: + if (args?.some(argIsDict)) { + warn(`getOperatorList - ignoring operator: ${fn}`); + continue; + } + if (markedContentLevel === 0) { + continue; + } + markedContentLevel--; + break; + default: + if (args?.some(argIsDict)) { + warn(`getOperatorList - ignoring operator: ${fn}`); + continue; + } + } + operatorList.addOp(fn, args); + } + if (stop) { + next(deferred); + return; + } + closePendingMarkedContentOPS(); + closePendingRestoreOPS(); + resolve(); + }).catch(reason => { + if (reason instanceof AbortException) { + return; + } + if (this.options.ignoreErrors) { + warn(`getOperatorList - ignoring errors during "${task.name}" ` + `task: "${reason}".`); + closePendingMarkedContentOPS(); + closePendingRestoreOPS(); + return; + } + throw reason; + }); + } + async getTextContent({ + stream, + task, + resources, + stateManager = null, + includeMarkedContent = false, + sink, + seenStyles = new Set(), + viewBox, + lang = null, + disableNormalization = false, + keepWhiteSpace = false, + prevRefs = null, + intersector = null + }) { + if (stream.isAsync) { + const bytes = await stream.asyncGetBytes(); + if (bytes) { + stream = new Stream(bytes, 0, bytes.length, stream.dict); + } + } + sink ??= textSinkWrapper(null); + const objId = stream.dict?.objId; + const seenRefs = new RefSet(prevRefs); + if (objId) { + if (prevRefs?.has(objId)) { + throw new Error(`getTextContent - ignoring circular reference: ${objId}`); + } + seenRefs.put(objId); + } + resources ||= Dict.empty; + stateManager ||= new StateManager(new TextState()); + let markedContentLevel = 0; + let textMarkedContentLevel = null; + 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, + prevTextRise: 0, + 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 !keepWhiteSpace && twoLastChars[twoLastCharsPos] !== " " && twoLastChars[(twoLastCharsPos + 1) % 2] === " "; + } + function resetLastChars() { + twoLastChars[0] = twoLastChars[1] = " "; + twoLastCharsPos = 0; + } + 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, currentTextState; + function pushWhitespace({ + width = 0, + height = 0, + transform = textContentItem.prevTransform, + fontName = textContentItem.fontName + }) { + intersector?.addExtraChar(" "); + textContent.items.push({ + str: " ", + dir: "ltr", + width, + height, + transform, + fontName, + hasEOL: false + }); + } + function getCurrentTextTransform() { + const font = textState.font; + const tsm = [textState.fontSize * textState.textHScale, 0, 0, textState.fontSize, 0, textState.textRise]; + if (font.isType3Font && (textState.fontSize <= 1 || font.isCharBBox) && !isArrayEqual(textState.fontMatrix, FONT_IDENTITY_MATRIX)) { + const glyphHeight = font.bbox[3] - font.bbox[1]; + if (glyphHeight > 0) { + tsm[3] *= glyphHeight * textState.fontMatrix[3]; + } + } + return Util.transform(textState.ctm, Util.transform(textState.textMatrix, tsm)); + } + function ensureTextContentItem() { + 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 (self.options.fontExtraProperties && font.systemFontInfo) { + const style = textContent.styles[loadedName]; + style.fontSubstitution = font.systemFontInfo.css; + style.fontSubstitutionLoadedName = font.systemFontInfo.loadedName; + } + } + 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 { + textContentItem.width = textContentItem.totalWidth = Math.hypot(trm[0], trm[1]); + textContentItem.height = textContentItem.totalHeight = 0; + textContentItem.vertical = true; + } + 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 (!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(textChunk) { + let text = textChunk.str.join(""); + if (!disableNormalization) { + text = normalizeUnicode(text); + } + const bidiResult = bidi(text, -1, textChunk.vertical); + return { + 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(fontName, fontRef) { + const translated = await self.loadFont(fontName, fontRef, resources, task, null, null, seenRefs); + textState.loadedName = translated.loadedName; + textState.font = translated.font; + textState.fontMatrix = translated.font.fontMatrix || FONT_IDENTITY_MATRIX; + } + 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(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: + [posX, posY] = [posY, posX]; + [lastPosX, lastPosY] = [lastPosY, lastPosX]; + break; + case 180: + [posX, posY, lastPosX, lastPosY] = [-posX, -posY, -lastPosX, -lastPosY]; + break; + case 270: + [posX, posY] = [-posY, -posX]; + [lastPosX, lastPosY] = [-lastPosY, -lastPosX]; + break; + default: + [posX, posY] = applyInverseRotation(posX, posY, currentTransform); + [lastPosX, lastPosY] = applyInverseRotation(lastPosX, lastPosY, textContentItem.prevTransform); + } + if (textState.font.vertical) { + const advanceY = (lastPosY - posY) / textContentItem.textAdvanceScale; + const advanceX = posX - lastPosX; + const textOrientation = Math.sign(textContentItem.height || textContentItem.totalHeight); + if (advanceY < textOrientation * textContentItem.negativeSpaceMax) { + if (Math.abs(advanceX) > 0.5 * textContentItem.width) { + appendEOL(); + return true; + } + resetLastChars(); + flushTextContentItem(); + return true; + } + if (Math.abs(advanceX) > textContentItem.width) { + appendEOL(); + return true; + } + if (advanceY <= textOrientation * textContentItem.notASpace) { + resetLastChars(); + } + if (advanceY <= textOrientation * textContentItem.trackingSpaceMin) { + if (shouldAddWhitepsace()) { + resetLastChars(); + flushTextContentItem(); + 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(advanceY) + }); + } else { + textContentItem.height += advanceY; + } + } + if (Math.abs(advanceX) > textContentItem.width * VERTICAL_SHIFT_RATIO) { + flushTextContentItem(); + } + return true; + } + const advanceX = (posX - lastPosX) / textContentItem.textAdvanceScale; + const advanceY = posY - lastPosY; + const textOrientation = Math.sign(textContentItem.width || textContentItem.totalWidth); + if (advanceX < textOrientation * textContentItem.negativeSpaceMax) { + if (Math.abs(advanceY) > 0.5 * textContentItem.height) { + appendEOL(); + return true; + } + resetLastChars(); + flushTextContentItem(); + return true; + } + const textRiseDelta = textState.textRise - textContentItem.prevTextRise; + const advanceYCorrected = textRiseDelta === 0 ? advanceY : advanceY - currentTransform[3] / textState.fontSize * textRiseDelta; + if (Math.abs(advanceYCorrected) > textContentItem.height) { + appendEOL(); + return true; + } + if (advanceX <= textOrientation * textContentItem.notASpace) { + resetLastChars(); + } + if (advanceX <= textOrientation * textContentItem.trackingSpaceMin) { + if (shouldAddWhitepsace()) { + resetLastChars(); + flushTextContentItem(); + 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(advanceX) + }); + } else { + textContentItem.width += advanceX; + } + } + if (Math.abs(advanceY) > textContentItem.height * VERTICAL_SHIFT_RATIO) { + flushTextContentItem(); + } + return true; + } + function buildTextContentItem({ + chars, + extraSpacing + }) { + if (currentTextState !== textState && (currentTextState.fontSize !== textState.fontSize || currentTextState.fontName !== textState.fontName && (currentTextState.font.name !== textState.font.name || currentTextState.font.vertical !== textState.font.vertical))) { + flushTextContentItem(); + currentTextState = textState.clone(); + } + const font = textState.font; + const baseCharSpacing = font.vertical ? -textState.charSpacing : textState.charSpacing; + if (!chars) { + const charSpacing = baseCharSpacing + extraSpacing; + if (charSpacing) { + if (!font.vertical) { + textState.translateTextMatrix(charSpacing * textState.textHScale, 0); + } else { + textState.translateTextMatrix(0, -charSpacing); + } + } + if (keepWhiteSpace) { + compareWithLastPosition(0); + } + return; + } + 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, + originalCharCode + } = glyph; + if (category.isInvisibleFormatMark) { + continue; + } + let charSpacing = baseCharSpacing + (i + 1 === ii ? extraSpacing : 0); + const glyphWidth = font.vertical ? glyph.vmetric[0] : glyph.width; + let scaledDim = glyphWidth * scale; + if (originalCharCode === 0x20) { + charSpacing += textState.wordSpacing; + } + if (!keepWhiteSpace && category.isWhitespace) { + if (!font.vertical) { + charSpacing += scaledDim; + textState.translateTextMatrix(charSpacing * textState.textHScale, 0); + } else { + charSpacing += -scaledDim; + textState.translateTextMatrix(0, -charSpacing); + } + saveLastChar(" "); + continue; + } + if (!category.isZeroWidthDiacritic && !compareWithLastPosition(scaledDim)) { + if (!font.vertical) { + textState.translateTextMatrix(scaledDim * textState.textHScale, 0); + } else { + textState.translateTextMatrix(0, scaledDim); + } + continue; + } + const textChunk = ensureTextContentItem(); + if (category.isZeroWidthDiacritic) { + scaledDim = 0; + } + if (!font.vertical) { + scaledDim *= textState.textHScale; + intersector?.addGlyph(getCurrentTextTransform(), scaledDim, 0, glyph.unicode); + textState.translateTextMatrix(scaledDim, 0); + textChunk.width += scaledDim; + } else { + intersector?.addGlyph(getCurrentTextTransform(), 0, scaledDim, glyph.unicode); + textState.translateTextMatrix(0, scaledDim); + scaledDim = Math.abs(scaledDim); + textChunk.height += scaledDim; + } + if (scaledDim) { + textChunk.prevTransform = getCurrentTextTransform(); + textChunk.prevTextRise = textState.textRise; + } + const glyphUnicode = glyph.unicode; + if (saveLastChar(glyphUnicode)) { + textChunk.str.push(" "); + intersector?.addExtraChar(" "); + } + if (!intersector) { + textChunk.str.push(glyphUnicode); + } + if (charSpacing) { + if (!font.vertical) { + textState.translateTextMatrix(charSpacing * textState.textHScale, 0); + } else { + textState.translateTextMatrix(0, -charSpacing); + } + } + } + } + function appendEOL() { + intersector?.addExtraChar("\n"); + resetLastChars(); + if (textContentItem.initialized) { + textContentItem.hasEOL = true; + flushTextContentItem(); + } else { + textContent.items.push({ + str: "", + dir: "ltr", + width: 0, + height: 0, + transform: getCurrentTextTransform(), + fontName: textState.loadedName, + hasEOL: true + }); + } + } + function addFakeSpaces(width, transf, textOrientation) { + if (textOrientation * textContentItem.spaceInFlowMin <= width && width <= textOrientation * textContentItem.spaceInFlowMax) { + if (textContentItem.initialized) { + resetLastChars(); + textContentItem.str.push(" "); + intersector?.addExtraChar(" "); + } + return false; + } + const fontName = textContentItem.fontName; + let height = 0; + if (textContentItem.vertical) { + height = width; + width = 0; + } + flushTextContentItem(); + resetLastChars(); + pushWhitespace({ + width: Math.abs(width), + height: Math.abs(height), + transform: transf || getCurrentTextTransform(), + fontName + }); + return true; + } + function flushTextContentItem() { + if (!textContentItem.initialized || !textContentItem.str) { + return; + } + 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; + } + function closePendingMarkedContentItems(level = 0) { + if (!includeMarkedContent || markedContentLevel <= level) { + return; + } + flushTextContentItem(); + for (; markedContentLevel > level; markedContentLevel--) { + textContent.items.push({ + type: "endMarkedContent" + }); + } + } + 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(resolve, reject); + } catch (ex) { + reject(ex); + } + }, reject); + }; + task.ensureNotTerminated(); + timeSlotManager.reset(); + const operation = {}; + let stop, + name, + isValidName, + args = []; + while (!(stop = timeSlotManager.check())) { + args.length = 0; + operation.args = args; + if (!preprocessor.read(operation)) { + break; + } + textState = stateManager.state; + currentTextState ||= textState.clone(); + const fn = operation.fn; + args = operation.args; + switch (fn | 0) { + case OPS.setFont: + const fontNameArg = args[0].name, + fontSizeArg = args[1]; + if (textState.font && fontNameArg === textState.fontName && fontSizeArg === textState.fontSize) { + break; + } + textState.fontName = fontNameArg; + textState.fontSize = fontSizeArg; + next(handleSetFont(fontNameArg, null)); + return; + case OPS.setTextRise: + textState.textRise = args[0]; + break; + case OPS.setHScale: + textState.textHScale = args[0] / 100; + break; + case OPS.setLeading: + textState.leading = args[0]; + break; + case OPS.moveText: + textState.translateTextLineMatrix(args[0], args[1]); + textState.textMatrix = textState.textLineMatrix.slice(); + break; + case OPS.setLeadingMoveText: + textState.leading = -args[1]; + textState.translateTextLineMatrix(args[0], args[1]); + textState.textMatrix = textState.textLineMatrix.slice(); + break; + case OPS.nextLine: + textState.carriageReturn(); + break; + 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 OPS.setCharSpacing: + textState.charSpacing = args[0]; + break; + case OPS.setWordSpacing: + textState.wordSpacing = args[0]; + break; + case OPS.beginText: + textState.textMatrix = IDENTITY_MATRIX.slice(); + textState.textLineMatrix = IDENTITY_MATRIX.slice(); + textMarkedContentLevel = markedContentLevel; + break; + case OPS.endText: + if (textMarkedContentLevel !== null) { + closePendingMarkedContentItems(textMarkedContentLevel); + textMarkedContentLevel = null; + } + break; + case OPS.showSpacedText: + if (!stateManager.state.font) { + self.ensureStateFont(stateManager.state); + continue; + } + const spaceFactor = (textState.font.vertical ? 1 : -1) * textState.fontSize / 1000; + for (const item of args[0]) { + 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 (showSpacedTextBuffer.length > 0) { + const str = showSpacedTextBuffer.join(""); + showSpacedTextBuffer.length = 0; + buildTextContentItem({ + chars: str, + extraSpacing: 0 + }); + } + break; + case OPS.showText: + if (!stateManager.state.font) { + self.ensureStateFont(stateManager.state); + continue; + } + buildTextContentItem({ + chars: args[0], + extraSpacing: 0 + }); + break; + case OPS.nextLineShowText: + if (!stateManager.state.font) { + self.ensureStateFont(stateManager.state); + continue; + } + textState.carriageReturn(); + buildTextContentItem({ + chars: args[0], + extraSpacing: 0 + }); + break; + case OPS.nextLineSetSpacingShowText: + if (!stateManager.state.font) { + self.ensureStateFont(stateManager.state); + continue; + } + textState.wordSpacing = args[0]; + textState.charSpacing = args[1]; + textState.carriageReturn(); + buildTextContentItem({ + chars: args[2], + extraSpacing: 0 + }); + break; + case OPS.paintXObject: + flushTextContentItem(); + xobjs ??= resources.get("XObject") || Dict.empty; + isValidName = args[0] instanceof Name; + name = args[0].name; + if (isValidName && emptyXObjectCache.getByName(name)) { + break; + } + next(new Promise(function (resolveXObject, rejectXObject) { + if (!isValidName) { + throw new FormatError("XObject must be referred to by name."); + } + 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 { + dict + } = xobj; + const type = dict.get("Subtype"); + if (!(type instanceof Name)) { + throw new FormatError("XObject should have a Name subtype"); + } + if (type.name !== "Form") { + emptyXObjectCache.set(name, dict.objId, true); + resolveXObject(); + return; + } + const currentState = stateManager.state.clone(); + const xObjStateManager = new StateManager(currentState); + const matrix = lookupMatrix(dict.getArray("Matrix"), null); + if (matrix) { + xObjStateManager.transform(matrix); + } + const localResources = dict.get("Resources"); + enqueueChunk(); + const sinkWrapper = textSinkWrapper(sink); + self.getTextContent({ + stream: xobj, + task, + resources: localResources instanceof Dict ? localResources : resources, + stateManager: xObjStateManager, + includeMarkedContent, + sink: sinkWrapper, + seenStyles, + viewBox, + lang, + disableNormalization, + keepWhiteSpace, + prevRefs: seenRefs + }).then(function () { + if (!sinkWrapper.enqueueInvoked) { + emptyXObjectCache.set(name, dict.objId, true); + } + resolveXObject(); + }, rejectXObject); + }).catch(reason => { + if (reason instanceof AbortException) { + return; + } + if (self.options.ignoreErrors) { + warn(`getTextContent - ignoring XObject: "${reason}".`); + return; + } + throw reason; + })); + return; + case OPS.setGState: + isValidName = args[0] instanceof Name; + name = args[0].name; + if (isValidName && emptyGStateCache.getByName(name)) { + break; + } + 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."); + } + 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(reason => { + if (reason instanceof AbortException) { + return; + } + if (self.options.ignoreErrors) { + warn(`getTextContent - ignoring ExtGState: "${reason}".`); + return; + } + throw reason; + })); + return; + case OPS.beginMarkedContent: + flushTextContentItem(); + if (includeMarkedContent) { + markedContentLevel++; + textContent.items.push({ + type: "beginMarkedContent", + tag: args[0] instanceof Name ? args[0].name : null + }); + } + break; + case OPS.beginMarkedContentProps: + flushTextContentItem(); + if (includeMarkedContent) { + markedContentLevel++; + const mcid = args[1] instanceof Dict ? args[1].get("MCID") : null; + textContent.items.push({ + type: "beginMarkedContentProps", + id: Number.isInteger(mcid) ? `${self.idFactory.getPageObjId()}_mc${mcid}` : null, + tag: args[0] instanceof Name ? args[0].name : null + }); + } + break; + case OPS.endMarkedContent: + flushTextContentItem(); + if (includeMarkedContent) { + if (markedContentLevel === 0) { + break; + } + markedContentLevel--; + textContent.items.push({ + type: "endMarkedContent" + }); + } + break; + } + if (textContent.items.length >= sink.desiredSize) { + stop = true; + break; + } + } + if (stop) { + next(deferred); + return; + } + flushTextContentItem(); + closePendingMarkedContentItems(); + enqueueChunk(); + resolve(); + }).catch(reason => { + if (reason instanceof AbortException) { + return; + } + if (this.options.ignoreErrors) { + warn(`getTextContent - ignoring errors during "${task.name}" ` + `task: "${reason}".`); + flushTextContentItem(); + closePendingMarkedContentItems(); + enqueueChunk(); + return; + } + throw reason; + }); + } + 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) { + properties.cidSystemInfo = { + registry: stringToPDFString(cidSystemInfo.get("Registry")), + ordering: stringToPDFString(cidSystemInfo.get("Ordering")), + supplement: cidSystemInfo.get("Supplement") + }; + } + try { + 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 differences = new Map(); + 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.set(index++, data.name); + } else { + throw new FormatError(`Invalid entry in 'Differences' array: ${data}`); + } + } + } + } 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); + } + if (baseEncodingName !== "MacRomanEncoding" && baseEncodingName !== "MacExpertEncoding" && baseEncodingName !== "WinAnsiEncoding") { + baseEncodingName = null; + } + } + const nonEmbeddedFont = !properties.file || properties.isInternalFont, + isSymbolsFontName = getSymbolsFonts()[properties.name]; + if (baseEncodingName && nonEmbeddedFont && isSymbolsFontName) { + baseEncodingName = null; + } + if (baseEncodingName === "WinAnsiEncoding" && nonEmbeddedFont && properties.name?.charCodeAt(0) >= 0xb7) { + const fontName = properties.name; + const chineseFontNames = ["\xCB\xCE\xCC\xE5", "\xBA\xDA\xCC\xE5", "\xBF\xAC\xCC\xE5", "\xB7\xC2\xCB\xCE", "\xBF\xAC\xCC\xE5_GB2312", "\xB7\xC2\xCB\xCE_GB2312", "\xC1\xA5\xCA\xE9", "\xD0\xC2\xCB\xCE", "\xB7\xC2\xCB\xCE\xCC\xE5", "\xD0\xA1\xB1\xEA\xCB\xCE"]; + if (chineseFontNames.includes(fontName)) { + baseEncodingName = null; + properties.defaultEncoding = "Adobe-GB1-UCS2"; + properties.composite = true; + properties.cidEncoding = Name.get("GBK-EUC-H"); + const cMap = await CMapFactory.create({ + encoding: properties.cidEncoding, + fetchBuiltInCMap: this._fetchBuiltInCMapBound, + useCMap: null + }); + properties.cMap = cMap; + properties.vertical = properties.cMap.vertical; + properties.cidSystemInfo = { + registry: "Adobe", + ordering: "GB1", + supplement: 0 + }; + } + } + if (baseEncodingName) { + properties.defaultEncoding = getEncoding(baseEncodingName); + } else { + let isSymbolicFont = !!(properties.flags & FontFlags.Symbolic); + const isNonsymbolicFont = !!(properties.flags & FontFlags.Nonsymbolic); + if (properties.type === "TrueType" && isSymbolicFont && isNonsymbolicFont && differences.size) { + properties.flags &= ~FontFlags.Symbolic; + isSymbolicFont = false; + } + 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.size; + 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(properties, forceGlyphs = false) { + util_assert(!properties.composite, "Must be a simple font."); + const toUnicode = new Map(); + const encoding = properties.defaultEncoding.slice(); + const baseEncodingName = properties.baseEncodingName; + for (const [charCode, glyphName] of properties.differences) { + if (glyphName === ".notdef") { + continue; + } + 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.set(+charcode, String.fromCharCode(unicode)); + continue; + } + let code = 0; + switch (glyphName[0]) { + case "G": + if (glyphName.length === 3) { + code = parseInt(glyphName.substring(1), 16); + } + break; + case "g": + if (glyphName.length === 5) { + code = parseInt(glyphName.substring(1), 16); + } + break; + case "C": + case "c": + if (glyphName.length >= 3 && glyphName.length <= 4) { + const codeStr = glyphName.substring(1); + if (forceGlyphs) { + code = parseInt(codeStr, 16); + break; + } + code = +codeStr; + if (Number.isNaN(code) && Number.isInteger(parseInt(codeStr, 16))) { + return this._simpleFontToUnicode(properties, true); + } + } + break; + case "u": + unicode = getUnicodeForGlyph(glyphName, glyphsUnicodeMap); + if (unicode !== -1) { + code = unicode; + } + break; + default: + switch (glyphName) { + case "f_h": + case "f_t": + case "T_h": + toUnicode.set(+charcode, glyphName.replaceAll("_", "")); + continue; + } + break; + } + if (code > 0 && code <= 0x10ffff && Number.isInteger(code)) { + if (baseEncodingName && code === +charcode) { + const baseEncoding = getEncoding(baseEncodingName); + if (baseEncoding && (glyphName = baseEncoding[charcode])) { + toUnicode.set(+charcode, String.fromCharCode(glyphsUnicodeMap[glyphName])); + continue; + } + } + toUnicode.set(+charcode, String.fromCodePoint(code)); + } + } + return toUnicode; + } + async buildToUnicode(properties) { + properties.hasIncludedToUnicodeMap = !!properties.toUnicode?.size; + 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 (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, + ordering + } = properties.cidSystemInfo; + const ucs2CMapName = Name.get(`${registry}-${ordering}-UCS2`); + const ucs2CMap = await CMapFactory.create({ + encoding: ucs2CMapName, + fetchBuiltInCMap: this._fetchBuiltInCMapBound, + useCMap: null + }); + const toUnicode = new Map(), + buf = []; + properties.cMap.forEach((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.set(charcode, String.fromCharCode(...buf)); + } + }); + return new ToUnicodeMap(toUnicode); + } + 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 + }); + return cmap instanceof IdentityCMap ? new IdentityToUnicodeMap(0, 0xffff) : new ToUnicodeMap(cmap.getMap()); + } + if (cmapObj instanceof BaseStream) { + try { + const cmap = await CMapFactory.create({ + encoding: cmapObj, + fetchBuiltInCMap: this._fetchBuiltInCMapBound, + useCMap: null + }); + if (cmap instanceof IdentityCMap) { + return new IdentityToUnicodeMap(0, 0xffff); + } + const map = new Map(); + cmap.forEach((charCode, token) => { + if (typeof token === "number") { + map.set(charCode, String.fromCodePoint(token)); + return; + } + 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; + } + k += 2; + const w2 = token.charCodeAt(k) << 8 | token.charCodeAt(k + 1); + str.push(((w1 & 0x3ff) << 10) + (w2 & 0x3ff) + 0x10000); + } + map.set(charCode, String.fromCodePoint(...str)); + }); + return new ToUnicodeMap(map); + } catch (reason) { + if (reason instanceof AbortException) { + return null; + } + if (this.options.ignoreErrors) { + warn(`readToUnicode - ignoring ToUnicode data: "${reason}".`); + return null; + } + throw reason; + } + } + return null; + } + readCidToGidMap(glyphsData, toUnicode) { + const map = new Map(); + 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; + } + map.set(code, glyphID); + } + return map; + } + 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; + } + 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++; + } + } 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; + } + } + } + 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/i.test(fontNameWoStyle); + } + getBaseFontMetrics(name) { + let defaultWidth = 0; + let widths = Object.create(null); + let monospace = false; + let fontName = normalizeFontName(name); + const stdFontMap = getStdFontMap(); + fontName = stdFontMap[fontName] || fontName; + const Metrics = getMetrics(); + const glyphWidths = Metrics[fontName] ?? Metrics[this.isSerifFont(name) ? "Times-Roman" : "Helvetica"]; + if (typeof glyphWidths === "number") { + defaultWidth = glyphWidths; + monospace = true; + } else { + widths = glyphWidths(); + } + return { + defaultWidth, + monospace, + widths + }; + } + buildCharCodeToWidth(widthsByGlyphName, properties) { + const widths = Object.create(null); + const diffs = properties.differences, + encoding = properties.defaultEncoding; + for (let charCode = 0; charCode < 256; charCode++) { + const width = diffs.has(charCode) && widthsByGlyphName[diffs.get(charCode)] || charCode in encoding && widthsByGlyphName[encoding[charCode]]; + if (width) { + widths[charCode] = width; + } + } + 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.stream || 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()); + } + } + if (type.name === "Type3") { + const charProcs = baseDict.get("CharProcs"); + if (charProcs instanceof Dict) { + for (const [key, entry] of charProcs.getRawEntries()) { + hash.update(entry instanceof Ref ? `${key}\0${entry}` : key); + } + } + } + } + return { + descriptor, + dict, + baseDict, + composite, + type: type.name, + firstChar, + lastChar, + toUnicode, + hash: hash ? hash.hexdigest() : "" + }; + } + async translateFont({ + descriptor, + dict, + baseDict, + composite, + type, + firstChar, + lastChar, + toUnicode, + cssFontInfo + }) { + const isType3Font = type === "Type3"; + if (!descriptor) { + if (isType3Font) { + descriptor = Dict.empty; + } else if (composite) { + descriptor = Dict.empty; + } else { + let baseFontName = dict.get("BaseFont"); + if (!(baseFontName instanceof Name)) { + throw new FormatError("Base font is not specified"); + } + baseFontName = normalizeFontName(baseFontName.name); + 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, 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++; + } + newProperties.widths = glyphWidths; + } else { + newProperties.widths = this.buildCharCodeToWidth(metrics.widths, newProperties); + } + return new Font(baseFontName, file, newProperties, this.options); + } + } + 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) { + if (!fontNameStr) { + fontName = Name.get(type); + } + } else if (fontNameStr !== baseFontStr) { + info(`The FontDescriptor's FontName is "${fontNameStr}" but ` + `should be the same as the Font's BaseFont "${baseFontStr}".`); + if (fontNameStr && baseFontStr && (baseFontStr.startsWith(fontNameStr) || !isKnownFontName(fontNameStr) && isKnownFontName(baseFontStr))) { + fontName = null; + } + fontName ||= baseFont; + } + if (!(fontName instanceof Name)) { + throw new FormatError("invalid font name"); + } + let fontFile, fontFileN, subtype, length1, length2, length3; + try { + for (const n of ["FontFile", "FontFile2", "FontFile3"]) { + fontFile = descriptor.get(n); + if (fontFile) { + fontFileN = n; + break; + } + } + if (fontFile) { + if (!(fontFile instanceof BaseStream)) { + throw new FormatError("FontFile should be a stream"); + } else { + if (fontFile.isAsync) { + const bytes = await fontFile.asyncGetBytes(); + if (bytes) { + fontFile = new Stream(bytes, 0, bytes.length, fontFile.dict); + } + } + 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 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 (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 (!isType3Font) { + const standardFontName = getStandardFontName(fontName.name); + if (standardFontName) { + fontFile = await this.fetchStandardFontData(standardFontName); + isInternalFont = !!fontFile; + } + if (!isInternalFont && this.options.useSystemFonts) { + systemFontInfo = getFontSubstitution(this.systemFontCache, this.idFactory, this.options.standardFontDataUrl, fontName.name, standardFontName, type); + } + } + const fontMatrix = lookupMatrix(dict.getArray("FontMatrix"), FONT_IDENTITY_MATRIX); + const bbox = lookupNormalRect(descriptor.getArray("FontBBox") || dict.getArray("FontBBox"), isType3Font ? [0, 0, 0, 0] : 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, + fontFileN, + 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 (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 + }); + properties.cMap = cMap; + properties.vertical = properties.cMap.vertical; + } + const newProperties = await this.extractDataStructures(dict, properties); + this.extractWidths(dict, descriptor, newProperties); + const font = new Font(fontName.name, fontFile, newProperties, this.options); + if (font.missingFile && !font.systemFontInfo && !isType3Font && this.options.useSystemFonts) { + const standardFontName = getStandardFontName(fontName.name); + const substitution = getFontSubstitution(this.systemFontCache, this.idFactory, this.options.standardFontDataUrl, fontName.name, standardFontName, type); + if (substitution) { + if (substitution.guessFallback) { + substitution.guessFallback = false; + substitution.css += `,${font.fallbackName}`; + } + font.systemFontInfo = substitution; + } + } + return font; + } + static buildFontPaths(font, glyphs, handler, evaluatorOptions) { + function buildPath(fontChar) { + const glyphName = `${font.loadedName}_path_${fontChar}`; + try { + const buffer = font.renderer.getPath(fontChar); + if (!buffer) { + return; + } + handler.send("commonobj", [glyphName, "FontPath", buffer], [buffer]); + } catch (reason) { + if (evaluatorOptions.ignoreErrors) { + warn(`buildFontPaths - ignoring ${glyphName} glyph: "${reason}".`); + return; + } + throw reason; + } + } + for (const glyph of glyphs) { + buildPath(glyph.fontChar); + const accent = glyph.accent; + if (accent?.fontChar) { + buildPath(accent.fontChar); + } + } + } + static get fallbackFontDict() { + 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 util_shadow(this, "fallbackFontDict", dict); + } +} +class TranslatedFont { + #sent = false; + #type3Loaded = null; + constructor({ + loadedName, + font, + dict + }) { + this.loadedName = loadedName; + this.font = font; + this.dict = dict; + this.type3Dependencies = font.isType3Font ? new Set() : null; + } + send(handler) { + if (this.#sent) { + return; + } + this.#sent = true; + const fontData = this.font.exportData(), + transfers = fontData.buffer ? [fontData.buffer] : null; + handler.send("commonobj", [this.loadedName, "Font", fontData], transfers); + } + fallback(handler, evaluatorOptions) { + if (!this.font.data) { + return; + } + this.font.disableFontFace = true; + PartialEvaluator.buildFontPaths(this.font, this.font.glyphCacheValues, handler, evaluatorOptions); + } + async loadType3Data(evaluator, resources, task, seenRefs = null) { + if (this.#type3Loaded) { + return this.#type3Loaded; + } + const { + dict, + font, + type3Dependencies + } = this; + util_assert(font.isType3Font, "Must be a Type3 font."); + const { + promise, + resolve + } = Promise.withResolvers(); + this.#type3Loaded = promise; + const type3Evaluator = evaluator.clone({ + ignoreErrors: false + }); + const type3FontRefs = new RefSet(evaluator.type3FontRefs); + if (dict.objId) { + type3FontRefs.put(dict.objId); + } + type3Evaluator.type3FontRefs = type3FontRefs; + const charProcs = dict.get("CharProcs"); + const fontResources = dict.get("Resources") || resources; + const charProcOperatorList = new Map(); + const [x0, y0, x1, y1] = font.bbox; + const fontBBoxSize = Math.hypot(x1 - x0, y1 - y0); + for (const key of charProcs.getKeys()) { + try { + const operatorList = new OperatorList(); + await type3Evaluator.getOperatorList({ + stream: charProcs.get(key), + task, + resources: fontResources, + operatorList, + prevRefs: seenRefs + }); + switch (operatorList.fnArray[0]) { + case OPS.setCharWidthAndBounds: + this.#removeType3ColorOperators(operatorList, fontBBoxSize); + break; + case OPS.setCharWidth: + if (!fontBBoxSize) { + this.#guessType3FontBBox(operatorList); + } + break; + } + charProcOperatorList.set(key, operatorList.getIR()); + for (const dependency of operatorList.dependencies) { + type3Dependencies.add(dependency); + } + } catch { + warn(`Type3 font resource "${key}" is not available.`); + charProcOperatorList.set(key, new OperatorList().getIR()); + } + } + font.charProcOperatorList = charProcOperatorList; + if (this._bbox) { + font.isCharBBox = true; + font.bbox = this._bbox; + } + resolve(); + return this.#type3Loaded; + } + #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) { + this._bbox ??= BBOX_INIT.slice(); + Util.rectBoundingBox(...charBBox, this._bbox); + } + let i = 0, + ii = operatorList.length; + while (i < ii) { + switch (operatorList.fnArray[i]) { + case OPS.setCharWidthAndBounds: + break; + 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 OPS.setGState: + const [gStateObj] = operatorList.argsArray[i]; + let j = 0, + jj = gStateObj.length; + while (j < jj) { + const [gStateKey] = gStateObj[j]; + switch (gStateKey) { + case "TR": + case "TR2": + case "HT": + case "BG": + case "BG2": + case "UCR": + case "UCR2": + gStateObj.splice(j, 1); + jj--; + continue; + } + j++; + } + break; + } + i++; + } + } + #guessType3FontBBox(operatorList) { + let i = 1; + const ii = operatorList.length; + while (i < ii) { + switch (operatorList.fnArray[i]) { + case OPS.constructPath: + const minMax = operatorList.argsArray[i][2]; + this._bbox ??= BBOX_INIT.slice(); + Util.rectBoundingBox(...minMax, this._bbox); + break; + } + i++; + } + } +} +class StateManager { + constructor(initialState = new EvalState()) { + this.state = initialState; + this.stateStack = []; + } + save() { + const old = this.state; + this.stateStack.push(this.state); + this.state = old.clone(); + } + restore() { + const prev = this.stateStack.pop(); + if (prev) { + this.state = prev; + } + } + transform(args) { + this.state.ctm = Util.transform(this.state.ctm, args); + } +} +class TextState { + ctm = new Float32Array(IDENTITY_MATRIX); + fontName = null; + fontSize = 0; + loadedName = null; + font = null; + fontMatrix = FONT_IDENTITY_MATRIX; + textMatrix = IDENTITY_MATRIX.slice(); + textLineMatrix = IDENTITY_MATRIX.slice(); + charSpacing = 0; + wordSpacing = 0; + leading = 0; + textHScale = 1; + textRise = 0; + 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(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(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(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 clone = Object.assign(Object.create(this), this); + clone.textMatrix = this.textMatrix.slice(); + clone.textLineMatrix = this.textLineMatrix.slice(); + clone.fontMatrix = this.fontMatrix.slice(); + return clone; + } +} +class EvalState { + ctm = new Float32Array(IDENTITY_MATRIX); + font = null; + textRenderingMode = TextRenderingMode.FILL; + _fillColorSpace = ColorSpaceUtils.gray; + _strokeColorSpace = ColorSpaceUtils.gray; + patternFillColorSpace = null; + patternStrokeColorSpace = null; + currentPointX = 0; + currentPointY = 0; + pathMinMax = F32_BBOX_INIT.slice(); + pathBuffer = []; + 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({ + newPath = false + } = {}) { + const clone = Object.create(this); + if (newPath) { + clone.pathBuffer = []; + clone.pathMinMax = F32_BBOX_INIT.slice(); + } + return clone; + } +} +class EvaluatorPreprocessor { + static get opMap() { + return util_shadow(this, "opMap", Object.assign(Object.create(null), { + 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, + fa: null, + fal: null, + fals: null, + false: null, + nu: null, + nul: null, + null: null + })); + } + static MAX_INVALID_PATH_OPS = 10; + constructor(stream, xref, stateManager = new StateManager()) { + this.parser = new Parser({ + lexer: new Lexer(stream, EvaluatorPreprocessor.opMap), + xref + }); + this.stateManager = stateManager; + this.nonProcessedArgs = []; + this._isPathOp = false; + this._numInvalidPathOPS = 0; + } + get savedStatesDepth() { + return this.stateManager.stateStack.length; + } + 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 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--; + } + while (argsLength < numArgs && nonProcessedArgs.length !== 0) { + if (args === null) { + args = []; + } + args.unshift(nonProcessedArgs.pop()); + argsLength++; + } + } + if (argsLength < numArgs) { + const partialMsg = `command ${cmd}: expected ${numArgs} args, ` + `but received ${argsLength} args.`; + if (this._isPathOp && ++this._numInvalidPathOPS > EvaluatorPreprocessor.MAX_INVALID_PATH_OPS) { + 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(fn, args); + operation.fn = fn; + operation.args = args; + return true; + } + 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(fn, args) { + switch (fn | 0) { + case OPS.save: + this.stateManager.save(); + break; + case OPS.restore: + this.stateManager.restore(); + break; + case OPS.transform: + this.stateManager.transform(args); + break; + } + } +} + +;// ./src/core/default_appearance.js + + + + + + + + + + + + + +class DefaultAppearanceEvaluator extends EvaluatorPreprocessor { + constructor(str) { + super(new StringStream(str)); + } + parse() { + const operation = { + fn: 0, + args: [] + }; + const result = { + fontSize: 0, + fontName: "", + fontColor: new Uint8ClampedArray(3) + }; + try { + 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 OPS.setFillRGBColor: + ColorSpaceUtils.rgb.getRgbItem(args, 0, result.fontColor, 0); + break; + case OPS.setFillGray: + ColorSpaceUtils.gray.getRgbItem(args, 0, result.fontColor, 0); + break; + case OPS.setFillCMYKColor: + ColorSpaceUtils.cmyk.getRgbItem(args, 0, result.fontColor, 0); + break; + } + } + } catch (reason) { + warn(`parseDefaultAppearance - ignoring errors: "${reason}".`); + } + return result; + } +} +function parseDefaultAppearance(str) { + return new DefaultAppearanceEvaluator(str).parse(); +} +class AppearanceStreamEvaluator extends EvaluatorPreprocessor { + constructor(stream, xref, globalColorSpaceCache) { + super(stream); + this.stream = stream; + this.xref = xref; + this.globalColorSpaceCache = globalColorSpaceCache; + this.resources = stream.dict?.get("Resources"); + } + parse() { + const operation = { + fn: 0, + args: [] + }; + let result = { + scaleFactor: 1, + fontSize: 0, + fontName: "", + fontColor: new Uint8ClampedArray(3), + fillColorSpace: ColorSpaceUtils.gray + }; + let breakLoop = false; + const stack = []; + try { + 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 OPS.restore: + result = stack.pop() || result; + break; + case OPS.setTextMatrix: + const tm = Util.transform(this.stateManager.state.ctm, args); + result.scaleFactor *= Math.hypot(tm[0], tm[1]); + break; + 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 OPS.setFillColorSpace: + result.fillColorSpace = ColorSpaceUtils.parse({ + cs: args[0], + xref: this.xref, + resources: this.resources, + pdfFunctionFactory: this._pdfFunctionFactory, + globalColorSpaceCache: this.globalColorSpaceCache, + localColorSpaceCache: this._localColorSpaceCache + }); + break; + case OPS.setFillColor: + const cs = result.fillColorSpace; + cs.getRgbItem(args, 0, result.fontColor, 0); + break; + case OPS.setFillRGBColor: + ColorSpaceUtils.rgb.getRgbItem(args, 0, result.fontColor, 0); + break; + case OPS.setFillGray: + ColorSpaceUtils.gray.getRgbItem(args, 0, result.fontColor, 0); + break; + case OPS.setFillCMYKColor: + ColorSpaceUtils.cmyk.getRgbItem(args, 0, result.fontColor, 0); + break; + case OPS.showText: + case OPS.showSpacedText: + case OPS.nextLineShowText: + case OPS.nextLineSetSpacingShowText: + result.fontSize *= result.scaleFactor; + breakLoop = true; + break; + } + } + } catch (reason) { + warn(`parseAppearanceStream - ignoring errors: "${reason}".`); + } + this.stream.reset(); + delete result.scaleFactor; + delete result.fillColorSpace; + return result; + } + get _localColorSpaceCache() { + return util_shadow(this, "_localColorSpaceCache", new LocalColorSpaceCache()); + } + get _pdfFunctionFactory() { + return util_shadow(this, "_pdfFunctionFactory", new PDFFunctionFactory({ + xref: this.xref + })); + } +} +function parseAppearanceStream(stream, xref, globalColorSpaceCache) { + return new AppearanceStreamEvaluator(stream, xref, globalColorSpaceCache).parse(); +} +function getPdfColor(color, isFill) { + if (color[0] === color[1] && color[1] === color[2]) { + const gray = color[0] / 255; + return `${core_utils_numberToString(gray)} ${isFill ? "g" : "G"}`; + } + return Array.from(color, c => core_utils_numberToString(c / 255)).join(" ") + ` ${isFill ? "rg" : "RG"}`; +} +function createDefaultAppearance({ + fontSize, + fontName, + fontColor +}) { + return `/${escapePDFName(fontName)} ${fontSize} Tf ${getPdfColor(fontColor, true)}`; +} +class FakeUnicodeFont { + static #fontNameId = 1; + constructor(xref, fontFamily) { + this.xref = xref; + this.widths = null; + this.firstChar = Infinity; + this.lastChar = -Infinity; + this.fontFamily = fontFamily; + const canvas = new OffscreenCanvas(1, 1); + this.ctxMeasure = canvas.getContext("2d", { + willReadFrequently: true + }); + this.fontName = Name.get(`InvalidPDFjsFont_${fontFamily}_${FakeUnicodeFont.#fontNameId++}`); + } + get fontDescriptorRef() { + if (!FakeUnicodeFont._fontDescriptorRef) { + const fontDescriptor = new Dict(this.xref); + fontDescriptor.setIfName("Type", "FontDescriptor"); + fontDescriptor.set("FontName", this.fontName); + fontDescriptor.set("FontFamily", "MyriadPro Regular"); + fontDescriptor.set("FontBBox", [0, 0, 0, 0]); + fontDescriptor.setIfName("FontStretch", "Normal"); + fontDescriptor.set("FontWeight", 400); + fontDescriptor.set("ItalicAngle", 0); + FakeUnicodeFont._fontDescriptorRef = this.xref.getNewPersistentRef(fontDescriptor); + } + return FakeUnicodeFont._fontDescriptorRef; + } + get descendantFontRef() { + const descendantFont = new Dict(this.xref); + descendantFont.set("BaseFont", this.fontName); + descendantFont.setIfName("Type", "Font"); + descendantFont.setIfName("Subtype", "CIDFontType0"); + descendantFont.setIfName("CIDToGIDMap", "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].sort(); + let currentChar = null; + let currentWidths = null; + for (const [char, width] of chars) { + if (!currentChar) { + currentChar = char; + currentWidths = [width]; + continue; + } + 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 baseFont = new Dict(this.xref); + baseFont.set("BaseFont", this.fontName); + baseFont.setIfName("Type", "Font"); + baseFont.setIfName("Subtype", "Type0"); + baseFont.setIfName("Encoding", "Identity-H"); + baseFont.set("DescendantFonts", [this.descendantFontRef]); + baseFont.setIfName("ToUnicode", "Identity-H"); + return this.xref.getNewPersistentRef(baseFont); + } + get resources() { + 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(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(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 = (/* inlined export .LINE_FACTOR */1.35) * fontSize; + const lineDescent = (/* inlined export .LINE_DESCENT_FACTOR */0.35) * fontSize; + return { + coords: [0, h + lineDescent - lineHeight], + bbox: [0, 0, w, h], + matrix: rotation !== 0 ? getRotationMatrix(rotation, h, lineHeight) : undefined + }; + } + 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); + } + } + } + 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 hscale = maxWidth > w ? w / maxWidth : 1; + let vscale = 1; + const lineHeight = (/* inlined export .LINE_FACTOR */1.35) * fontSize; + const lineDescent = (/* inlined export .LINE_DESCENT_FACTOR */0.35) * 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 ${core_utils_numberToString(w)} ${core_utils_numberToString(h)} re W n`, `BT`, `1 0 0 1 0 ${core_utils_numberToString(h + lineDescent)} Tm 0 Tc ${getPdfColor(bgColor, true)}`, `/${this.fontName.name} ${core_utils_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.setIfName("Type", "ExtGState"); + extGState.set("R0", r0); + resources.set("ExtGState", extGState); + } + const vShift = core_utils_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.setIfName("Subtype", "Form"); + appearanceStreamDict.setIfName("Type", "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); + } + return new StringStream(appearance, appearanceStreamDict); + } +} + +;// ./src/shared/scripting_utils.js +/* unused harmony import specifier */ var scripting_utils_MathClamp; + + + +function makeColorComp(n) { + return Math.floor(scripting_utils_MathClamp(n, 0, 1) * 255).toString(16).padStart(2, "0"); +} +function scaleAndClamp(x) { + return scripting_utils_MathClamp(x, 0, 1) * 255; +} +class ColorConverters { + static CMYK_G([c, y, m, k]) { + return ["G", 1 - Math.min(1, 0.3 * c + 0.59 * m + 0.11 * y + k)]; + } + static G_CMYK([g]) { + return ["CMYK", 0, 0, 0, 1 - g]; + } + static G_RGB([g]) { + return ["RGB", g, g, g]; + } + static G_rgb([g]) { + g = scaleAndClamp(g); + return [g, g, g]; + } + static G_HTML([g]) { + const G = makeColorComp(g); + return `#${G}${G}${G}`; + } + static RGB_G([r, g, b]) { + return ["G", 0.3 * r + 0.59 * g + 0.11 * b]; + } + static RGB_rgb(color) { + return color.map(scaleAndClamp); + } + static RGB_HTML(color) { + return `#${color.map(makeColorComp).join("")}`; + } + static T_HTML() { + return "#00000000"; + } + static T_rgb() { + return [null]; + } + static CMYK_RGB([c, y, m, k]) { + return ["RGB", 1 - Math.min(1, c + k), 1 - Math.min(1, m + k), 1 - Math.min(1, y + k)]; + } + static CMYK_rgb([c, y, m, k]) { + return [scaleAndClamp(1 - Math.min(1, c + k)), scaleAndClamp(1 - Math.min(1, m + k)), scaleAndClamp(1 - Math.min(1, y + k))]; + } + static CMYK_HTML(components) { + const rgb = this.CMYK_RGB(components).slice(1); + return this.RGB_HTML(rgb); + } + static RGB_CMYK([r, g, b]) { + const c = 1 - r; + const m = 1 - g; + const y = 1 - b; + const k = Math.min(c, m, y); + return ["CMYK", c, m, y, k]; + } +} +const DateFormats = ["m/d", "m/d/yy", "mm/dd/yy", "mm/yy", "d-mmm", "d-mmm-yy", "dd-mmm-yy", "yy-mm-dd", "mmm-yy", "mmmm-yy", "mmm d, yyyy", "mmmm d, yyyy", "m/d/yy h:MM tt", "m/d/yy HH:MM"]; +const TimeFormats = ["HH:MM", "h:MM tt", "HH:MM:ss", "h:MM:ss tt"]; + +;// ./node_modules/core-js/modules/es.json.stringify.js +es_json_stringify_namespaceFn(); + +;// ./src/core/name_number_tree.js + + + + + +class NameOrNumberTree { + constructor(root, xref, type) { + this.root = root; + this.xref = xref; + this._type = type; + } + getAll(isRaw = false) { + const map = new Map(); + if (!this.root) { + return map; + } + const xref = this.xref; + const processed = new RefSet(); + if (this.root instanceof Ref) { + processed.put(this.root); + } + const queue = [this.root]; + for (const node of queue) { + const obj = xref.fetchIfRef(node); + 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 (kid instanceof Ref) { + if (processed.has(kid)) { + throw new FormatError(`Duplicate entry in "${this._type}" tree.`); + } + processed.put(kid); + } + queue.push(kid); + } + continue; + } + const entries = obj.get(this._type); + if (!Array.isArray(entries)) { + continue; + } + for (let i = 0, ii = entries.length; i < ii; i += 2) { + map.set(isRaw ? entries[i] : xref.fetchIfRef(entries[i]), isRaw ? entries[i + 1] : xref.fetchIfRef(entries[i + 1])); + } + } + return map; + } + 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 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 (l > r) { + return null; + } + } + const entries = kidsOrEntries.get(this._type); + if (Array.isArray(entries)) { + let l = 0, + r = entries.length - 2; + while (l <= r) { + const tmp = l + r >> 1, + m = tmp + (tmp & 1); + const currentKey = xref.fetchIfRef(entries[m]); + if (key < currentKey) { + r = m - 2; + } else if (key > currentKey) { + l = m + 2; + } else { + return entries[m + 1]; + } + } + } + return null; + } + get(key) { + return this.xref.fetchIfRef(this.getRaw(key)); + } +} +class NameTree extends NameOrNumberTree { + constructor(root, xref) { + super(root, xref, "Names"); + } +} +class NumberTree extends NameOrNumberTree { + constructor(root, xref) { + super(root, xref, "Nums"); + } +} + +;// ./src/core/cleanup_helper.js + + + + +function clearGlobalCaches() { + clearPatternCaches(); + clearPrimitiveCaches(); + clearUnicodeCaches(); + WasmImage.cleanup(); +} + +;// ./src/core/file_spec.js + + + + +class FileSpec { + constructor(root) { + if (!(root instanceof Dict)) { + return; + } + this.root = root; + if (root.has("RF")) { + warn("Related file specifications are not supported"); + } + } + get filename() { + const item = FileSpec.pickPlatformItem(this.root); + if (item && typeof item === "string") { + return stringToPDFString(item, true).replaceAll("\\\\", "\\").replaceAll("\\/", "/").replaceAll("\\", "/"); + } + return ""; + } + get description() { + const desc = this.root?.get("Desc"); + return desc && typeof desc === "string" ? stringToPDFString(desc) : ""; + } + get serializable() { + const { + filename, + description + } = this; + return { + rawFilename: filename, + filename: stripPath(filename) || "unnamed", + description + }; + } + static pickPlatformItem(dict, raw = false) { + if (dict instanceof Dict) { + for (const key of ["UF", "F", "Unix", "Mac", "DOS"]) { + if (dict.has(key)) { + return raw ? dict.getRaw(key) : dict.get(key); + } + } + } + return null; + } + static hasEmbeddedFile(fileSpecDict) { + return this.pickPlatformItem(fileSpecDict.get("EF")) instanceof BaseStream; + } + static readContent(dict) { + if (!(dict instanceof Dict)) { + return null; + } + const ef = this.pickPlatformItem(dict.get("EF")); + if (!(ef instanceof BaseStream)) { + warn("Embedded file specification points to non-existing/invalid content"); + return null; + } + return this.readStreamContent(ef); + } + static readStreamContent(stream) { + const encrypt = stream.dict?.xref?.encrypt; + if (encrypt?.encryptionKey === null) { + throw new PasswordException("No password given", PasswordResponses.NEED_PASSWORD); + } + return stream.getBytes(); + } +} + +;// ./src/core/xml_parser.js + + + + + +const XMLParserErrorCode = { + NoError: 0, + EndOfDocument: -1, + UnterminatedCdata: -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"; +} +function isWhitespaceString(s) { + for (let i = 0, ii = s.length; i < ii; i++) { + if (!isWhitespace(s, i)) { + return false; + } + } + return true; +} +class XMLParserBase { + static get _entityRegex() { + return util_shadow(this, "_entityRegex", /&(?:#x([^;&]+)|#([^;&]+)|([^;&]+));/g); + } + _resolveEntities(s) { + return s.replaceAll(XMLParserBase._entityRegex, (all, hex, dec, entity) => { + if (hex || dec) { + const code = hex ? parseInt(hex, 16) : parseInt(dec, 10); + return code >= 0 && code <= 0x10ffff ? String.fromCodePoint(code) : all; + } + switch (entity) { + case "lt": + return "<"; + case "gt": + return ">"; + case "amp": + return "&"; + case "quot": + return '"'; + case "apos": + return "'"; + } + return this.onResolveEntity(entity); + }); + } + _parseContent(s, start) { + const attributes = []; + let pos = start; + function skipWs() { + while (pos < s.length && isWhitespace(s, pos)) { + ++pos; + } + } + while (pos < s.length && !isWhitespace(s, pos) && s[pos] !== ">" && s[pos] !== "/") { + ++pos; + } + const name = s.substring(start, pos); + skipWs(); + while (pos < s.length && s[pos] !== ">" && s[pos] !== "/" && s[pos] !== "?") { + skipWs(); + let attrName = "", + attrValue = ""; + while (pos < s.length && !isWhitespace(s, pos) && s[pos] !== "=") { + attrName += s[pos]; + ++pos; + } + skipWs(); + if (s[pos] !== "=") { + return null; + } + ++pos; + skipWs(); + const attrEndChar = s[pos]; + if (attrEndChar !== '"' && attrEndChar !== "'") { + return null; + } + const attrEndIndex = s.indexOf(attrEndChar, ++pos); + if (attrEndIndex < 0) { + return null; + } + attrValue = s.substring(pos, attrEndIndex); + attributes.push({ + name: attrName, + value: this._resolveEntities(attrValue) + }); + pos = attrEndIndex + 1; + skipWs(); + } + return { + name, + attributes, + parsed: pos - start + }; + } + _parseProcessingInstruction(s, start) { + let pos = start; + function skipWs() { + while (pos < s.length && isWhitespace(s, pos)) { + ++pos; + } + } + while (pos < s.length && !isWhitespace(s, pos) && s[pos] !== ">" && s[pos] !== "?" && s[pos] !== "/") { + ++pos; + } + const name = s.substring(start, pos); + skipWs(); + const attrStart = pos; + while (pos < s.length && (s[pos] !== "?" || s[pos + 1] !== ">")) { + ++pos; + } + const value = s.substring(attrStart, pos); + return { + name, + value, + parsed: pos - start + }; + } + parseXml(s) { + let i = 0; + while (i < s.length) { + const ch = s[i]; + let j = i; + if (ch === "<") { + ++j; + const ch2 = s[j]; + let q; + switch (ch2) { + case "/": + ++j; + q = s.indexOf(">", j); + if (q < 0) { + this.onError(XMLParserErrorCode.UnterminatedElement); + return; + } + this.onEndElement(s.substring(j, q)); + j = q + 1; + break; + case "?": + ++j; + const pi = this._parseProcessingInstruction(s, j); + if (s.substring(j + pi.parsed, j + pi.parsed + 2) !== "?>") { + this.onError(XMLParserErrorCode.UnterminatedXmlDeclaration); + return; + } + this.onPi(pi.name, pi.value); + j += pi.parsed + 2; + break; + case "!": + if (s.substring(j + 1, j + 3) === "--") { + q = s.indexOf("-->", j + 3); + if (q < 0) { + this.onError(XMLParserErrorCode.UnterminatedComment); + return; + } + this.onComment(s.substring(j + 3, q)); + j = q + 3; + } else if (s.substring(j + 1, j + 8) === "[CDATA[") { + q = s.indexOf("]]>", j + 8); + if (q < 0) { + this.onError(XMLParserErrorCode.UnterminatedCdata); + return; + } + this.onCdata(s.substring(j + 8, q)); + j = q + 3; + } else if (s.substring(j + 1, j + 8) === "DOCTYPE") { + const q2 = s.indexOf("[", j + 8); + let complexDoctype = false; + q = s.indexOf(">", j + 8); + if (q < 0) { + this.onError(XMLParserErrorCode.UnterminatedDoctypeDeclaration); + return; + } + if (q2 > 0 && q > q2) { + q = s.indexOf("]>", j + 8); + if (q < 0) { + this.onError(XMLParserErrorCode.UnterminatedDoctypeDeclaration); + return; + } + complexDoctype = true; + } + const doctypeContent = s.substring(j + 8, q + (complexDoctype ? 1 : 0)); + this.onDoctype(doctypeContent); + j = q + (complexDoctype ? 2 : 1); + } else { + this.onError(XMLParserErrorCode.MalformedElement); + return; + } + break; + default: + const content = this._parseContent(s, j); + if (content === null) { + this.onError(XMLParserErrorCode.MalformedElement); + return; + } + let isClosed = false; + if (s.substring(j + content.parsed, j + content.parsed + 2) === "/>") { + isClosed = true; + } else if (s.substring(j + content.parsed, j + content.parsed + 1) !== ">") { + this.onError(XMLParserErrorCode.UnterminatedElement); + return; + } + this.onBeginElement(content.name, content.attributes, isClosed); + j += content.parsed + (isClosed ? 2 : 1); + break; + } + } else { + while (j < s.length && s[j] !== "<") { + j++; + } + const text = s.substring(i, j); + this.onText(this._resolveEntities(text)); + } + i = j; + } + } + onResolveEntity(name) { + return `&${name};`; + } + onPi(name, value) {} + onComment(text) {} + onCdata(text) {} + onDoctype(doctypeContent) {} + onText(text) {} + onBeginElement(name, attributes, isEmpty) {} + onEndElement(name) {} + onError(code) {} +} +class SimpleDOMNode { + 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 childNodes = this.parentNode.childNodes; + if (!childNodes) { + return undefined; + } + const index = childNodes.indexOf(this); + return index === -1 ? undefined : childNodes[index + 1]; + } + get textContent() { + return !this.childNodes ? this.nodeValue || "" : this.childNodes.map(child => child.textContent).join(""); + } + get children() { + return this.childNodes || []; + } + hasChildNodes() { + return this.childNodes?.length > 0; + } + 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; + } + } else if (stack.length === 0) { + return null; + } else { + const [parent] = stack.pop(); + let siblingPos = 0; + for (const child of parent.childNodes) { + if (component.name === child.nodeName) { + if (siblingPos === component.pos) { + return child.searchNode(paths, pos + 1); + } + siblingPos++; + } + } + return node.searchNode(paths, pos + 1); + } + } + if (node.childNodes?.length > 0) { + stack.push([node, 0]); + node = node.childNodes[0]; + } else if (stack.length === 0) { + return null; + } else { + while (stack.length !== 0) { + const [parent, currentPos] = stack.pop(); + const newPos = currentPos + 1; + if (newPos < parent.childNodes.length) { + stack.push([parent, newPos]); + node = parent.childNodes[newPos]; + break; + } + } + if (stack.length === 0) { + return null; + } + } + } + } + dump(buffer) { + if (this.nodeName === "#text") { + buffer.push(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 = false, + lowerCaseName = false + }) { + super(); + this._currentFragment = null; + this._stack = null; + this._errorCode = XMLParserErrorCode.NoError; + this._hasAttributes = hasAttributes; + this._lowerCaseName = lowerCaseName; + } + parseFromString(data) { + this._currentFragment = []; + this._stack = []; + this._errorCode = XMLParserErrorCode.NoError; + this.parseXml(data); + if (this._errorCode !== XMLParserErrorCode.NoError) { + return undefined; + } + const [documentElement] = this._currentFragment; + if (!documentElement) { + return undefined; + } + return { + documentElement + }; + } + onText(text) { + if (isWhitespaceString(text)) { + return; + } + const node = new SimpleDOMNode("#text", text); + this._currentFragment.push(node); + } + onCdata(text) { + const node = new SimpleDOMNode("#text", text); + this._currentFragment.push(node); + } + onBeginElement(name, attributes, isEmpty) { + if (this._lowerCaseName) { + name = name.toLowerCase(); + } + const node = new SimpleDOMNode(name); + node.childNodes = []; + if (this._hasAttributes) { + node.attributes = attributes; + } + this._currentFragment.push(node); + if (isEmpty) { + return; + } + this._stack.push(this._currentFragment); + this._currentFragment = node.childNodes; + } + onEndElement(name) { + this._currentFragment = this._stack.pop() || []; + const lastElement = this._currentFragment.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); + } + } + _repair(data) { + return data.replace(/^[^<]+/, "").replaceAll(/>\\376\\377([^<]+)/g, function (all, codes) { + const bytes = codes.replaceAll(/\\([0-3])([0-7])([0-7])/g, (_, d1, d2, d3) => 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 charBuf.join(""); + }); + } + _getSequence(entry) { + const name = entry.nodeName; + return name !== "rdf:bag" && name !== "rdf:seq" && name !== "rdf:alt" ? null : entry.childNodes.filter(node => node.nodeName === "rdf:li"); + } + _parseArray(entry) { + if (!entry.hasChildNodes()) { + return; + } + const [seqNode] = entry.childNodes; + const sequence = this._getSequence(seqNode) || []; + this._metadataMap.set(entry.nodeName, sequence.map(node => node.textContent.trim())); + } + _parse(xmlDocument) { + let rdf = xmlDocument.documentElement; + if (rdf.nodeName !== "rdf:rdf") { + rdf = rdf.firstChild; + while (rdf && rdf.nodeName !== "rdf:rdf") { + rdf = rdf.nextSibling; + } + } + if (!rdf || rdf.nodeName !== "rdf:rdf" || !rdf.hasChildNodes()) { + return; + } + for (const desc of rdf.childNodes) { + if (desc.nodeName !== "rdf:description") { + continue; + } + for (const entry of desc.childNodes) { + const name = entry.nodeName; + switch (name) { + case "#text": + continue; + case "dc:creator": + case "dc:subject": + this._parseArray(entry); + continue; + } + this._metadataMap.set(name, entry.textContent.trim()); + } + } + } + get serializable() { + return { + parsedData: this._metadataMap, + rawData: this._data + }; + } +} + +;// ./src/core/sound.js + + + + + + + +const WAV_HEADER_SIZE = 44; +function getSoundFormat(dict) { + if (!dict || dict.has("CO")) { + return null; + } + const sampleRate = dict.get("R"); + if (!Number.isInteger(sampleRate) || sampleRate <= 0) { + return null; + } + const channels = dict.get("C") ?? 1; + if (!Number.isInteger(channels) || channels < 1 || channels > 2) { + return null; + } + const bitsPerSample = dict.get("B") ?? 8; + if (bitsPerSample !== 8 && bitsPerSample !== 16) { + return null; + } + const e = dict.get("E"); + let encoding = "Raw"; + if (e !== undefined) { + encoding = e instanceof Name ? e.name : null; + } + return encoding !== "Raw" && encoding !== "Signed" ? null : { + channels, + sampleRate, + bitsPerSample, + encoding + }; +} +function soundStreamToWav(stream, samples) { + const format = getSoundFormat(stream.dict); + if (!format) { + return null; + } + const { + channels, + sampleRate, + bitsPerSample, + encoding + } = format; + const blockAlign = channels * (bitsPerSample >> 3); + const dataLength = samples.length - samples.length % blockAlign; + if (dataLength === 0) { + return null; + } + const wav = new Uint8Array(WAV_HEADER_SIZE + dataLength); + const view = new DataView(wav.buffer); + wav.set(stringToBytes("RIFF"), 0); + view.setUint32(4, WAV_HEADER_SIZE - 8 + dataLength, true); + wav.set(stringToBytes("WAVE"), 8); + wav.set(stringToBytes("fmt "), 12); + view.setUint32(16, 16, true); + view.setUint16(20, 1, true); + view.setUint16(22, channels, true); + view.setUint32(24, sampleRate, true); + view.setUint32(28, sampleRate * blockAlign, true); + view.setUint16(32, blockAlign, true); + view.setUint16(34, bitsPerSample, true); + wav.set(stringToBytes("data"), 36); + view.setUint32(40, dataLength, true); + if (bitsPerSample === 16) { + const signed = encoding === "Signed"; + for (let i = 0; i < dataLength; i += 2) { + let value = samples[i] << 8 | samples[i + 1]; + if (signed) { + if (value >= 0x8000) { + value -= 0x10000; + } + } else { + value -= 0x8000; + } + view.setInt16(WAV_HEADER_SIZE + i, value, true); + } + } else if (encoding === "Signed") { + for (let i = 0; i < dataLength; i++) { + wav[WAV_HEADER_SIZE + i] = samples[i] + 128 & 0xff; + } + } else { + wav.set(samples.subarray(0, dataLength), WAV_HEADER_SIZE); + } + return wav; +} + +;// ./src/core/struct_tree.js + + + + + + + + + + + + + + + +const MAX_DEPTH = 40; +const TABLE_SPAN_ATTRIBUTES = [["RowSpan", "rowSpan"], ["ColSpan", "colSpan"]]; +const StructElementType = { + PAGE_CONTENT: 1, + STREAM_CONTENT: 2, + OBJECT: 3, + ANNOTATION: 4, + ELEMENT: 5 +}; +class StructTreeRoot { + kidRefToPosition = undefined; + parentTree = null; + roleMap = new Map(); + structParentIds = null; + constructor(xref, rootDict, rootRef) { + this.xref = xref; + this.dict = rootDict; + this.ref = rootRef instanceof Ref ? rootRef : null; + const roleMap = rootDict.get("RoleMap"); + if (roleMap instanceof Dict) { + for (const [key, value] of roleMap) { + if (value instanceof Name) { + this.roleMap.set(key, value.name); + } + } + } + const parentTree = rootDict.getRaw("ParentTree"); + if (parentTree) { + this.parentTree = new NumberTree(parentTree, xref); + } + } + getKidPosition(kidRef) { + if (this.kidRefToPosition === undefined) { + const obj = this.dict.get("K"); + if (Array.isArray(obj)) { + const map = this.kidRefToPosition = new Map(); + for (let i = 0, ii = obj.length; i < ii; i++) { + const ref = obj[i]; + if (ref) { + map.set(ref.toString(), i); + } + } + } else if (obj instanceof Dict) { + this.kidRefToPosition = new Map([[obj.objId, 0]]); + } else if (!obj) { + this.kidRefToPosition = new Map(); + } else { + this.kidRefToPosition = null; + } + } + return this.kidRefToPosition ? this.kidRefToPosition.get(kidRef) ?? NaN : -1; + } + #addIdToPage(pageRef, id, type, objId) { + if (!(pageRef instanceof Ref) || id < 0) { + return; + } + (this.structParentIds ??= new RefMap()).getOrPutComputed(pageRef, makeArr).push([id, type, objId]); + } + addAnnotationIdToPage(pageRef, id, ref) { + this.#addIdToPage(pageRef, id, StructElementType.ANNOTATION, ref instanceof Ref ? ref.toString() : null); + } + 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, + changes + }) { + const root = await pdfManager.ensureCatalog("cloneDict"); + const cache = new RefMap(); + 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, + changes, + cache + }); + structTreeRoot.set("ParentTreeNextKey", nextKey); + cache.put(parentTreeRef, parentTree); + for (const [ref, obj] of cache.items()) { + changes.put(ref, { + data: obj + }); + } + } + async canUpdateStructTree({ + pdfManager, + 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, this.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.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, + changes + }) { + const { + ref: structTreeRootRef, + xref + } = this; + const structTreeRoot = this.dict.clone(); + const cache = new RefMap(); + 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, + changes, + cache + }); + if (newNextKey === -1) { + return; + } + structTreeRoot.set("ParentTreeNextKey", newNextKey); + if (numsRef) { + cache.put(numsRef, nums); + } + for (const [ref, obj] of cache.items()) { + changes.put(ref, { + data: obj + }); + } + } + static async #writeKids({ + newAnnotationsByPage, + structTreeRootRef, + structTreeRoot, + kids, + nums, + xref, + pdfManager, + changes, + cache + }) { + const objr = Name.get("OBJR"); + let nextKey = -1; + let structTreePageObjs; + 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); + changes.put(objRef, { + data: tagDict + }); + 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); + idToElements.getOrInsertComputed(id, makeArr).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; + } + const cachedParentDict = cache.getOrPutComputed(parentRef, () => parentDict.clone()); + 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(tree, dict) { + this.tree = tree; + this.xref = tree.xref; + this.dict = dict; + this.kids = []; + this.parseKids(); + } + get role() { + const nameObj = this.dict.get("S"); + const name = nameObj instanceof Name ? nameObj.name : ""; + const { + root + } = this.tree; + return root.roleMap.get(name) ?? name; + } + get mathML() { + let AFs = this.dict.get("AF") || []; + if (!Array.isArray(AFs)) { + AFs = [AFs]; + } + for (let af of AFs) { + af = this.xref.fetchIfRef(af); + if (!isDict(af, "Filespec") || !isName(af.get("AFRelationship"), "Supplement")) { + continue; + } + const fileStream = FileSpec.pickPlatformItem(af.get("EF")); + if (!(fileStream instanceof BaseStream) || !isDict(fileStream.dict, "EmbeddedFile") || !isName(fileStream.dict.get("Subtype"), "application/mathml+xml")) { + continue; + } + return stringToUTF8String(fileStream.getString()); + } + for (const attributes of this.attributes) { + if (isName(attributes.get("O"), "MSFT_Office")) { + const mathml = attributes.get("MSFT_MathML"); + return mathml ? stringToPDFString(mathml) : null; + } + } + return null; + } + #collectAttributes(value, attributes) { + const pending = [value]; + const visited = new RefSet(); + while (pending.length > 0) { + value = pending.pop(); + if (value instanceof Ref) { + if (visited.has(value)) { + continue; + } + visited.put(value); + value = this.xref.fetch(value); + } + if (value instanceof BaseStream) { + value = value.dict; + } + if (value instanceof Dict) { + attributes.push(value); + continue; + } + if (!Array.isArray(value)) { + continue; + } + for (let i = value.length - 1; i >= 0; i--) { + if (!Number.isInteger(value[i])) { + pending.push(value[i]); + } + } + } + } + get attributes() { + const attributes = []; + const classes = this.dict.getArray("C"); + if (classes !== undefined) { + const classMap = this.tree.rootDict?.get("ClassMap"); + if (classMap instanceof Dict) { + for (const className of Array.isArray(classes) ? classes : [classes]) { + if (className instanceof Name) { + this.#collectAttributes(classMap.getRaw(className.name), attributes); + } + } + } + } + this.#collectAttributes(this.dict.getRaw("A"), attributes); + return util_shadow(this, "attributes", attributes); + } + get tableAttributes() { + const { + role + } = this; + if (role !== "Table" && role !== "TH" && role !== "TD") { + return null; + } + const map = new Map(); + for (const attributes of this.attributes) { + if (!isName(attributes.get("O"), "Table")) { + continue; + } + if (role === "Table") { + if (attributes.has("Summary")) { + const summary = attributes.get("Summary"); + if (typeof summary === "string" && summary) { + map.set("summary", stringToPDFString(summary)); + } else { + map.delete("summary"); + } + } + continue; + } + for (const [key, name] of TABLE_SPAN_ATTRIBUTES) { + if (!attributes.has(key)) { + continue; + } + const value = attributes.get(key); + if (Number.isInteger(value) && value > 1) { + map.set(name, value); + } else { + map.delete(name); + } + } + if (attributes.has("Headers")) { + map.delete("headers"); + const headers = attributes.getArray("Headers"); + if (Array.isArray(headers)) { + const ids = headers.filter(header => typeof header === "string").map(stringToPDFString); + if (ids.length > 0) { + map.set("headers", ids); + } + } + } + if (role === "TH" && attributes.has("Scope")) { + map.delete("scope"); + const scope = attributes.get("Scope"); + if (scope instanceof Name && ["Row", "Column", "Both"].includes(scope.name)) { + map.set("scope", scope.name); + } + } + if (role === "TH" && attributes.has("Short")) { + map.delete("short"); + const short = attributes.get("Short"); + if (typeof short === "string" && short) { + map.set("short", stringToPDFString(short)); + } + } + } + return map.size ? map : null; + } + parseKids() { + 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, this.xref.fetchIfRef(kid)); + if (element) { + this.kids.push(element); + } + } + } else { + const element = this.parseKid(pageObjId, kids); + if (element) { + this.kids.push(element); + } + } + } + parseKid(pageObjId, kid) { + if (Number.isInteger(kid)) { + if (this.tree.pageDict.objId !== pageObjId) { + return null; + } + return new StructElement({ + type: StructElementType.PAGE_CONTENT, + mcid: kid, + pageObjId + }); + } + if (!(kid instanceof Dict)) { + return null; + } + const pageRef = kid.getRaw("Pg"); + if (pageRef instanceof Ref) { + pageObjId = pageRef.toString(); + } + const type = kid.get("Type") instanceof Name ? kid.get("Type").name : null; + if (type === "MCR") { + if (this.tree.pageDict.objId !== pageObjId) { + return null; + } + const kidRef = kid.getRaw("Stm"); + return new StructElement({ + type: StructElementType.STREAM_CONTENT, + refObjId: kidRef instanceof Ref ? kidRef.toString() : null, + pageObjId, + mcid: kid.get("MCID") + }); + } + if (type === "OBJR") { + if (this.tree.pageDict.objId !== pageObjId) { + return null; + } + const kidRef = kid.getRaw("Obj"); + return new StructElement({ + type: StructElementType.OBJECT, + refObjId: kidRef instanceof Ref ? kidRef.toString() : null, + pageObjId + }); + } + return new StructElement({ + type: StructElementType.ELEMENT, + dict: kid + }); + } +} +class StructElement { + constructor({ + type, + dict = null, + mcid = null, + pageObjId = null, + refObjId = null + }) { + this.type = type; + this.dict = dict; + this.mcid = mcid; + this.pageObjId = pageObjId; + this.refObjId = refObjId; + this.parentNode = null; + } +} +class StructTreePage { + constructor(structTreeRoot, pageDict) { + this.root = structTreeRoot; + this.xref = structTreeRoot?.xref ?? null; + this.rootDict = structTreeRoot?.dict ?? null; + this.pageDict = pageDict; + this.nodes = []; + } + collectObjects(pageRef) { + if (!this.root || !this.rootDict || !(pageRef instanceof Ref)) { + return null; + } + 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.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.root; + 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(); + if (Number.isInteger(id)) { + const parentArray = parentTree.get(id); + if (Array.isArray(parentArray)) { + for (const ref of parentArray) { + if (ref instanceof Ref) { + this.addNode(this.xref.fetch(ref), map); + } + } + } + } + if (!ids) { + return; + } + for (const [elemId, type, objId] of ids) { + const obj = parentTree.get(elemId); + if (!obj) { + continue; + } + const elem = this.addNode(this.xref.fetchIfRef(obj), map); + if (!elem || !objId) { + continue; + } + for (const kid of elem.kids) { + if (kid.type === StructElementType.OBJECT && kid.refObjId === objId) { + kid.type = type; + } + } + } + } + addNode(dict, map, level = 0) { + if (level > MAX_DEPTH) { + warn("StructTree MAX_DEPTH reached."); + return null; + } + if (!(dict instanceof Dict)) { + return null; + } + if (map.has(dict)) { + return map.get(dict); + } + const element = new StructElementNode(this, dict); + map.set(dict, element); + switch (element.role) { + case "L": + case "LBody": + case "LI": + case "Table": + case "THead": + case "TBody": + case "TFoot": + case "TR": + { + for (const kid of element.kids) { + if (kid.type === StructElementType.ELEMENT) { + this.addNode(kid.dict, map, level - 1); + } + } + } + } + const parent = dict.get("P"); + if (!(parent instanceof Dict) || isName(parent.get("Type"), "StructTreeRoot")) { + if (!this.addTopLevelNode(dict, element)) { + map.delete(dict); + } + return element; + } + const parentNode = this.addNode(parent, map, level + 1); + if (!parentNode) { + return element; + } + let save = false; + for (const kid of parentNode.kids) { + if (kid.type === StructElementType.ELEMENT && kid.dict === dict) { + kid.parentNode = element; + save = true; + } + } + if (!save) { + map.delete(dict); + } + return element; + } + addTopLevelNode(dict, element) { + const index = this.root.getKidPosition(dict.objId); + if (isNaN(index)) { + return false; + } + if (index !== -1) { + this.nodes[index] = element; + } + return true; + } + get serializable() { + function nodeToSerializable(node, parent, level = 0) { + if (level > MAX_DEPTH) { + warn("StructTree too deep to be fully serialized."); + return; + } + 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 structId = node.dict.get("ID"); + if (obj.role === "TH" && typeof structId === "string" && structId) { + obj.structId = stringToPDFString(structId); + } + node.tableAttributes?.forEach((val, key) => { + obj[key] = val; + }); + if (obj.role === "Formula") { + try { + const { + mathML + } = node; + if (mathML) { + obj.mathML = mathML; + } + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn(`Ignoring mathML: "${ex}".`); + } + } + let bbox = null, + size = null; + for (const a of node.attributes) { + bbox = lookupNormalRect(a.getArray("BBox"), bbox); + const width = a.get("Width"); + const height = a.get("Height"); + if (typeof width === "number" && width > 0 && typeof height === "number" && height > 0) { + size = [0, 0, width, height]; + } + } + if (bbox || size) { + obj.bbox = bbox ?? size; + } + 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 root = Object.create(null); + root.children = []; + root.role = "Root"; + for (const child of this.nodes) { + if (!child) { + continue; + } + nodeToSerializable(child, root); + } + return root; + } +} + +;// ./src/core/catalog.js + + + + + + + + + + + + + + + + + + + + + + + + + + + + +const isRef = v => v instanceof Ref; +const isValidExplicitDest = _isValidExplicitDest.bind(null, isRef, isName); +function fetchDest(dest) { + if (dest instanceof Dict) { + dest = dest.get("D"); + } + return isValidExplicitDest(dest) ? dest : null; +} +function fetchRemoteDest(action) { + let dest = action.get("D"); + if (dest) { + if (dest instanceof Name) { + dest = dest.name; + } + if (typeof dest === "string") { + return stringToPDFString(dest, true); + } else if (isValidExplicitDest(dest)) { + return JSON.stringify(dest); + } + } + return null; +} +class Catalog { + #actualNumPages = null; + #annotationAttachmentIdByRef = new RefMap(); + #annotationAttachmentRefById = new Map(); + #soundAttachmentIds = new Set(); + #catDict = null; + builtInCMapCache = new Map(); + fontCache = new RefMap(); + globalColorSpaceCache = new GlobalColorSpaceCache(); + globalImageCache = new GlobalImageCache(); + nonBlendModesSet = new RefSet(); + pageDictCache = new RefMap(); + pageIndexCache = new RefMap(); + pageKidsCountCache = new RefMap(); + standardFontDataCache = new Map(); + systemFontCache = new Map(); + 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; + } + cloneDict() { + return this.#catDict.clone(); + } + getAttachmentIdForAnnotation(ref, isSound = false) { + let id = this.#annotationAttachmentIdByRef.get(ref); + if (!id) { + const baseId = `attachmentRef:${ref.toString()}`; + id = baseId; + let i = 1; + while (this.#annotationAttachmentRefById.has(id) || this.attachments?.has(id)) { + id = `${baseId}-${i++}`; + } + this.#annotationAttachmentIdByRef.put(ref, id); + this.#annotationAttachmentRefById.set(id, ref); + } + if (isSound) { + this.#soundAttachmentIds.add(id); + } + return id; + } + get version() { + const version = this.#catDict.get("Version"); + if (version instanceof Name) { + if (PDF_VERSION_REGEXP.test(version.name)) { + return util_shadow(this, "version", version.name); + } + warn(`Invalid PDF catalog version: ${version.name}`); + } + return util_shadow(this, "version", null); + } + get lang() { + const lang = this.#catDict.get("Lang"); + return util_shadow(this, "lang", lang && typeof lang === "string" ? stringToPDFString(lang) : null); + } + get needsRendering() { + const needsRendering = this.#catDict.get("NeedsRendering"); + return util_shadow(this, "needsRendering", needsRendering === true); + } + get collection() { + let collection = null; + try { + 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 util_shadow(this, "collection", collection); + } + get acroForm() { + let acroForm = null; + try { + 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 util_shadow(this, "acroForm", acroForm); + } + get acroFormRef() { + const value = this.#catDict.getRaw("AcroForm"); + return util_shadow(this, "acroFormRef", value instanceof Ref ? value : null); + } + get metadata() { + const streamRef = this.#catDict.getRaw("Metadata"); + if (!(streamRef instanceof Ref)) { + return util_shadow(this, "metadata", null); + } + let metadata = null; + try { + const stream = this.xref.fetch(streamRef, !this.xref.encrypt?.encryptMetadata); + if (stream instanceof BaseStream && isDict(stream.dict, "Metadata") && isName(stream.dict.get("Subtype"), "XML")) { + const data = stringToUTF8String(stream.getString()); + if (data) { + metadata = new MetadataParser(data).serializable; + } + } + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + info(`Skipping invalid Metadata: "${ex}".`); + } + return util_shadow(this, "metadata", metadata); + } + get markInfo() { + let markInfo = null; + try { + markInfo = this.#readMarkInfo(); + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn("Unable to read mark info."); + } + return util_shadow(this, "markInfo", markInfo); + } + #readMarkInfo() { + const obj = this.#catDict.get("MarkInfo"); + if (!(obj instanceof Dict)) { + return null; + } + const markInfo = new Map(); + for (const key of ["Marked", "UserProperties", "Suspects"]) { + const val = obj.get(key); + markInfo.set(key, val === true); + } + return markInfo; + } + get hasStructTree() { + return this.#catDict.has("StructTreeRoot"); + } + get structTreeRoot() { + let structTree = null; + try { + structTree = this.#readStructTreeRoot(); + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn("Unable read to structTreeRoot info."); + } + return util_shadow(this, "structTreeRoot", structTree); + } + #readStructTreeRoot() { + const rawObj = this.#catDict.getRaw("StructTreeRoot"), + obj = this.xref.fetchIfRef(rawObj); + return obj instanceof Dict ? new StructTreeRoot(this.xref, obj, rawObj) : null; + } + get toplevelPagesDict() { + const pagesObj = this.#catDict.get("Pages"); + if (!(pagesObj instanceof Dict)) { + throw new FormatError("Invalid top-level pages dictionary."); + } + return util_shadow(this, "toplevelPagesDict", pagesObj); + } + get documentOutline() { + let obj = null; + try { + obj = this.#readDocumentOutline(); + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn("Unable to read document outline."); + } + return util_shadow(this, "documentOutline", obj); + } + #readDocumentOutline(options = {}) { + 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: outlineDict, + resultObj: data, + docBaseUrl: this.baseUrl, + docAttachments: this.attachments + }); + 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 = ColorSpaceUtils.rgb.getRgb(color, 0); + } + const outlineItem = { + action: data.action, + attachmentId: data.attachmentId, + 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: [] + }; + if (options.keepRawDict) { + outlineItem.rawDict = outlineDict; + } + i.parent.items.push(outlineItem); + obj = outlineDict.getRaw("First"); + if (obj instanceof Ref && !processed.has(obj)) { + queue.push({ + obj, + parent: outlineItem + }); + processed.put(obj); + } + obj = outlineDict.getRaw("Next"); + if (obj instanceof Ref && !processed.has(obj)) { + queue.push({ + obj, + parent: i.parent + }); + processed.put(obj); + } + } + return root.items.length > 0 ? root.items : null; + } + get documentOutlineForEditor() { + let obj = null; + try { + obj = this.#readDocumentOutline({ + keepRawDict: true + }); + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn("Unable to read document outline."); + } + return util_shadow(this, "documentOutlineForEditor", obj); + } + get permissions() { + let permissions = null; + try { + permissions = this.#readPermissions(); + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn("Unable to read permissions."); + } + return util_shadow(this, "permissions", permissions); + } + #readPermissions() { + const encrypt = this.xref.trailer.get("Encrypt"); + if (!(encrypt instanceof Dict)) { + return null; + } + let flags = encrypt.get("P"); + if (typeof flags !== "number") { + return null; + } + flags += 2 ** 32; + const permissions = new Set(); + for (const value of Object.values(PermissionFlag)) { + if (flags & value) { + permissions.add(value); + } + } + return permissions; + } + get optionalContentConfig() { + let config = null; + try { + const properties = this.#catDict.get("OCProperties"); + if (!properties) { + return util_shadow(this, "optionalContentConfig", null); + } + const defaultConfig = properties.get("D"); + if (!defaultConfig) { + return util_shadow(this, "optionalContentConfig", null); + } + const groupsData = properties.get("OCGs"); + if (!Array.isArray(groupsData)) { + return util_shadow(this, "optionalContentConfig", null); + } + const groupRefCache = new RefMap(); + for (const groupRef of groupsData) { + if (!(groupRef instanceof Ref) || groupRefCache.has(groupRef)) { + continue; + } + groupRefCache.put(groupRef, this.#readOptionalContentGroup(groupRef)); + } + config = this.#readOptionalContentConfig(defaultConfig, groupRefCache); + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn(`Unable to read optional content config: ${ex}`); + } + return util_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 && 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 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); + return !nestedOrder?.length ? null : { + name: stringToPDFString(nestedName), + order: nestedOrder + }; + } + 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: typeof config.get("Name") === "string" ? stringToPDFString(config.get("Name")) : null, + creator: typeof config.get("Creator") === "string" ? stringToPDFString(config.get("Creator")) : null, + baseState: 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(num = null) { + this.#actualNumPages = num; + } + get hasActualNumPages() { + return this.#actualNumPages !== null; + } + get _pagesCount() { + 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 util_shadow(this, "_pagesCount", obj); + } + get numPages() { + return this.#actualNumPages ?? this._pagesCount; + } + get destinations() { + const dests = new Map(); + for (const obj of this.#readDests()) { + if (obj instanceof NameTree) { + for (const [key, value] of obj.getAll()) { + const dest = fetchDest(value); + if (dest) { + dests.set(stringToPDFString(key, true), dest); + } + } + } else if (obj instanceof Dict) { + for (const [key, value] of obj) { + const dest = fetchDest(value); + if (dest) { + dests.getOrInsert(stringToPDFString(key, true), dest); + } + } + } + } + return util_shadow(this, "destinations", dests); + } + getDestination(id) { + if (Object.hasOwn(this, "destinations")) { + return this.destinations.get(id) ?? null; + } + for (const obj of this.#readDests()) { + if (obj instanceof NameTree || obj instanceof Dict) { + const dest = fetchDest(obj.get(id)); + if (dest) { + return dest; + } + } + } + return this.destinations.get(id) ?? null; + } + #readDests() { + const obj = this.#catDict.get("Names"); + const rawDests = []; + if (obj?.has("Dests")) { + rawDests.push(new NameTree(obj.getRaw("Dests"), this.xref)); + } + if (this.#catDict.has("Dests")) { + rawDests.push(this.#catDict.get("Dests")); + } + return rawDests; + } + get rawPageLabels() { + const obj = this.#catDict.getRaw("PageLabels"); + if (!obj) { + return null; + } + const numberTree = new NumberTree(obj, this.xref); + return numberTree.getAll(); + } + get pageLabels() { + let obj = null; + try { + obj = this.#readPageLabels(); + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn("Unable to read page labels."); + } + return util_shadow(this, "pageLabels", obj); + } + #readPageLabels() { + const nums = this.rawPageLabels; + if (!nums) { + return null; + } + const pageLabels = new Array(this.numPages); + let style = null, + prefix = ""; + 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 (labelDict.has("Type") && !isName(labelDict.get("Type"), "PageLabel")) { + throw new FormatError("Invalid type in PageLabel dictionary."); + } + if (labelDict.has("S")) { + const s = labelDict.get("S"); + if (!(s instanceof Name)) { + throw new FormatError("Invalid style in PageLabel dictionary."); + } + 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."); + } + 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."); + } + currentIndex = st; + } else { + currentIndex = 1; + } + } + switch (style) { + case "D": + currentLabel = currentIndex; + break; + case "R": + case "r": + currentLabel = toRomanNumerals(currentIndex, style === "r"); + break; + case "A": + case "a": + const LIMIT = 26; + const letterIndex = currentIndex - 1; + const character = String.fromCharCode(style.charCodeAt(0) + letterIndex % LIMIT); + currentLabel = character.repeat(Math.floor(letterIndex / LIMIT) + 1); + break; + default: + if (style) { + throw new FormatError(`Invalid style "${style}" in PageLabel dictionary.`); + } + currentLabel = ""; + } + pageLabels[i] = prefix + currentLabel; + currentIndex++; + } + return pageLabels; + } + get pageLayout() { + const obj = this.#catDict.get("PageLayout"); + let pageLayout = ""; + if (obj instanceof Name) { + switch (obj.name) { + case "SinglePage": + case "OneColumn": + case "TwoColumnLeft": + case "TwoColumnRight": + case "TwoPageLeft": + case "TwoPageRight": + pageLayout = obj.name; + } + } + return util_shadow(this, "pageLayout", pageLayout); + } + get pageMode() { + 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": + pageMode = obj.name; + } + } + return util_shadow(this, "pageMode", pageMode); + } + get viewerPreferences() { + const obj = this.#catDict.get("ViewerPreferences"); + if (!(obj instanceof Dict)) { + return util_shadow(this, "viewerPreferences", null); + } + let prefs = null; + for (const [key, value] of obj) { + let prefValue; + switch (key) { + case "HideToolbar": + case "HideMenubar": + case "HideWindowUI": + case "FitWindow": + case "CenterWindow": + case "DisplayDocTitle": + case "PickTrayByPDFSize": + if (typeof value === "boolean") { + prefValue = value; + } + break; + case "NonFullScreenPageMode": + if (value instanceof Name) { + switch (value.name) { + case "UseNone": + case "UseOutlines": + case "UseThumbs": + case "UseOC": + prefValue = value.name; + break; + default: + prefValue = "UseNone"; + } + } + break; + case "Direction": + if (value instanceof Name) { + switch (value.name) { + case "L2R": + case "R2L": + prefValue = value.name; + break; + default: + prefValue = "L2R"; + } + } + break; + case "ViewArea": + case "ViewClip": + case "PrintArea": + case "PrintClip": + if (value instanceof Name) { + switch (value.name) { + case "MediaBox": + case "CropBox": + case "BleedBox": + case "TrimBox": + case "ArtBox": + prefValue = value.name; + break; + default: + prefValue = "CropBox"; + } + } + break; + case "PrintScaling": + if (value instanceof Name) { + switch (value.name) { + case "None": + case "AppDefault": + prefValue = value.name; + break; + default: + prefValue = "AppDefault"; + } + } + break; + case "Duplex": + if (value instanceof Name) { + switch (value.name) { + case "Simplex": + case "DuplexFlipShortEdge": + case "DuplexFlipLongEdge": + prefValue = value.name; + break; + default: + prefValue = "None"; + } + } + break; + case "PrintPageRange": + if (Array.isArray(value) && value.length % 2 === 0 && value.every((page, i, arr) => Number.isInteger(page) && page > 0 && (i === 0 || page >= arr[i - 1]) && page <= this.numPages)) { + prefValue = value; + } + break; + case "NumCopies": + if (Number.isInteger(value) && value > 0) { + prefValue = value; + } + break; + default: + warn(`Ignoring non-standard key in ViewerPreferences: ${key}.`); + continue; + } + if (prefValue === undefined) { + warn(`Bad value, for key "${key}", in ViewerPreferences: ${value}.`); + continue; + } + (prefs ??= new Map()).set(key, prefValue); + } + return util_shadow(this, "viewerPreferences", prefs); + } + get openAction() { + const obj = this.#catDict.get("OpenAction"); + const openAction = new Map(); + 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.set("dest", resultObj.dest); + } else if (resultObj.action) { + openAction.set("action", resultObj.action); + } + } else if (isValidExplicitDest(obj)) { + openAction.set("dest", obj); + } + return util_shadow(this, "openAction", openAction.size ? openAction : null); + } + get attachments() { + 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()) { + (attachments ??= new Map()).set(stringToPDFString(key, true), new FileSpec(value).serializable); + } + } + return util_shadow(this, "attachments", attachments); + } + #attachmentContentByName(id) { + const obj = this.#catDict.get("Names"); + if (obj instanceof Dict && obj.has("EmbeddedFiles")) { + const nameTree = new NameTree(obj.getRaw("EmbeddedFiles"), this.xref); + for (const [key, value] of nameTree.getAll()) { + if (stringToPDFString(key, true) === id) { + return FileSpec.readContent(value); + } + } + } + return undefined; + } + attachmentContent(id) { + const namedContent = this.#attachmentContentByName(id); + if (namedContent !== undefined) { + return namedContent; + } + const ref = this.#annotationAttachmentRefById.get(id); + if (ref) { + const target = this.xref.fetch(ref); + if (target instanceof BaseStream) { + const content = FileSpec.readStreamContent(target); + return this.#soundAttachmentIds.has(id) ? soundStreamToWav(target, content) ?? content : content; + } + return target instanceof Dict ? FileSpec.readContent(target) : null; + } + return null; + } + get rawEmbeddedFiles() { + const obj = this.#catDict.get("Names"); + if (!(obj instanceof Dict) || !obj.has("EmbeddedFiles")) { + return null; + } + const nameTree = new NameTree(obj.getRaw("EmbeddedFiles"), this.xref); + return nameTree.getAll(true); + } + get xfaImages() { + 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 (value instanceof BaseStream) { + xfaImages ??= new Map(); + xfaImages.set(stringToPDFString(key, true), value.getBytes()); + } + } + } + return util_shadow(this, "xfaImages", xfaImages); + } + #collectJavaScript() { + const obj = this.#catDict.get("Names"); + let javaScript = null; + function appendIfJavaScriptDict(name, jsDict) { + if (!(jsDict instanceof Dict) || !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, true).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, true), value); + } + } + const openAction = this.#catDict.get("OpenAction"); + if (openAction) { + appendIfJavaScriptDict("OpenAction", openAction); + } + return javaScript; + } + get jsActions() { + const javaScript = this.#collectJavaScript(); + let actions = collectActions(this.xref, this.#catDict, DocumentActionEventType); + if (javaScript) { + actions ??= new Map(); + for (const [key, val] of javaScript) { + actions.getOrInsertComputed(key, makeArr).push(val); + } + } + return util_shadow(this, "jsActions", actions); + } + async cleanup(manuallyTriggered = false) { + clearGlobalCaches(); + this.globalColorSpaceCache.clear(); + this.globalImageCache.clear(manuallyTriggered); + this.pageKidsCountCache.clear(); + this.pageIndexCache.clear(); + this.pageDictCache.clear(); + this.nonBlendModesSet.clear(); + for (const { + dict + } of await Promise.all(this.fontCache)) { + delete dict.cacheKey; + } + this.fontCache.clear(); + this.builtInCMapCache.clear(); + this.standardFontDataCache.clear(); + this.systemFontCache.clear(); + } + 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 (visitedNodes.has(currentNode)) { + throw new FormatError("Pages tree contains circular reference."); + } + 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; + } + } + nodesToVisit.push(obj); + continue; + } + if (!(currentNode instanceof Dict)) { + throw new FormatError("Page dictionary kid reference points to wrong type of object."); + } + 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 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 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)); + } + } + } + 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 { + kids = await xref.fetchAsync(kids); + } catch (ex) { + addPageError(ex); + break; + } + } + if (!Array.isArray(kids)) { + let type = currentNode.getRaw("Type"); + if (type instanceof Ref) { + try { + type = await xref.fetchAsync(type); + } catch (ex) { + addPageError(ex); + break; + } + } + if (isName(type, "Page") || !currentNode.has("Kids")) { + addPageDict(currentNode, null); + break; + } + addPageError(new FormatError("Page dictionary kids object is not an array.")); + break; + } + if (posInKids >= kids.length) { + queue.pop(); + continue; + } + const kidObj = kids[posInKids]; + let obj; + if (kidObj instanceof Ref) { + if (visitedNodes.has(kidObj)) { + addPageError(new FormatError("Pages tree contains circular reference.")); + break; + } + visitedNodes.put(kidObj); + try { + obj = await xref.fetchAsync(kidObj); + } catch (ex) { + addPageError(ex); + break; + } + } else { + obj = kidObj; + } + if (!(obj instanceof Dict)) { + addPageError(new FormatError("Page dictionary kid reference points to wrong type of object.")); + break; + } + let type = obj.getRaw("Type"); + if (type instanceof Ref) { + try { + type = await xref.fetchAsync(type); + } catch (ex) { + addPageError(ex); + break; + } + } + if (isName(type, "Page") || !obj.has("Kids")) { + addPageDict(obj, kidObj instanceof Ref ? kidObj : null); + } else { + queue.push({ + currentNode: obj, + posInKids: 0 + }); + } + queueItem.posInKids++; + } + return map; + } + async getPageIndex(pageRef) { + const cachedPageIndex = this.pageIndexCache.get(pageRef); + if (cachedPageIndex !== undefined) { + return cachedPageIndex; + } + const xref = this.xref; + let total = 0, + ref = pageRef; + const visited = new RefSet(); + visited.put(pageRef); + while (true) { + const node = await xref.fetchAsync(ref); + if (isRefsEqual(ref, 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) { + break; + } + if (!(node instanceof Dict)) { + throw new FormatError("Node must be a dictionary."); + } + const parentRef = node.getRaw("Parent"); + if (parentRef instanceof Ref) { + if (visited.has(parentRef)) { + throw new FormatError("Pages tree contains circular reference."); + } + visited.put(parentRef); + } + const parent = await node.getAsync("Parent"); + if (!parent) { + break; + } + if (!(parent instanceof Dict)) { + throw new FormatError("Parent must be a dictionary."); + } + const kids = await parent.getAsync("Kids"); + if (!kids) { + break; + } + if (!Array.isArray(kids)) { + throw new FormatError("Kids must be an array."); + } + const kidPromises = []; + let found = false; + for (const kid of kids) { + if (!(kid instanceof Ref)) { + throw new FormatError("Kid must be a reference."); + } + if (isRefsEqual(kid, ref)) { + found = true; + break; + } + kidPromises.push(xref.fetchAsync(kid).then(obj => { + if (!(obj instanceof Dict)) { + throw new FormatError("Kid node must be a dictionary."); + } + if (obj.has("Count")) { + const count = obj.get("Count"); + if (Number.isInteger(count) && count >= 0) { + total += count; + return; + } + throw new FormatError("Count must be a (positive) integer."); + } + total++; + })); + } + if (!found) { + throw new FormatError("Kid reference not found in parent's kids."); + } + await Promise.all(kidPromises); + ref = parentRef; + } + this.pageIndexCache.put(pageRef, total); + return total; + } + get baseUrl() { + 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 util_shadow(this, "baseUrl", absoluteUrl.href); + } + } + } + return util_shadow(this, "baseUrl", this.pdfManager.docBaseUrl); + } + static #getDestFromStructElement(xref, seRef) { + const seDict = xref.fetchIfRef(seRef); + if (!(seDict instanceof Dict)) { + return null; + } + let pageRef = null; + const directPg = seDict.getRaw("Pg"); + if (directPg instanceof Ref) { + pageRef = directPg; + } + if (!pageRef) { + const queue = [seDict]; + const visited = new RefSet(); + visited.put(seRef); + while (queue.length > 0 && !pageRef) { + const node = queue.shift(); + let kids = node.getRaw("K"); + if (kids instanceof Ref) { + if (visited.has(kids)) { + continue; + } + visited.put(kids); + kids = xref.fetch(kids); + } + let kidsArr; + if (Array.isArray(kids)) { + kidsArr = kids; + } else if (kids) { + kidsArr = [kids]; + } else { + continue; + } + for (const kid of kidsArr) { + if (kid instanceof Ref) { + if (visited.has(kid)) { + continue; + } + visited.put(kid); + } + const kidObj = xref.fetchIfRef(kid); + if (!(kidObj instanceof Dict)) { + continue; + } + const pg = kidObj.getRaw("Pg"); + if (pg instanceof Ref) { + pageRef = pg; + break; + } + queue.push(kidObj); + } + } + } + if (!pageRef) { + const MAX_DEPTH = 40; + let current = seDict; + for (let depth = 0; depth < MAX_DEPTH; depth++) { + const parentRaw = current.getRaw("P"); + if (!(parentRaw instanceof Ref)) { + break; + } + const parentDict = xref.fetch(parentRaw); + if (!(parentDict instanceof Dict) || isName(parentDict.get("Type"), "StructTreeRoot")) { + break; + } + const pg = parentDict.getRaw("Pg"); + if (pg instanceof Ref) { + pageRef = pg; + break; + } + current = parentDict; + } + } + if (!pageRef) { + return null; + } + let x = null, + y = null; + const attrs = seDict.get("A"); + if (attrs instanceof Dict) { + const bbox = lookupRect(attrs.getArray("BBox"), null); + if (bbox) { + x = bbox[0]; + y = bbox[3]; + } + } + return [pageRef, { + name: "XYZ" + }, x, y, null]; + } + static parseDestDictionary({ + destDict, + resultObj, + docBaseUrl = null, + docAttachments = null + }) { + if (!(destDict instanceof Dict)) { + warn("parseDestDictionary: `destDict` must be a dictionary."); + return; + } + 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 (action instanceof Dict) { + const actionType = action.get("S"); + if (!(actionType instanceof Name)) { + warn("parseDestDictionary: Invalid type in Action dictionary."); + return; + } + const actionName = actionType.name; + switch (actionName) { + case "ResetForm": + 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": + url = action.get("URI"); + if (url instanceof Name) { + url = "/" + url.name; + } + break; + case "GoTo": + dest = action.get("D"); + break; + case "Launch": + case "GoToR": + const urlDict = action.get("F"); + if (urlDict instanceof Dict) { + url = new FileSpec(urlDict).filename; + } else if (typeof urlDict === "string") { + url = urlDict; + } else { + break; + } + const remoteDest = fetchRemoteDest(action); + if (remoteDest) { + url = url.split("#", 1)[0] + "#" + remoteDest; + } + const newWindow = action.get("NewWindow"); + if (typeof newWindow === "boolean") { + resultObj.newWindow = newWindow; + } + break; + case "GoToE": + const target = action.get("T"); + let id = null; + if (target instanceof Dict) { + const relationship = target.get("R"); + const name = target.get("N"); + if (isName(relationship, "C") && typeof name === "string") { + id = stringToPDFString(name, true); + } + } + if (docAttachments && id) { + resultObj.attachmentId = id; + resultObj.attachment = docAttachments.get(id); + const attachmentDest = fetchRemoteDest(action); + if (attachmentDest) { + resultObj.attachmentDest = attachmentDest; + } + } else { + warn(`parseDestDictionary - unimplemented "GoToE" action.`); + } + break; + case "Named": + const namedAction = action.get("N"); + if (namedAction instanceof Name) { + resultObj.action = namedAction.name; + } + break; + case "SetOCGState": + 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": + stateArr.push(elem.name); + break; + } + } else if (elem instanceof Ref) { + stateArr.push(elem.toString()); + } + } + if (stateArr.length !== state.length) { + break; + } + resultObj.setOCGState = { + state: stateArr, + preserveRB: preserveRB !== false + }; + break; + case "JavaScript": + 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, true)); + if (jsURL) { + url = jsURL.url; + resultObj.newWindow = jsURL.newWindow; + break; + } + default: + if (actionName === "JavaScript" || actionName === "SubmitForm") { + break; + } + warn(`parseDestDictionary - unsupported action: "${actionName}".`); + break; + } + } else if (destDict.has("Dest")) { + dest = destDict.get("Dest"); + } + 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, true); + } else if (isValidExplicitDest(dest)) { + resultObj.dest = dest; + } + } + if (!resultObj.dest && !resultObj.url && !resultObj.action && !resultObj.attachment && !resultObj.setOCGState && !resultObj.resetForm) { + const seRef = destDict.getRaw("SE"); + if (seRef instanceof Ref) { + try { + const seDest = Catalog.#getDestFromStructElement(destDict.xref, seRef); + if (seDest) { + resultObj.dest = seDest; + } + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + info("SE parsing failed."); + } + } + } + } +} + +;// ./src/core/editor/pdf_images.js + + + + + + + + + + + + + + + +const FLATE_COLOR_COUNT_THRESHOLD = 16384; +function createImageDict(xref, width, height, colorSpace) { + const image = new Dict(xref); + image.set("Type", Name.get("XObject")); + image.set("Subtype", Name.get("Image")); + image.set("BitsPerComponent", 8); + image.setIfName("ColorSpace", colorSpace); + image.set("Width", width); + image.set("Height", height); + return image; +} +function createRawImage(buffer, dict) { + return new Stream(buffer, 0, buffer.length, dict); +} +function paethPredictor(left, above, upperLeft) { + const p = left + above - upperLeft; + const pa = Math.abs(p - left); + const pb = Math.abs(p - above); + const pc = Math.abs(p - upperLeft); + if (pa <= pb && pa <= pc) { + return left; + } + return pb <= pc ? above : upperLeft; +} +function applyPNGOptimumFilter(data, width, height, bytesPerPixel) { + const rowSize = width * bytesPerPixel; + const out = new Uint8Array(height * (rowSize + 1)); + const candidates = [new Uint8Array(rowSize), new Uint8Array(rowSize), new Uint8Array(rowSize), new Uint8Array(rowSize), new Uint8Array(rowSize)]; + for (let y = 0; y < height; y++) { + const rowOffset = y * rowSize; + const prevRowOffset = rowOffset - rowSize; + const scores = [0, 0, 0, 0, 0]; + for (let x = 0; x < rowSize; x++) { + const offset = rowOffset + x; + const cur = data[offset]; + const left = x >= bytesPerPixel ? data[offset - bytesPerPixel] : 0; + const above = y > 0 ? data[prevRowOffset + x] : 0; + const upperLeft = y > 0 && x >= bytesPerPixel ? data[prevRowOffset + x - bytesPerPixel] : 0; + candidates[0][x] = cur; + candidates[1][x] = cur - left & 0xff; + candidates[2][x] = cur - above & 0xff; + candidates[3][x] = cur - (left + above >> 1) & 0xff; + candidates[4][x] = cur - paethPredictor(left, above, upperLeft) & 0xff; + for (let f = 0; f < 5; f++) { + const v = candidates[f][x]; + scores[f] += v < 128 ? v : 256 - v; + } + } + let bestFilter = 0; + for (let f = 1; f < 5; f++) { + if (scores[f] < scores[bestFilter]) { + bestFilter = f; + } + } + const outOffset = y * (rowSize + 1); + out[outOffset] = bestFilter; + out.set(candidates[bestFilter], outOffset + 1); + } + return out; +} +async function deflate(bytes) { + const cs = new CompressionStream("deflate"); + const writer = cs.writable.getWriter(); + const writePromise = (async () => { + try { + await writer.ready; + await writer.write(bytes); + await writer.ready; + await writer.close(); + } catch (reason) { + await writer.abort(reason).catch(() => {}); + throw reason; + } + })(); + const [compressed] = await Promise.all([new Response(cs.readable).bytes(), writePromise.then(() => null)]); + return compressed; +} +async function createPNGLikeImage(buffer, width, height, dict) { + const bytesPerPixel = buffer.length / (width * height); + let compressed; + if (typeof CompressionStream === "function") { + try { + const filtered = applyPNGOptimumFilter(buffer, width, height, bytesPerPixel); + compressed = await deflate(filtered); + } catch {} + } + if (!compressed) { + return createRawImage(buffer, dict); + } + dict.setIfName("Filter", "FlateDecode"); + const decodeParms = new Dict(dict.xref); + decodeParms.set("Predictor", 15); + decodeParms.set("Columns", width); + decodeParms.set("Colors", bytesPerPixel); + decodeParms.set("BitsPerComponent", 8); + dict.set("DecodeParms", decodeParms); + return createRawImage(compressed, dict); +} +async function createImage(bitmap, xref, { + closeBitmap = false +} = {}) { + const { + width, + height + } = bitmap; + if (!Number.isInteger(width) || !Number.isInteger(height) || width <= 0 || height <= 0) { + if (closeBitmap) { + bitmap.close?.(); + } + throw new Error(`createImage: invalid bitmap dimensions ${width}x${height}`); + } + const canvas = new OffscreenCanvas(width, height); + const ctx = canvas.getContext("2d", { + alpha: true, + willReadFrequently: true + }); + let data; + try { + ctx.drawImage(bitmap, 0, 0); + data = ctx.getImageData(0, 0, width, height).data; + } finally { + if (closeBitmap) { + bitmap.close?.(); + } + } + const buf32 = new Uint32Array(data.buffer, data.byteOffset, data.byteLength >> 2); + const isLE = FeatureTest.isLittleEndian; + const rgbMask = isLE ? 0x00ffffff : 0xffffff00; + const colorCounter = new Set(); + let hasAlpha = false; + let useFlate = true; + for (const v of buf32) { + if ((isLE ? v >>> 24 : v & 0xff) !== 0xff) { + hasAlpha = true; + break; + } + if (useFlate) { + colorCounter.add((v & rgbMask) >>> 0); + if (colorCounter.size > FLATE_COLOR_COUNT_THRESHOLD) { + useFlate = false; + colorCounter.clear(); + } + } + } + if (hasAlpha) { + useFlate = true; + } + const image = createImageDict(xref, width, height, "DeviceRGB"); + let imageStreamPromise; + let imageRenderStream = null; + if (useFlate) { + const rgbBuffer = new Uint8Array(width * height * 3); + for (let i = 0, j = 0, ii = data.length; i < ii; i += 4, j += 3) { + rgbBuffer[j] = data[i]; + rgbBuffer[j + 1] = data[i + 1]; + rgbBuffer[j + 2] = data[i + 2]; + } + imageStreamPromise = createPNGLikeImage(rgbBuffer, width, height, image); + imageRenderStream = createRawImage(rgbBuffer, createImageDict(xref, width, height, "DeviceRGB")); + } else { + image.setIfName("Filter", "DCTDecode"); + imageStreamPromise = canvas.convertToBlob({ + type: "image/jpeg", + quality: 1 + }).then(blob => blob.bytes()).then(bytes => createRawImage(bytes, image)); + } + let smaskStreamPromise = Promise.resolve(null); + let smaskRenderStream = null; + if (hasAlpha) { + const alphaBuffer = new Uint8Array(buf32.length); + if (isLE) { + 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 = createImageDict(xref, width, height, "DeviceGray"); + const smaskRenderDict = createImageDict(xref, width, height, "DeviceGray"); + smaskStreamPromise = createPNGLikeImage(alphaBuffer, width, height, smask); + smaskRenderStream = createRawImage(alphaBuffer, smaskRenderDict); + } + const [imageStream, smaskStream] = await Promise.all([imageStreamPromise, smaskStreamPromise]); + return { + imageStream, + imageRenderStream, + smaskStream, + smaskRenderStream, + width, + height + }; +} + +;// ./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); + } + } +} +class ObjectLoader { + refSet = new RefSet(); + constructor(dict, keys, xref) { + this.dict = dict; + this.keys = keys; + this.xref = xref; + } + async load() { + const { + keys, + dict + } = this; + const nodesToVisit = []; + for (const key of keys) { + const rawValue = dict.getRaw(key); + if (rawValue !== undefined) { + nodesToVisit.push(rawValue); + } + } + await this.#walk(nodesToVisit); + this.refSet = null; + } + 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(currentNode); + currentNode = this.xref.fetch(currentNode); + } catch (ex) { + if (!(ex instanceof MissingDataException)) { + warn(`ObjectLoader.#walk - requesting all data: "${ex}".`); + await this.xref.stream.manager.requestAllChunks(); + return; + } + nodesToRevisit.push(currentNode); + pendingRequests.push({ + begin: ex.begin, + end: ex.end + }); + } + } + if (currentNode instanceof BaseStream) { + const baseStreams = currentNode.getBaseStreams(); + if (baseStreams) { + let foundMissingData = false; + for (const stream of baseStreams) { + if (stream.isDataLoaded) { + continue; + } + foundMissingData = true; + pendingRequests.push({ + begin: stream.start, + end: stream.end + }); + } + if (foundMissingData) { + nodesToRevisit.push(currentNode); + } + } + } + addChildren(currentNode, nodesToVisit); + } + if (pendingRequests.length) { + await this.xref.stream.manager.requestRanges(pendingRequests); + for (const node of nodesToRevisit) { + if (node instanceof Ref) { + this.refSet.remove(node); + } + } + await this.#walk(nodesToRevisit); + } + } + static async load(obj, keys, xref) { + if (xref.stream.isDataLoaded) { + return; + } + const objLoader = new ObjectLoader(obj, keys, xref); + await objLoader.load(); + } +} + +;// ./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"); + +;// ./node_modules/core-js/modules/es.iterator.flat-map.js +es_iterator_flat_map_namespaceFn(); + +;// ./node_modules/core-js/modules/es.uint8-array.from-base64.js +es_uint8_array_from_base64_namespaceFn(); + +;// ./src/core/xfa/namespaces.js +const $buildXFAObject = Symbol(); +const NamespaceIds = { + config: { + id: 0, + check: ns => ns.startsWith("http://www.xfa.org/schema/xci/") + }, + connectionSet: { + id: 1, + check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-connection-set/") + }, + datasets: { + id: 2, + check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-data/") + }, + form: { + id: 3, + check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-form/") + }, + localeSet: { + id: 4, + check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-locale-set/") + }, + pdf: { + id: 5, + check: ns => ns === "http://ns.adobe.com/xdp/pdf/" + }, + signature: { + id: 6, + check: ns => ns === "http://www.w3.org/2000/09/xmldsig#" + }, + sourceSet: { + id: 7, + check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-source-set/") + }, + stylesheet: { + id: 8, + check: ns => ns === "http://www.w3.org/1999/XSL/Transform" + }, + template: { + id: 9, + check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-template/") + }, + xdc: { + id: 10, + check: ns => ns.startsWith("http://www.xfa.org/schema/xdc/") + }, + xdp: { + id: 11, + check: ns => ns === "http://ns.adobe.com/xdp/" + }, + xfdf: { + id: 12, + check: ns => ns === "http://ns.adobe.com/xfdf/" + }, + xhtml: { + id: 13, + check: ns => ns === "http://www.w3.org/1999/xhtml" + }, + xmpmeta: { + id: 14, + check: ns => ns === "http://ns.adobe.com/xmpmeta/" + } +}; + +;// ./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) { + return str.startsWith("'") || str.startsWith('"') ? str.slice(1, -1) : str; +} +function getInteger({ + data, + defaultValue, + validate +}) { + if (!data) { + return defaultValue; + } + data = data.trim(); + const n = parseInt(data, 10); + return !isNaN(n) && validate(n) ? n : defaultValue; +} +function getFloat({ + data, + defaultValue, + validate +}) { + if (!data) { + return defaultValue; + } + data = data.trim(); + const n = parseFloat(data); + return !isNaN(n) && validate(n) ? n : defaultValue; +} +function getKeyword({ + data, + defaultValue, + validate +}) { + if (!data) { + return defaultValue; + } + data = data.trim(); + return validate(data) ? data : defaultValue; +} +function getStringOption(data, options) { + return getKeyword({ + data, + defaultValue: options[0], + validate: k => options.includes(k) + }); +} +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]; + return conv ? conv(value) : value; +} +function getRatio(data) { + if (!data) { + return { + num: 1, + den: 1 + }; + } + const ratio = data.split(":", 2).map(x => parseFloat(x.trim())).filter(x => !isNaN(x)); + if (ratio.length === 1) { + ratio.push(1); + } + if (ratio.length === 0) { + return { + num: 1, + den: 1 + }; + } + const [num, den] = ratio; + return { + num, + den + }; +} +function getRelevant(data) { + if (!data) { + return []; + } + return data.trim().split(/\s+/).map(e => ({ + 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.split(",", 3).map(c => { + c = parseInt(c.trim(), 10); + return isNaN(c) ? 0 : MathClamp(c, 0, 255); + }); + 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.split(",", 4).map(m => getMeasurement(m.trim(), "-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 util_shadow(this, "FAILURE", new HTMLResult(false, null, null, null)); + } + static get EMPTY() { + return util_shadow(this, "EMPTY", new HTMLResult(true, null, null, null)); + } + constructor(success, html, bbox, breakNode) { + this.success = success; + this.html = html; + this.bbox = bbox; + this.breakNode = breakNode; + } + isBreak() { + return !!this.breakNode; + } + static breakNode(node) { + return new HTMLResult(false, null, null, node); + } + static success(html, bbox = null) { + return new HTMLResult(true, html, bbox, null); + } +} + +;// ./src/core/xfa/fonts.js + + + + + + + + + + + + + + + + +class FontFinder { + constructor(pdfFonts) { + this.fonts = new Map(); + this.cache = new Map(); + this.warned = new Set(); + this.defaultFont = null; + this.add(pdfFonts); + } + add(pdfFonts, reallyMissingFonts = null) { + for (const pdfFont of pdfFonts) { + this.addPdfFont(pdfFont); + } + for (const pdfFont of this.fonts.values()) { + pdfFont.regular ||= pdfFont.italic || pdfFont.bold || pdfFont.bolditalic; + } + if (!reallyMissingFonts || reallyMissingFonts.size === 0) { + return; + } + const myriad = this.fonts.get("PdfJS-Fallback-PdfJS-XFA"); + for (const missing of reallyMissingFonts) { + this.fonts.set(missing, myriad); + } + } + addPdfFont(pdfFont) { + const cssFontInfo = pdfFont.cssFontInfo; + const name = cssFontInfo.fontFamily; + const font = this.fonts.getOrInsertComputed(name, makeObj); + this.defaultFont ??= font; + let property = ""; + const fontWeight = parseFloat(cssFontInfo.fontWeight); + if (parseFloat(cssFontInfo.italicAngle) !== 0) { + property = fontWeight >= 700 ? "bolditalic" : "italic"; + } else if (fontWeight >= 700) { + property = "bold"; + } + if (!property) { + if (pdfFont.name.includes("Bold") || pdfFont.psName?.includes("Bold")) { + property = "bold"; + } + if (pdfFont.name.includes("Italic") || pdfFont.name.endsWith("It") || pdfFont.psName?.includes("Italic") || pdfFont.psName?.endsWith("It")) { + property += "italic"; + } + } + property ||= "regular"; + font[property] = pdfFont; + } + getDefault() { + return this.defaultFont; + } + find(fontName, mustWarn = true) { + let font = this.fonts.get(fontName) || this.cache.get(fontName); + if (font) { + return font; + } + const pattern = /[,\-_ ]|bolditalic|bold|italic|regular|it/gi; + let name = fontName.replaceAll(pattern, ""); + font = this.fonts.get(name); + if (font) { + this.cache.set(fontName, font); + return font; + } + name = name.toLowerCase(); + const maybe = []; + for (const [family, pdfFont] of this.fonts) { + 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 === 0) { + name = name.replaceAll(/psmt|mt/gi, ""); + for (const [family, pdfFont] of this.fonts) { + 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(xfaFont, typeface) { + if (xfaFont.posture === "italic") { + return xfaFont.weight === "bold" ? typeface.bolditalic : 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(xfaFont, margin, lineHeight, fontFinder) { + this.lineHeight = lineHeight; + this.paraMargin = margin || { + top: 0, + bottom: 0, + left: 0, + right: 0 + }; + if (!xfaFont) { + [this.pdfFont, this.xfaFont] = this.defaultFont(fontFinder); + return; + } + this.xfaFont = { + typeface: xfaFont.typeface, + posture: xfaFont.posture, + weight: xfaFont.weight, + size: xfaFont.size, + letterSpacing: xfaFont.letterSpacing + }; + const typeface = fontFinder.find(xfaFont.typeface); + if (!typeface) { + [this.pdfFont, this.xfaFont] = this.defaultFont(fontFinder); + return; + } + this.pdfFont = 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(defaultXfaFont, defaultParaMargin, defaultLineHeight, fontFinder) { + this.fontFinder = fontFinder; + this.stack = [new FontInfo(defaultXfaFont, defaultParaMargin, defaultLineHeight, fontFinder)]; + } + pushData(xfaFont, margin, lineHeight) { + const lastFont = this.stack.at(-1); + for (const name of ["typeface", "posture", "weight", "size", "letterSpacing"]) { + 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); + fontInfo.pdfFont ||= lastFont.pdfFont; + this.stack.push(fontInfo); + } + popFont() { + this.stack.pop(); + } + topFont() { + return this.stack.at(-1); + } +} +class TextMeasure { + constructor(defaultXfaFont, defaultParaMargin, defaultLineHeight, fonts) { + this.glyphs = []; + this.fontSelector = new FontSelector(defaultXfaFont, defaultParaMargin, defaultLineHeight, fonts); + this.extraHeight = 0; + } + pushData(xfaFont, margin, lineHeight) { + this.fontSelector.pushData(xfaFont, margin, lineHeight); + } + popFont(xfaFont) { + return this.fontSelector.popFont(); + } + addPara() { + const lastFont = this.fontSelector.topFont(); + this.extraHeight += lastFont.paraMargin.top + lastFont.paraMargin.bottom; + } + addString(str) { + if (!str) { + return; + } + const lastFont = this.fontSelector.topFont(); + const fontSize = lastFont.xfaFont.size; + if (lastFont.pdfFont) { + const letterSpacing = lastFont.xfaFont.letterSpacing; + const pdfFont = lastFont.pdfFont; + const 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", true]); + } + this.glyphs.pop(); + return; + } + 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]); + } + 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 + }; + } +} + +;// ./node_modules/core-js/modules/es.weak-map.get-or-insert.js +es_weak_map_get_or_insert_namespaceFn(); + +;// ./node_modules/core-js/modules/es.weak-map.get-or-insert-computed.js +es_weak_map_get_or_insert_computed_namespaceFn(); + +;// ./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(); + return index === "*" ? Infinity : parseInt(index, 10) || 0; +} +function parseExpression(expr, dotDotAllowed, noExpr = true) { + let match = expr.match(namePattern); + if (!match) { + return null; + } + let [name] = match; + const parsed = [{ + name, + cacheName: "." + name, + index: 0, + js: null, + formCalc: null, + operator: operators.dot + }]; + let pos = name.length; + while (pos < expr.length) { + const spos = pos; + const char = expr.charAt(pos++); + if (char === "[") { + match = expr.slice(pos).match(indexPattern); + if (!match) { + warn("XFA - Invalid index in SOM expression"); + return null; + } + parsed.at(-1).index = parseIndex(match[0]); + pos += match[0].length + 1; + continue; + } + let operator; + switch (expr.charAt(pos)) { + case ".": + if (!dotDotAllowed) { + return null; + } + pos++; + operator = operators.dotDot; + break; + case "#": + pos++; + operator = operators.dotHash; + break; + case "[": + if (noExpr) { + warn("XFA - SOM expression contains a FormCalc subexpression which is not supported for now."); + return null; + } + operator = operators.dotBracket; + break; + case "(": + if (noExpr) { + warn("XFA - SOM expression contains a JavaScript subexpression which is not supported for now."); + return null; + } + operator = operators.dotParen; + break; + default: + operator = operators.dot; + break; + } + match = expr.slice(pos).match(namePattern); + if (!match) { + break; + } + [name] = match; + pos += name.length; + parsed.push({ + name, + cacheName: expr.slice(spos, pos), + operator, + index: 0, + js: null, + formCalc: null + }); + } + return parsed; +} +function searchNode(root, container, expr, dotDotAllowed = true, useCache = true) { + const parsed = parseExpression(expr, dotDotAllowed); + if (!parsed) { + return null; + } + const fn = shortcuts.get(parsed[0].name); + let i = 0; + let isQualified; + if (fn) { + isQualified = true; + root = [fn(root, container)]; + i = 1; + } else { + isQualified = container === null; + root = [container || root]; + } + for (let ii = parsed.length; i < ii; i++) { + const { + name, + cacheName, + operator, + index + } = parsed[i]; + const nodes = []; + for (const node of root) { + if (!node.isXFAObject) { + continue; + } + let children, cached; + if (useCache) { + cached = somCache.getOrInsertComputed(node, makeMap); + 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); + } + } + if (nodes.length === 0 && !isQualified && i === 0) { + const parent = container[$getParent](); + container = parent; + if (!container) { + return null; + } + i = -1; + root = [container]; + continue; + } + root = isFinite(index) ? nodes.filter(node => index < node.length).map(node => node[index]) : nodes.flat(); + } + return root.length === 0 ? null : root; +} +function createDataNode(root, container, expr) { + const parsed = parseExpression(expr); + if (!parsed || 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; +} + +;// ./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 xfa_object_uid = 0; +const NS_DATASETS = NamespaceIds.datasets.id; +class XFAObject { + constructor(nsId, name, hasChildren = false) { + this[$namespaceId] = nsId; + this[$nodeName] = name; + this[_hasChildren] = hasChildren; + this[_parent] = null; + this[_children] = []; + this[$uid] = `${name}${xfa_object_uid++}`; + this[$globalData] = null; + } + get isXFAObject() { + return true; + } + get isXFAObjectArray() { + return false; + } + 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); + } + root = node; + } + return node; + } + [$onChild](child) { + if (!this[_hasChildren] || !this[$onChildCheck](child)) { + return false; + } + const name = child[$nodeName]; + const node = this[name]; + if (node instanceof XFAObjectArray) { + if (node.push(child)) { + this[$appendChild](child); + return true; + } + } else { + if (node !== null) { + this[$removeChild](node); + } + this[name] = child; + this[$appendChild](child); + return true; + } + let id = ""; + if (this.id) { + id = ` (id: ${this.id})`; + } else if (this.name) { + id = ` (name: ${this.name} ${this.h.value})`; + } + warn(`XFA - node "${this[$nodeName]}"${id} has already enough "${name}"!`); + return false; + } + [$onChildCheck](child) { + return Object.hasOwn(this, child[$nodeName]) && child[$namespaceId] === this[$namespaceId]; + } + [$isNsAgnostic]() { + return false; + } + [$acceptWhitespace]() { + return false; + } + [$isCDATAXml]() { + return false; + } + [$isBindable]() { + return false; + } + [$popPara]() { + if (this.para) { + this[$getTemplateRoot]()[$extra].paraStack.pop(); + } + } + [$pushPara]() { + this[$getTemplateRoot]()[$extra].paraStack.push(this.para); + } + [$setId](ids) { + if (this.id && this[$namespaceId] === NamespaceIds.template.id) { + ids.set(this.id, this); + } + } + [$getTemplateRoot]() { + return this[$globalData].template; + } + [$isSplittable]() { + return false; + } + [$isThereMoreWidth]() { + return false; + } + [$appendChild](child) { + child[_parent] = this; + this[_children].push(child); + if (!child[$globalData] && this[$globalData]) { + child[$globalData] = this[$globalData]; + } + } + [$removeChild](child) { + const i = this[_children].indexOf(child); + this[_children].splice(i, 1); + } + [$hasSettableValue]() { + return Object.hasOwn(this, "value"); + } + [$setValue](_) {} + [$onText](_) {} + [$finalize]() {} + [$clean](builder) { + delete this[_hasChildren]; + if (this[$cleanup]) { + builder.clean(this[$cleanup]); + delete this[$cleanup]; + } + } + [$indexOf](child) { + return this[_children].indexOf(child); + } + [$insertAt](i, child) { + child[_parent] = this; + this[_children].splice(i, 0, child); + if (!child[$globalData] && this[$globalData]) { + child[$globalData] = this[$globalData]; + } + } + [$isTransparent]() { + return !this.name; + } + [$lastAttribute]() { + return ""; + } + [$text]() { + return this[_children].length === 0 ? this[$content] : this[_children].map(c => c[$text]()).join(""); + } + get [_attributeNames]() { + const proto = Object.getPrototypeOf(this); + if (!proto._attributes) { + const attributes = proto._attributes = new Set(); + for (const name of Object.getOwnPropertyNames(this)) { + if (this[name] === null || this[name] instanceof XFAObject || this[name] instanceof XFAObjectArray) { + break; + } + attributes.add(name); + } + } + return util_shadow(this, _attributeNames, proto._attributes); + } + [$isDescendent](parent) { + let node = this; + while (node) { + if (node === parent) { + return true; + } + node = node[$getParent](); + } + return false; + } + [$getParent]() { + return this[_parent]; + } + [$getSubformParent]() { + return this[$getParent](); + } + [$dump]() { + const dumped = Object.create(null); + if (this[$content]) { + dumped.$content = this[$content]; + } + for (const name of Object.getOwnPropertyNames(this)) { + const value = this[name]; + if (value === null) { + continue; + } + if (value instanceof XFAObject) { + dumped[name] = value[$dump](); + } else if (value instanceof XFAObjectArray) { + if (!value.isEmpty()) { + dumped[name] = value.dump(); + } + } else { + dumped[name] = value; + } + } + return dumped; + } + [$toStyle]() { + return null; + } + [$toHTML]() { + return 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.keys().filter(x => allAttr.has(x) && !setAttr.has(x)).toArray(); + } + [$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); + 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)); + } + return typeof obj === "object" && obj !== null ? Object.assign({}, obj) : obj; + } + [$clone]() { + const clone = Object.create(Object.getPrototypeOf(this)); + for (const $symbol of Object.getOwnPropertySymbols(this)) { + try { + clone[$symbol] = this[$symbol]; + } catch { + util_shadow(clone, $symbol, this[$symbol]); + } + } + clone[$uid] = `${clone[$nodeName]}${xfa_object_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) { + return !name ? this[_children] : 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(max = Infinity) { + this[_max] = max; + this[_children] = []; + } + get isXFAObject() { + return false; + } + get isXFAObjectArray() { + return true; + } + push(child) { + const len = this[_children].length; + if (len <= this[_max]) { + this[_children].push(child); + return true; + } + warn(`XFA - node "${child[$nodeName]}" accepts no more than ${this[_max]} children`); + return false; + } + isEmpty() { + return this[_children].length === 0; + } + dump() { + return this[_children].length === 1 ? this[_children][0][$dump]() : this[_children].map(x => x[$dump]()); + } + [$clone]() { + const clone = new XFAObjectArray(this[_max]); + clone[_children] = this[_children].map(c => c[$clone]()); + return clone; + } + get children() { + return this[_children]; + } + clear() { + this[_children].length = 0; + } +} +class XFAAttribute { + constructor(node, name, value) { + this[_parent] = node; + this[$nodeName] = name; + this[$content] = value; + this[$consumed] = false; + this[$uid] = `attribute${xfa_object_uid++}`; + } + [$getParent]() { + return this[_parent]; + } + [$isDataValue]() { + return true; + } + [$getDataValue]() { + return this[$content].trim(); + } + [$setValue](value) { + value = value.value || ""; + this[$content] = value.toString(); + } + [$text]() { + return this[$content]; + } + [$isDescendent](parent) { + return this[_parent] === parent || this[_parent][$isDescendent](parent); + } +} +class XmlObject extends XFAObject { + constructor(nsId, name, attributes = {}) { + super(nsId, name); + this[$content] = ""; + this[_dataValue] = null; + if (name !== "#text") { + const map = new Map(); + this[_attributes] = map; + for (const [attrName, value] of Object.entries(attributes)) { + map.set(attrName, new XFAAttribute(this, attrName, value)); + } + if (Object.hasOwn(attributes, $nsAttributes)) { + const dataNode = attributes[$nsAttributes].xfa.dataNode; + if (dataNode !== undefined) { + if (dataNode === "dataGroup") { + this[_dataValue] = false; + } else if (dataNode === "dataValue") { + this[_dataValue] = true; + } + } + } + } + this[$consumed] = false; + } + [$toString](buf) { + const tagName = this[$nodeName]; + if (tagName === "#text") { + buf.push(encodeToXmlString(this[$content])); + return; + } + const utf8TagName = utf8StringToString(tagName); + const prefix = this[$namespaceId] === NS_DATASETS ? "xfa:" : ""; + buf.push(`<${prefix}${utf8TagName}`); + for (const [name, value] of this[_attributes]) { + const utf8Name = utf8StringToString(name); + buf.push(` ${utf8Name}="${encodeToXmlString(value[$content])}"`); + } + if (this[_dataValue] !== null) { + if (this[_dataValue]) { + buf.push(` xfa:dataNode="dataValue"`); + } else { + buf.push(` xfa:dataNode="dataGroup"`); + } + } + if (!this[$content] && this[_children].length === 0) { + buf.push("/>"); + return; + } + buf.push(">"); + if (this[$content]) { + if (typeof this[$content] === "string") { + buf.push(encodeToXmlString(this[$content])); + } else { + this[$content][$toString](buf); + } + } else { + for (const child of this[_children]) { + child[$toString](buf); + } + } + buf.push(``); + } + [$onChild](child) { + if (this[$content]) { + const node = new XmlObject(this[$namespaceId], "#text"); + this[$appendChild](node); + node[$content] = this[$content]; + this[$content] = ""; + } + this[$appendChild](child); + return true; + } + [$onText](str) { + this[$content] += str; + } + [$finalize]() { + if (this[$content] && this[_children].length > 0) { + const node = new XmlObject(this[$namespaceId], "#text"); + this[$appendChild](node); + node[$content] = this[$content]; + delete this[$content]; + } + } + [$toHTML]() { + if (this[$nodeName] === "#text") { + return HTMLResult.success({ + name: "#text", + value: this[$content] + }); + } + return HTMLResult.EMPTY; + } + [$getAttributes]() { + return this[_attributes]; + } + [$getChildrenByClass](name) { + const value = this[_attributes].get(name); + return value !== undefined ? value : this[$getChildren](name); + } + *[$getChildrenByNameIt](name, allTransparent) { + const value = this[_attributes].get(name); + if (value) { + yield value; + } + for (const child of this[_children]) { + if (child[$nodeName] === name) { + yield child; + } + if (allTransparent) { + yield* child[$getChildrenByNameIt](name, allTransparent); + } + } + } + *[$getAttributeIt](name, skipConsumed) { + const value = this[_attributes].get(name); + if (value && (!skipConsumed || !value[$consumed])) { + yield value; + } + for (const child of this[_children]) { + yield* child[$getAttributeIt](name, skipConsumed); + } + } + *[$getRealChildrenByNameIt](name, allTransparent, skipConsumed) { + for (const child of this[_children]) { + if (child[$nodeName] === name && (!skipConsumed || !child[$consumed])) { + yield child; + } + if (allTransparent) { + yield* child[$getRealChildrenByNameIt](name, allTransparent, skipConsumed); + } + } + } + [$isDataValue]() { + if (this[_dataValue] === null) { + return this[_children].length === 0 || this[_children][0][$namespaceId] === NamespaceIds.xhtml.id; + } + return this[_dataValue]; + } + [$getDataValue]() { + if (this[_dataValue] === null) { + if (this[_children].length === 0) { + return this[$content].trim(); + } + return this[_children][0][$namespaceId] === NamespaceIds.xhtml.id ? this[_children][0][$text]().trim() : null; + } + return this[$content].trim(); + } + [$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(nsId, name) { + super(nsId, name); + this[$content] = ""; + } + [$onText](text) { + this[$content] += text; + } + [$finalize]() {} +} +class OptionObject extends ContentObject { + constructor(nsId, name, options) { + super(nsId, name); + this[_options] = options; + } + [$finalize]() { + this[$content] = getKeyword({ + data: this[$content], + defaultValue: this[_options][0], + validate: k => this[_options].includes(k) + }); + } + [$clean](builder) { + super[$clean](builder); + delete this[_options]; + } +} +class StringObject extends ContentObject { + [$finalize]() { + this[$content] = this[$content].trim(); + } +} +class IntegerObject extends ContentObject { + constructor(nsId, name, defaultValue, validator) { + super(nsId, name); + this[_defaultValue] = defaultValue; + this[_validator] = validator; + } + [$finalize]() { + this[$content] = getInteger({ + data: this[$content], + defaultValue: this[_defaultValue], + validate: this[_validator] + }); + } + [$clean](builder) { + super[$clean](builder); + delete this[_defaultValue]; + delete this[_validator]; + } +} +class Option01 extends IntegerObject { + constructor(nsId, name) { + super(nsId, name, 0, n => n === 1); + } +} +class Option10 extends IntegerObject { + 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`; +} +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(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 = Math.sumPrecise(extra.columnWidths.slice(extra.currentColumn)); + extra.currentColumn = 0; + } else { + w = Math.sumPrecise(extra.columnWidths.slice(extra.currentColumn, extra.currentColumn + colSpan)); + extra.currentColumn = (extra.currentColumn + node.colSpan) % extra.columnWidths.length; + } + if (!isNaN(w)) { + width = node.w = w; + } + } + style.width = width !== "" ? measureToString(width) : "auto"; + style.height = height !== "" ? measureToString(height) : "auto"; + }, + 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"; + } + }, + presence(node, style) { + switch (node.presence) { + case "invisible": + style.visibility = "hidden"; + break; + case "hidden": + case "inactive": + style.display = "none"; + break; + } + }, + hAlign(node, style) { + if (node[$nodeName] === "para") { + switch (node.hAlign) { + case "justifyAll": + style.textAlign = "justify-all"; + break; + case "radix": + style.textAlign = "left"; + break; + default: + style.textAlign = node.hAlign; + } + } else { + switch (node.hAlign) { + case "left": + style.alignSelf = "start"; + break; + case "center": + style.alignSelf = "center"; + break; + case "right": + style.alignSelf = "end"; + break; + } + } + }, + margin(node, style) { + if (node.margin) { + style.margin = node.margin[$toStyle]().margin; + } + } +}; +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(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(node, availableSpace) { + let height = null; + let width = null; + let isBroken = false; + if ((!node.w || !node.h) && node.value) { + let marginH = 0; + let marginV = 0; + if (node.margin) { + marginH = node.margin.leftInset + node.margin.rightInset; + marginV = node.margin.topInset + node.margin.bottomInset; + } + let lineHeight = null; + let margin = null; + if (node.para) { + margin = Object.create(null); + lineHeight = node.para.lineHeight === "" ? null : node.para.lineHeight; + margin.top = node.para.spaceAbove === "" ? 0 : node.para.spaceAbove; + margin.bottom = node.para.spaceBelow === "" ? 0 : node.para.spaceBelow; + margin.left = node.para.marginLeft === "" ? 0 : node.para.marginLeft; + margin.right = node.para.marginRight === "" ? 0 : node.para.marginRight; + } + let font = node.font; + if (!font) { + const root = node[$getTemplateRoot](); + let parent = node[$getParent](); + while (parent && parent !== root) { + if (parent.font) { + font = parent.font; + break; + } + parent = parent[$getParent](); + } + } + const maxWidth = (node.w || availableSpace.width) - marginH; + const fontFinder = node[$globalData].fontFinder; + if (node.value.exData && node.value.exData[$content] && node.value.exData.contentType === "text/html") { + const res = layoutText(node.value.exData[$content], font, margin, lineHeight, fontFinder, maxWidth); + width = res.width; + height = res.height; + isBroken = res.isBroken; + } else { + 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; + } + } + if (width !== null && !node.w) { + width += marginH; + } + if (height !== null && !node.h) { + height += marginV; + } + } + return { + w: width, + h: height, + isBroken + }; +} +function computeBbox(node, html, availableSpace) { + let bbox; + if (node.w !== "" && node.h !== "") { + bbox = [node.x, node.y, node.w, node.h]; + } else { + if (!availableSpace) { + return null; + } + let width = node.w; + if (width === "") { + if (node.maxW === 0) { + const parent = node[$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]; + } + return bbox; +} +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 = Math.sumPrecise(extra.columnWidths.slice(extra.currentColumn)); + } else { + width = Math.sumPrecise(extra.columnWidths.slice(extra.currentColumn, extra.currentColumn + colSpan)); + } + 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 = Math.sumPrecise(node.columnWidths); + } + } +} +function layoutClass(node) { + switch (node.layout) { + case "position": + return "xfaPosition"; + case "lr-tb": + return "xfaLrTb"; + case "rl-row": + return "xfaRlRow"; + case "rl-tb": + return "xfaRlTb"; + case "row": + return "xfaRow"; + case "table": + return "xfaTable"; + case "tb": + return "xfaTb"; + default: + return "xfaPosition"; + } +} +function toStyle(node, ...names) { + const style = Object.create(null); + for (const name of names) { + const value = node[name]; + if (value === null) { + continue; + } + if (Object.hasOwn(converters, 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 style; +} +function createWrapper(node, html) { + const { + attributes + } = html; + const { + style + } = attributes; + const wrapper = { + name: "div", + attributes: { + class: ["xfaWrapper"], + style: Object.create(null) + }, + children: [] + }; + attributes.class.push("xfaWrapped"); + if (node.border) { + const { + widths, + insets + } = node.border[$extra]; + let width, height; + let top = insets[0]; + let left = insets[3]; + const insetsH = insets[0] + insets[2]; + const insetsW = insets[1] + insets[3]; + switch (node.border.hand) { + case "even": + top -= widths[0] / 2; + left -= widths[3] / 2; + width = `calc(100% + ${(widths[1] + widths[3]) / 2 - insetsW}px)`; + height = `calc(100% + ${(widths[0] + widths[2]) / 2 - insetsH}px)`; + break; + case "left": + top -= widths[0]; + left -= widths[3]; + width = `calc(100% + ${widths[1] + widths[3] - insetsW}px)`; + height = `calc(100% + ${widths[0] + widths[2] - insetsH}px)`; + break; + case "right": + width = insetsW ? `calc(100% - ${insetsW}px)` : "100%"; + height = insetsH ? `calc(100% - ${insetsH}px)` : "100%"; + break; + } + const classNames = ["xfaBorder"]; + if (isPrintOnly(node.border)) { + classNames.push("xfaPrintOnly"); + } + const border = { + name: "div", + attributes: { + class: classNames, + style: { + top: `${top}px`, + left: `${left}px`, + width, + height + } + }, + children: [] + }; + for (const key of ["border", "borderWidth", "borderColor", "borderRadius", "borderStyle"]) { + if (style[key] !== undefined) { + border.attributes.style[key] = style[key]; + delete style[key]; + } + } + wrapper.children.push(border, html); + } else { + wrapper.children.push(html); + } + for (const key of ["background", "backgroundClip", "top", "left", "width", "height", "minWidth", "minHeight", "maxWidth", "maxHeight", "transform", "transformOrigin", "visibility"]) { + if (style[key] !== undefined) { + wrapper.attributes.style[key] = style[key]; + delete style[key]; + } + } + 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 fixTextIndent(styles) { + const indent = getMeasurement(styles.textIndent, "0px"); + if (indent >= 0) { + return; + } + 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 isPrintOnly(node) { + return node.relevant.length > 0 && !node.relevant[0].excluded && node.relevant[0].viewname === "print"; +} +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 = serializeFontFamily(name); + const typeface = fontFinder.find(name); + if (typeface) { + const { + fontFamily + } = typeface.regular.cssFontInfo; + if (fontFamily !== name) { + style.fontFamily = serializeFontFamily(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: [node.layout === "lr-tb" ? "xfaLr" : "xfaRl"] + }, + children + }; +} +function flushHTML(node) { + if (!node[$extra]) { + return null; + } + 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); + } + } + } + return html.children.length === 0 ? null : html; +} +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 (!extra.line || extra.attempt === 1) { + extra.line = createLine(node, []); + extra.children.push(extra.line); + extra.numberInLine = 0; + } + extra.numberInLine += 1; + extra.line.children.push(html); + if (extra.attempt === 0) { + extra.currentWidth += w; + extra.height = Math.max(extra.height, extra.prevHeight + h); + } else { + extra.currentWidth = w; + extra.prevHeight = extra.height; + extra.height += h; + extra.attempt = 0; + } + extra.width = Math.max(extra.width, extra.currentWidth); + break; + case "rl-row": + case "row": + { + extra.children.push(html); + extra.width += w; + extra.height = Math.max(extra.height, h); + const height = measureToString(extra.height); + for (const child of extra.children) { + child.attributes.style.height = height; + } + break; + } + case "table": + { + extra.width = MathClamp(w, extra.width, availableSpace.width); + extra.height += h; + extra.children.push(html); + break; + } + case "tb": + { + extra.width = MathClamp(w, extra.width, availableSpace.width); + extra.height += h; + extra.children.push(html); + break; + } + } +} +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": + 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 = Math.sumPrecise(node[$extra].columnWidths.slice(node[$extra].currentColumn)); + return { + width, + height: availableSpace.height - marginH + }; + case "table": + case "tb": + return { + width: availableSpace.width - marginH, + height: availableSpace.height - marginV - node[$extra].height + }; + case "position": + default: + return availableSpace; + } +} +function getTransformedBBox(node) { + let w = node.w === "" ? NaN : node.w; + let h = node.h === "" ? NaN : node.h; + let [centerX, centerY] = [0, 0]; + switch (node.anchorType || "") { + case "bottomCenter": + [centerX, centerY] = [w / 2, h]; + break; + case "bottomLeft": + [centerX, centerY] = [0, h]; + break; + case "bottomRight": + [centerX, centerY] = [w, h]; + break; + case "middleCenter": + [centerX, centerY] = [w / 2, h / 2]; + break; + case "middleLeft": + [centerX, centerY] = [0, h / 2]; + break; + case "middleRight": + [centerX, centerY] = [w, h / 2]; + break; + case "topCenter": + [centerX, centerY] = [w / 2, 0]; + break; + case "topRight": + [centerX, centerY] = [w, 0]; + break; + } + let x, y; + switch (node.rotate || 0) { + case 0: + [x, y] = [-centerX, -centerY]; + break; + case 90: + [x, y] = [-centerY, centerX]; + [w, h] = [h, -w]; + break; + case 180: + [x, y] = [centerX, centerY]; + [w, h] = [-w, -h]; + break; + case 270: + [x, y] = [centerY, -centerX]; + [w, h] = [-h, w]; + break; + } + return [node.x + x + Math.min(0, w), node.y + y + Math.min(0, h), Math.abs(w), Math.abs(h)]; +} +function checkDimensions(node, space) { + if (node[$getTemplateRoot]()[$extra].firstUnsplittable === null || 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": + 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": + 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 (node[$getTemplateRoot]()[$extra].noLayoutFailure || 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": + if (node[$getTemplateRoot]()[$extra].noLayoutFailure) { + return true; + } + 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 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(node) { + return node.margin && (node.margin.topInset || node.margin.rightInset || node.margin.bottomInset || node.margin.leftInset); +} +function _setValue(templateNode, value) { + if (!templateNode.value) { + const nodeValue = new template_Value({}); + templateNode[$appendChild](nodeValue); + templateNode.value = nodeValue; + } + templateNode.value[$setValue](value); +} +function* getContainedChildren(node) { + for (const child of node[$getChildren]()) { + if (child instanceof SubformSet) { + yield* child[$getContainedChildren](); + continue; + } + yield child; + } +} +function isRequired(node) { + return node.validate?.nullTest === "error"; +} +function setTabIndex(node) { + while (node) { + if (!node.traversal) { + node[$tabIndex] = node[$getParent]()[$tabIndex]; + return; + } + if (node[$tabIndex]) { + return; + } + let next = null; + for (const child of node.traversal[$getChildren]()) { + if (child.operation === "next") { + next = child; + break; + } + } + if (!next || !next.ref) { + node[$tabIndex] = node[$getParent]()[$tabIndex]; + return; + } + const root = node[$getTemplateRoot](); + node[$tabIndex] = ++root[$tabIndex]; + const ref = root[$searchNode](next.ref, node); + if (!ref) { + return; + } + node = ref[0]; + } +} +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 (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(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(value) { + return HTMLResult.success({ + name: "div", + attributes: { + class: ["xfaRich"], + style: Object.create(null) + }, + children: [{ + name: "span", + attributes: { + style: Object.create(null) + }, + value + }] + }); +} +function setFirstUnsplittable(node) { + const root = node[$getTemplateRoot](); + if (root[$extra].firstUnsplittable === null) { + root[$extra].firstUnsplittable = node; + root[$extra].noLayoutFailure = true; + } +} +function unsetFirstUnsplittable(node) { + const root = node[$getTemplateRoot](); + if (root[$extra].firstUnsplittable === node) { + root[$extra].noLayoutFailure = false; + } +} +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; + } + target = target[0]; + } + const { + currentPageArea, + currentContentArea + } = root[$extra]; + if (node.targetType === "pageArea") { + if (!(target instanceof PageArea)) { + target = null; + } + if (node.startNew) { + node[$extra].target = target || currentPageArea; + return true; + } else if (target && target !== currentPageArea) { + node[$extra].target = target; + return true; + } + return false; + } + if (!(target instanceof ContentArea)) { + target = null; + } + 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(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(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(attributes) { + super(TEMPLATE_NS_ID, "arc", true); + this.circular = getInteger({ + data: attributes.circular, + defaultValue: 0, + validate: x => x === 1 + }); + this.hand = getStringOption(attributes.hand, ["even", "left", "right"]); + this.id = attributes.id || ""; + this.startAngle = getFloat({ + data: attributes.startAngle, + defaultValue: 0, + validate: x => true + }); + this.sweepAngle = getFloat({ + data: attributes.sweepAngle, + defaultValue: 360, + validate: x => true + }); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.edge = null; + this.fill = null; + } + [$toHTML]() { + const edge = this.edge || new template_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 (this.sweepAngle === 360) { + arc = { + name: "ellipse", + attributes: { + xmlns: SVG_NS, + cx: "50%", + cy: "50%", + rx: "50%", + ry: "50%", + style + } + }; + } else { + const startAngle = this.startAngle * Math.PI / 180; + const sweepAngle = this.sweepAngle * Math.PI / 180; + const largeArc = this.sweepAngle > 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: SVG_NS, + d: `M ${x1} ${y1} A 50 50 0 ${largeArc} 0 ${x2} ${y2}`, + vectorEffect: "non-scaling-stroke", + style + } + }; + Object.assign(attributes, { + viewBox: "0 0 100 100", + preserveAspectRatio: "none" + }); + } + const svg = { + name: "svg", + children: [arc], + attributes + }; + const parent = this[$getParent]()[$getParent](); + if (hasMargin(parent)) { + return HTMLResult.success({ + name: "div", + attributes: { + style: { + display: "inline", + width: "100%", + height: "100%" + } + }, + children: [svg] + }); + } + svg.attributes.style.position = "absolute"; + return HTMLResult.success(svg); + } +} +class Area extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "area", true); + this.colSpan = getInteger({ + data: attributes.colSpan, + defaultValue: 1, + validate: n => n >= 1 || n === -1 + }); + 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(); + this.draw = new XFAObjectArray(); + this.exObject = new XFAObjectArray(); + this.exclGroup = new XFAObjectArray(); + this.field = new XFAObjectArray(); + this.subform = new XFAObjectArray(); + this.subformSet = new XFAObjectArray(); + } + *[$getContainedChildren]() { + yield* getContainedChildren(this); + } + [$isTransparent]() { + return true; + } + [$isBindable]() { + return true; + } + [$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); + } + [$getAvailableSpace]() { + return this[$extra].availableSpace; + } + [$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", "field", "exclGroup", "subform", "subformSet"]), + include: true + }); + if (!result.success) { + if (result.isBreak()) { + return result; + } + delete this[$extra]; + return HTMLResult.FAILURE; + } + 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(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; + } + [$toHTML]() { + return this.toolTip?.[$content] || null; + } +} +class Barcode extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "barcode", true); + this.charEncoding = getKeyword({ + data: attributes.charEncoding ? attributes.charEncoding.toLowerCase() : "", + defaultValue: "", + validate: k => ["utf-8", "big-five", "fontspecific", "gbk", "gb-18030", "gb-2312", "ksc-5601", "none", "shift-jis", "ucs-2", "utf-16"].includes(k) || k.match(/iso-8859-\d{2}/) + }); + this.checksum = getStringOption(attributes.checksum, ["none", "1mod10", "1mod10_1mod11", "2mod10", "auto"]); + this.dataColumnCount = getInteger({ + data: attributes.dataColumnCount, + defaultValue: -1, + validate: x => x >= 0 + }); + this.dataLength = getInteger({ + data: attributes.dataLength, + defaultValue: -1, + validate: x => x >= 0 + }); + this.dataPrep = getStringOption(attributes.dataPrep, ["none", "flateCompress"]); + this.dataRowCount = getInteger({ + data: attributes.dataRowCount, + defaultValue: -1, + validate: x => x >= 0 + }); + this.endChar = attributes.endChar || ""; + this.errorCorrectionLevel = getInteger({ + data: attributes.errorCorrectionLevel, + defaultValue: -1, + validate: x => x >= 0 && x <= 8 + }); + this.id = attributes.id || ""; + this.moduleHeight = getMeasurement(attributes.moduleHeight, "5mm"); + this.moduleWidth = getMeasurement(attributes.moduleWidth, "0.25mm"); + this.printCheckDigit = getInteger({ + data: attributes.printCheckDigit, + defaultValue: 0, + validate: x => x === 1 + }); + this.rowColumnRatio = getRatio(attributes.rowColumnRatio); + this.startChar = attributes.startChar || ""; + this.textLocation = getStringOption(attributes.textLocation, ["below", "above", "aboveEmbedded", "belowEmbedded", "none"]); + this.truncate = getInteger({ + data: attributes.truncate, + defaultValue: 0, + validate: x => x === 1 + }); + 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 = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.wideNarrowRatio = getRatio(attributes.wideNarrowRatio); + this.encrypt = null; + this.extras = null; + } +} +class Bind extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "bind", true); + this.match = getStringOption(attributes.match, ["once", "dataRef", "global", "none"]); + this.ref = attributes.ref || ""; + this.picture = null; + } +} +class BindItems extends XFAObject { + 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(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(attributes) { + super(TEMPLATE_NS_ID, "boolean"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } + [$toHTML](availableSpace) { + return valueToHtml(this[$content] === 1 ? "1" : "0"); + } +} +class Border extends XFAObject { + 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(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; + } + [$getExtra]() { + if (!this[$extra]) { + const edges = this.edge.children.slice(); + if (edges.length < 4) { + const defaultEdge = edges.at(-1) || new template_Edge({}); + for (let i = edges.length; i < 4; i++) { + edges.push(defaultEdge); + } + } + const widths = edges.map(edge => edge.thickness); + const insets = [0, 0, 0, 0]; + if (this.margin) { + insets[0] = this.margin.topInset; + insets[1] = this.margin.rightInset; + insets[2] = this.margin.bottomInset; + insets[3] = this.margin.leftInset; + } + this[$extra] = { + widths, + insets, + edges + }; + } + return this[$extra]; + } + [$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); + } + } + style.borderRadius = cornerStyles.map(s => s.radius).join(" "); + } + switch (this.presence) { + case "invisible": + case "hidden": + style.borderStyle = ""; + break; + case "inactive": + style.borderStyle = "none"; + break; + default: + style.borderStyle = edgeStyles.map(s => s.style).join(" "); + break; + } + style.borderWidth = edgeStyles.map(s => s.width).join(" "); + style.borderColor = edgeStyles.map(s => s.color).join(" "); + return style; + } +} +class Break extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "break", true); + this.after = getStringOption(attributes.after, ["auto", "contentArea", "pageArea", "pageEven", "pageOdd"]); + this.afterTarget = attributes.afterTarget || ""; + this.before = getStringOption(attributes.before, ["auto", "contentArea", "pageArea", "pageEven", "pageOdd"]); + this.beforeTarget = attributes.beforeTarget || ""; + this.bookendLeader = attributes.bookendLeader || ""; + this.bookendTrailer = attributes.bookendTrailer || ""; + this.id = attributes.id || ""; + this.overflowLeader = attributes.overflowLeader || ""; + this.overflowTarget = attributes.overflowTarget || ""; + this.overflowTrailer = attributes.overflowTrailer || ""; + this.startNew = getInteger({ + data: attributes.startNew, + defaultValue: 0, + validate: x => x === 1 + }); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + } +} +class BreakAfter extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "breakAfter", true); + this.id = attributes.id || ""; + this.leader = attributes.leader || ""; + this.startNew = getInteger({ + data: attributes.startNew, + defaultValue: 0, + validate: x => x === 1 + }); + this.target = attributes.target || ""; + this.targetType = getStringOption(attributes.targetType, ["auto", "contentArea", "pageArea"]); + this.trailer = attributes.trailer || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.script = null; + } +} +class BreakBefore extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "breakBefore", true); + this.id = attributes.id || ""; + this.leader = attributes.leader || ""; + this.startNew = getInteger({ + data: attributes.startNew, + defaultValue: 0, + validate: x => x === 1 + }); + this.target = attributes.target || ""; + this.targetType = getStringOption(attributes.targetType, ["auto", "contentArea", "pageArea"]); + this.trailer = attributes.trailer || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.script = null; + } + [$toHTML](availableSpace) { + this[$extra] = {}; + return HTMLResult.FAILURE; + } +} +class Button extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "button", true); + this.highlight = getStringOption(attributes.highlight, ["inverted", "none", "outline", "push"]); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + } + [$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: [] + }); + } + return HTMLResult.success(htmlButton); + } +} +class Calculate extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "calculate", true); + this.id = attributes.id || ""; + this.override = getStringOption(attributes.override, ["disabled", "error", "ignore", "warning"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + this.message = null; + this.script = null; + } +} +class Caption extends XFAObject { + 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(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); + 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; + } + [$setValue](value) { + _setValue(this, value); + } + [$getExtra](availableSpace) { + if (!this[$extra]) { + let { + width, + height + } = availableSpace; + switch (this.placement) { + case "left": + case "right": + case "inline": + width = this.reserve <= 0 ? width : this.reserve; + break; + case "top": + case "bottom": + height = this.reserve <= 0 ? height : this.reserve; + break; + } + this[$extra] = layoutNode(this, { + width, + height + }); + } + return this[$extra]; + } + [$toHTML](availableSpace) { + if (!this.value) { + return HTMLResult.EMPTY; + } + 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, + h + } = this[$getExtra](availableSpace); + switch (this.placement) { + case "left": + case "right": + case "inline": + this.reserve = w; + break; + case "top": + case "bottom": + this.reserve = h; + break; + } + } + const children = []; + if (typeof value === "string") { + children.push({ + name: "#text", + value + }); + } else { + children.push(value); + } + const style = toStyle(this, "font", "margin", "visibility"); + switch (this.placement) { + case "left": + case "right": + if (this.reserve > 0) { + style.width = measureToString(this.reserve); + } + break; + case "top": + case "bottom": + if (this.reserve > 0) { + style.height = measureToString(this.reserve); + } + break; + } + setPara(this, null, value); + this[$popPara](); + this.reserve = savedReserve; + return HTMLResult.success({ + name: "div", + attributes: { + style, + class: ["xfaCaption"] + }, + children + }); + } +} +class Certificate extends StringObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "certificate"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Certificates extends XFAObject { + 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; + this.oids = null; + this.signing = null; + this.subjectDNs = null; + } +} +class CheckButton extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "checkButton", true); + this.id = attributes.id || ""; + this.mark = getStringOption(attributes.mark, ["default", "check", "circle", "cross", "diamond", "square", "star"]); + 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; + } + [$toHTML](availableSpace) { + const style = toStyle(this, "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 { + type = "checkbox"; + className = "xfaCheckbox"; + dataId = field[$data]?.[$uid] || field[$uid]; + } + const input = { + name: "input", + attributes: { + class: [className], + style, + fieldId, + dataId, + type, + checked, + xfaOn: exportedValue.on, + xfaOff: exportedValue.off, + "aria-label": ariaLabel(field), + "aria-required": false + } + }; + 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: [input] + }); + } +} +class ChoiceList extends XFAObject { + 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: attributes.textEntry, + defaultValue: 0, + validate: x => x === 1 + }); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.border = null; + this.extras = null; + this.margin = null; + } + [$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(--total-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 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: values[i] || displayed[i], + style: optionStyle + }, + value: displayed[i] + }; + if (values[i] === value) { + option.attributes.selected = selected = true; + } + children.push(option); + } + if (!selected) { + children.splice(0, 0, { + name: "option", + attributes: { + hidden: true, + selected: true + }, + value: " " + }); + } + } + const selectAttributes = { + class: ["xfaSelect"], + fieldId: field[$uid], + dataId: field[$data]?.[$uid] || field[$uid], + style, + "aria-label": ariaLabel(field), + "aria-required": false + }; + if (isRequired(field)) { + selectAttributes["aria-required"] = true; + selectAttributes.required = true; + } + if (this.open === "multiSelect") { + selectAttributes.multiple = true; + } + return HTMLResult.success({ + name: "label", + attributes: { + class: ["xfaLabel"] + }, + children: [{ + name: "select", + children, + attributes: selectAttributes + }] + }); + } +} +class Color extends XFAObject { + 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; + } + [$hasSettableValue]() { + return false; + } + [$toStyle]() { + return this.value ? Util.makeHexColor(this.value.r, this.value.g, this.value.b) : null; + } +} +class Comb extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "comb"); + this.id = attributes.id || ""; + this.numberOfCells = getInteger({ + data: attributes.numberOfCells, + defaultValue: 0, + validate: x => x >= 0 + }); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Connect extends XFAObject { + 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 = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.picture = null; + } +} +class ContentArea extends XFAObject { + 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; + } + [$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, + class: classNames, + id: this[$uid] + } + }); + } +} +class Corner extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "corner", true); + this.id = attributes.id || ""; + this.inverted = getInteger({ + data: attributes.inverted, + defaultValue: 0, + validate: x => x === 1 + }); + this.join = getStringOption(attributes.join, ["square", "round"]); + this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); + this.radius = getMeasurement(attributes.radius); + this.stroke = getStringOption(attributes.stroke, ["solid", "dashDot", "dashDotDot", "dashed", "dotted", "embossed", "etched", "lowered", "raised"]); + this.thickness = getMeasurement(attributes.thickness, "0.5pt"); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.color = null; + this.extras = null; + } + [$toStyle]() { + const style = toStyle(this, "visibility"); + style.radius = measureToString(this.join === "square" ? 0 : this.radius); + return style; + } +} +class DateElement extends ContentObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "date"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } + [$finalize]() { + const date = this[$content].trim(); + this[$content] = date ? new Date(date) : null; + } + [$toHTML](availableSpace) { + return valueToHtml(this[$content] ? this[$content].toString() : ""); + } +} +class DateTime extends ContentObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "dateTime"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } + [$finalize]() { + const date = this[$content].trim(); + this[$content] = date ? new Date(date) : null; + } + [$toHTML](availableSpace) { + return valueToHtml(this[$content] ? this[$content].toString() : ""); + } +} +class DateTimeEdit extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "dateTimeEdit", true); + this.hScrollPolicy = getStringOption(attributes.hScrollPolicy, ["auto", "off", "on"]); + 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; + } + [$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: [html] + }); + } +} +class Decimal extends ContentObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "decimal"); + this.fracDigits = getInteger({ + data: attributes.fracDigits, + defaultValue: 2, + validate: x => true + }); + this.id = attributes.id || ""; + this.leadDigits = getInteger({ + data: attributes.leadDigits, + defaultValue: -1, + validate: x => true + }); + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } + [$finalize]() { + const number = parseFloat(this[$content].trim()); + this[$content] = isNaN(number) ? null : number; + } + [$toHTML](availableSpace) { + return valueToHtml(this[$content] !== null ? this[$content].toString() : ""); + } +} +class DefaultUi extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "defaultUi", true); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + } +} +class Desc extends XFAObject { + 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(); + this.decimal = new XFAObjectArray(); + this.exData = new XFAObjectArray(); + this.float = new XFAObjectArray(); + this.image = new XFAObjectArray(); + this.integer = new XFAObjectArray(); + this.text = new XFAObjectArray(); + this.time = new XFAObjectArray(); + } +} +class DigestMethod extends OptionObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "digestMethod", ["", "SHA1", "SHA256", "SHA512", "RIPEMD160"]); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class DigestMethods extends XFAObject { + 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(attributes) { + super(TEMPLATE_NS_ID, "draw", true); + this.anchorType = getStringOption(attributes.anchorType, ["topLeft", "bottomCenter", "bottomLeft", "bottomRight", "middleCenter", "middleLeft", "middleRight", "topCenter", "topRight"]); + this.colSpan = getInteger({ + data: attributes.colSpan, + defaultValue: 1, + validate: n => n >= 1 || n === -1 + }); + this.h = attributes.h ? getMeasurement(attributes.h) : ""; + this.hAlign = getStringOption(attributes.hAlign, ["left", "center", "justify", "justifyAll", "radix", "right"]); + 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(attributes.relevant); + this.rotate = getInteger({ + data: attributes.rotate, + defaultValue: 0, + validate: x => x % 90 === 0 + }); + 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; + this.desc = null; + this.extras = null; + this.font = null; + this.keep = null; + this.margin = null; + this.para = null; + this.traversal = null; + this.ui = null; + this.value = null; + this.setProperty = new XFAObjectArray(); + } + [$setValue](value) { + _setValue(this, value); + } + [$toHTML](availableSpace) { + setTabIndex(this); + if (this.presence === "hidden" || this.presence === "inactive") { + return HTMLResult.EMPTY; + } + fixDimensions(this); + 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 = w; + } + if (h && this.h === "") { + this.h = h; + } + setFirstUnsplittable(this); + if (!checkDimensions(this, availableSpace)) { + this.w = savedW; + this.h = savedH; + this[$popPara](); + return HTMLResult.FAILURE; + } + unsetFirstUnsplittable(this); + const style = toStyle(this, "font", "hAlign", "dimensions", "position", "presence", "rotate", "anchorType", "border", "margin"); + setMinMaxDimensions(this, style); + if (style.margin) { + style.padding = style.margin; + delete style.margin; + } + const classNames = ["xfaDraw"]; + if (this.font) { + classNames.push("xfaFont"); + } + 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 template_Edge extends XFAObject { + 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(attributes.stroke, ["solid", "dashDot", "dashDotDot", "dashed", "dotted", "embossed", "etched", "lowered", "raised"]); + this.thickness = getMeasurement(attributes.thickness, "0.5pt"); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.color = null; + this.extras = null; + } + [$toStyle]() { + const style = toStyle(this, "visibility"); + Object.assign(style, { + linecap: this.cap, + width: measureToString(this.thickness), + color: this.color ? this.color[$toStyle]() : "#000000", + style: "" + }); + if (this.presence !== "visible") { + style.style = "none"; + } else { + switch (this.stroke) { + case "solid": + style.style = "solid"; + break; + case "dashDot": + style.style = "dashed"; + break; + case "dashDotDot": + style.style = "dashed"; + break; + case "dashed": + style.style = "dashed"; + break; + case "dotted": + style.style = "dotted"; + break; + case "embossed": + style.style = "ridge"; + break; + case "etched": + style.style = "groove"; + break; + case "lowered": + style.style = "inset"; + break; + case "raised": + style.style = "outset"; + break; + } + } + return style; + } +} +class Encoding extends OptionObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "encoding", ["adbe.x509.rsa_sha1", "adbe.pkcs7.detached", "adbe.pkcs7.sha1"]); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Encodings extends XFAObject { + 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(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(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(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(attributes) { + super(TEMPLATE_NS_ID, "encryptionMethod", ["", "AES256-CBC", "TRIPLEDES-CBC", "AES128-CBC", "AES192-CBC"]); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class EncryptionMethods extends XFAObject { + 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(attributes) { + super(TEMPLATE_NS_ID, "event", true); + this.activity = getStringOption(attributes.activity, ["click", "change", "docClose", "docReady", "enter", "exit", "full", "indexChange", "initialize", "mouseDown", "mouseEnter", "mouseExit", "mouseUp", "postExecute", "postOpen", "postPrint", "postSave", "postSign", "postSubmit", "preExecute", "preOpen", "prePrint", "preSave", "preSign", "preSubmit", "ready", "validationState"]); + this.id = attributes.id || ""; + this.listen = getStringOption(attributes.listen, ["refOnly", "refAndDescendents"]); + this.name = attributes.name || ""; + this.ref = attributes.ref || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + this.encryptData = null; + this.execute = null; + this.script = null; + this.signData = null; + this.submit = null; + } +} +class ExData extends ContentObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "exData"); + this.contentType = attributes.contentType || ""; + this.href = attributes.href || ""; + this.id = attributes.id || ""; + this.maxLength = getInteger({ + data: attributes.maxLength, + defaultValue: -1, + validate: x => x >= -1 + }); + this.name = attributes.name || ""; + this.rid = attributes.rid || ""; + this.transferEncoding = getStringOption(attributes.transferEncoding, ["none", "base64", "package"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } + [$isCDATAXml]() { + return this.contentType === "text/html"; + } + [$onChild](child) { + if (this.contentType === "text/html" && child[$namespaceId] === NamespaceIds.xhtml.id) { + this[$content] = child; + return true; + } + if (this.contentType === "text/xml") { + this[$content] = child; + return true; + } + return false; + } + [$toHTML](availableSpace) { + if (this.contentType !== "text/html" || !this[$content]) { + return HTMLResult.EMPTY; + } + return this[$content][$toHTML](availableSpace); + } +} +class ExObject extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "exObject", true); + this.archive = attributes.archive || ""; + this.classId = attributes.classId || ""; + this.codeBase = attributes.codeBase || ""; + this.codeType = attributes.codeType || ""; + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + this.boolean = new XFAObjectArray(); + this.date = new XFAObjectArray(); + this.dateTime = new XFAObjectArray(); + this.decimal = new XFAObjectArray(); + this.exData = new XFAObjectArray(); + this.exObject = new XFAObjectArray(); + this.float = new XFAObjectArray(); + this.image = new XFAObjectArray(); + this.integer = new XFAObjectArray(); + this.text = new XFAObjectArray(); + this.time = new XFAObjectArray(); + } +} +class ExclGroup extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "exclGroup", true); + this.access = getStringOption(attributes.access, ["open", "nonInteractive", "protected", "readOnly"]); + this.accessKey = attributes.accessKey || ""; + this.anchorType = getStringOption(attributes.anchorType, ["topLeft", "bottomCenter", "bottomLeft", "bottomRight", "middleCenter", "middleLeft", "middleRight", "topCenter", "topRight"]); + this.colSpan = getInteger({ + data: attributes.colSpan, + defaultValue: 1, + validate: n => n >= 1 || n === -1 + }); + this.h = attributes.h ? getMeasurement(attributes.h) : ""; + this.hAlign = getStringOption(attributes.hAlign, ["left", "center", "justify", "justifyAll", "radix", "right"]); + this.id = attributes.id || ""; + this.layout = getStringOption(attributes.layout, ["position", "lr-tb", "rl-row", "rl-tb", "row", "table", "tb"]); + 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(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; + this.calculate = null; + this.caption = null; + this.desc = null; + this.extras = null; + this.margin = null; + this.para = null; + this.traversal = null; + this.validate = null; + this.connect = new XFAObjectArray(); + this.event = new XFAObjectArray(); + this.field = new XFAObjectArray(); + this.setProperty = new XFAObjectArray(); + } + [$isBindable]() { + return true; + } + [$hasSettableValue]() { + return true; + } + [$setValue](value) { + for (const field of this.field.children) { + if (!field.value) { + const nodeValue = new template_Value({}); + field[$appendChild](nodeValue); + field.value = nodeValue; + } + field.value[$setValue](value); + } + } + [$isThereMoreWidth]() { + return this.layout.endsWith("-tb") && this[$extra].attempt === 0 && this[$extra].numberInLine > 0 || this[$getParent]()[$isThereMoreWidth](); + } + [$isSplittable]() { + const parent = this[$getSubformParent](); + if (!parent[$isSplittable]()) { + return false; + } + 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; + } + [$flushHTML]() { + return flushHTML(this); + } + [$addHTML](html, bbox) { + addHTML(this, html, bbox); + } + [$getAvailableSpace]() { + return getAvailableSpace(this); + } + [$toHTML](availableSpace) { + setTabIndex(this); + if (this.presence === "hidden" || this.presence === "inactive" || this.h === 0 || this.w === 0) { + return HTMLResult.EMPTY; + } + fixDimensions(this); + const children = []; + const attributes = { + id: this[$uid], + class: [] + }; + setAccess(this, attributes.class); + this[$extra] ||= Object.create(null); + Object.assign(this[$extra], { + children, + attributes, + attempt: 0, + line: null, + numberInLine: 0, + availableSpace: { + width: Math.min(this.w || Infinity, availableSpace.width), + height: Math.min(this.h || Infinity, availableSpace.height) + }, + width: 0, + height: 0, + prevHeight: 0, + currentWidth: 0 + }); + const isSplittable = this[$isSplittable](); + if (!isSplittable) { + setFirstUnsplittable(this); + } + if (!checkDimensions(this, availableSpace)) { + return HTMLResult.FAILURE; + } + const filter = new Set(["field"]); + if (this.layout.includes("row")) { + const columnWidths = this[$getSubformParent]().columnWidths; + if (Array.isArray(columnWidths) && columnWidths.length > 0) { + this[$extra].columnWidths = columnWidths; + this[$extra].currentColumn = 0; + } + } + 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 (isLrTb && this[$extra].attempt === 0 && this[$extra].numberInLine === 0 && !this[$getTemplateRoot]()[$extra].noLayoutFailure) { + this[$extra].attempt = maxRun; + break; + } + } + this[$popPara](); + if (!isSplittable) { + unsetFirstUnsplittable(this); + } + if (this[$extra].attempt === maxRun) { + if (!isSplittable) { + delete this[$extra]; + } + return HTMLResult.FAILURE; + } + let marginH = 0; + let marginV = 0; + if (this.margin) { + marginH = this.margin.leftInset + this.margin.rightInset; + marginV = this.margin.topInset + this.margin.bottomInset; + } + const width = Math.max(this[$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(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(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(); + this.decimal = new XFAObjectArray(); + this.exData = new XFAObjectArray(); + this.extras = new XFAObjectArray(); + this.float = new XFAObjectArray(); + this.image = new XFAObjectArray(); + this.integer = new XFAObjectArray(); + this.text = new XFAObjectArray(); + this.time = new XFAObjectArray(); + } +} +class Field extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "field", true); + this.access = getStringOption(attributes.access, ["open", "nonInteractive", "protected", "readOnly"]); + this.accessKey = attributes.accessKey || ""; + this.anchorType = getStringOption(attributes.anchorType, ["topLeft", "bottomCenter", "bottomLeft", "bottomRight", "middleCenter", "middleLeft", "middleRight", "topCenter", "topRight"]); + this.colSpan = getInteger({ + data: attributes.colSpan, + defaultValue: 1, + validate: n => n >= 1 || n === -1 + }); + this.h = attributes.h ? getMeasurement(attributes.h) : ""; + this.hAlign = getStringOption(attributes.hAlign, ["left", "center", "justify", "justifyAll", "radix", "right"]); + 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(attributes.relevant); + this.rotate = getInteger({ + data: attributes.rotate, + defaultValue: 0, + validate: x => x % 90 === 0 + }); + 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; + this.calculate = null; + this.caption = null; + this.desc = null; + this.extras = null; + this.font = null; + this.format = null; + this.items = new XFAObjectArray(2); + this.keep = null; + this.margin = null; + this.para = null; + this.traversal = null; + this.ui = null; + this.validate = null; + this.value = null; + this.bindItems = new XFAObjectArray(); + this.connect = new XFAObjectArray(); + this.event = new XFAObjectArray(); + this.setProperty = new XFAObjectArray(); + } + [$isBindable]() { + return true; + } + [$setValue](value) { + _setValue(this, value); + } + [$toHTML](availableSpace) { + setTabIndex(this); + if (!this.ui) { + this.ui = new Ui({}); + this.ui[$globalData] = this[$globalData]; + this[$appendChild](this.ui); + let node; + switch (this.items.children.length) { + case 0: + node = new TextEdit({}); + this.ui.textEdit = node; + break; + case 1: + node = new CheckButton({}); + this.ui.checkButton = node; + break; + case 2: + node = new ChoiceList({}); + this.ui.choiceList = node; + break; + } + this.ui[$appendChild](node); + } + if (!this.ui || this.presence === "hidden" || this.presence === "inactive" || this.h === 0 || this.w === 0) { + return HTMLResult.EMPTY; + } + 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; + } + } + borderDims = getBorderDims(this.ui[$getExtra]()); + uiW += borderDims.w; + uiH += borderDims.h; + if (this.caption) { + const { + w, + h, + isBroken + } = this.caption[$getExtra](availableSpace); + if (isBroken && this[$getSubformParent]()[$isThereMoreWidth]()) { + this[$popPara](); + return HTMLResult.FAILURE; + } + width = w; + height = h; + switch (this.caption.placement) { + case "left": + case "right": + case "inline": + width += uiW; + break; + case "top": + case "bottom": + height += uiH; + break; + } + } else { + width = uiW; + height = uiH; + } + if (width && this.w === "") { + width += marginH; + this.w = Math.min(this.maxW <= 0 ? Infinity : this.maxW, this.minW + 1 < width ? width : this.minW); + } + if (height && this.h === "") { + height += marginV; + this.h = Math.min(this.maxH <= 0 ? Infinity : this.maxH, this.minH + 1 < height ? height : this.minH); + } + } + this[$popPara](); + fixDimensions(this); + setFirstUnsplittable(this); + if (!checkDimensions(this, availableSpace)) { + this.w = savedW; + this.h = savedH; + this[$popPara](); + return HTMLResult.FAILURE; + } + unsetFirstUnsplittable(this); + const style = toStyle(this, "font", "dimensions", "position", "rotate", "anchorType", "presence", "margin", "hAlign"); + setMinMaxDimensions(this, style); + const classNames = ["xfaField"]; + if (this.font) { + classNames.push("xfaFont"); + } + if (isPrintOnly(this)) { + classNames.push("xfaPrintOnly"); + } + 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]; + } + } + ui.attributes.style ||= Object.create(null); + let aElement = null; + if (this.ui.button) { + 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; + } + } + } + } + if (!this.ui.imageEdit && ui.children?.[0] && this.h) { + borderDims ||= getBorderDims(this.ui[$getExtra]()); + if (this.caption && ["top", "bottom"].includes(this.caption.placement)) { + let 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) { + 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"; + } + ui.attributes.class ||= []; + ui.children.splice(0, 0, caption); + switch (this.caption.placement) { + case "left": + ui.attributes.class.push("xfaLeft"); + break; + case "right": + ui.attributes.class.push("xfaRight"); + break; + case "top": + ui.attributes.class.push("xfaTop"); + break; + case "bottom": + ui.attributes.class.push("xfaBottom"); + break; + case "inline": + ui.attributes.class.push("xfaLeft"); + break; + } + this.w = savedW; + this.h = savedH; + return HTMLResult.success(createWrapper(this, html), bbox); + } +} +class Fill extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "fill", true); + this.id = attributes.id || ""; + this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.color = null; + this.extras = null; + this.linear = null; + this.pattern = null; + this.radial = null; + this.solid = null; + this.stipple = null; + } + [$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 (parent instanceof Rectangle || parent instanceof Arc) { + propName = altPropName = "fill"; + style.fill = "white"; + } + 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 color = this.color[$toStyle](); + style[color.startsWith("#") ? propName : altPropName] = color; + } + return style; + } +} +class Filter extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "filter", true); + this.addRevocationInfo = getStringOption(attributes.addRevocationInfo, ["", "required", "optional", "none"]); + 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: x => x >= 1 && x <= 5 + }); + this.appearanceFilter = null; + this.certificates = null; + this.digestMethods = null; + this.encodings = null; + this.encryptionMethods = null; + this.handler = null; + this.lockDocument = null; + this.mdp = null; + this.reasons = null; + this.timeStamp = null; + } +} +class Float extends ContentObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "float"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } + [$finalize]() { + const number = parseFloat(this[$content].trim()); + this[$content] = isNaN(number) ? null : number; + } + [$toHTML](availableSpace) { + return valueToHtml(this[$content] !== null ? this[$content].toString() : ""); + } +} +class template_Font extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "font", true); + this.baselineShift = getMeasurement(attributes.baselineShift); + this.fontHorizontalScale = getFloat({ + data: attributes.fontHorizontalScale, + defaultValue: 100, + validate: x => x >= 0 + }); + this.fontVerticalScale = getFloat({ + data: attributes.fontVerticalScale, + defaultValue: 100, + validate: x => x >= 0 + }); + this.id = attributes.id || ""; + this.kerningMode = getStringOption(attributes.kerningMode, ["none", "pair"]); + this.letterSpacing = getMeasurement(attributes.letterSpacing, "0"); + this.lineThrough = getInteger({ + data: attributes.lineThrough, + defaultValue: 0, + validate: x => x === 1 || x === 2 + }); + this.lineThroughPeriod = getStringOption(attributes.lineThroughPeriod, ["all", "word"]); + this.overline = getInteger({ + data: attributes.overline, + defaultValue: 0, + validate: x => x === 1 || x === 2 + }); + 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: attributes.underline, + defaultValue: 0, + validate: x => x === 1 || x === 2 + }); + 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; + } + [$clean](builder) { + super[$clean](builder); + this[$globalData].usedTypefaces.add(this.typeface); + } + [$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"; + } + } + if (this.baselineShift) { + style.verticalAlign = measureToString(this.baselineShift); + } + 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"; + } + } + 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(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(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(attributes) { + super(TEMPLATE_NS_ID, "hyphenation"); + this.excludeAllCaps = getInteger({ + data: attributes.excludeAllCaps, + defaultValue: 0, + validate: x => x === 1 + }); + this.excludeInitialCap = getInteger({ + data: attributes.excludeInitialCap, + defaultValue: 0, + validate: x => x === 1 + }); + this.hyphenate = getInteger({ + data: attributes.hyphenate, + defaultValue: 0, + validate: x => x === 1 + }); + this.id = attributes.id || ""; + this.pushCharacterCount = getInteger({ + data: attributes.pushCharacterCount, + defaultValue: 3, + validate: x => x >= 0 + }); + this.remainCharacterCount = getInteger({ + data: attributes.remainCharacterCount, + defaultValue: 3, + validate: x => x >= 0 + }); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.wordCharacterCount = getInteger({ + data: attributes.wordCharacterCount, + defaultValue: 7, + validate: x => x >= 0 + }); + } +} +class Image extends StringObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "image"); + this.aspect = getStringOption(attributes.aspect, ["fit", "actual", "height", "none", "width"]); + this.contentType = attributes.contentType || ""; + this.href = attributes.href || ""; + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.transferEncoding = getStringOption(attributes.transferEncoding, ["base64", "none", "package"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } + [$toHTML]() { + if (this.contentType && !MIMES.has(this.contentType.toLowerCase())) { + return HTMLResult.EMPTY; + } + let buffer = this[$globalData].images?.get(this.href); + if (!buffer && (this.href || !this[$content])) { + return HTMLResult.EMPTY; + } + if (!buffer && this.transferEncoding === "base64") { + buffer = Uint8Array.fromBase64(this[$content]); + } + if (!buffer) { + return HTMLResult.EMPTY; + } + if (!this.contentType) { + 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; + } + } + const blob = new Blob([buffer], { + type: this.contentType + }); + let style; + switch (this.aspect) { + case "fit": + case "actual": + break; + case "height": + style = { + height: "100%", + objectFit: "fill" + }; + break; + case "none": + style = { + width: "100%", + height: "100%", + objectFit: "fill" + }; + break; + case "width": + style = { + width: "100%", + objectFit: "fill" + }; + break; + } + const parent = this[$getParent](); + return HTMLResult.success({ + name: "img", + attributes: { + class: ["xfaImage"], + style, + src: URL.createObjectURL(blob), + alt: parent ? ariaLabel(parent[$getParent]()) : null + } + }); + } +} +class ImageEdit extends XFAObject { + 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; + } + [$toHTML](availableSpace) { + if (this.data === "embed") { + return HTMLResult.success({ + name: "div", + children: [], + attributes: {} + }); + } + return HTMLResult.EMPTY; + } +} +class Integer extends ContentObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "integer"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } + [$finalize]() { + const number = parseInt(this[$content].trim(), 10); + this[$content] = isNaN(number) ? null : number; + } + [$toHTML](availableSpace) { + return valueToHtml(this[$content] !== null ? this[$content].toString() : ""); + } +} +class Issuers extends XFAObject { + 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(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 = attributes.ref || ""; + this.save = getInteger({ + data: attributes.save, + defaultValue: 0, + validate: x => x === 1 + }); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.boolean = new XFAObjectArray(); + this.date = new XFAObjectArray(); + this.dateTime = new XFAObjectArray(); + this.decimal = new XFAObjectArray(); + this.exData = new XFAObjectArray(); + this.float = new XFAObjectArray(); + this.image = new XFAObjectArray(); + this.integer = new XFAObjectArray(); + this.text = new XFAObjectArray(); + this.time = new XFAObjectArray(); + } + [$toHTML]() { + const output = []; + for (const child of this[$getChildren]()) { + output.push(child[$text]()); + } + return HTMLResult.success(output); + } +} +class Keep extends XFAObject { + 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(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(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; + } + [$toHTML]() { + const parent = this[$getParent]()[$getParent](); + const edge = this.edge || new template_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: SVG_NS, + x1, + y1, + x2, + y2, + style + } + }; + const svg = { + name: "svg", + children: [line], + attributes: { + xmlns: SVG_NS, + width, + height, + style: { + overflow: "visible" + } + } + }; + if (hasMargin(parent)) { + return HTMLResult.success({ + name: "div", + attributes: { + style: { + display: "inline", + width: "100%", + height: "100%" + } + }, + children: [svg] + }); + } + svg.attributes.style.position = "absolute"; + return HTMLResult.success(svg); + } +} +class Linear extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "linear", true); + this.id = attributes.id || ""; + this.type = getStringOption(attributes.type, ["toRight", "toBottom", "toLeft", "toTop"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.color = null; + this.extras = null; + } + [$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(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 || ""; + } + [$finalize]() { + this[$content] = getStringOption(this[$content], ["auto", "0", "1"]); + } +} +class Manifest extends XFAObject { + 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(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; + } + [$toStyle]() { + return { + margin: measureToString(this.topInset) + " " + measureToString(this.rightInset) + " " + measureToString(this.bottomInset) + " " + measureToString(this.leftInset) + }; + } +} +class Mdp extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "mdp"); + this.id = attributes.id || ""; + this.permissions = getInteger({ + data: attributes.permissions, + defaultValue: 2, + validate: x => x === 1 || x === 3 + }); + this.signatureType = getStringOption(attributes.signatureType, ["filler", "author"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Medium extends XFAObject { + 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(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(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(attributes) { + super(TEMPLATE_NS_ID, "numericEdit", true); + this.hScrollPolicy = getStringOption(attributes.hScrollPolicy, ["auto", "off", "on"]); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.border = null; + this.comb = null; + this.extras = null; + this.margin = null; + } + [$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: [html] + }); + } +} +class Occur extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "occur", true); + this.id = attributes.id || ""; + this.initial = attributes.initial !== "" ? getInteger({ + data: attributes.initial, + defaultValue: "", + validate: x => true + }) : ""; + this.max = attributes.max !== "" ? getInteger({ + data: attributes.max, + defaultValue: -1, + validate: x => true + }) : ""; + this.min = attributes.min !== "" ? getInteger({ + data: attributes.min, + defaultValue: 1, + validate: x => true + }) : ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + } + [$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(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(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(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 || ""; + } + [$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[$extra]; + } +} +class PageArea extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "pageArea", true); + this.blankOrNotBlank = getStringOption(attributes.blankOrNotBlank, ["any", "blank", "notBlank"]); + this.id = attributes.id || ""; + this.initialNumber = getInteger({ + data: attributes.initialNumber, + defaultValue: 1, + validate: x => true + }); + this.name = attributes.name || ""; + this.numbered = getInteger({ + data: attributes.numbered, + defaultValue: 1, + validate: x => true + }); + this.oddOrEven = getStringOption(attributes.oddOrEven, ["any", "even", "odd"]); + this.pagePosition = getStringOption(attributes.pagePosition, ["any", "first", "last", "only", "rest"]); + this.relevant = getRelevant(attributes.relevant); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.desc = null; + this.extras = null; + this.medium = null; + this.occur = null; + this.area = new XFAObjectArray(); + this.contentArea = new XFAObjectArray(); + this.draw = new XFAObjectArray(); + this.exclGroup = new XFAObjectArray(); + this.field = new XFAObjectArray(); + this.subform = new XFAObjectArray(); + } + [$isUsable]() { + if (!this[$extra]) { + this[$extra] = { + numberOfUse: 0 + }; + return true; + } + return !this.occur || this.occur.max === -1 || this[$extra].numberOfUse < this.occur.max; + } + [$cleanPage]() { + delete this[$extra]; + } + [$getNextPage]() { + this[$extra] ||= { + numberOfUse: 0 + }; + const parent = this[$getParent](); + if (parent.relation === "orderedOccurrence") { + if (this[$isUsable]()) { + this[$extra].numberOfUse += 1; + return this; + } + } + return parent[$getNextPage](); + } + [$getAvailableSpace]() { + return this[$extra].space || { + width: 0, + height: 0 + }; + } + [$toHTML]() { + 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: true + }); + this[$childrenToHTML]({ + filter: new Set(["contentArea"]), + include: true + }); + return HTMLResult.success({ + name: "div", + children, + attributes: { + class: ["xfaPage"], + id: this[$uid], + style, + xfaName: this.name + } + }); + } +} +class PageSet extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "pageSet", true); + this.duplexImposition = getStringOption(attributes.duplexImposition, ["longEdge", "shortEdge"]); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.relation = getStringOption(attributes.relation, ["orderedOccurrence", "duplexPaginated", "simplexPaginated"]); + 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(); + } + [$cleanPage]() { + for (const page of this.pageArea.children) { + page[$cleanPage](); + } + for (const page of this.pageSet.children) { + page[$cleanPage](); + } + } + [$isUsable]() { + return !this.occur || this.occur.max === -1 || this[$extra].numberOfUse < this.occur.max; + } + [$getNextPage]() { + this[$extra] ||= { + numberOfUse: 1, + pageIndex: -1, + pageSetIndex: -1 + }; + 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 (page) { + return page; + } + page = this.pageArea.children.find(p => p.oddOrEven === "any" && p.pagePosition === position); + if (page) { + return page; + } + page = this.pageArea.children.find(p => p.oddOrEven === "any" && p.pagePosition === "any"); + return page ?? this.pageArea.children[0]; + } +} +class Para extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "para", true); + this.hAlign = getStringOption(attributes.hAlign, ["left", "center", "justify", "justifyAll", "radix", "right"]); + 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: attributes.orphans, + defaultValue: 0, + validate: x => x >= 0 + }); + this.preserve = attributes.preserve || ""; + this.radixOffset = attributes.radixOffset ? getMeasurement(attributes.radixOffset, "0pt") : ""; + 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((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: attributes.widows, + defaultValue: 0, + validate: x => x >= 0 + }); + this.hyphenation = null; + } + [$toStyle]() { + const style = toStyle(this, "hAlign"); + if (this.marginLeft !== "") { + style.paddingLeft = measureToString(this.marginLeft); + } + if (this.marginRight !== "") { + style.paddingRight = 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(attributes) { + super(TEMPLATE_NS_ID, "passwordEdit", true); + this.hScrollPolicy = getStringOption(attributes.hScrollPolicy, ["auto", "off", "on"]); + this.id = attributes.id || ""; + this.passwordChar = attributes.passwordChar || "*"; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.border = null; + this.extras = null; + this.margin = null; + } +} +class template_Pattern extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "pattern", true); + this.id = attributes.id || ""; + this.type = getStringOption(attributes.type, ["crossHatch", "crossDiagonal", "diagonalLeft", "diagonalRight", "horizontal", "vertical"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.color = null; + this.extras = null; + } + [$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 `${cmd}(to top,${colors}) ${cmd}(to right,${colors})`; + case "crossDiagonal": + return `${cmd}(45deg,${colors}) ${cmd}(-45deg,${colors})`; + case "diagonalLeft": + return `${cmd}(45deg,${colors})`; + case "diagonalRight": + return `${cmd}(-45deg,${colors})`; + case "horizontal": + return `${cmd}(to top,${colors})`; + case "vertical": + return `${cmd}(to right,${colors})`; + } + return ""; + } +} +class Picture extends StringObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "picture"); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Proto extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "proto", true); + this.appearanceFilter = new XFAObjectArray(); + this.arc = new XFAObjectArray(); + this.area = new XFAObjectArray(); + this.assist = new XFAObjectArray(); + this.barcode = new XFAObjectArray(); + this.bindItems = new XFAObjectArray(); + this.bookend = new XFAObjectArray(); + this.boolean = new XFAObjectArray(); + this.border = new XFAObjectArray(); + this.break = new XFAObjectArray(); + this.breakAfter = new XFAObjectArray(); + this.breakBefore = new XFAObjectArray(); + this.button = new XFAObjectArray(); + this.calculate = new XFAObjectArray(); + this.caption = new XFAObjectArray(); + this.certificate = new XFAObjectArray(); + this.certificates = new XFAObjectArray(); + this.checkButton = new XFAObjectArray(); + this.choiceList = new XFAObjectArray(); + this.color = new XFAObjectArray(); + this.comb = new XFAObjectArray(); + this.connect = new XFAObjectArray(); + this.contentArea = new XFAObjectArray(); + this.corner = new XFAObjectArray(); + this.date = new XFAObjectArray(); + this.dateTime = new XFAObjectArray(); + this.dateTimeEdit = new XFAObjectArray(); + this.decimal = new XFAObjectArray(); + this.defaultUi = new XFAObjectArray(); + this.desc = new XFAObjectArray(); + this.digestMethod = new XFAObjectArray(); + this.digestMethods = new XFAObjectArray(); + this.draw = new XFAObjectArray(); + this.edge = new XFAObjectArray(); + this.encoding = new XFAObjectArray(); + this.encodings = new XFAObjectArray(); + this.encrypt = new XFAObjectArray(); + this.encryptData = new XFAObjectArray(); + this.encryption = new XFAObjectArray(); + this.encryptionMethod = new XFAObjectArray(); + this.encryptionMethods = new XFAObjectArray(); + this.event = new XFAObjectArray(); + this.exData = new XFAObjectArray(); + this.exObject = new XFAObjectArray(); + this.exclGroup = new XFAObjectArray(); + this.execute = new XFAObjectArray(); + this.extras = new XFAObjectArray(); + this.field = new XFAObjectArray(); + this.fill = new XFAObjectArray(); + this.filter = new XFAObjectArray(); + this.float = new XFAObjectArray(); + this.font = new XFAObjectArray(); + this.format = new XFAObjectArray(); + this.handler = new XFAObjectArray(); + this.hyphenation = new XFAObjectArray(); + this.image = new XFAObjectArray(); + this.imageEdit = new XFAObjectArray(); + this.integer = new XFAObjectArray(); + this.issuers = new XFAObjectArray(); + this.items = new XFAObjectArray(); + this.keep = new XFAObjectArray(); + this.keyUsage = new XFAObjectArray(); + this.line = new XFAObjectArray(); + this.linear = new XFAObjectArray(); + this.lockDocument = new XFAObjectArray(); + this.manifest = new XFAObjectArray(); + this.margin = new XFAObjectArray(); + this.mdp = new XFAObjectArray(); + this.medium = new XFAObjectArray(); + this.message = new XFAObjectArray(); + this.numericEdit = new XFAObjectArray(); + this.occur = new XFAObjectArray(); + this.oid = new XFAObjectArray(); + this.oids = new XFAObjectArray(); + this.overflow = new XFAObjectArray(); + this.pageArea = new XFAObjectArray(); + this.pageSet = new XFAObjectArray(); + this.para = new XFAObjectArray(); + this.passwordEdit = new XFAObjectArray(); + this.pattern = new XFAObjectArray(); + this.picture = new XFAObjectArray(); + this.radial = new XFAObjectArray(); + this.reason = new XFAObjectArray(); + this.reasons = new XFAObjectArray(); + this.rectangle = new XFAObjectArray(); + this.ref = new XFAObjectArray(); + this.script = new XFAObjectArray(); + this.setProperty = new XFAObjectArray(); + this.signData = new XFAObjectArray(); + this.signature = new XFAObjectArray(); + this.signing = new XFAObjectArray(); + this.solid = new XFAObjectArray(); + this.speak = new XFAObjectArray(); + this.stipple = new XFAObjectArray(); + this.subform = new XFAObjectArray(); + this.subformSet = new XFAObjectArray(); + this.subjectDN = new XFAObjectArray(); + this.subjectDNs = new XFAObjectArray(); + this.submit = new XFAObjectArray(); + this.text = new XFAObjectArray(); + this.textEdit = new XFAObjectArray(); + this.time = new XFAObjectArray(); + this.timeStamp = new XFAObjectArray(); + this.toolTip = new XFAObjectArray(); + this.traversal = new XFAObjectArray(); + this.traverse = new XFAObjectArray(); + this.ui = new XFAObjectArray(); + this.validate = new XFAObjectArray(); + this.value = new XFAObjectArray(); + this.variables = new XFAObjectArray(); + } +} +class Radial extends XFAObject { + 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; + } + [$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(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(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(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; + } + [$toHTML]() { + const edge = this.edge.children.length ? this.edge.children[0] : new template_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" + }, + 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%" + } + }, + children: [svg] + }); + } + svg.attributes.style.position = "absolute"; + return HTMLResult.success(svg); + } +} +class RefElement extends StringObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "ref"); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class template_Script extends StringObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "script"); + this.binding = attributes.binding || ""; + this.contentType = attributes.contentType || ""; + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.runAt = getStringOption(attributes.runAt, ["client", "both", "server"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class SetProperty extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "setProperty"); + this.connection = attributes.connection || ""; + this.ref = attributes.ref || ""; + this.target = attributes.target || ""; + } +} +class SignData extends XFAObject { + 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(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; + this.manifest = null; + this.margin = null; + } +} +class Signing extends XFAObject { + 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(attributes) { + super(TEMPLATE_NS_ID, "solid", true); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + } + [$toStyle](startColor) { + return startColor ? startColor[$toStyle]() : "#FFFFFF"; + } +} +class Speak extends StringObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "speak"); + this.disable = getInteger({ + data: attributes.disable, + defaultValue: 0, + validate: x => x === 1 + }); + this.id = attributes.id || ""; + this.priority = getStringOption(attributes.priority, ["custom", "caption", "name", "toolTip"]); + this.rid = attributes.rid || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Stipple extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "stipple", true); + this.id = attributes.id || ""; + this.rate = getInteger({ + data: attributes.rate, + defaultValue: 50, + validate: x => x >= 0 && x <= 100 + }); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.color = null; + this.extras = null; + } + [$toStyle](bgColor) { + const alpha = this.rate / 100; + return Util.makeHexColor(Math.round(bgColor.value.r * (1 - alpha) + this.value.r * alpha), Math.round(bgColor.value.g * (1 - alpha) + this.value.g * alpha), Math.round(bgColor.value.b * (1 - alpha) + this.value.b * alpha)); + } +} +class Subform extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "subform", true); + this.access = getStringOption(attributes.access, ["open", "nonInteractive", "protected", "readOnly"]); + this.allowMacro = getInteger({ + data: attributes.allowMacro, + defaultValue: 0, + validate: x => x === 1 + }); + this.anchorType = getStringOption(attributes.anchorType, ["topLeft", "bottomCenter", "bottomLeft", "bottomRight", "middleCenter", "middleLeft", "middleRight", "topCenter", "topRight"]); + this.colSpan = getInteger({ + data: attributes.colSpan, + defaultValue: 1, + validate: n => n >= 1 || n === -1 + }); + this.columnWidths = (attributes.columnWidths || "").trim().split(/\s+/).map(x => x === "-1" ? -1 : getMeasurement(x)); + this.h = attributes.h ? getMeasurement(attributes.h) : ""; + this.hAlign = getStringOption(attributes.hAlign, ["left", "center", "justify", "justifyAll", "radix", "right"]); + this.id = attributes.id || ""; + this.layout = getStringOption(attributes.layout, ["position", "lr-tb", "rl-row", "rl-tb", "row", "table", "tb"]); + 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(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(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; + this.border = null; + this.break = null; + this.calculate = null; + this.desc = null; + this.extras = null; + this.keep = null; + this.margin = null; + this.occur = null; + this.overflow = null; + this.pageSet = null; + this.para = null; + this.traversal = null; + this.validate = null; + this.variables = null; + this.area = new XFAObjectArray(); + this.breakAfter = new XFAObjectArray(); + this.breakBefore = new XFAObjectArray(); + this.connect = new XFAObjectArray(); + this.draw = new XFAObjectArray(); + this.event = new XFAObjectArray(); + this.exObject = new XFAObjectArray(); + this.exclGroup = new XFAObjectArray(); + this.field = new XFAObjectArray(); + this.proto = new XFAObjectArray(); + this.setProperty = new XFAObjectArray(); + this.subform = new XFAObjectArray(); + this.subformSet = new XFAObjectArray(); + } + [$getSubformParent]() { + const parent = this[$getParent](); + return parent instanceof SubformSet ? parent[$getSubformParent]() : parent; + } + [$isBindable]() { + return true; + } + [$isThereMoreWidth]() { + return this.layout.endsWith("-tb") && this[$extra].attempt === 0 && this[$extra].numberInLine > 0 || this[$getParent]()[$isThereMoreWidth](); + } + *[$getContainedChildren]() { + yield* getContainedChildren(this); + } + [$flushHTML]() { + return flushHTML(this); + } + [$addHTML](html, bbox) { + addHTML(this, html, bbox); + } + [$getAvailableSpace]() { + return getAvailableSpace(this); + } + [$isSplittable]() { + const parent = this[$getSubformParent](); + if (!parent[$isSplittable]()) { + return false; + } + if (this[$extra]._isSplittable !== undefined) { + return this[$extra]._isSplittable; + } + 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; + } + [$toHTML](availableSpace) { + setTabIndex(this); + if (this.break) { + if (this.break.after !== "auto" || this.break.afterTarget !== "") { + const node = new BreakAfter({ + targetType: this.break.after, + target: this.break.afterTarget, + startNew: this.break.startNew.toString() + }); + node[$globalData] = this[$globalData]; + this[$appendChild](node); + this.breakAfter.push(node); + } + if (this.break.before !== "auto" || this.break.beforeTarget !== "") { + const node = new BreakBefore({ + targetType: this.break.before, + target: this.break.beforeTarget, + startNew: this.break.startNew.toString() + }); + node[$globalData] = this[$globalData]; + this[$appendChild](node); + this.breakBefore.push(node); + } + if (this.break.overflowTarget !== "") { + const node = new Overflow({ + target: this.break.overflowTarget, + leader: this.break.overflowLeader, + trailer: this.break.overflowTrailer + }); + node[$globalData] = this[$globalData]; + this[$appendChild](node); + this.overflow.push(node); + } + this[$removeChild](this.break); + this.break = null; + } + if (this.presence === "hidden" || this.presence === "inactive") { + return HTMLResult.EMPTY; + } + 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 breakBefore = this.breakBefore.children[0]; + if (handleBreak(breakBefore)) { + return HTMLResult.breakNode(breakBefore); + } + } + if (this[$extra]?.afterBreakAfter) { + return HTMLResult.EMPTY; + } + fixDimensions(this); + const children = []; + const attributes = { + id: this[$uid], + class: [] + }; + setAccess(this, attributes.class); + this[$extra] ||= Object.create(null); + Object.assign(this[$extra], { + children, + line: null, + attributes, + attempt: 0, + numberInLine: 0, + availableSpace: { + width: Math.min(this.w || Infinity, availableSpace.width), + height: Math.min(this.h || Infinity, availableSpace.height) + }, + width: 0, + height: 0, + prevHeight: 0, + currentWidth: 0 + }); + const root = this[$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", "field", "subform", "subformSet"]); + if (this.layout.includes("row")) { + const columnWidths = this[$getSubformParent]().columnWidths; + if (Array.isArray(columnWidths) && columnWidths.length > 0) { + this[$extra].columnWidths = columnWidths; + this[$extra].currentColumn = 0; + } + } + 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 overflowExtra = this.overflow[$getExtra](); + if (overflowExtra.addLeader) { + overflowExtra.addLeader = false; + handleOverflow(this, overflowExtra.leader, availableSpace); + } + } + 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 (isLrTb && this[$extra].attempt === 0 && this[$extra].numberInLine === 0 && !root[$extra].noLayoutFailure) { + this[$extra].attempt = maxRun; + break; + } + } + 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 overflowExtra = this.overflow[$getExtra](); + if (overflowExtra.addTrailer) { + overflowExtra.addTrailer = false; + handleOverflow(this, overflowExtra.trailer, availableSpace); + } + } + let marginH = 0; + let marginV = 0; + if (this.margin) { + marginH = this.margin.leftInset + this.margin.rightInset; + marginV = this.margin.topInset + this.margin.bottomInset; + } + const width = Math.max(this[$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 html = { + name: "div", + attributes, + children + }; + applyAssist(this, attributes); + const result = HTMLResult.success(createWrapper(this, html), bbox); + if (this.breakAfter.children.length >= 1) { + const breakAfter = this.breakAfter.children[0]; + if (handleBreak(breakAfter)) { + this[$extra].afterBreakAfter = result; + return HTMLResult.breakNode(breakAfter); + } + } + delete this[$extra]; + return result; + } +} +class SubformSet extends XFAObject { + 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(attributes.relevant); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.bookend = null; + this.break = null; + this.desc = null; + this.extras = null; + this.occur = null; + this.overflow = null; + this.breakAfter = new XFAObjectArray(); + this.breakBefore = new XFAObjectArray(); + this.subform = new XFAObjectArray(); + this.subformSet = new XFAObjectArray(); + } + *[$getContainedChildren]() { + yield* getContainedChildren(this); + } + [$getSubformParent]() { + let parent = this[$getParent](); + while (!(parent instanceof Subform)) { + parent = parent[$getParent](); + } + return parent; + } + [$isBindable]() { + return true; + } +} +class SubjectDN extends ContentObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "subjectDN"); + this.delimiter = attributes.delimiter || ","; + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } + [$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(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(attributes) { + super(TEMPLATE_NS_ID, "submit", true); + this.embedPDF = getInteger({ + data: attributes.embedPDF, + defaultValue: 0, + validate: x => x === 1 + }); + this.format = getStringOption(attributes.format, ["xdp", "formdata", "pdf", "urlencoded", "xfd", "xml"]); + this.id = attributes.id || ""; + this.target = attributes.target || ""; + this.textEncoding = getKeyword({ + data: attributes.textEncoding ? attributes.textEncoding.toLowerCase() : "", + defaultValue: "", + validate: k => ["utf-8", "big-five", "fontspecific", "gbk", "gb-18030", "gb-2312", "ksc-5601", "none", "shift-jis", "ucs-2", "utf-16"].includes(k) || k.match(/iso-8859-\d{2}/) + }); + 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(attributes) { + super(TEMPLATE_NS_ID, "template", true); + this.baseProfile = getStringOption(attributes.baseProfile, ["full", "interactiveForms"]); + this.extras = null; + this.subform = new XFAObjectArray(); + } + [$finalize]() { + if (this.subform.children.length === 0) { + warn("XFA - No subforms in template node."); + } + if (this.subform.children.length >= 2) { + warn("XFA - Several subforms in template node: please file a bug."); + } + this[$tabIndex] = DEFAULT_TAB_INDEX; + } + [$isSplittable]() { + return true; + } + [$searchNode](expr, container) { + if (expr.startsWith("#")) { + return [this[$ids].get(expr.slice(1))]; + } + return searchNode(this, container, expr, true, true); + } + *[$toPages]() { + if (!this.subform.children.length) { + return HTMLResult.success({ + name: "div", + children: [] + }); + } + this[$extra] = { + overflowNode: null, + firstUnsplittable: null, + currentContentArea: null, + currentPageArea: null, + noLayoutFailure: false, + pageNumber: 1, + pagePosition: "first", + oddOrEven: "odd", + blankOrNotBlank: "nonBlank", + paraStack: [] + }; + 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 (root.subform.children.length >= 1 && root.subform.children[0].breakBefore.children.length >= 1) { + breakBefore = root.subform.children[0].breakBefore.children[0]; + breakBeforeTarget = breakBefore.target; + } else if (root.break?.beforeTarget) { + breakBefore = root.break; + breakBeforeTarget = breakBefore.beforeTarget; + } else if (root.subform.children.length >= 1 && root.subform.children[0].break?.beforeTarget) { + breakBefore = root.subform.children[0].break; + breakBeforeTarget = breakBefore.beforeTarget; + } + if (breakBefore) { + const target = this[$searchNode](breakBeforeTarget, breakBefore[$getParent]()); + if (target instanceof PageArea) { + pageArea = target; + breakBefore[$extra] = {}; + } + } + pageArea ||= pageAreas[0]; + pageArea[$extra] = { + numberOfUse: 1 + }; + const pageAreaParent = pageArea[$getParent](); + pageAreaParent[$extra] = { + numberOfUse: 1, + pageIndex: pageAreaParent.pageArea.children.indexOf(pageArea), + pageSetIndex: 0 + }; + let targetPageArea; + let leader = null; + let trailer = null; + let hasSomething = true; + let hasSomethingCounter = 0; + let startIndex = 0; + while (true) { + if (!hasSomething) { + mainHtml.children.pop(); + if (++hasSomethingCounter === MAX_EMPTY_PAGES) { + warn("XFA - Something goes wrong: please file a bug."); + return mainHtml; + } + } else { + hasSomethingCounter = 0; + } + 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 (trailer) { + this[$extra].noLayoutFailure = true; + page.children.push(trailer[$toHTML](pageArea[$extra].space).html); + trailer = null; + } + 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 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 (trailer) { + htmlContentAreas[i].children.push(trailer[$toHTML](space).html); + trailer = 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(); + } + return mainHtml; + } + if (html.isBreak()) { + const node = html.breakNode; + flush(i); + if (node.targetType === "auto") { + continue; + } + 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); + } + } + continue; + } + flush(i); + } + 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(attributes) { + super(TEMPLATE_NS_ID, "text"); + this.id = attributes.id || ""; + this.maxChars = getInteger({ + data: attributes.maxChars, + defaultValue: 0, + validate: x => x >= 0 + }); + this.name = attributes.name || ""; + this.rid = attributes.rid || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } + [$acceptWhitespace]() { + return true; + } + [$onChild](child) { + if (child[$namespaceId] === NamespaceIds.xhtml.id) { + this[$content] = child; + return true; + } + warn(`XFA - Invalid content in Text: ${child[$nodeName]}.`); + return false; + } + [$onText](str) { + if (this[$content] instanceof XFAObject) { + return; + } + super[$onText](str); + } + [$finalize]() { + if (typeof this[$content] === "string") { + this[$content] = this[$content].replaceAll("\r\n", "\n"); + } + } + [$getExtra]() { + if (typeof this[$content] === "string") { + return this[$content].split(/[\u2029\u2028\n]/).filter(Boolean).join("\n"); + } + return this[$content][$text](); + } + [$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(para => para.split(/[\u2028\n]/).flatMap(line => [{ + name: "span", + value: line + }, { + name: "br" + }])).forEach(lines => { + html.children.push({ + name: "p", + children: lines + }); + }); + } 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(html); + } + return this[$content][$toHTML](availableSpace); + } +} +class TextEdit extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "textEdit", true); + this.allowRichText = getInteger({ + data: attributes.allowRichText, + defaultValue: 0, + validate: x => x === 1 + }); + this.hScrollPolicy = getStringOption(attributes.hScrollPolicy, ["auto", "off", "on"]); + this.id = attributes.id || ""; + this.multiLine = getInteger({ + data: attributes.multiLine, + defaultValue: "", + validate: x => x === 0 || x === 1 + }); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.vScrollPolicy = getStringOption(attributes.vScrollPolicy, ["auto", "off", "on"]); + this.border = null; + this.comb = null; + this.extras = null; + this.margin = null; + } + [$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: [html] + }); + } +} +class Time extends StringObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "time"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } + [$finalize]() { + const date = this[$content].trim(); + this[$content] = date ? new Date(date) : null; + } + [$toHTML](availableSpace) { + return valueToHtml(this[$content] ? this[$content].toString() : ""); + } +} +class TimeStamp extends XFAObject { + 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(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(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(attributes) { + super(TEMPLATE_NS_ID, "traverse", true); + this.id = attributes.id || ""; + this.operation = getStringOption(attributes.operation, ["next", "back", "down", "first", "left", "right", "up"]); + this.ref = attributes.ref || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + this.script = null; + } + get name() { + return this.operation; + } + [$isTransparent]() { + return false; + } +} +class Ui extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "ui", true); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + this.picture = null; + this.barcode = null; + this.button = null; + this.checkButton = null; + this.choiceList = null; + this.dateTimeEdit = null; + this.defaultUi = null; + this.imageEdit = null; + this.numericEdit = null; + this.passwordEdit = null; + this.signature = null; + this.textEdit = null; + } + [$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[$extra] = null; + } + return this[$extra]; + } + [$toHTML](availableSpace) { + const obj = this[$getExtra](); + return obj ? obj[$toHTML](availableSpace) : HTMLResult.EMPTY; + } +} +class Validate extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "validate", true); + this.formatTest = getStringOption(attributes.formatTest, ["warning", "disabled", "error"]); + this.id = attributes.id || ""; + this.nullTest = getStringOption(attributes.nullTest, ["disabled", "error", "warning"]); + this.scriptTest = getStringOption(attributes.scriptTest, ["error", "disabled", "warning"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + this.message = null; + this.picture = null; + this.script = null; + } +} +class template_Value extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "value", true); + this.id = attributes.id || ""; + this.override = getInteger({ + data: attributes.override, + defaultValue: 0, + validate: x => x === 1 + }); + this.relevant = getRelevant(attributes.relevant); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.arc = null; + this.boolean = null; + this.date = null; + this.dateTime = null; + this.decimal = null; + this.exData = null; + this.float = null; + this.image = null; + this.integer = null; + this.line = null; + this.rectangle = null; + this.text = null; + this.time = null; + } + [$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; + } + } + const valueName = value[$nodeName]; + if (this[valueName] !== null) { + this[valueName][$content] = value[$content]; + return; + } + for (const name of Object.getOwnPropertyNames(this)) { + const obj = this[name]; + if (obj instanceof XFAObject) { + this[name] = null; + this[$removeChild](obj); + } + } + this[value[$nodeName]] = value; + this[$appendChild](value); + } + [$text]() { + if (this.exData) { + return typeof this.exData[$content] === "string" ? this.exData[$content].trim() : 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; + } + [$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(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(); + this.decimal = new XFAObjectArray(); + this.exData = new XFAObjectArray(); + this.float = new XFAObjectArray(); + this.image = new XFAObjectArray(); + this.integer = new XFAObjectArray(); + this.manifest = new XFAObjectArray(); + this.script = new XFAObjectArray(); + this.text = new XFAObjectArray(); + this.time = new XFAObjectArray(); + } + [$isTransparent]() { + return true; + } +} +class TemplateNamespace { + static [$buildXFAObject](name, attributes) { + if (Object.hasOwn(TemplateNamespace, name)) { + const node = TemplateNamespace[name](attributes); + node[$setSetAttributes](attributes); + return node; + } + return undefined; + } + static appearanceFilter(attrs) { + return new AppearanceFilter(attrs); + } + static arc(attrs) { + return new Arc(attrs); + } + static area(attrs) { + return new Area(attrs); + } + static assist(attrs) { + return new Assist(attrs); + } + static barcode(attrs) { + return new Barcode(attrs); + } + static bind(attrs) { + return new Bind(attrs); + } + static bindItems(attrs) { + return new BindItems(attrs); + } + static bookend(attrs) { + return new Bookend(attrs); + } + static boolean(attrs) { + return new BooleanElement(attrs); + } + static border(attrs) { + return new Border(attrs); + } + static break(attrs) { + return new Break(attrs); + } + static breakAfter(attrs) { + return new BreakAfter(attrs); + } + static breakBefore(attrs) { + return new BreakBefore(attrs); + } + static button(attrs) { + return new Button(attrs); + } + static calculate(attrs) { + return new Calculate(attrs); + } + static caption(attrs) { + return new Caption(attrs); + } + static certificate(attrs) { + return new Certificate(attrs); + } + static certificates(attrs) { + return new Certificates(attrs); + } + static checkButton(attrs) { + return new CheckButton(attrs); + } + static choiceList(attrs) { + return new ChoiceList(attrs); + } + static color(attrs) { + return new Color(attrs); + } + static comb(attrs) { + return new Comb(attrs); + } + static connect(attrs) { + return new Connect(attrs); + } + static contentArea(attrs) { + return new ContentArea(attrs); + } + static corner(attrs) { + return new Corner(attrs); + } + static date(attrs) { + return new DateElement(attrs); + } + static dateTime(attrs) { + return new DateTime(attrs); + } + static dateTimeEdit(attrs) { + return new DateTimeEdit(attrs); + } + static decimal(attrs) { + return new Decimal(attrs); + } + static defaultUi(attrs) { + return new DefaultUi(attrs); + } + static desc(attrs) { + return new Desc(attrs); + } + static digestMethod(attrs) { + return new DigestMethod(attrs); + } + static digestMethods(attrs) { + return new DigestMethods(attrs); + } + static draw(attrs) { + return new Draw(attrs); + } + static edge(attrs) { + return new template_Edge(attrs); + } + static encoding(attrs) { + return new Encoding(attrs); + } + static encodings(attrs) { + return new Encodings(attrs); + } + static encrypt(attrs) { + return new Encrypt(attrs); + } + static encryptData(attrs) { + return new EncryptData(attrs); + } + static encryption(attrs) { + return new Encryption(attrs); + } + static encryptionMethod(attrs) { + return new EncryptionMethod(attrs); + } + static encryptionMethods(attrs) { + return new EncryptionMethods(attrs); + } + static event(attrs) { + return new Event(attrs); + } + static exData(attrs) { + return new ExData(attrs); + } + static exObject(attrs) { + return new ExObject(attrs); + } + static exclGroup(attrs) { + return new ExclGroup(attrs); + } + static execute(attrs) { + return new Execute(attrs); + } + static extras(attrs) { + return new Extras(attrs); + } + static field(attrs) { + return new Field(attrs); + } + static fill(attrs) { + return new Fill(attrs); + } + static filter(attrs) { + return new Filter(attrs); + } + static float(attrs) { + return new Float(attrs); + } + static font(attrs) { + return new template_Font(attrs); + } + static format(attrs) { + return new Format(attrs); + } + static handler(attrs) { + return new Handler(attrs); + } + static hyphenation(attrs) { + return new Hyphenation(attrs); + } + static image(attrs) { + return new Image(attrs); + } + static imageEdit(attrs) { + return new ImageEdit(attrs); + } + static integer(attrs) { + return new Integer(attrs); + } + static issuers(attrs) { + return new Issuers(attrs); + } + static items(attrs) { + return new Items(attrs); + } + static keep(attrs) { + return new Keep(attrs); + } + static keyUsage(attrs) { + return new KeyUsage(attrs); + } + static line(attrs) { + return new Line(attrs); + } + static linear(attrs) { + return new Linear(attrs); + } + static lockDocument(attrs) { + return new LockDocument(attrs); + } + static manifest(attrs) { + return new Manifest(attrs); + } + static margin(attrs) { + return new Margin(attrs); + } + static mdp(attrs) { + return new Mdp(attrs); + } + static medium(attrs) { + return new Medium(attrs); + } + static message(attrs) { + return new Message(attrs); + } + static numericEdit(attrs) { + return new NumericEdit(attrs); + } + static occur(attrs) { + return new Occur(attrs); + } + static oid(attrs) { + return new Oid(attrs); + } + static oids(attrs) { + return new Oids(attrs); + } + static overflow(attrs) { + return new Overflow(attrs); + } + static pageArea(attrs) { + return new PageArea(attrs); + } + static pageSet(attrs) { + return new PageSet(attrs); + } + static para(attrs) { + return new Para(attrs); + } + static passwordEdit(attrs) { + return new PasswordEdit(attrs); + } + static pattern(attrs) { + return new template_Pattern(attrs); + } + static picture(attrs) { + return new Picture(attrs); + } + static proto(attrs) { + return new Proto(attrs); + } + static radial(attrs) { + return new Radial(attrs); + } + static reason(attrs) { + return new Reason(attrs); + } + static reasons(attrs) { + return new Reasons(attrs); + } + static rectangle(attrs) { + return new Rectangle(attrs); + } + static ref(attrs) { + return new RefElement(attrs); + } + static script(attrs) { + return new template_Script(attrs); + } + static setProperty(attrs) { + return new SetProperty(attrs); + } + static signData(attrs) { + return new SignData(attrs); + } + static signature(attrs) { + return new Signature(attrs); + } + static signing(attrs) { + return new Signing(attrs); + } + static solid(attrs) { + return new Solid(attrs); + } + static speak(attrs) { + return new Speak(attrs); + } + static stipple(attrs) { + return new Stipple(attrs); + } + static subform(attrs) { + return new Subform(attrs); + } + static subformSet(attrs) { + return new SubformSet(attrs); + } + static subjectDN(attrs) { + return new SubjectDN(attrs); + } + static subjectDNs(attrs) { + return new SubjectDNs(attrs); + } + static submit(attrs) { + return new Submit(attrs); + } + static template(attrs) { + return new Template(attrs); + } + static text(attrs) { + return new Text(attrs); + } + static textEdit(attrs) { + return new TextEdit(attrs); + } + static time(attrs) { + return new Time(attrs); + } + static timeStamp(attrs) { + return new TimeStamp(attrs); + } + static toolTip(attrs) { + return new ToolTip(attrs); + } + static traversal(attrs) { + return new Traversal(attrs); + } + static traverse(attrs) { + return new Traverse(attrs); + } + static ui(attrs) { + return new Ui(attrs); + } + static validate(attrs) { + return new Validate(attrs); + } + static value(attrs) { + return new template_Value(attrs); + } + static variables(attrs) { + return new Variables(attrs); + } +} + +;// ./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(root) { + this.root = root; + this.datasets = root.datasets; + this.data = root.datasets?.data || new XmlObject(bind_NS_DATASETS, "data"); + this.emptyMerge = this.data[$getChildren]().length === 0; + this.root.form = this.form = root.template[$clone](); + } + _isConsumeData() { + return !this.emptyMerge && this._mergeMode; + } + _isMatchTemplate() { + return !this._isConsumeData(); + } + bind() { + this._bindElement(this.form, this.data); + return this.form; + } + getData() { + return this.data; + } + _bindValue(formNode, data, picture) { + formNode[$data] = data; + if (formNode[$hasSettableValue]()) { + if (data[$isDataValue]()) { + const value = data[$getDataValue](); + formNode[$setValue](createText(value)); + } else if (formNode instanceof Field && formNode.ui?.choiceList?.open === "multiSelect") { + const value = data[$getChildren]().map(child => child[$content].trim()).join("\n"); + formNode[$setValue](createText(value)); + } else if (this._isConsumeData()) { + warn(`XFA - Nodes haven't the same type.`); + } + } else if (!data[$isDataValue]() || this._isMatchTemplate()) { + this._bindElement(formNode, data); + } else { + warn(`XFA - Nodes haven't the same type.`); + } + } + _findDataByNameToConsume(name, isValue, dataNode, global) { + if (!name) { + return null; + } + let generator, match; + for (let i = 0; i < 3; i++) { + generator = dataNode[$getRealChildrenByNameIt](name, false, true); + while (true) { + match = generator.next().value; + if (!match) { + break; + } + if (isValue === match[$isDataValue]()) { + return match; + } + } + if (dataNode[$namespaceId] === bind_NS_DATASETS && 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; + return match?.[$isDataValue]() ? match : null; + } + _setProperties(formNode, dataNode) { + if (!Object.hasOwn(formNode, "setProperty")) { + return; + } + 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 (!Object.hasOwn(targetNode, $content)) { + warn(`XFA - Invalid node to use in setProperty`); + continue; + } + targetNode[$data] = node; + targetNode[$content] = content; + targetNode[$finalize](); + } + } + _bindItems(formNode, dataNode) { + if (!Object.hasOwn(formNode, "items") || !Object.hasOwn(formNode, "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; + } + 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); + } + } + } + _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); + } + } + _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); + } + } + } + _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 (!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(child, dataNode); + continue; + case "global": + global = true; + break; + case "dataRef": + if (!child.bind.ref) { + warn(`XFA - ref is empty in node ${child[$nodeName]}.`); + this._setAndBind(child, dataNode); + continue; + } + ref = child.bind.ref; + break; + default: + break; + } + if (child.bind.picture) { + picture = child.bind.picture[$content]; + } + } + 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; + }); + } + } + } else { + if (!child.name) { + this._setAndBind(child, dataNode); + continue; + } + if (this._isConsumeData()) { + 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); + } + match = matches.length > 0 ? matches : null; + } else { + match = dataNode[$getRealChildrenByNameIt](child.name, false, this.emptyMerge).next().value; + if (!match) { + if (min === 0) { + uselessNodes.push(child); + continue; + } + 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; + } + if (this.emptyMerge) { + match[$consumed] = true; + } + match = [match]; + } + } + if (match) { + this._bindOccurrences(child, match, picture); + } else if (min > 0) { + this._setAndBind(child, dataNode); + } else { + uselessNodes.push(child); + } + } + uselessNodes.forEach(node => node[$getParent]()[$removeChild](node)); + } +} + +;// ./src/core/xfa/data.js + + +class DataHandler { + constructor(root, data) { + this.data = data; + this.dataset = root.datasets || null; + } + 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 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 nodes = child[$getChildren](); + if (nodes.length > 0) { + stack.push([-1, nodes]); + } + } + const buf = [``]; + 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(""); + } +} + +;// ./src/core/xfa/config.js + + + + + + + + + + + + + + +const CONFIG_NS_ID = NamespaceIds.config.id; +class Acrobat extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "acrobat", true); + this.acrobat7 = null; + this.autoSave = null; + this.common = null; + this.validate = null; + this.validateApprovalSignatures = null; + this.submitUrl = new XFAObjectArray(); + } +} +class Acrobat7 extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "acrobat7", true); + this.dynamicRender = null; + } +} +class ADBE_JSConsole extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "ADBE_JSConsole", ["delegate", "Enable", "Disable"]); + } +} +class ADBE_JSDebugger extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "ADBE_JSDebugger", ["delegate", "Enable", "Disable"]); + } +} +class AddSilentPrint extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "addSilentPrint"); + } +} +class AddViewerPreferences extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "addViewerPreferences"); + } +} +class AdjustData extends Option10 { + constructor(attributes) { + super(CONFIG_NS_ID, "adjustData"); + } +} +class AdobeExtensionLevel extends IntegerObject { + constructor(attributes) { + super(CONFIG_NS_ID, "adobeExtensionLevel", 0, n => n >= 1 && n <= 8); + } +} +class Agent extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "agent", true); + this.name = attributes.name ? attributes.name.trim() : ""; + this.common = new XFAObjectArray(); + } +} +class AlwaysEmbed extends ContentObject { + constructor(attributes) { + super(CONFIG_NS_ID, "alwaysEmbed"); + } +} +class Amd extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "amd"); + } +} +class config_Area extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "area"); + this.level = getInteger({ + data: attributes.level, + defaultValue: 0, + validate: n => n >= 1 && n <= 3 + }); + this.name = getStringOption(attributes.name, ["", "barcode", "coreinit", "deviceDriver", "font", "general", "layout", "merge", "script", "signature", "sourceSet", "templateCache"]); + } +} +class config_Attributes extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "attributes", ["preserve", "delegate", "ignore"]); + } +} +class AutoSave extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "autoSave", ["disabled", "enabled"]); + } +} +class Base extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "base"); + } +} +class BatchOutput extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "batchOutput"); + this.format = getStringOption(attributes.format, ["none", "concat", "zip", "zipCompress"]); + } +} +class BehaviorOverride extends ContentObject { + constructor(attributes) { + super(CONFIG_NS_ID, "behaviorOverride"); + } + [$finalize]() { + this[$content] = new Map(this[$content].trim().split(/\s+/).filter(x => x.includes(":")).map(x => x.split(":", 2))); + } +} +class Cache extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "cache", true); + this.templateCache = null; + } +} +class Change extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "change"); + } +} +class Common extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "common", true); + this.data = null; + this.locale = null; + this.localeSet = null; + this.messaging = null; + this.suppressBanner = null; + this.template = null; + this.validationMessaging = null; + this.versionControl = null; + this.log = new XFAObjectArray(); + } +} +class Compress extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "compress"); + this.scope = getStringOption(attributes.scope, ["imageOnly", "document"]); + } +} +class CompressLogicalStructure extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "compressLogicalStructure"); + } +} +class CompressObjectStream extends Option10 { + constructor(attributes) { + super(CONFIG_NS_ID, "compressObjectStream"); + } +} +class Compression extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "compression", true); + this.compressLogicalStructure = null; + this.compressObjectStream = null; + this.level = null; + this.type = null; + } +} +class Config extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "config", true); + this.acrobat = null; + this.present = null; + this.trace = null; + this.agent = new XFAObjectArray(); + } +} +class Conformance extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "conformance", ["A", "B"]); + } +} +class ContentCopy extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "contentCopy"); + } +} +class Copies extends IntegerObject { + constructor(attributes) { + super(CONFIG_NS_ID, "copies", 1, n => n >= 1); + } +} +class Creator extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "creator"); + } +} +class CurrentPage extends IntegerObject { + constructor(attributes) { + super(CONFIG_NS_ID, "currentPage", 0, n => n >= 0); + } +} +class Data extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "data", true); + this.adjustData = null; + this.attributes = null; + this.incrementalLoad = null; + this.outputXSL = null; + this.range = null; + this.record = null; + this.startNode = null; + this.uri = null; + this.window = null; + this.xsl = null; + this.excludeNS = new XFAObjectArray(); + this.transform = new XFAObjectArray(); + } +} +class Debug extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "debug", true); + this.uri = null; + } +} +class DefaultTypeface extends ContentObject { + constructor(attributes) { + super(CONFIG_NS_ID, "defaultTypeface"); + this.writingScript = getStringOption(attributes.writingScript, ["*", "Arabic", "Cyrillic", "EastEuropeanRoman", "Greek", "Hebrew", "Japanese", "Korean", "Roman", "SimplifiedChinese", "Thai", "TraditionalChinese", "Vietnamese"]); + } +} +class Destination extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "destination", ["pdf", "pcl", "ps", "webClient", "zpl"]); + } +} +class DocumentAssembly extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "documentAssembly"); + } +} +class Driver extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "driver", true); + this.name = attributes.name ? attributes.name.trim() : ""; + this.fontInfo = null; + this.xdc = null; + } +} +class DuplexOption extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "duplexOption", ["simplex", "duplexFlipLongEdge", "duplexFlipShortEdge"]); + } +} +class DynamicRender extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "dynamicRender", ["forbidden", "required"]); + } +} +class Embed extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "embed"); + } +} +class config_Encrypt extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "encrypt"); + } +} +class config_Encryption extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "encryption", true); + this.encrypt = null; + this.encryptionLevel = null; + this.permissions = null; + } +} +class EncryptionLevel extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "encryptionLevel", ["40bit", "128bit"]); + } +} +class Enforce extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "enforce"); + } +} +class Equate extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "equate"); + this.force = getInteger({ + data: attributes.force, + defaultValue: 1, + validate: n => n === 0 + }); + this.from = attributes.from || ""; + this.to = attributes.to || ""; + } +} +class EquateRange extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "equateRange"); + this.from = attributes.from || ""; + this.to = attributes.to || ""; + this._unicodeRange = attributes.unicodeRange || ""; + } + get unicodeRange() { + const ranges = []; + const unicodeRegex = /U\+([0-9a-fA-F]+)/; + const unicodeRange = this._unicodeRange; + for (let range of unicodeRange.split(",").map(x => x.trim()).filter(Boolean)) { + range = range.split("-", 2).map(x => { + const found = x.match(unicodeRegex); + return !found ? 0 : parseInt(found[1], 16); + }); + if (range.length === 1) { + range.push(range[0]); + } + ranges.push(range); + } + return util_shadow(this, "unicodeRange", ranges); + } +} +class Exclude extends ContentObject { + constructor(attributes) { + super(CONFIG_NS_ID, "exclude"); + } + [$finalize]() { + this[$content] = this[$content].trim().split(/\s+/).filter(x => x && ["calculate", "close", "enter", "exit", "initialize", "ready", "validate"].includes(x)); + } +} +class ExcludeNS extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "excludeNS"); + } +} +class FlipLabel extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "flipLabel", ["usePrinterSetting", "on", "off"]); + } +} +class config_FontInfo extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "fontInfo", true); + this.embed = null; + this.map = null; + this.subsetBelow = null; + this.alwaysEmbed = new XFAObjectArray(); + this.defaultTypeface = new XFAObjectArray(); + this.neverEmbed = new XFAObjectArray(); + } +} +class FormFieldFilling extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "formFieldFilling"); + } +} +class GroupParent extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "groupParent"); + } +} +class IfEmpty extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "ifEmpty", ["dataValue", "dataGroup", "ignore", "remove"]); + } +} +class IncludeXDPContent extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "includeXDPContent"); + } +} +class IncrementalLoad extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "incrementalLoad", ["none", "forwardOnly"]); + } +} +class IncrementalMerge extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "incrementalMerge"); + } +} +class Interactive extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "interactive"); + } +} +class Jog extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "jog", ["usePrinterSetting", "none", "pageSet"]); + } +} +class LabelPrinter extends XFAObject { + 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; + this.xdc = null; + } +} +class Layout extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "layout", ["paginate", "panel"]); + } +} +class Level extends IntegerObject { + constructor(attributes) { + super(CONFIG_NS_ID, "level", 0, n => n > 0); + } +} +class Linearized extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "linearized"); + } +} +class Locale extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "locale"); + } +} +class LocaleSet extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "localeSet"); + } +} +class Log extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "log", true); + this.mode = null; + this.threshold = null; + this.to = null; + this.uri = null; + } +} +class MapElement extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "map", true); + this.equate = new XFAObjectArray(); + this.equateRange = new XFAObjectArray(); + } +} +class MediumInfo extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "mediumInfo", true); + this.map = null; + } +} +class config_Message extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "message", true); + this.msgId = null; + this.severity = null; + } +} +class Messaging extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "messaging", true); + this.message = new XFAObjectArray(); + } +} +class Mode extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "mode", ["append", "overwrite"]); + } +} +class ModifyAnnots extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "modifyAnnots"); + } +} +class MsgId extends IntegerObject { + constructor(attributes) { + super(CONFIG_NS_ID, "msgId", 1, n => n >= 1); + } +} +class NameAttr extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "nameAttr"); + } +} +class NeverEmbed extends ContentObject { + constructor(attributes) { + super(CONFIG_NS_ID, "neverEmbed"); + } +} +class NumberOfCopies extends IntegerObject { + constructor(attributes) { + super(CONFIG_NS_ID, "numberOfCopies", null, n => n >= 2 && n <= 5); + } +} +class OpenAction extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "openAction", true); + this.destination = null; + } +} +class Output extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "output", true); + this.to = null; + this.type = null; + this.uri = null; + } +} +class OutputBin extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "outputBin"); + } +} +class OutputXSL extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "outputXSL", true); + this.uri = null; + } +} +class Overprint extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "overprint", ["none", "both", "draw", "field"]); + } +} +class Packets extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "packets"); + } + [$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(attributes) { + super(CONFIG_NS_ID, "pageOffset"); + this.x = getInteger({ + data: attributes.x, + defaultValue: "useXDCSetting", + validate: n => true + }); + this.y = getInteger({ + data: attributes.y, + defaultValue: "useXDCSetting", + validate: n => true + }); + } +} +class PageRange extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "pageRange"); + } + [$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(attributes) { + super(CONFIG_NS_ID, "pagination", ["simplex", "duplexShortEdge", "duplexLongEdge"]); + } +} +class PaginationOverride extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "paginationOverride", ["none", "forceDuplex", "forceDuplexLongEdge", "forceDuplexShortEdge", "forceSimplex"]); + } +} +class Part extends IntegerObject { + constructor(attributes) { + super(CONFIG_NS_ID, "part", 1, n => false); + } +} +class Pcl extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "pcl", true); + this.name = attributes.name || ""; + this.batchOutput = null; + this.fontInfo = null; + this.jog = null; + this.mediumInfo = null; + this.outputBin = null; + this.pageOffset = null; + this.staple = null; + this.xdc = null; + } +} +class Pdf extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "pdf", true); + this.name = attributes.name || ""; + this.adobeExtensionLevel = null; + this.batchOutput = null; + this.compression = null; + this.creator = null; + this.encryption = null; + this.fontInfo = null; + this.interactive = null; + this.linearized = null; + this.openAction = null; + this.pdfa = null; + this.producer = null; + this.renderPolicy = null; + this.scriptModel = null; + this.silentPrint = null; + this.submitFormat = null; + this.tagged = null; + this.version = null; + this.viewerPreferences = null; + this.xdc = null; + } +} +class Pdfa extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "pdfa", true); + this.amd = null; + this.conformance = null; + this.includeXDPContent = null; + this.part = null; + } +} +class Permissions extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "permissions", true); + this.accessibleContent = null; + this.change = null; + this.contentCopy = null; + this.documentAssembly = null; + this.formFieldFilling = null; + this.modifyAnnots = null; + this.plaintextMetadata = null; + this.print = null; + this.printHighQuality = null; + } +} +class PickTrayByPDFSize extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "pickTrayByPDFSize"); + } +} +class config_Picture extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "picture"); + } +} +class PlaintextMetadata extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "plaintextMetadata"); + } +} +class Presence extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "presence", ["preserve", "dissolve", "dissolveStructure", "ignore", "remove"]); + } +} +class Present extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "present", true); + this.behaviorOverride = null; + this.cache = null; + this.common = null; + this.copies = null; + this.destination = null; + this.incrementalMerge = null; + this.layout = null; + this.output = null; + this.overprint = null; + this.pagination = null; + this.paginationOverride = null; + this.script = null; + this.validate = null; + this.xdp = null; + this.driver = new XFAObjectArray(); + this.labelPrinter = new XFAObjectArray(); + this.pcl = new XFAObjectArray(); + this.pdf = new XFAObjectArray(); + this.ps = new XFAObjectArray(); + this.submitUrl = new XFAObjectArray(); + this.webClient = new XFAObjectArray(); + this.zpl = new XFAObjectArray(); + } +} +class Print extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "print"); + } +} +class PrintHighQuality extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "printHighQuality"); + } +} +class PrintScaling extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "printScaling", ["appdefault", "noScaling"]); + } +} +class PrinterName extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "printerName"); + } +} +class Producer extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "producer"); + } +} +class Ps extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "ps", true); + this.name = attributes.name || ""; + this.batchOutput = null; + this.fontInfo = null; + this.jog = null; + this.mediumInfo = null; + this.outputBin = null; + this.staple = null; + this.xdc = null; + } +} +class Range extends ContentObject { + constructor(attributes) { + super(CONFIG_NS_ID, "range"); + } + [$finalize]() { + this[$content] = this[$content].split(",", 2).map(range => range.split("-").map(x => parseInt(x.trim(), 10))).filter(range => range.every(x => !isNaN(x))).map(range => { + if (range.length === 1) { + range.push(range[0]); + } + return range; + }); + } +} +class Record extends ContentObject { + constructor(attributes) { + super(CONFIG_NS_ID, "record"); + } + [$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(attributes) { + super(CONFIG_NS_ID, "relevant"); + } + [$finalize]() { + this[$content] = this[$content].trim().split(/\s+/); + } +} +class Rename extends ContentObject { + constructor(attributes) { + super(CONFIG_NS_ID, "rename"); + } + [$finalize]() { + this[$content] = this[$content].trim(); + if (this[$content].toLowerCase().startsWith("xml") || /[\p{L}_][\p{L}\d._\p{M}-]*/u.test(this[$content])) { + warn("XFA - Rename: invalid XFA name"); + } + } +} +class RenderPolicy extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "renderPolicy", ["server", "client"]); + } +} +class RunScripts extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "runScripts", ["both", "client", "none", "server"]); + } +} +class config_Script extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "script", true); + this.currentPage = null; + this.exclude = null; + this.runScripts = null; + } +} +class ScriptModel extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "scriptModel", ["XFA", "none"]); + } +} +class Severity extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "severity", ["ignore", "error", "information", "trace", "warning"]); + } +} +class SilentPrint extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "silentPrint", true); + this.addSilentPrint = null; + this.printerName = null; + } +} +class Staple extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "staple"); + this.mode = getStringOption(attributes.mode, ["usePrinterSetting", "on", "off"]); + } +} +class StartNode extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "startNode"); + } +} +class StartPage extends IntegerObject { + constructor(attributes) { + super(CONFIG_NS_ID, "startPage", 0, n => true); + } +} +class SubmitFormat extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "submitFormat", ["html", "delegate", "fdf", "xml", "pdf"]); + } +} +class SubmitUrl extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "submitUrl"); + } +} +class SubsetBelow extends IntegerObject { + constructor(attributes) { + super(CONFIG_NS_ID, "subsetBelow", 100, n => n >= 0 && n <= 100); + } +} +class SuppressBanner extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "suppressBanner"); + } +} +class Tagged extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "tagged"); + } +} +class config_Template extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "template", true); + this.base = null; + this.relevant = null; + this.startPage = null; + this.uri = null; + this.xsl = null; + } +} +class Threshold extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "threshold", ["trace", "error", "information", "warning"]); + } +} +class To extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "to", ["null", "memory", "stderr", "stdout", "system", "uri"]); + } +} +class TemplateCache extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "templateCache"); + this.maxEntries = getInteger({ + data: attributes.maxEntries, + defaultValue: 5, + validate: n => n >= 0 + }); + } +} +class Trace extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "trace", true); + this.area = new XFAObjectArray(); + } +} +class Transform extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "transform", true); + this.groupParent = null; + this.ifEmpty = null; + this.nameAttr = null; + this.picture = null; + this.presence = null; + this.rename = null; + this.whitespace = null; + } +} +class config_Type extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "type", ["none", "ascii85", "asciiHex", "ccittfax", "flate", "lzw", "runLength", "native", "xdp", "mergedXDP"]); + } +} +class Uri extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "uri"); + } +} +class config_Validate extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "validate", ["preSubmit", "prePrint", "preExecute", "preSave"]); + } +} +class ValidateApprovalSignatures extends ContentObject { + constructor(attributes) { + super(CONFIG_NS_ID, "validateApprovalSignatures"); + } + [$finalize]() { + this[$content] = this[$content].trim().split(/\s+/).filter(x => ["docReady", "postSign"].includes(x)); + } +} +class ValidationMessaging extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "validationMessaging", ["allMessagesIndividually", "allMessagesTogether", "firstMessageOnly", "noMessages"]); + } +} +class Version extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "version", ["1.7", "1.6", "1.5", "1.4", "1.3", "1.2"]); + } +} +class VersionControl extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "VersionControl"); + this.outputBelow = getStringOption(attributes.outputBelow, ["warn", "error", "update"]); + this.sourceAbove = getStringOption(attributes.sourceAbove, ["warn", "error"]); + this.sourceBelow = getStringOption(attributes.sourceBelow, ["update", "maintain"]); + } +} +class ViewerPreferences extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "viewerPreferences", true); + this.ADBE_JSConsole = null; + this.ADBE_JSDebugger = null; + this.addViewerPreferences = null; + this.duplexOption = null; + this.enforce = null; + this.numberOfCopies = null; + this.pageRange = null; + this.pickTrayByPDFSize = null; + this.printScaling = null; + } +} +class WebClient extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "webClient", true); + this.name = attributes.name ? attributes.name.trim() : ""; + this.fontInfo = null; + this.xdc = null; + } +} +class Whitespace extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "whitespace", ["preserve", "ltrim", "normalize", "rtrim", "trim"]); + } +} +class Window extends ContentObject { + constructor(attributes) { + super(CONFIG_NS_ID, "window"); + } + [$finalize]() { + const pair = this[$content].split(",", 2).map(x => parseInt(x.trim(), 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(attributes) { + super(CONFIG_NS_ID, "xdc", true); + this.uri = new XFAObjectArray(); + this.xsl = new XFAObjectArray(); + } +} +class Xdp extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "xdp", true); + this.packets = null; + } +} +class Xsl extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "xsl", true); + this.debug = null; + this.uri = null; + } +} +class Zpl extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "zpl", true); + this.name = attributes.name ? attributes.name.trim() : ""; + this.batchOutput = null; + this.flipLabel = null; + this.fontInfo = null; + this.xdc = null; + } +} +class ConfigNamespace { + static [$buildXFAObject](name, attributes) { + return Object.hasOwn(ConfigNamespace, name) ? ConfigNamespace[name](attributes) : undefined; + } + static acrobat(attrs) { + return new Acrobat(attrs); + } + static acrobat7(attrs) { + return new Acrobat7(attrs); + } + static ADBE_JSConsole(attrs) { + return new ADBE_JSConsole(attrs); + } + static ADBE_JSDebugger(attrs) { + return new ADBE_JSDebugger(attrs); + } + static addSilentPrint(attrs) { + return new AddSilentPrint(attrs); + } + static addViewerPreferences(attrs) { + return new AddViewerPreferences(attrs); + } + static adjustData(attrs) { + return new AdjustData(attrs); + } + static adobeExtensionLevel(attrs) { + return new AdobeExtensionLevel(attrs); + } + static agent(attrs) { + return new Agent(attrs); + } + static alwaysEmbed(attrs) { + return new AlwaysEmbed(attrs); + } + static amd(attrs) { + return new Amd(attrs); + } + static area(attrs) { + return new config_Area(attrs); + } + static attributes(attrs) { + return new config_Attributes(attrs); + } + static autoSave(attrs) { + return new AutoSave(attrs); + } + static base(attrs) { + return new Base(attrs); + } + static batchOutput(attrs) { + return new BatchOutput(attrs); + } + static behaviorOverride(attrs) { + return new BehaviorOverride(attrs); + } + static cache(attrs) { + return new Cache(attrs); + } + static change(attrs) { + return new Change(attrs); + } + static common(attrs) { + return new Common(attrs); + } + static compress(attrs) { + return new Compress(attrs); + } + static compressLogicalStructure(attrs) { + return new CompressLogicalStructure(attrs); + } + static compressObjectStream(attrs) { + return new CompressObjectStream(attrs); + } + static compression(attrs) { + return new Compression(attrs); + } + static config(attrs) { + return new Config(attrs); + } + static conformance(attrs) { + return new Conformance(attrs); + } + static contentCopy(attrs) { + return new ContentCopy(attrs); + } + static copies(attrs) { + return new Copies(attrs); + } + static creator(attrs) { + return new Creator(attrs); + } + static currentPage(attrs) { + return new CurrentPage(attrs); + } + static data(attrs) { + return new Data(attrs); + } + static debug(attrs) { + return new Debug(attrs); + } + static defaultTypeface(attrs) { + return new DefaultTypeface(attrs); + } + static destination(attrs) { + return new Destination(attrs); + } + static documentAssembly(attrs) { + return new DocumentAssembly(attrs); + } + static driver(attrs) { + return new Driver(attrs); + } + static duplexOption(attrs) { + return new DuplexOption(attrs); + } + static dynamicRender(attrs) { + return new DynamicRender(attrs); + } + static embed(attrs) { + return new Embed(attrs); + } + static encrypt(attrs) { + return new config_Encrypt(attrs); + } + static encryption(attrs) { + return new config_Encryption(attrs); + } + static encryptionLevel(attrs) { + return new EncryptionLevel(attrs); + } + static enforce(attrs) { + return new Enforce(attrs); + } + static equate(attrs) { + return new Equate(attrs); + } + static equateRange(attrs) { + return new EquateRange(attrs); + } + static exclude(attrs) { + return new Exclude(attrs); + } + static excludeNS(attrs) { + return new ExcludeNS(attrs); + } + static flipLabel(attrs) { + return new FlipLabel(attrs); + } + static fontInfo(attrs) { + return new config_FontInfo(attrs); + } + static formFieldFilling(attrs) { + return new FormFieldFilling(attrs); + } + static groupParent(attrs) { + return new GroupParent(attrs); + } + static ifEmpty(attrs) { + return new IfEmpty(attrs); + } + static includeXDPContent(attrs) { + return new IncludeXDPContent(attrs); + } + static incrementalLoad(attrs) { + return new IncrementalLoad(attrs); + } + static incrementalMerge(attrs) { + return new IncrementalMerge(attrs); + } + static interactive(attrs) { + return new Interactive(attrs); + } + static jog(attrs) { + return new Jog(attrs); + } + static labelPrinter(attrs) { + return new LabelPrinter(attrs); + } + static layout(attrs) { + return new Layout(attrs); + } + static level(attrs) { + return new Level(attrs); + } + static linearized(attrs) { + return new Linearized(attrs); + } + static locale(attrs) { + return new Locale(attrs); + } + static localeSet(attrs) { + return new LocaleSet(attrs); + } + static log(attrs) { + return new Log(attrs); + } + static map(attrs) { + return new MapElement(attrs); + } + static mediumInfo(attrs) { + return new MediumInfo(attrs); + } + static message(attrs) { + return new config_Message(attrs); + } + static messaging(attrs) { + return new Messaging(attrs); + } + static mode(attrs) { + return new Mode(attrs); + } + static modifyAnnots(attrs) { + return new ModifyAnnots(attrs); + } + static msgId(attrs) { + return new MsgId(attrs); + } + static nameAttr(attrs) { + return new NameAttr(attrs); + } + static neverEmbed(attrs) { + return new NeverEmbed(attrs); + } + static numberOfCopies(attrs) { + return new NumberOfCopies(attrs); + } + static openAction(attrs) { + return new OpenAction(attrs); + } + static output(attrs) { + return new Output(attrs); + } + static outputBin(attrs) { + return new OutputBin(attrs); + } + static outputXSL(attrs) { + return new OutputXSL(attrs); + } + static overprint(attrs) { + return new Overprint(attrs); + } + static packets(attrs) { + return new Packets(attrs); + } + static pageOffset(attrs) { + return new PageOffset(attrs); + } + static pageRange(attrs) { + return new PageRange(attrs); + } + static pagination(attrs) { + return new Pagination(attrs); + } + static paginationOverride(attrs) { + return new PaginationOverride(attrs); + } + static part(attrs) { + return new Part(attrs); + } + static pcl(attrs) { + return new Pcl(attrs); + } + static pdf(attrs) { + return new Pdf(attrs); + } + static pdfa(attrs) { + return new Pdfa(attrs); + } + static permissions(attrs) { + return new Permissions(attrs); + } + static pickTrayByPDFSize(attrs) { + return new PickTrayByPDFSize(attrs); + } + static picture(attrs) { + return new config_Picture(attrs); + } + static plaintextMetadata(attrs) { + return new PlaintextMetadata(attrs); + } + static presence(attrs) { + return new Presence(attrs); + } + static present(attrs) { + return new Present(attrs); + } + static print(attrs) { + return new Print(attrs); + } + static printHighQuality(attrs) { + return new PrintHighQuality(attrs); + } + static printScaling(attrs) { + return new PrintScaling(attrs); + } + static printerName(attrs) { + return new PrinterName(attrs); + } + static producer(attrs) { + return new Producer(attrs); + } + static ps(attrs) { + return new Ps(attrs); + } + static range(attrs) { + return new Range(attrs); + } + static record(attrs) { + return new Record(attrs); + } + static relevant(attrs) { + return new Relevant(attrs); + } + static rename(attrs) { + return new Rename(attrs); + } + static renderPolicy(attrs) { + return new RenderPolicy(attrs); + } + static runScripts(attrs) { + return new RunScripts(attrs); + } + static script(attrs) { + return new config_Script(attrs); + } + static scriptModel(attrs) { + return new ScriptModel(attrs); + } + static severity(attrs) { + return new Severity(attrs); + } + static silentPrint(attrs) { + return new SilentPrint(attrs); + } + static staple(attrs) { + return new Staple(attrs); + } + static startNode(attrs) { + return new StartNode(attrs); + } + static startPage(attrs) { + return new StartPage(attrs); + } + static submitFormat(attrs) { + return new SubmitFormat(attrs); + } + static submitUrl(attrs) { + return new SubmitUrl(attrs); + } + static subsetBelow(attrs) { + return new SubsetBelow(attrs); + } + static suppressBanner(attrs) { + return new SuppressBanner(attrs); + } + static tagged(attrs) { + return new Tagged(attrs); + } + static template(attrs) { + return new config_Template(attrs); + } + static templateCache(attrs) { + return new TemplateCache(attrs); + } + static threshold(attrs) { + return new Threshold(attrs); + } + static to(attrs) { + return new To(attrs); + } + static trace(attrs) { + return new Trace(attrs); + } + static transform(attrs) { + return new Transform(attrs); + } + static type(attrs) { + return new config_Type(attrs); + } + static uri(attrs) { + return new Uri(attrs); + } + static validate(attrs) { + return new config_Validate(attrs); + } + static validateApprovalSignatures(attrs) { + return new ValidateApprovalSignatures(attrs); + } + static validationMessaging(attrs) { + return new ValidationMessaging(attrs); + } + static version(attrs) { + return new Version(attrs); + } + static versionControl(attrs) { + return new VersionControl(attrs); + } + static viewerPreferences(attrs) { + return new ViewerPreferences(attrs); + } + static webClient(attrs) { + return new WebClient(attrs); + } + static whitespace(attrs) { + return new Whitespace(attrs); + } + static window(attrs) { + return new Window(attrs); + } + static xdc(attrs) { + return new Xdc(attrs); + } + static xdp(attrs) { + return new Xdp(attrs); + } + static xsl(attrs) { + return new Xsl(attrs); + } + static zpl(attrs) { + return new Zpl(attrs); + } +} + +;// ./src/core/xfa/connection_set.js + + +const CONNECTION_SET_NS_ID = NamespaceIds.connectionSet.id; +class ConnectionSet extends XFAObject { + 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(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(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(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(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(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(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(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(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(attributes) { + super(CONNECTION_SET_NS_ID, "wsdlConnection", true); + this.dataDescription = attributes.dataDescription || ""; + this.name = attributes.name || ""; + this.effectiveInputPolicy = null; + this.effectiveOutputPolicy = null; + this.operation = null; + this.soapAction = null; + this.soapAddress = null; + this.wsdlAddress = null; + } +} +class XmlConnection extends XFAObject { + 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(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 [$buildXFAObject](name, attributes) { + return Object.hasOwn(ConnectionSetNamespace, name) ? ConnectionSetNamespace[name](attributes) : undefined; + } + static connectionSet(attrs) { + return new ConnectionSet(attrs); + } + static effectiveInputPolicy(attrs) { + return new EffectiveInputPolicy(attrs); + } + static effectiveOutputPolicy(attrs) { + return new EffectiveOutputPolicy(attrs); + } + static operation(attrs) { + return new Operation(attrs); + } + static rootElement(attrs) { + return new RootElement(attrs); + } + static soapAction(attrs) { + return new SoapAction(attrs); + } + static soapAddress(attrs) { + return new SoapAddress(attrs); + } + static uri(attrs) { + return new connection_set_Uri(attrs); + } + static wsdlAddress(attrs) { + return new WsdlAddress(attrs); + } + static wsdlConnection(attrs) { + return new WsdlConnection(attrs); + } + static xmlConnection(attrs) { + return new XmlConnection(attrs); + } + static xsdConnection(attrs) { + return new XsdConnection(attrs); + } +} + +;// ./src/core/xfa/datasets.js + + + +const DATASETS_NS_ID = NamespaceIds.datasets.id; +class datasets_Data extends XmlObject { + constructor(attributes) { + super(DATASETS_NS_ID, "data", attributes); + } + [$isNsAgnostic]() { + return true; + } +} +class Datasets extends XFAObject { + constructor(attributes) { + super(DATASETS_NS_ID, "datasets", true); + this.data = null; + this.Signature = null; + } + [$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 [$buildXFAObject](name, attributes) { + return Object.hasOwn(DatasetsNamespace, name) ? DatasetsNamespace[name](attributes) : undefined; + } + static datasets(attributes) { + return new Datasets(attributes); + } + static data(attributes) { + return new datasets_Data(attributes); + } +} + +;// ./src/core/xfa/locale_set.js + + + +const LOCALE_SET_NS_ID = NamespaceIds.localeSet.id; +class CalendarSymbols extends XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "calendarSymbols", true); + this.name = "gregorian"; + this.dayNames = new XFAObjectArray(2); + this.eraNames = null; + this.meridiemNames = null; + this.monthNames = new XFAObjectArray(2); + } +} +class CurrencySymbol extends StringObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "currencySymbol"); + this.name = getStringOption(attributes.name, ["symbol", "isoname", "decimal"]); + } +} +class CurrencySymbols extends XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "currencySymbols", true); + this.currencySymbol = new XFAObjectArray(3); + } +} +class DatePattern extends StringObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "datePattern"); + this.name = getStringOption(attributes.name, ["full", "long", "med", "short"]); + } +} +class DatePatterns extends XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "datePatterns", true); + this.datePattern = new XFAObjectArray(4); + } +} +class DateTimeSymbols extends ContentObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "dateTimeSymbols"); + } +} +class Day extends StringObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "day"); + } +} +class DayNames extends XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "dayNames", true); + this.abbr = getInteger({ + data: attributes.abbr, + defaultValue: 0, + validate: x => x === 1 + }); + this.day = new XFAObjectArray(7); + } +} +class Era extends StringObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "era"); + } +} +class EraNames extends XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "eraNames", true); + this.era = new XFAObjectArray(2); + } +} +class locale_set_Locale extends XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "locale", true); + this.desc = attributes.desc || ""; + this.name = "isoname"; + this.calendarSymbols = null; + this.currencySymbols = null; + this.datePatterns = null; + this.dateTimeSymbols = null; + this.numberPatterns = null; + this.numberSymbols = null; + this.timePatterns = null; + this.typeFaces = null; + } +} +class locale_set_LocaleSet extends XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "localeSet", true); + this.locale = new XFAObjectArray(); + } +} +class Meridiem extends StringObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "meridiem"); + } +} +class MeridiemNames extends XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "meridiemNames", true); + this.meridiem = new XFAObjectArray(2); + } +} +class Month extends StringObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "month"); + } +} +class MonthNames extends XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "monthNames", true); + this.abbr = getInteger({ + data: attributes.abbr, + defaultValue: 0, + validate: x => x === 1 + }); + this.month = new XFAObjectArray(12); + } +} +class NumberPattern extends StringObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "numberPattern"); + this.name = getStringOption(attributes.name, ["full", "long", "med", "short"]); + } +} +class NumberPatterns extends XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "numberPatterns", true); + this.numberPattern = new XFAObjectArray(4); + } +} +class NumberSymbol extends StringObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "numberSymbol"); + this.name = getStringOption(attributes.name, ["decimal", "grouping", "percent", "minus", "zero"]); + } +} +class NumberSymbols extends XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "numberSymbols", true); + this.numberSymbol = new XFAObjectArray(5); + } +} +class TimePattern extends StringObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "timePattern"); + this.name = getStringOption(attributes.name, ["full", "long", "med", "short"]); + } +} +class TimePatterns extends XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "timePatterns", true); + this.timePattern = new XFAObjectArray(4); + } +} +class TypeFace extends XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "typeFace", true); + this.name = attributes.name | ""; + } +} +class TypeFaces extends XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "typeFaces", true); + this.typeFace = new XFAObjectArray(); + } +} +class LocaleSetNamespace { + static [$buildXFAObject](name, attributes) { + return Object.hasOwn(LocaleSetNamespace, name) ? LocaleSetNamespace[name](attributes) : undefined; + } + static calendarSymbols(attrs) { + return new CalendarSymbols(attrs); + } + static currencySymbol(attrs) { + return new CurrencySymbol(attrs); + } + static currencySymbols(attrs) { + return new CurrencySymbols(attrs); + } + static datePattern(attrs) { + return new DatePattern(attrs); + } + static datePatterns(attrs) { + return new DatePatterns(attrs); + } + static dateTimeSymbols(attrs) { + return new DateTimeSymbols(attrs); + } + static day(attrs) { + return new Day(attrs); + } + static dayNames(attrs) { + return new DayNames(attrs); + } + static era(attrs) { + return new Era(attrs); + } + static eraNames(attrs) { + return new EraNames(attrs); + } + static locale(attrs) { + return new locale_set_Locale(attrs); + } + static localeSet(attrs) { + return new locale_set_LocaleSet(attrs); + } + static meridiem(attrs) { + return new Meridiem(attrs); + } + static meridiemNames(attrs) { + return new MeridiemNames(attrs); + } + static month(attrs) { + return new Month(attrs); + } + static monthNames(attrs) { + return new MonthNames(attrs); + } + static numberPattern(attrs) { + return new NumberPattern(attrs); + } + static numberPatterns(attrs) { + return new NumberPatterns(attrs); + } + static numberSymbol(attrs) { + return new NumberSymbol(attrs); + } + static numberSymbols(attrs) { + return new NumberSymbols(attrs); + } + static timePattern(attrs) { + return new TimePattern(attrs); + } + static timePatterns(attrs) { + return new TimePatterns(attrs); + } + static typeFace(attrs) { + return new TypeFace(attrs); + } + static typeFaces(attrs) { + return new TypeFaces(attrs); + } +} + +;// ./src/core/xfa/signature.js + + +const SIGNATURE_NS_ID = NamespaceIds.signature.id; +class signature_Signature extends XFAObject { + constructor(attributes) { + super(SIGNATURE_NS_ID, "signature", true); + } +} +class SignatureNamespace { + static [$buildXFAObject](name, attributes) { + return Object.hasOwn(SignatureNamespace, name) ? SignatureNamespace[name](attributes) : undefined; + } + static signature(attributes) { + return new signature_Signature(attributes); + } +} + +;// ./src/core/xfa/stylesheet.js + + +const STYLESHEET_NS_ID = NamespaceIds.stylesheet.id; +class Stylesheet extends XFAObject { + constructor(attributes) { + super(STYLESHEET_NS_ID, "stylesheet", true); + } +} +class StylesheetNamespace { + static [$buildXFAObject](name, attributes) { + return Object.hasOwn(StylesheetNamespace, name) ? StylesheetNamespace[name](attributes) : undefined; + } + static stylesheet(attributes) { + return new Stylesheet(attributes); + } +} + +;// ./src/core/xfa/xdp.js + + + +const XDP_NS_ID = NamespaceIds.xdp.id; +class xdp_Xdp extends XFAObject { + constructor(attributes) { + super(XDP_NS_ID, "xdp", true); + this.uuid = attributes.uuid || ""; + this.timeStamp = attributes.timeStamp || ""; + this.config = null; + this.connectionSet = null; + this.datasets = null; + this.localeSet = null; + this.stylesheet = new XFAObjectArray(); + this.template = null; + } + [$onChildCheck](child) { + const ns = NamespaceIds[child[$nodeName]]; + return ns && child[$namespaceId] === ns.id; + } +} +class XdpNamespace { + static [$buildXFAObject](name, attributes) { + return Object.hasOwn(XdpNamespace, name) ? XdpNamespace[name](attributes) : undefined; + } + static xdp(attributes) { + return new xdp_Xdp(attributes); + } +} + +;// ./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, parseInt(value, 10) / 100).toFixed(2)})`], ["xfa-font-vertical-scale", value => `scaleY(${Math.max(0, parseInt(value, 10) / 100).toFixed(2)})`], ["xfa-spacerun", ""], ["xfa-tab-stops", ""], ["font-size", (value, original) => { + value = original.fontSize = Math.abs(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; + } + 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-z])/gi, (_, x) => x.toUpperCase())] = newValue; + } + } + if (style.fontFamily) { + setFontFamily({ + typeface: style.fontFamily, + weight: style.fontWeight || "normal", + posture: style.fontStyle || "normal", + size: original.fontSize || 0 + }, node, node[$globalData].fontFinder, style); + } + 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(--total-scale-factor))`; + } + fixTextIndent(style); + return style; +} +function checkStyle(node) { + if (!node.style) { + return ""; + } + return node.style.split(";").filter(s => !!s.trim()).map(s => s.split(":", 2).map(t => t.trim())).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(attributes, name) { + super(XHTML_NS_ID, name); + this[$richText] = false; + this.style = attributes.style || ""; + } + [$clean](builder) { + super[$clean](builder); + this.style = checkStyle(this); + } + [$acceptWhitespace]() { + return !NoWhites.has(this[$nodeName]); + } + [$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; + } + } + [$pushGlyphs](measure, mustPop = true) { + const xfaFont = Object.create(null); + const margin = { + top: NaN, + bottom: NaN, + left: NaN, + right: NaN + }; + let lineHeight = null; + for (const [key, value] of this.style.split(";").map(s => s.split(":", 2))) { + switch (key) { + case "font-family": + xfaFont.typeface = stripQuotes(value); + break; + case "font-size": + xfaFont.size = getMeasurement(value); + break; + case "font-weight": + xfaFont.weight = value; + break; + case "font-style": + xfaFont.posture = value; + break; + case "letter-spacing": + xfaFont.letterSpacing = getMeasurement(value); + break; + case "margin": + const values = value.split(/ \t/).map(getMeasurement); + switch (values.length) { + case 1: + margin.top = margin.bottom = margin.left = margin.right = values[0]; + break; + case 2: + margin.top = margin.bottom = values[0]; + margin.left = margin.right = values[1]; + break; + case 3: + margin.top = values[0]; + margin.bottom = values[2]; + margin.left = margin.right = values[1]; + break; + case 4: + margin.top = values[0]; + margin.left = values[1]; + margin.bottom = values[2]; + margin.right = values[3]; + break; + } + break; + case "margin-top": + margin.top = getMeasurement(value); + break; + case "margin-bottom": + margin.bottom = getMeasurement(value); + break; + case "margin-left": + margin.left = getMeasurement(value); + break; + case "margin-right": + margin.right = getMeasurement(value); + break; + case "line-height": + lineHeight = getMeasurement(value); + break; + } + } + 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(); + } + } + [$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[$nodeName], + attributes: { + href: this.href, + style: mapStyle(this.style, this, this[$richText]) + }, + children, + value + }); + } +} +class xhtml_A extends XhtmlObject { + constructor(attributes) { + super(attributes, "a"); + this.href = fixURL(attributes.href) || ""; + } +} +class B extends XhtmlObject { + constructor(attributes) { + super(attributes, "b"); + } + [$pushGlyphs](measure) { + measure.pushFont({ + weight: "bold" + }); + super[$pushGlyphs](measure); + measure.popFont(); + } +} +class Body extends XhtmlObject { + constructor(attributes) { + super(attributes, "body"); + } + [$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(attributes) { + super(attributes, "br"); + } + [$text]() { + return "\n"; + } + [$pushGlyphs](measure) { + measure.addString("\n"); + } + [$toHTML](availableSpace) { + return HTMLResult.success({ + name: "br" + }); + } +} +class Html extends XhtmlObject { + constructor(attributes) { + super(attributes, "html"); + } + [$toHTML](availableSpace) { + const children = []; + this[$extra] = { + children + }; + this[$childrenToHTML]({}); + if (children.length === 0) { + return HTMLResult.success({ + name: "div", + attributes: { + class: ["xfaRich"], + style: {} + }, + value: this[$content] || "" + }); + } + 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 + }); + } +} +class I extends XhtmlObject { + constructor(attributes) { + super(attributes, "i"); + } + [$pushGlyphs](measure) { + measure.pushFont({ + posture: "italic" + }); + super[$pushGlyphs](measure); + measure.popFont(); + } +} +class Li extends XhtmlObject { + constructor(attributes) { + super(attributes, "li"); + } +} +class Ol extends XhtmlObject { + constructor(attributes) { + super(attributes, "ol"); + } +} +class xhtml_P extends XhtmlObject { + constructor(attributes) { + super(attributes, "p"); + } + [$pushGlyphs](measure) { + super[$pushGlyphs](measure, false); + measure.addString("\n"); + measure.addPara(); + measure.popFont(); + } + [$text]() { + const siblings = this[$getParent]()[$getChildren](); + return siblings.at(-1) === this ? super[$text]() : super[$text]() + "\n"; + } +} +class Span extends XhtmlObject { + constructor(attributes) { + super(attributes, "span"); + } +} +class Sub extends XhtmlObject { + constructor(attributes) { + super(attributes, "sub"); + } +} +class Sup extends XhtmlObject { + constructor(attributes) { + super(attributes, "sup"); + } +} +class Ul extends XhtmlObject { + constructor(attributes) { + super(attributes, "ul"); + } +} +class XhtmlNamespace { + static [$buildXFAObject](name, attributes) { + return Object.hasOwn(XhtmlNamespace, name) ? XhtmlNamespace[name](attributes) : undefined; + } + static a(attributes) { + return new xhtml_A(attributes); + } + static b(attributes) { + return new B(attributes); + } + static body(attributes) { + return new Body(attributes); + } + static br(attributes) { + return new Br(attributes); + } + static html(attributes) { + return new Html(attributes); + } + static i(attributes) { + return new I(attributes); + } + static li(attributes) { + return new Li(attributes); + } + static ol(attributes) { + return new Ol(attributes); + } + static p(attributes) { + return new xhtml_P(attributes); + } + static span(attributes) { + return new Span(attributes); + } + static sub(attributes) { + return new Sub(attributes); + } + static sup(attributes) { + return new Sup(attributes); + } + static ul(attributes) { + return new Ul(attributes); + } +} + +;// ./src/core/xfa/setup.js + + + + + + + + + +const NamespaceSetUp = { + config: ConfigNamespace, + connection: ConnectionSetNamespace, + datasets: DatasetsNamespace, + localeSet: LocaleSetNamespace, + signature: SignatureNamespace, + stylesheet: StylesheetNamespace, + template: TemplateNamespace, + xdp: XdpNamespace, + xhtml: XhtmlNamespace +}; + +;// ./src/core/xfa/unknown.js + + +class UnknownNamespace { + constructor(nsId) { + this.namespaceId = nsId; + } + [$buildXFAObject](name, attributes) { + return new XmlObject(this.namespaceId, name, attributes); + } +} + +;// ./src/core/xfa/builder.js + + + + + + + + + + + + + +class Root extends XFAObject { + constructor(ids) { + super(-1, "root", Object.create(null)); + this.element = null; + this[$ids] = ids; + } + [$onChild](child) { + this.element = child; + return true; + } + [$finalize]() { + super[$finalize](); + if (this.element.template instanceof Template) { + this[$ids].set($root, this.element); + this.element.template[$resolvePrototypes](this[$ids]); + this.element.template[$ids] = this[$ids]; + } + } +} +class Empty extends XFAObject { + constructor() { + super(-1, "", Object.create(null)); + } + [$onChild](_) { + return false; + } +} +class Builder { + constructor(rootNameSpace = null) { + this._namespaceStack = []; + this._nsAgnosticLevel = 0; + this._namespacePrefixes = new Map(); + this._namespaces = new Map(); + this._nextNsId = Math.max(...Object.values(NamespaceIds).map(({ + id + }) => id)); + this._currentNamespace = rootNameSpace || new UnknownNamespace(++this._nextNsId); + } + buildRoot(ids) { + return new Root(ids); + } + build({ + nsPrefix, + name, + attributes, + namespace, + prefixes + }) { + const hasNamespaceDef = namespace !== null; + if (hasNamespaceDef) { + this._namespaceStack.push(this._currentNamespace); + this._currentNamespace = this._searchNamespace(namespace); + } + if (prefixes) { + this._addNamespacePrefix(prefixes); + } + if (Object.hasOwn(attributes, $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; + } + } + if (xfaAttrs) { + attributes[$nsAttributes] = xfaAttrs; + } else { + delete attributes[$nsAttributes]; + } + } + 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(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; + } + } + ns = new UnknownNamespace(++this._nextNsId); + this._namespaces.set(nsName, ns); + return ns; + } + _addNamespacePrefix(prefixes) { + for (const { + prefix, + value + } of prefixes) { + const namespace = this._searchNamespace(value); + this._namespacePrefixes.getOrInsertComputed(prefix, makeArr).push(namespace); + } + } + _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(data) { + const { + hasNamespace, + prefixes, + nsAgnostic + } = data; + if (hasNamespace) { + this._currentNamespace = this._namespaceStack.pop(); + } + prefixes?.forEach(({ + prefix + }) => { + this._namespacePrefixes.get(prefix).pop(); + }); + if (nsAgnostic) { + this._nsAgnosticLevel--; + } + } +} + +;// ./src/core/xfa/parser.js + + + + + + + + + + + + + + +class XFAParser extends XMLParserBase { + constructor(rootNameSpace = null, richText = false) { + super(); + this._builder = new Builder(rootNameSpace); + this._stack = []; + this._globalData = { + usedTypefaces: new Set() + }; + this._ids = new Map(); + this._current = this._builder.buildRoot(this._ids); + this._errorCode = XMLParserErrorCode.NoError; + this._whiteRegex = /^\s+$/; + this._nbsps = /\xa0+/g; + this._richText = richText; + } + parse(data) { + this.parseXml(data); + if (this._errorCode !== XMLParserErrorCode.NoError) { + return undefined; + } + this._current[$finalize](); + return this._current.element; + } + 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(text) { + this._current[$onText](text); + } + _mkAttributes(attributes, tagName) { + let namespace = null; + let prefixes = null; + const attributeObj = Object.create({}); + for (const { + name, + value + } of attributes) { + if (name === "xmlns") { + if (!namespace) { + namespace = value; + } else { + warn(`XFA - multiple namespace definition in <${tagName}>`); + } + } else if (name.startsWith("xmlns:")) { + const prefix = name.substring("xmlns:".length); + prefixes ??= []; + prefixes.push({ + prefix, + value + }); + } else { + const i = name.indexOf(":"); + if (i === -1) { + attributeObj[name] = value; + } else { + const 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 [namespace, prefixes, attributeObj]; + } + _getNameAndPrefix(name, nsAgnostic) { + const i = name.indexOf(":"); + if (i === -1) { + return [name, null]; + } + return [name.substring(i + 1), nsAgnostic ? "" : name.substring(0, i)]; + } + onBeginElement(tagName, attributes, isEmpty) { + const [namespace, prefixes, attributesObj] = this._mkAttributes(attributes, tagName); + const [name, nsPrefix] = this._getNameAndPrefix(tagName, this._builder.isNsAgnostic()); + const node = this._builder.build({ + nsPrefix, + name, + attributes: attributesObj, + namespace, + prefixes + }); + node[$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(); + if (this._current[$onChild](node)) { + node[$setId](this._ids); + } + node[$clean](this._builder); + } + onError(code) { + this._errorCode = code; + } +} + +;// ./src/core/xfa/factory.js + + + + + + + + + + + + + + +class XFAFactory { + constructor(data) { + try { + 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}`); + } + } + isValid() { + return !!(this.root && this.form); + } + _createPagesHelper() { + const iterator = this.form[$toPages](); + return new Promise((resolve, reject) => { + const nextIteration = () => { + try { + const value = iterator.next(); + if (value.done) { + resolve(value.value); + } else { + setTimeout(nextIteration, 0); + } + } catch (e) { + reject(e); + } + }; + setTimeout(nextIteration, 0); + }); + } + async _createPages() { + try { + this.pages = await this._createPagesHelper(); + this.dims = this.pages.children.map(c => { + const { + width, + height + } = c.attributes.style; + return [0, 0, parseInt(width, 10), parseInt(height, 10)]; + }); + } catch (e) { + warn(`XFA - an error occurred during layout: ${e}`); + } + } + getBoundingBox(pageIndex) { + return this.dims[pageIndex]; + } + async getNumPages() { + if (!this.pages) { + await this._createPages(); + } + return this.dims.length; + } + setImages(images) { + this.form[$globalData].images = images; + } + 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 missingFonts.length > 0 ? missingFonts : null; + } + appendFonts(fonts, reallyMissingFonts) { + this.form[$globalData].fontFinder.add(fonts, reallyMissingFonts); + } + async getPages() { + if (!this.pages) { + await this._createPages(); + } + const pages = this.pages; + this.pages = null; + return pages; + } + serializeData(storage) { + return this.dataHandler.serialize(storage); + } + static _createDocument(data) { + return !data.get("/xdp:xdp") ? data.get("xdp:xdp") : data.values().join(""); + } + static getRichTextAsHtml(rc) { + if (!rc || typeof rc !== "string") { + return null; + } + try { + let root = new XFAParser(XhtmlNamespace, true).parse(rc); + if (!["body", "xhtml"].includes(root[$nodeName])) { + const newRoot = XhtmlNamespace.body({}); + newRoot[$appendChild](root); + root = newRoot; + } + const result = root[$toHTML](); + if (!result.success) { + return null; + } + const { + html + } = result; + const { + attributes + } = html; + if (attributes) { + 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(pdfManager) { + return Promise.all([pdfManager.ensureCatalog("acroForm"), pdfManager.ensureDoc("xfaDatasets"), pdfManager.ensureCatalog("structTreeRoot"), pdfManager.ensureCatalog("baseUrl"), pdfManager.ensureCatalog("attachments"), pdfManager.ensureCatalog("globalColorSpaceCache")]).then(([acroForm, xfaDatasets, structTreeRoot, baseUrl, attachments, globalColorSpaceCache]) => ({ + pdfManager, + catalog: pdfManager.pdfDocument.catalog, + acroForm: acroForm instanceof Dict ? acroForm : Dict.empty, + xfaDatasets, + structTreeRoot, + baseUrl, + attachments, + globalColorSpaceCache + }), reason => { + warn(`createGlobals: "${reason}".`); + return null; + }); + } + static async create(xref, ref, annotationGlobals, idFactory, collectFields, orphanFields, collectByType, pageRef) { + const pageIndex = collectFields ? await this._getPageIndex(xref, ref, annotationGlobals.pdfManager) : null; + return annotationGlobals.pdfManager.ensure(this, "_create", [xref, ref, annotationGlobals, idFactory, collectFields, orphanFields, collectByType, pageIndex, pageRef]); + } + static _create(xref, ref, annotationGlobals, idFactory, collectFields = false, orphanFields = null, collectByType = null, pageIndex = null, pageRef = null) { + const dict = xref.fetchIfRef(ref); + if (!(dict instanceof Dict)) { + return undefined; + } + let subtype = dict.get("Subtype"); + subtype = subtype instanceof Name ? subtype.name : null; + if (collectByType && !collectByType.has(AnnotationType[subtype?.toUpperCase()])) { + return null; + } + const { + acroForm, + pdfManager + } = annotationGlobals; + const id = ref instanceof Ref ? ref.toString() : `annot_${idFactory.createObjId()}`; + const parameters = { + xref, + ref, + dict, + subtype, + id, + annotationGlobals, + collectFields, + orphanFields, + needAppearances: !collectFields && acroForm.get("NeedAppearances") === true, + pageIndex, + evaluatorOptions: pdfManager.evaluatorOptions, + pageRef + }; + switch (subtype) { + case "Link": + return new LinkAnnotation(parameters); + case "Text": + return new TextAnnotation(parameters); + case "Widget": + let fieldType = getInheritableProperty({ + dict, + key: "FT" + }); + fieldType = fieldType instanceof Name ? fieldType.name : null; + switch (fieldType) { + case "Tx": + return new TextWidgetAnnotation(parameters); + case "Btn": + return new ButtonWidgetAnnotation(parameters); + case "Ch": + return new ChoiceWidgetAnnotation(parameters); + case "Sig": + return new SignatureWidgetAnnotation(parameters); + } + warn(`Unimplemented widget field type "${fieldType}", ` + "falling back to base field type."); + return new WidgetAnnotation(parameters); + case "Popup": + return new PopupAnnotation(parameters); + case "FreeText": + return new FreeTextAnnotation(parameters); + case "Line": + return new LineAnnotation(parameters); + case "Square": + return new SquareAnnotation(parameters); + case "Circle": + return new CircleAnnotation(parameters); + case "PolyLine": + return new PolylineAnnotation(parameters); + case "Polygon": + return new PolygonAnnotation(parameters); + case "Caret": + return new CaretAnnotation(parameters); + case "Ink": + return new InkAnnotation(parameters); + case "Highlight": + return new HighlightAnnotation(parameters); + case "Underline": + return new UnderlineAnnotation(parameters); + case "Squiggly": + return new SquigglyAnnotation(parameters); + case "StrikeOut": + return new StrikeOutAnnotation(parameters); + case "Stamp": + return new StampAnnotation(parameters); + case "FileAttachment": + return new FileAttachmentAnnotation(parameters); + case "RichMedia": + return new RichMediaAnnotation(parameters); + case "Screen": + return new ScreenAnnotation(parameters); + case "Sound": + return new SoundAnnotation(parameters); + default: + 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(xref, ref, pdfManager) { + try { + const annotDict = await xref.fetchIfRefAsync(ref); + if (!(annotDict instanceof Dict)) { + return -1; + } + const pageRef = annotDict.getRaw("P"); + if (pageRef instanceof Ref) { + try { + return await pdfManager.ensureCatalog("getPageIndex", [pageRef]); + } 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(annotations, xref, isOffscreenCanvasSupported) { + if (!isOffscreenCanvasSupported) { + warn("generateImages: OffscreenCanvas is not supported, cannot save or print some annotations with images."); + return null; + } + let imagePromises; + for (const { + bitmapId, + bitmap + } of annotations) { + if (!bitmap) { + continue; + } + imagePromises ||= new Map(); + imagePromises.set(bitmapId, createImage(bitmap, xref)); + } + return imagePromises; + } + static getPrintData(annotation) { + throw new Error("Not implemented: getPrintData"); + } + static async saveNewAnnotations(evaluator, xref, task, annotations, imagePromises, changes) { + let baseFontRef; + const promises = []; + const { + isOffscreenCanvasSupported + } = evaluator.options; + for (const annotation of annotations) { + if (annotation.deleted) { + continue; + } + switch (annotation.annotationType) { + case AnnotationEditorType.FREETEXT: + if (!annotation.appearanceRef && !baseFontRef) { + const baseFont = new Dict(xref); + baseFont.setIfName("BaseFont", "Helvetica"); + baseFont.setIfName("Type", "Font"); + baseFont.setIfName("Subtype", "Type1"); + baseFont.setIfName("Encoding", "WinAnsiEncoding"); + baseFontRef = xref.getNewTemporaryRef(); + changes.put(baseFontRef, { + data: baseFont + }); + } + promises.push(FreeTextAnnotation.createNewAnnotation(xref, annotation, changes, { + evaluator, + task, + baseFontRef + })); + break; + case AnnotationEditorType.HIGHLIGHT: + if (annotation.quadPoints) { + promises.push(HighlightAnnotation.createNewAnnotation(xref, annotation, changes)); + } else { + promises.push(InkAnnotation.createNewAnnotation(xref, annotation, changes)); + } + break; + case AnnotationEditorType.INK: + promises.push(InkAnnotation.createNewAnnotation(xref, annotation, changes)); + break; + case AnnotationEditorType.STAMP: + const image = isOffscreenCanvasSupported ? await imagePromises?.get(annotation.bitmapId) : null; + if (image?.imageStream) { + const { + imageStream, + smaskStream + } = image; + if (smaskStream) { + const smaskRef = xref.getNewTemporaryRef(); + changes.put(smaskRef, { + data: smaskStream + }); + imageStream.dict.set("SMask", smaskRef); + } + const imageRef = image.imageRef = xref.getNewTemporaryRef(); + changes.put(imageRef, { + data: imageStream + }); + image.imageStream = null; + image.imageRenderStream = null; + image.smaskStream = null; + image.smaskRenderStream = null; + } + promises.push(StampAnnotation.createNewAnnotation(xref, annotation, changes, { + image + })); + break; + case AnnotationEditorType.SIGNATURE: + promises.push(StampAnnotation.createNewAnnotation(xref, annotation, changes, {})); + break; + } + } + return { + annotations: (await Promise.all(promises)).flat() + }; + } + 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 + })); + } else { + promises.push(InkAnnotation.createNewPrintAnnotation(annotationGlobals, xref, annotation, { + evaluatorOptions: options + })); + } + 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, + imageRenderStream, + smaskStream, + smaskRenderStream + } = image; + const imageRef = imageRenderStream || new JpegStream(imageStream, imageStream.length); + if (smaskStream || smaskRenderStream) { + imageRef.dict.set("SMask", smaskRenderStream || smaskStream); + } + image.imageRef = imageRef; + image.imageStream = null; + image.imageRenderStream = null; + image.smaskStream = null; + image.smaskRenderStream = null; + } + promises.push(StampAnnotation.createNewPrintAnnotation(annotationGlobals, xref, annotation, { + image, + evaluatorOptions: options + })); + break; + case AnnotationEditorType.SIGNATURE: + promises.push(StampAnnotation.createNewPrintAnnotation(annotationGlobals, xref, annotation, { + evaluatorOptions: options + })); + break; + } + } + return Promise.all(promises); + } +} +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: + ColorSpaceUtils.gray.getRgbItem(color, 0, rgbColor, 0); + return rgbColor; + case 3: + ColorSpaceUtils.rgb.getRgbItem(color, 0, rgbColor, 0); + return rgbColor; + case 4: + ColorSpaceUtils.cmyk.getRgbItem(color, 0, rgbColor, 0); + return rgbColor; + default: + return defaultColor; + } +} +function getPdfColorArray(color, defaultValue = null) { + return color && Array.from(color, c => c / 255) || defaultValue; +} +function getQuadPoints(dict, rect) { + const quadPoints = dict.getArray("QuadPoints"); + if (!isNumberArray(quadPoints, null) || quadPoints.length === 0 || quadPoints.length % 8 > 0) { + return null; + } + 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(rect, bbox, matrix) { + const minMax = F32_BBOX_INIT.slice(); + Util.axialAlignedBoundingBox(bbox, matrix, minMax); + const [minX, minY, maxX, maxY] = minMax; + 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]; +} +function writeLineToCurveToAppearance(data, buffer, maybeClose = false) { + buffer.push(`${core_utils_numberToString(data[4])} ${core_utils_numberToString(data[5])} m`); + for (let i = 6, ii = data.length; i < ii; i += 6) { + if (isNaN(data[i])) { + buffer.push(`${core_utils_numberToString(data[i + 4])} ${core_utils_numberToString(data[i + 5])} l`); + } else { + const curve = data.slice(i, i + 6); + buffer.push(`${curve.map(core_utils_numberToString).join(" ")} c`); + } + } + if (maybeClose && data.length === 6) { + buffer.push(`${core_utils_numberToString(data[4])} ${core_utils_numberToString(data[5])} l`); + } +} +class Annotation { + appearance = null; + _oc = undefined; + constructor(params) { + const { + annotationGlobals, + dict, + orphanFields, + ref, + subtype, + xref + } = 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(xref, 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 = { + annotationType: AnnotationType[subtype?.toUpperCase()], + annotationFlags: this.flags, + borderStyle: this.borderStyle, + color: this.color, + backgroundColor: this.backgroundColor, + borderColor: this.borderColor, + rotation: this.rotation, + contentsObj: this._contents, + hasAppearance: !!this.appearance, + id: params.id, + modificationDate: this.modificationDate, + oc: this._oc, + rect: this.rectangle, + subtype, + hasOwnCanvas: false, + noRotate: !!(this.flags & AnnotationFlag.NOROTATE), + noHTML: isLocked && isContentLocked, + isEditable: false, + structParent: -1 + }; + 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, this.ref); + } + 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(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 = params.evaluatorOptions.isOffscreenCanvasSupported; + this._fallbackFontDict = null; + this._needAppearances = false; + } + _getOperatorListNoAppearance() { + return { + opList: new OperatorList(), + separateForm: false, + separateCanvas: false + }; + } + _hasFlag(flags, flag) { + return !!(flags & flag); + } + _buildFlags(noView, noPrint) { + let { + flags + } = this; + if (noView === undefined) { + if (noPrint === undefined) { + return undefined; + } + return noPrint ? flags & ~AnnotationFlag.PRINT : 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; + } + _isViewable(flags) { + return !this._hasFlag(flags, AnnotationFlag.INVISIBLE) && !this._hasFlag(flags, AnnotationFlag.NOVIEW); + } + _isPrintable(flags) { + return this._hasFlag(flags, AnnotationFlag.PRINT) && !this._hasFlag(flags, AnnotationFlag.HIDDEN) && !this._hasFlag(flags, AnnotationFlag.INVISIBLE); + } + mustBeViewed(annotationStorage, _renderForms) { + const noView = annotationStorage?.get(this.data.id)?.noView; + return noView !== undefined ? !noView : this.viewable && !this._hasFlag(this.flags, AnnotationFlag.HIDDEN); + } + mustBePrinted(annotationStorage) { + const noPrint = annotationStorage?.get(this.data.id)?.noPrint; + return noPrint !== undefined ? !noPrint : this.printable; + } + mustBeViewedWhenEditing(isEditing, modifiedIds = null) { + return isEditing ? !this.data.isEditable : !modifiedIds?.has(this.data.id); + } + get viewable() { + return this.data.quadPoints !== null && (this.flags === 0 || this._isViewable(this.flags)); + } + get printable() { + return this.data.quadPoints !== null && this.flags !== 0 && this._isPrintable(this.flags); + } + _parseStringHelper(data) { + const str = typeof data === "string" ? stringToPDFString(data) : ""; + const dir = str && bidi(str).dir === "rtl" ? "rtl" : "ltr"; + return { + str, + dir + }; + } + 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(title) { + this._title = this._parseStringHelper(title); + } + setContents(contents) { + this._contents = this._parseStringHelper(contents); + } + setModificationDate(modificationDate) { + this.modificationDate = typeof modificationDate === "string" ? modificationDate : null; + } + 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(flag) { + return this._hasFlag(this.flags, flag); + } + setRectangle(rectangle) { + this.rectangle = lookupNormalRect(rectangle, [0, 0, 0, 0]); + } + setColor(color) { + this.color = getRgbColor(color); + } + setLineEndings(lineEndings) { + this.lineEndings = ["None", "None"]; + 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": + case "Circle": + case "Diamond": + case "OpenArrow": + case "ClosedArrow": + case "Butt": + case "ROpenArrow": + case "RClosedArrow": + case "Slash": + this.lineEndings[i] = obj.name; + continue; + } + } + warn(`Ignoring invalid lineEnding: ${obj}`); + } + } + } + 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; + } + } + } + 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 (!(borderStyle instanceof Dict)) { + return; + } + 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)) { + if (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 if (array.length === 0) { + this.borderStyle.setWidth(0); + } + } + } else { + this.borderStyle.setWidth(0); + } + } + setAppearance(dict) { + 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)) { + return; + } + const appearance = normalAppearanceState.get(as.name); + if (appearance instanceof BaseStream) { + this.appearance = appearance; + } + } + #setOptionalContent(xref, dict) { + if (dict.has("OC")) { + try { + this._oc = parseMarkedContentProps(xref, dict.get("OC"), null); + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn(`#setOptionalContent: ${ex}`); + } + } + } + async loadResources(keys, appearance) { + const resources = await appearance.dict.getAsync("Resources"); + if (resources) { + await ObjectLoader.load(resources, keys, resources.xref); + } + return resources; + } + get _ownCanvasRequiresForms() { + return false; + } + async getOperatorList(evaluator, task, intent, annotationStorage) { + const { + hasOwnCanvas, + id, + rect + } = this.data; + let appearance = this.appearance; + const isUsingOwnCanvas = !!(hasOwnCanvas && intent & RenderingIntentFlag.DISPLAY && (!this._ownCanvasRequiresForms || intent & RenderingIntentFlag.ANNOTATIONS_FORMS)); + if (isUsingOwnCanvas && (this.width === 0 || this.height === 0)) { + this.data.hasOwnCanvas = false; + return this._getOperatorListNoAppearance(); + } + if (!appearance) { + if (!isUsingOwnCanvas) { + return this._getOperatorListNoAppearance(); + } + appearance = new StringStream("", new Dict()); + } + const appearanceDict = appearance.dict; + const resources = await this.loadResources(RESOURCES_KEYS_OPERATOR_LIST, appearance); + const bbox = lookupRect(appearanceDict.getArray("BBox"), [0, 0, this.width, this.height]); + const matrix = lookupMatrix(appearanceDict.getArray("Matrix"), IDENTITY_MATRIX); + const transform = getTransformMatrix(rect, bbox, matrix); + const opList = new OperatorList(); + const optionalContent = this._oc; + 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 + }); + opList.addOp(OPS.endAnnotation, []); + if (optionalContent !== undefined) { + opList.addOp(OPS.endMarkedContent, []); + } + this.reset(); + return { + opList, + separateForm: false, + separateCanvas: isUsingOwnCanvas + }; + } + async save(evaluator, task, annotationStorage, changes) { + return null; + } + get overlaysTextContent() { + return false; + } + get hasTextContent() { + return false; + } + async extractTextContent(evaluator, task, viewBox) { + if (!this.appearance) { + return; + } + const resources = await this.loadResources(RESOURCES_KEYS_TEXT_CONTENT, this.appearance); + const text = []; + const buffer = []; + let firstPositionX = Infinity; + let firstPositionY = Infinity; + let firstPosition = null; + const sink = { + desiredSize: Math.Infinity, + ready: true, + enqueue(chunk, size) { + for (const item of chunk.items) { + if (item.str === undefined) { + continue; + } + firstPositionX = Math.min(firstPositionX, item.transform[4]); + firstPositionY = Math.min(firstPositionY, item.transform[5]); + buffer.push(item.str); + if (item.hasEOL) { + text.push(buffer.join("").trimEnd()); + buffer.length = 0; + } + } + } + }; + await evaluator.getTextContent({ + stream: this.appearance, + task, + resources, + includeMarkedContent: true, + keepWhiteSpace: true, + sink, + viewBox + }); + this.reset(); + if (firstPositionX !== Infinity) { + firstPosition = [firstPositionX, firstPositionY]; + } + 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(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]; + const p = coords.slice(); + Util.applyTransform(p, transform); + Util.applyTransform(p, matrix); + return p; + } + getFieldObject() { + 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 stream of this._streams) { + stream.reset(); + } + } + _constructFieldName(dict) { + if (!dict.has("T") && !dict.has("Parent")) { + warn("Unknown field name, falling back to empty field name."); + return ""; + } + if (!dict.has("Parent")) { + return stringToPDFString(dict.get("T")); + } + 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("."); + } + _getAttachmentId(fsDict, fsRef, annotationGlobals, isSound = false) { + if (!(fsDict instanceof Dict)) { + return undefined; + } + if (!(fsRef instanceof Ref)) { + fsRef = FileSpec.pickPlatformItem(fsDict.get("EF"), true); + } + return fsRef instanceof Ref ? annotationGlobals.catalog.getAttachmentIdForAnnotation(fsRef, isSound) : undefined; + } + get width() { + return this.data.rect[2] - this.data.rect[0]; + } + get height() { + return this.data.rect[3] - this.data.rect[1]; + } +} +class AnnotationBorderStyle { + width = 1; + rawWidth = 1; + style = AnnotationBorderStyleType.SOLID; + dashArray = [3]; + horizontalCornerRadius = 0; + verticalCornerRadius = 0; + 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 = width; + } + } + 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(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; + } + } + 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(radius) { + if (Number.isInteger(radius)) { + this.horizontalCornerRadius = radius; + } + } + setVerticalCornerRadius(radius) { + if (Number.isInteger(radius)) { + this.verticalCornerRadius = radius; + } + } +} +class MarkupAnnotation extends Annotation { + 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 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(parent.get("Contents")); + this.data.contentsObj = this._contents; + if (!parent.has("CreationDate")) { + this.data.creationDate = null; + } else { + this.setCreationDate(parent.get("CreationDate")); + this.data.creationDate = this.creationDate; + } + if (!parent.has("M")) { + this.data.modificationDate = null; + } else { + this.setModificationDate(parent.get("M")); + this.data.modificationDate = this.modificationDate; + } + 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.titleObj = this._title; + this.setCreationDate(dict.get("CreationDate")); + this.data.creationDate = this.creationDate; + 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")); + } + } + setCreationDate(creationDate) { + this.creationDate = typeof creationDate === "string" ? creationDate : null; + } + _setDefaultAppearance({ + xref, + extra, + strokeColor, + fillColor, + blendMode, + strokeAlpha, + fillAlpha, + pointsCallback + }) { + const bbox = this.data.rect = BBOX_INIT.slice(); + const buffer = ["q"]; + if (extra) { + buffer.push(extra); + } + if (strokeColor) { + buffer.push(`${strokeColor[0]} ${strokeColor[1]} ${strokeColor[2]} RG`); + } + if (fillColor) { + buffer.push(`${fillColor[0]} ${fillColor[1]} ${fillColor[2]} rg`); + } + const pointsArray = this.data.quadPoints || 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 points = pointsCallback(buffer, pointsArray.subarray(i, i + 8)); + Util.rectBoundingBox(...points, bbox); + } + buffer.push("Q"); + const formDict = new Dict(xref); + const appearanceStreamDict = new Dict(xref); + appearanceStreamDict.setIfName("Subtype", "Form"); + const appearanceStream = new StringStream(buffer.join(" "), appearanceStreamDict); + formDict.set("Fm0", appearanceStream); + const gsDict = new Dict(xref); + if (blendMode) { + gsDict.setIfName("BM", blendMode); + } + gsDict.setIfNumber("CA", strokeAlpha); + gsDict.setIfNumber("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); + appearanceDict.set("BBox", bbox); + this.appearance = new StringStream("/GS0 gs /Fm0 Do", appearanceDict); + this._streams.push(this.appearance, appearanceStream); + } + static async createNewAnnotation(xref, annotation, changes, params) { + const annotationRef = annotation.ref ||= xref.getNewTemporaryRef(); + const ap = await this.createNewAppearanceStream(annotation, xref, params); + let apRef = annotation.appearanceRef ?? null; + if (ap) { + changes.put(apRef = xref.getNewTemporaryRef(), { + data: ap + }); + } + const annotationDict = this.createNewDict(annotation, xref, { + apRef + }); + if (Number.isInteger(annotation.parentTreeId)) { + annotationDict.set("StructParent", annotation.parentTreeId); + } + changes.put(annotationRef, { + data: annotationDict + }); + const retRef = { + ref: annotationRef + }; + const { + popup + } = annotation; + if (popup) { + if (popup.deleted) { + annotationDict.delete("Popup"); + annotationDict.delete("Contents"); + annotationDict.delete("RC"); + return retRef; + } + const popupRef = popup.ref ||= xref.getNewTemporaryRef(); + popup.parent = annotationRef; + const popupDict = PopupAnnotation.createNewDict(popup, xref); + changes.put(popupRef, { + data: popupDict + }); + annotationDict.setIfDefined("Contents", stringToAsciiOrUTF16BE(popup.contents)); + annotationDict.set("Popup", popupRef); + return [retRef, { + ref: popupRef + }]; + } + return retRef; + } + 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(params) { + super(params); + const { + dict, + xref, + annotationGlobals + } = params; + const data = this.data; + this._needAppearances = params.needAppearances; + 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); + } + } + 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, + acroFormResources, + appearanceResources, + mergedResources: Dict.merge({ + xref, + dictArray: [localResources, appearanceResources, acroFormResources], + mergeSubDicts: true + }) + }; + data.fieldFlags = getInheritableProperty({ + dict, + key: "Ff" + }); + if (!Number.isInteger(data.fieldFlags) || data.fieldFlags < 0) { + data.fieldFlags = 0; + } + data.password = this.hasFieldFlag(AnnotationFieldFlag.PASSWORD); + 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(formValue) { + if (Array.isArray(formValue)) { + const arr = formValue.map(item => this._decodeFormValue(item)).filter(item => item !== null); + return arr.length > 0 ? arr : null; + } else if (formValue instanceof Name) { + return formValue.name; + } else if (typeof formValue === "string") { + return stringToPDFString(formValue); + } + return null; + } + hasFieldFlag(flag) { + return !!(this.data.fieldFlags & flag); + } + _isViewable(flags) { + return true; + } + mustBeViewed(annotationStorage, renderForms) { + if (renderForms) { + return this.viewable; + } + return super.mustBeViewed(annotationStorage, renderForms) && !this._hasFlag(this.flags, AnnotationFlag.NOVIEW); + } + getRotationMatrix(annotationStorage) { + let rotation = annotationStorage?.get(this.data.id)?.rotation; + if (rotation === undefined) { + rotation = this.rotation; + } + return rotation === 0 ? IDENTITY_MATRIX : getRotationMatrix(rotation, this.width, this.height); + } + getBorderAndBackgroundAppearances(annotationStorage) { + let rotation = annotationStorage?.get(this.data.id)?.rotation; + if (rotation === undefined) { + rotation = this.rotation; + } + if (!this.backgroundColor && !this.borderColor) { + return ""; + } + const rect = rotation === 0 || rotation === 180 ? `0 0 ${this.width} ${this.height} re` : `0 0 ${this.height} ${this.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 (intent & RenderingIntentFlag.ANNOTATIONS_FORMS && !(this instanceof SignatureWidgetAnnotation) && !this.data.noHTML && !this.data.hasOwnCanvas) { + const list = this._getOperatorListNoAppearance(); + list.separateForm = true; + return list; + } + if (!this._hasText) { + return super.getOperatorList(evaluator, task, intent, annotationStorage); + } + const isUsingOwnCanvas = !!(this.data.hasOwnCanvas && intent & RenderingIntentFlag.DISPLAY); + if (isUsingOwnCanvas && (this.width === 0 || this.height === 0)) { + this.data.hasOwnCanvas = false; + return this._getOperatorListNoAppearance(); + } + 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 matrix = [1, 0, 0, 1, 0, 0]; + const bbox = [0, 0, this.width, this.height]; + const transform = getTransformMatrix(this.data.rect, bbox, matrix); + const optionalContent = this._oc; + if (optionalContent !== undefined) { + opList.addOp(OPS.beginMarkedContentProps, ["OC", optionalContent]); + } + opList.addOp(OPS.beginAnnotation, [this.data.id, this.data.rect, transform, this.getRotationMatrix(annotationStorage), isUsingOwnCanvas]); + const stream = new StringStream(content); + await evaluator.getOperatorList({ + stream, + task, + resources: this._fieldResources.mergedResources, + operatorList: opList + }); + opList.addOp(OPS.endAnnotation, []); + if (optionalContent !== undefined) { + opList.addOp(OPS.endMarkedContent, []); + } + return { + opList, + separateForm: false, + separateCanvas: isUsingOwnCanvas + }; + } + _getMKDict(rotation) { + const mk = new Dict(null); + if (rotation) { + mk.set("R", rotation); + } + mk.setIfArray("BC", getPdfColorArray(this.borderColor)); + mk.setIfArray("BG", getPdfColorArray(this.backgroundColor)); + return mk.size > 0 ? mk : null; + } + amendSavedDict(annotationStorage, dict) {} + setValue(dict, value, xref, changes) { + const { + dict: parentDict, + ref: parentRef + } = getParentToUpdate(dict, this.ref, xref); + if (!parentDict) { + dict.set("V", value); + } else if (!changes.has(parentRef)) { + const newParentDict = parentDict.clone(); + newParentDict.set("V", value); + changes.put(parentRef, { + data: newParentDict + }); + return newParentDict; + } + return null; + } + async save(evaluator, task, annotationStorage, changes) { + 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; + } + value ||= this.data.fieldValue; + } + if (rotation === undefined && !this._hasValueFromXFA && Array.isArray(value) && Array.isArray(this.data.fieldValue) && isArrayEqual(value, this.data.fieldValue) && flags === undefined) { + return; + } + if (rotation === undefined) { + rotation = this.rotation; + } + let appearance = null; + if (!this._needAppearances) { + appearance = await this._getAppearance(evaluator, task, RenderingIntentFlag.SAVE, annotationStorage); + if (appearance === null && flags === undefined) { + return; + } + } else {} + let needAppearances = false; + if (appearance?.needAppearances) { + needAppearances = true; + appearance = null; + } + const { + xref + } = evaluator; + const originalDict = xref.fetchIfRef(this.ref); + if (!(originalDict instanceof Dict)) { + return; + } + const dict = new Dict(xref); + for (const [key, rawVal] of originalDict.getRawEntries()) { + if (key !== "AP") { + dict.set(key, rawVal); + } + } + 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 + }; + const newParentDict = this.setValue(dict, Array.isArray(value) ? value.map(stringToAsciiOrUTF16BE) : stringToAsciiOrUTF16BE(value), xref, changes); + this.amendSavedDict(annotationStorage, newParentDict || dict); + const maybeMK = this._getMKDict(rotation); + if (maybeMK) { + dict.set("MK", maybeMK); + } + changes.put(this.ref, { + data: dict, + 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), + appearanceDict = new Dict(xref); + appearanceDict.setIfName("Subtype", "Form"); + appearanceDict.set("Resources", resources); + const bbox = rotation % 180 === 0 ? [0, 0, this.width, this.height] : [0, 0, this.height, this.width]; + appearanceDict.set("BBox", bbox); + const appearanceStream = new StringStream(appearance, appearanceDict); + const rotationMatrix = this.getRotationMatrix(annotationStorage); + if (rotationMatrix !== IDENTITY_MATRIX) { + appearanceDict.set("Matrix", rotationMatrix); + } + changes.put(newRef, { + data: appearanceStream, + xfa: null, + needAppearances: false + }); + } + dict.set("M", `D:${getModificationDate()}`); + } + async _getAppearance(evaluator, task, intent, annotationStorage) { + if (this.data.password) { + return null; + } + const storageEntry = annotationStorage?.get(this.data.id); + let value, rotation; + if (storageEntry) { + value = storageEntry.formattedValue || storageEntry.value; + rotation = storageEntry.rotation; + } + if (rotation === undefined && value === undefined && !this._needAppearances) { + if (!this._hasValueFromXFA || this.appearance) { + return null; + } + } + 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]; + } + util_assert(typeof value === "string", "Expected `value` to be a string."); + value = value.trimEnd(); + if (this.data.combo) { + const option = this.data.options.find(({ + exportValue + }) => value === exportValue); + value = option?.displayValue || value; + } + if (value === "") { + return `/Tx BMC q ${colors}Q EMC`; + } + if (rotation === undefined) { + rotation = this.rotation; + } + let lineCount = -1; + let lines; + if (this.data.multiLine) { + lines = value.split(/\r\n?|\n/).map(line => line.normalize("NFC")); + lineCount = lines.length; + } else { + lines = [value.replace(/\r\n?|\n/, "").normalize("NFC")]; + } + const defaultPadding = 1; + const defaultHPadding = 2; + let { + width: totalWidth, + height: totalHeight + } = this; + if (rotation === 90 || rotation === 270) { + [totalWidth, totalHeight] = [totalHeight, totalWidth]; + } + if (!this._defaultAppearance) { + this.data.defaultAppearanceData = parseDefaultAppearance(this._defaultAppearance = "/Helvetica 0 Tf 0 g"); + } + if (!this.data.defaultAppearanceData.fontSize && (totalWidth <= 2 * defaultHPadding || totalHeight <= 2 * defaultPadding)) { + return `/Tx BMC q ${colors}Q EMC`; + } + 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, rawVal] of newFont.getRawEntries()) { + oldFont.set(key, rawVal); + } + } 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 = fontName; + [defaultAppearance, fontSize, lineHeight] = this._computeFontSize(totalHeight - 2 * defaultPadding, totalWidth - 2 * defaultHPadding, value, font, lineCount); + this.data.defaultAppearanceData = savedDefaultAppearance; + } else { + if (!this._isOffscreenCanvasSupported) { + warn("_getAppearance: OffscreenCanvas is not supported, annotation may not render correctly."); + } + [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; + let { + ascent: fontAscent, + descent: fontDescent + } = font; + if (isNaN(fontAscent) || isNaN(fontDescent) || !fontAscent && !fontDescent) { + fontAscent = (/* inlined export .LINE_FACTOR */1.35) - (/* inlined export .LINE_DESCENT_FACTOR */0.35); + fontDescent = (/* inlined export .LINE_DESCENT_FACTOR */0.35); + } else { + fontDescent = Math.abs(fontDescent); + } + const vShift = (totalHeight - (fontAscent + fontDescent) * fontSize) / 2 + fontDescent * fontSize; + 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, vShift, alignment, bidi(lines[0]).dir === "rtl", annotationStorage); + } + const bottomPadding = vShift; + if (alignment === 0 || alignment > 2) { + return `/Tx BMC q ${colors}BT ` + defaultAppearance + ` 1 0 0 1 ${core_utils_numberToString(defaultHPadding)} ${core_utils_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 ${colors}BT ` + defaultAppearance + ` 1 0 0 1 0 0 Tm ${renderedText}` + " ET Q EMC"; + } + static async _getFontData(evaluator, task, appearanceData, resources) { + const operatorList = new OperatorList(); + const initialState = { + font: null, + clone() { + return this; + } + }; + const { + fontName, + fontSize + } = appearanceData; + await evaluator.handleSetFont(resources, [fontName && Name.get(fontName), fontSize], null, operatorList, task, initialState, null); + return initialState.font; + } + _getTextWidth(text, font) { + return Math.sumPrecise(font.charsToGlyphs(text).map(g => g.width)) / 1000; + } + _computeFontSize(height, width, text, font, lineCount) { + let { + fontSize + } = this.data.defaultAppearanceData; + const lineHeight = (fontSize || 12) * (/* inlined export .LINE_FACTOR */1.35); + let 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 / (/* inlined export .LINE_FACTOR */1.35), width / textWidth)); + numberOfLines = 1; + } else { + 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 = 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 false; + }; + numberOfLines = Math.max(numberOfLines, lineCount); + const getFontSize = n => roundWithTwoDigits(height / n / (/* inlined export .LINE_FACTOR */1.35)); + if (height > 0 && isTooBig(getFontSize(numberOfLines))) { + let low = numberOfLines, + high = 2 * numberOfLines; + while (isTooBig(getFontSize(high))) { + low = high; + high *= 2; + } + while (high - low > 1) { + const mid = Math.floor((low + high) / 2); + if (isTooBig(getFontSize(mid))) { + low = mid; + } else { + high = mid; + } + } + numberOfLines = high; + } + fontSize = getFontSize(numberOfLines); + } + const { + fontName, + fontColor + } = this.data.defaultAppearanceData; + this._defaultAppearance = createDefaultAppearance({ + fontSize, + fontName, + fontColor + }); + } + return [this._defaultAppearance, fontSize, height / numberOfLines]; + } + _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 = core_utils_numberToString(shift - prevInfo.shift); + prevInfo.shift = shift; + vPadding = core_utils_numberToString(vPadding); + return `${shiftStr} ${vPadding} Td (${escapeString(text)}) Tj`; + } + _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; + } + } + } + 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(params) { + super(params); + const { + annotationGlobals, + 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 = true; + if (typeof this.data.fieldValue !== "string") { + this.data.fieldValue = ""; + } + const getAlignment = q => Number.isInteger(q) && q >= 0 && q <= 2 ? q : null; + this.data.textAlignment = getAlignment(getInheritableProperty({ + dict, + key: "Q" + })) ?? getAlignment(annotationGlobals.acroForm.get("Q")) ?? null; + 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(AnnotationFieldFlag.COMB) && !this.data.multiLine && !this.data.password && !this.hasFieldFlag(AnnotationFieldFlag.FILESELECT) && this.data.maxLen !== 0; + this.data.doNotScroll = this.hasFieldFlag(AnnotationFieldFlag.DONOTSCROLL); + const { + actions + } = this.data; + if (!actions) { + return; + } + const AFDateTime = /^AF(Date|Time)_(?:Keystroke|Format)(?:Ex)?\(['"]?([^'"]+)['"]?\);$/; + let canUseHTMLDateTime = false; + const aFormat = actions.get("Format"), + aKeystroke = actions.get("Keystroke"); + if (aFormat?.length === 1 && aKeystroke?.length === 1 && AFDateTime.test(aFormat[0]) && AFDateTime.test(aKeystroke[0]) || aFormat?.length === 0 && aKeystroke?.length === 1 && AFDateTime.test(aKeystroke[0]) || aKeystroke?.length === 0 && aFormat?.length === 1 && AFDateTime.test(aFormat[0])) { + canUseHTMLDateTime = true; + } + const actionsToVisit = []; + if (aFormat) { + actionsToVisit.push(...aFormat); + } + if (aKeystroke) { + actionsToVisit.push(...aKeystroke); + } + if (canUseHTMLDateTime) { + actions.delete("Keystroke"); + actions.set("Format", actionsToVisit); + } + for (const formatAction of actionsToVisit) { + const m = formatAction.match(AFDateTime); + if (!m) { + continue; + } + const isDate = m[1] === "Date"; + let format = m[2]; + const num = parseInt(format, 10); + if (!isNaN(num) && Math.floor(Math.log10(num)) + 1 === m[2].length) { + format = (isDate ? DateFormats : TimeFormats)[num] ?? format; + } + this.data.datetimeFormat = format; + if (!canUseHTMLDateTime) { + break; + } + if (isDate) { + if (/HH|MM|ss|h/.test(format)) { + this.data.datetimeType = "datetime-local"; + this.data.timeStep = /ss/.test(format) ? 1 : 60; + } else { + this.data.datetimeType = "date"; + } + break; + } + this.data.datetimeType = "time"; + this.data.timeStep = /ss/.test(format) ? 1 : 60; + break; + } + } + get hasTextContent() { + return !!this.appearance && !this._needAppearances; + } + _getCombAppearance(defaultAppearance, font, text, fontSize, width, vShift, alignment, isRTL, annotationStorage) { + const combWidth = width / this.data.maxLen; + const colors = this.getBorderAndBackgroundAppearances(annotationStorage); + const cells = font.getCharPositions(text).map(([start, end]) => { + const glyph = text.substring(start, end); + return { + glyph, + width: this._getTextWidth(glyph, font) * fontSize + }; + }); + if (isRTL) { + cells.reverse(); + } + const textWidth = combWidth * cells.length; + let hShift = 0; + if (alignment === 1) { + hShift += Math.floor((width - textWidth) / (2 * combWidth)) * combWidth; + } else if (alignment === 2) { + hShift += width - textWidth; + } + const buf = []; + let previousWidth = 0; + for (let i = 0, ii = cells.length; i < ii; i++) { + const { + glyph, + width: glyphWidth + } = cells[i]; + const shift = i === 0 ? (combWidth - glyphWidth) / 2 : combWidth + (previousWidth - glyphWidth) / 2; + buf.push(`${core_utils_numberToString(shift)} 0 Td (${escapeString(glyph)}) Tj`); + previousWidth = glyphWidth; + } + const renderedComb = buf.join(" "); + return `/Tx BMC q ${colors}BT ` + defaultAppearance + ` 1 0 0 1 ${core_utils_numberToString(hShift)} ${core_utils_numberToString(vShift)} Tm ${renderedComb}` + " ET Q EMC"; + } + _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 colors = this.getBorderAndBackgroundAppearances(annotationStorage); + const renderedText = buf.join("\n"); + return `/Tx BMC q ${colors}BT ` + defaultAppearance + ` 1 0 0 1 0 ${core_utils_numberToString(height)} Tm ${renderedText}` + " ET Q EMC"; + } + _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)); + } + 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"); + } + } + getFieldObject() { + return { + id: this.data.id, + value: this.data.fieldValue, + defaultValue: this.data.defaultFieldValue || "", + multiline: this.data.multiLine, + password: this.data.password, + charLimit: this.data.maxLen, + comb: this.data.comb, + editable: !this.data.readOnly, + hidden: this.data.hidden, + name: this.data.fieldName, + rect: this.data.rect, + actions: this.data.actions, + page: this.data.pageIndex, + strokeColor: this.data.borderColor, + fillColor: this.data.backgroundColor, + rotation: this.rotation, + datetimeFormat: this.data.datetimeFormat, + hasDatetimeHTML: !!this.data.datetimeType, + type: "text" + }; + } +} +class ButtonWidgetAnnotation extends WidgetAnnotation { + constructor(params) { + super(params); + this.checkedAppearance = null; + this.uncheckedAppearance = null; + const isRadio = this.hasFieldFlag(AnnotationFieldFlag.RADIO), + isPushButton = this.hasFieldFlag(AnnotationFieldFlag.PUSHBUTTON); + this.data.checkBox = !isRadio && !isPushButton; + this.data.radioButton = isRadio && !isPushButton; + this.data.pushButton = isPushButton; + this.data.isTooltipOnly = false; + this.data.hasOwnCanvas = true; + this.data.noHTML = false; + if (this.data.checkBox) { + this._processCheckBox(params); + } else if (this.data.radioButton) { + this._processRadioButton(params); + } else if (this.data.pushButton) { + this._processPushButton(params); + } else { + warn("Invalid field flags for button widget annotation"); + } + } + get _ownCanvasRequiresForms() { + return this.data.checkBox || this.data.radioButton; + } + #getOperatorListForAppearance(evaluator, task, intent, annotationStorage, rotation, appearance) { + if (!appearance) { + return this._getOperatorListNoAppearance(); + } + 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; + } + async getOperatorList(evaluator, task, intent, annotationStorage) { + if (this.data.pushButton) { + return super.getOperatorList(evaluator, task, intent, false, annotationStorage); + } + if (intent & RenderingIntentFlag.DISPLAY && intent & RenderingIntentFlag.ANNOTATIONS_FORMS && (this.data.checkBox || this.data.radioButton)) { + const setCanvasName = (operatorList, name) => { + const index = operatorList.fnArray.indexOf(OPS.beginAnnotation); + if (index !== -1) { + operatorList.argsArray[index].push(name); + } + }; + const checked = await this.#getOperatorListForAppearance(evaluator, task, intent, annotationStorage, null, this.checkedAppearance); + setCanvasName(checked.opList, "checked"); + const unchecked = await this.#getOperatorListForAppearance(evaluator, task, intent, annotationStorage, null, this.uncheckedAppearance); + setCanvasName(unchecked.opList, "unchecked"); + checked.opList.addOpList(unchecked.opList); + checked.separateForm ||= unchecked.separateForm; + checked.separateCanvas ||= unchecked.separateCanvas; + return checked; + } + 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); + } + value ??= this.data.checkBox ? this.data.fieldValue === this.data.exportValue : this.data.fieldValue === this.data.buttonValue; + return this.#getOperatorListForAppearance(evaluator, task, intent, annotationStorage, rotation, value ? this.checkedAppearance : this.uncheckedAppearance); + } + async save(evaluator, task, annotationStorage, changes) { + if (this.data.checkBox) { + this._saveCheckbox(evaluator, task, annotationStorage, changes); + return; + } + if (this.data.radioButton) { + this._saveRadioButton(evaluator, task, annotationStorage, changes); + } + } + async _saveCheckbox(evaluator, task, annotationStorage, changes) { + if (!annotationStorage) { + return; + } + 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; + } + const defaultValue = this.data.fieldValue === this.data.exportValue; + if (defaultValue === value) { + return; + } + } + let dict = evaluator.xref.fetchIfRef(this.ref); + if (!(dict instanceof Dict)) { + return; + } + 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._onStateName : "Off"); + this.setValue(dict, name, evaluator.xref, changes); + 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); + } + changes.put(this.ref, { + data: dict, + xfa, + needAppearances: false + }); + } + async _saveRadioButton(evaluator, task, annotationStorage, changes) { + if (!annotationStorage) { + return; + } + 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; + } + const defaultValue = this.data.fieldValue === this.data.buttonValue; + if (defaultValue === value) { + return; + } + } + let dict = evaluator.xref.fetchIfRef(this.ref); + if (!(dict instanceof Dict)) { + return; + } + 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._onStateName : "Off"); + if (value) { + this.setValue(dict, name, evaluator.xref, changes); + } + 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); + } + changes.put(this.ref, { + data: dict, + xfa, + needAppearances: false + }); + } + _getDefaultCheckedAppearance(params, type) { + const { + width, + height + } = this; + 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 = core_utils_numberToString((width - metrics.width) / 2); + const yShift = core_utils_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.setIfName("Subtype", "Form"); + appearanceStreamDict.setIfName("Type", "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, appearanceStreamDict); + this._streams.push(this.checkedAppearance); + } + _getOnStateName(dict) { + const appearanceStates = dict.get("AP"); + if (!(appearanceStates instanceof Dict)) { + return null; + } + const normalAppearance = appearanceStates.get("N"); + if (!(normalAppearance instanceof Dict)) { + return null; + } + for (const key of normalAppearance.getKeys()) { + if (key !== "Off") { + return key; + } + } + return null; + } + _getExportValueForOptIndex(index, opt, xref) { + if (Number.isInteger(index) && index >= 0 && index < opt.length) { + const value = this._decodeFormValue(xref.fetchIfRef(opt[index])); + if (typeof value === "string") { + return value; + } + } + return null; + } + _getOptInfo(dict, onState, opt, xref) { + if (!Array.isArray(opt)) { + return null; + } + const stateToIndex = new Map(); + let currentIndex = null; + const fieldParent = dict.get("Parent"); + const kids = fieldParent instanceof Dict ? fieldParent.get("Kids") : null; + if (Array.isArray(kids)) { + for (let i = 0, ii = Math.min(kids.length, opt.length); i < ii; i++) { + const kid = kids[i]; + if (kid instanceof Ref && isRefsEqual(kid, this.ref)) { + currentIndex = i; + } + const kidDict = xref.fetchIfRef(kid); + if (!(kidDict instanceof Dict)) { + continue; + } + if (kidDict === dict) { + currentIndex = i; + } + const kidOnState = this._getOnStateName(kidDict); + if (typeof kidOnState === "string" && !stateToIndex.has(kidOnState)) { + stateToIndex.set(kidOnState, i); + } + } + } else if (opt.length === 1 && typeof onState === "string") { + currentIndex = 0; + stateToIndex.set(onState, 0); + } + return { + currentIndex, + opt, + stateToIndex + }; + } + _getExportValue(state, optInfo, xref) { + if (!optInfo || typeof state !== "string" || state === "Off") { + return state; + } + if (state === this._onStateName) { + const exportValue = this._getExportValueForOptIndex(optInfo.currentIndex, optInfo.opt, xref); + if (exportValue !== null) { + return exportValue; + } + } + if (optInfo.stateToIndex.has(state)) { + const exportValue = this._getExportValueForOptIndex(optInfo.stateToIndex.get(state), optInfo.opt, xref); + if (exportValue !== null) { + return exportValue; + } + } + const index = parseInt(state, 10); + return Number.isInteger(index) && String(index) === state ? this._getExportValueForOptIndex(index, optInfo.opt, xref) || state : state; + } + _processCheckBox(params) { + const customAppearance = params.dict.get("AP"); + let normalAppearance = customAppearance instanceof Dict ? customAppearance.get("N") : null; + if (!(normalAppearance instanceof Dict)) { + normalAppearance = null; + } + 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 ? [...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 otherYes = exportValues.find(v => v !== "Off"); + exportValues.length = 0; + exportValues.push("Off", otherYes); + } + const onState = exportValues[1]; + this._onStateName = onState; + const opt = getInheritableProperty({ + dict: params.dict, + key: "Opt" + }); + const optInfo = this._getOptInfo(params.dict, onState, opt, params.xref); + this.data.exportValue = this._getExportValue(onState, optInfo, params.xref); + if (!exportValues.includes(this.data.fieldValue) && this.data.fieldValue !== this.data.exportValue) { + this.data.fieldValue = "Off"; + } + this.data.fieldValue = this._getExportValue(this.data.fieldValue, optInfo, params.xref); + this.data.defaultFieldValue = this._getExportValue(this.data.defaultFieldValue, optInfo, params.xref); + const checkedAppearance = normalAppearance?.get(onState); + 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); + } + this._fallbackFontDict = this.fallbackFontDict; + if (this.data.defaultFieldValue === null) { + this.data.defaultFieldValue = "Off"; + } + } + _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; + } + let onState = null; + for (const key of normalAppearance.getKeys()) { + if (key !== "Off") { + onState = key; + break; + } + } + this._onStateName = onState; + const opt = getInheritableProperty({ + dict: params.dict, + key: "Opt" + }); + const optInfo = this._getOptInfo(params.dict, onState, opt, params.xref); + this.data.buttonValue = this._getExportValue(onState, optInfo, params.xref); + this.data.fieldValue = this._getExportValue(this.data.fieldValue, optInfo, params.xref); + this.data.defaultFieldValue = this._getExportValue(this.data.defaultFieldValue, optInfo, params.xref); + const checkedAppearance = normalAppearance.get(onState); + 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; + if (this.data.defaultFieldValue === null) { + this.data.defaultFieldValue = "Off"; + } + } + _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 type = "button"; + let exportValues; + if (this.data.checkBox) { + type = "checkbox"; + exportValues = this.data.exportValue; + } else if (this.data.radioButton) { + type = "radiobutton"; + exportValues = this.data.buttonValue; + } + return { + id: this.data.id, + value: this.data.fieldValue || "Off", + defaultValue: this.data.defaultFieldValue, + exportValues, + editable: !this.data.readOnly, + name: this.data.fieldName, + rect: this.data.rect, + hidden: this.data.hidden, + actions: this.data.actions, + page: this.data.pageIndex, + strokeColor: this.data.borderColor, + fillColor: this.data.backgroundColor, + rotation: this.rotation, + type + }; + } + get fallbackFontDict() { + const dict = new Dict(); + dict.setIfName("BaseFont", "ZapfDingbats"); + dict.setIfName("Type", "FallbackType"); + dict.setIfName("Subtype", "FallbackType"); + dict.setIfName("Encoding", "ZapfDingbatsEncoding"); + return util_shadow(this, "fallbackFontDict", dict); + } +} +class ChoiceWidgetAnnotation extends WidgetAnnotation { + 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 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 (typeof this.data.fieldValue === "string") { + this.data.fieldValue = [this.data.fieldValue]; + } else { + this.data.fieldValue ||= []; + } + } else { + this.data.fieldValue = []; + 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); + } + } + } + if (this.data.options.length === 0 && this.data.fieldValue.length > 0) { + this.data.options = this.data.fieldValue.map(value => ({ + exportValue: value, + displayValue: value + })); + } + this.data.combo = this.hasFieldFlag(AnnotationFieldFlag.COMBO); + this.data.multiSelect = this.hasFieldFlag(AnnotationFieldFlag.MULTISELECT); + this._hasText = true; + } + getFieldObject() { + const type = this.data.combo ? "combobox" : "listbox"; + const value = this.data.fieldValue.length > 0 ? this.data.fieldValue[0] : null; + return { + id: this.data.id, + value, + defaultValue: this.data.defaultFieldValue, + editable: !this.data.readOnly, + name: this.data.fieldName, + rect: this.data.rect, + numItems: this.data.fieldValue.length, + multipleSelection: this.data.multiSelect, + hidden: this.data.hidden, + actions: this.data.actions, + items: this.data.options, + page: this.data.pageIndex, + strokeColor: this.data.borderColor, + fillColor: this.data.backgroundColor, + rotation: this.rotation, + type + }; + } + 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; + } + } + dict.set("I", indices); + } + async _getAppearance(evaluator, task, intent, annotationStorage) { + if (this.data.combo) { + return super._getAppearance(evaluator, task, intent, annotationStorage); + } + let exportedValue, rotation; + const storageEntry = annotationStorage?.get(this.data.id); + if (storageEntry) { + rotation = storageEntry.rotation; + exportedValue = storageEntry.value; + } + 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 { + width: totalWidth, + height: totalHeight + } = this; + 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 font = await WidgetAnnotation._getFontData(evaluator, task, this.data.defaultAppearanceData, this._fieldResources.mergedResources); + 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; + } + } + [defaultAppearance, fontSize] = this._computeFontSize(lineHeight, totalWidth - 2 * defaultHPadding, value, font, -1); + } else { + defaultAppearance = this._defaultAppearance; + } + const lineHeight = fontSize * (/* inlined export .LINE_FACTOR */1.35); + 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 = MathClamp(maxIndex - numberOfVisibleLines + 1, 0, minIndex); + } + 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`); + } + } + } + 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)); + } + buf.push("ET Q EMC"); + return buf.join("\n"); + } +} +class SignatureWidgetAnnotation extends WidgetAnnotation { + _hasValueFromXFA = false; + constructor(params) { + super(params); + this.data.fieldValue = null; + this.data.hasOwnCanvas = this.data.noRotate; + this.data.noHTML = !this.data.hasOwnCanvas; + } + getFieldObject() { + return { + id: this.data.id, + value: null, + page: this.data.pageIndex, + type: "signature" + }; + } +} +class TextAnnotation extends MarkupAnnotation { + constructor(params) { + const DEFAULT_ICON_SIZE = 22; + super(params); + this.data.noRotate = true; + this.data.hasOwnCanvas = this.data.noRotate; + this.data.noHTML = false; + const { + dict + } = params; + 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 (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; + } + } +} +class LinkAnnotation extends Annotation { + constructor(params) { + super(params); + const { + dict, + annotationGlobals + } = params; + 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: dict, + resultObj: this.data, + docBaseUrl: annotationGlobals.baseUrl, + docAttachments: annotationGlobals.attachments + }); + } + get overlaysTextContent() { + return true; + } +} +class PopupAnnotation extends Annotation { + constructor(params) { + super(params); + const { + dict + } = params; + this.data.noHTML = false; + if (this.width === 0 || this.height === 0) { + 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(parentItem.getArray("Rect"), null); + this.data.creationDate = parentItem.get("CreationDate") || ""; + const rt = parentItem.get("RT"); + if (isName(rt, AnnotationReplyType.GROUP)) { + parentItem = parentItem.get("IRT"); + } + 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(parentItem.get("Contents")); + this.data.contentsObj = this._contents; + if (parentItem.has("RC")) { + this.data.richText = XFAFactory.getRichTextAsHtml(parentItem.get("RC")); + } + this.data.open = !!dict.get("Open"); + } + static createNewDict(annotation, xref, _params) { + const { + oldAnnotation, + rect, + parent + } = annotation; + const popup = oldAnnotation || new Dict(xref); + popup.setIfNotExists("Type", Name.get("Annot")); + popup.setIfNotExists("Subtype", Name.get("Popup")); + popup.setIfNotExists("Open", false); + popup.setIfArray("Rect", rect); + popup.set("Parent", parent); + return popup; + } + static async createNewAppearanceStream(annotation, xref, params) { + return null; + } +} +class FreeTextAnnotation extends MarkupAnnotation { + constructor(params) { + super(params); + this.data.hasOwnCanvas = this.data.noRotate; + this.data.isEditable = !this.data.noHTML; + this.data.noHTML = false; + const { + annotationGlobals, + xref + } = params; + this.setDefaultAppearance(params); + this._hasAppearance = !!this.appearance; + if (this._hasAppearance) { + const { + fontColor, + fontSize + } = parseAppearanceStream(this.appearance, xref, annotationGlobals.globalColorSpaceCache); + this.data.defaultAppearanceData.fontColor = fontColor; + this.data.defaultAppearanceData.fontSize = fontSize || 10; + } else { + this.data.defaultAppearanceData.fontSize ||= 10; + const { + fontColor, + fontSize + } = this.data.defaultAppearanceData; + if (this._contents.str) { + this.data.textContent = this._contents.str.split(/\r\n?|\n/).map(line => line.trimEnd()); + const { + coords, + bbox, + matrix + } = FakeUnicodeFont.getFirstPositionInfo(this.rectangle, this.rotation, fontSize); + this.data.textPosition = this._transformPoint(coords, bbox, matrix); + } + if (this._isOffscreenCanvasSupported) { + const strokeAlpha = params.dict.get("CA"); + const fakeUnicodeFont = new FakeUnicodeFont(xref, "sans-serif"); + this.appearance = fakeUnicodeFont.createAppearance(this._contents.str, this.rectangle, this.rotation, fontSize, fontColor, strokeAlpha); + this._streams.push(this.appearance); + } else { + warn("FreeTextAnnotation: OffscreenCanvas is not supported, annotation may not render correctly."); + } + } + } + get hasTextContent() { + return this._hasAppearance; + } + static createNewDict(annotation, xref, { + apRef, + ap + }) { + const { + color, + date, + fontSize, + oldAnnotation, + rect, + rotation, + user, + value + } = annotation; + const freetext = oldAnnotation || new Dict(xref); + freetext.setIfNotExists("Type", Name.get("Annot")); + freetext.setIfNotExists("Subtype", Name.get("FreeText")); + freetext.set(oldAnnotation ? "M" : "CreationDate", `D:${getModificationDate(date)}`); + if (oldAnnotation) { + freetext.delete("RC"); + } + freetext.setIfArray("Rect", rect); + const da = `/Helv ${fontSize} Tf ${getPdfColor(color, true)}`; + freetext.set("DA", da); + freetext.setIfDefined("Contents", stringToAsciiOrUTF16BE(value)); + freetext.setIfNotExists("F", 4); + freetext.setIfNotExists("Border", [0, 0, 0]); + freetext.setIfNumber("Rotate", rotation); + freetext.setIfDefined("T", stringToAsciiOrUTF16BE(user)); + if (apRef || ap) { + const n = new Dict(xref); + freetext.set("AP", n); + n.set("N", apRef || ap); + } + return freetext; + } + static getPrintData({ + color, + fontSize, + rect, + rotation, + value + }) { + throw new Error("Not implemented: getPrintData"); + } + static async createNewAppearanceStream(annotation, xref, params) { + const { + baseFontRef, + evaluator, + task + } = params; + const { + color, + fontSize, + rect, + rotation, + value + } = annotation; + if (!color) { + return null; + } + const resources = new Dict(xref); + const font = new Dict(xref); + if (baseFontRef) { + font.set("Helv", baseFontRef); + } else { + const baseFont = new Dict(xref); + baseFont.setIfName("BaseFont", "Helvetica"); + baseFont.setIfName("Type", "Font"); + baseFont.setIfName("Subtype", "Type1"); + baseFont.setIfName("Encoding", "WinAnsiEncoding"); + font.set("Helv", baseFont); + } + 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]; + } + 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); + } + const hscale = totalWidth > w ? w / totalWidth : 1; + let vscale = 1; + const lineHeight = (/* inlined export .LINE_FACTOR */1.35) * fontSize; + const lineAscent = ((/* inlined export .LINE_FACTOR */1.35) - (/* inlined export .LINE_DESCENT_FACTOR */0.35)) * 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: + matrix = [1, 0, 0, 1]; + clipBox = [rect[0], rect[1], w, h]; + firstPoint = [rect[0], rect[3] - lineAscent]; + break; + case 90: + matrix = [0, 1, -1, 0]; + clipBox = [rect[1], -rect[2], w, h]; + firstPoint = [rect[1], -rect[0] - lineAscent]; + break; + case 180: + matrix = [-1, 0, 0, -1]; + clipBox = [-rect[2], -rect[3], w, h]; + firstPoint = [-rect[2], -rect[1] - lineAscent]; + break; + case 270: + matrix = [0, -1, 1, 0]; + clipBox = [-rect[3], rect[0], w, h]; + firstPoint = [-rect[3], rect[2] - lineAscent]; + break; + } + const buffer = ["q", `${matrix.join(" ")} 0 0 cm`, `${clipBox.join(" ")} re W n`, `BT`, `${getPdfColor(color, true)}`, `0 Tc /Helv ${core_utils_numberToString(newFontSize)} Tf`]; + buffer.push(`${firstPoint.join(" ")} Td (${escapeString(encodedLines[0])}) Tj`); + const vShift = core_utils_numberToString(lineHeight); + for (let i = 1, ii = encodedLines.length; i < ii; i++) { + const line = encodedLines[i]; + buffer.push(`0 -${vShift} Td (${escapeString(line)}) Tj`); + } + buffer.push("ET", "Q"); + const appearance = buffer.join("\n"); + const appearanceStreamDict = new Dict(xref); + appearanceStreamDict.set("FormType", 1); + appearanceStreamDict.setIfName("Subtype", "Form"); + appearanceStreamDict.setIfName("Type", "XObject"); + appearanceStreamDict.set("BBox", rect); + appearanceStreamDict.set("Resources", resources); + appearanceStreamDict.set("Matrix", [1, 0, 0, 1, -rect[0], -rect[1]]); + return new StringStream(appearance, appearanceStreamDict); + } +} +class LineAnnotation extends MarkupAnnotation { + constructor(params) { + super(params); + const { + dict, + xref + } = params; + this.data.hasOwnCanvas = this.data.noRotate; + 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 strokeColor = getPdfColorArray(this.color, [0, 0, 0]); + const strokeAlpha = dict.get("CA"); + const interiorColor = getRgbColor(dict.getArray("IC"), null); + const fillColor = getPdfColorArray(interiorColor); + 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, + 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[7] - borderWidth, points[2] + borderWidth, points[3] + borderWidth]; + } + }); + } + } +} +class SquareAnnotation extends MarkupAnnotation { + constructor(params) { + super(params); + const { + dict, + xref + } = params; + this.data.hasOwnCanvas = this.data.noRotate; + this.data.noHTML = false; + if (!this.appearance) { + const strokeColor = getPdfColorArray(this.color, [0, 0, 0]); + const strokeAlpha = dict.get("CA"); + const interiorColor = getRgbColor(dict.getArray("IC"), null); + const fillColor = getPdfColorArray(interiorColor); + const fillAlpha = fillColor ? strokeAlpha : null; + if (this.borderStyle.width === 0 && !fillColor) { + return; + } + this._setDefaultAppearance({ + xref, + extra: `${this.borderStyle.width} w`, + 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[7], points[2], points[3]]; + } + }); + } + } +} +class CircleAnnotation extends MarkupAnnotation { + constructor(params) { + super(params); + const { + dict, + xref + } = params; + if (!this.appearance) { + const strokeColor = getPdfColorArray(this.color, [0, 0, 0]); + const strokeAlpha = dict.get("CA"); + const interiorColor = getRgbColor(dict.getArray("IC"), null); + const fillColor = getPdfColorArray(interiorColor); + 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, + extra: `${this.borderStyle.width} w`, + 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"); + if (fillColor) { + buffer.push("B"); + } else { + buffer.push("S"); + } + return [points[0], points[7], points[2], points[3]]; + } + }); + } + } +} +class PolylineAnnotation extends MarkupAnnotation { + constructor(params) { + super(params); + const { + dict, + xref + } = params; + this.data.hasOwnCanvas = this.data.noRotate; + this.data.noHTML = false; + this.data.vertices = null; + if (!(this instanceof PolygonAnnotation)) { + this.setLineEndings(dict.getArray("LE")); + this.data.lineEndings = this.lineEndings; + } + const rawVertices = dict.getArray("Vertices"); + if (!isNumberArray(rawVertices, null)) { + return; + } + const vertices = this.data.vertices = Float32Array.from(rawVertices); + if (!this.appearance) { + const strokeColor = getPdfColorArray(this.color, [0, 0, 0]); + const strokeAlpha = dict.get("CA"); + let fillColor = getRgbColor(dict.getArray("IC"), null); + fillColor &&= getPdfColorArray(fillColor); + let operator; + if (fillColor) { + if (this.color) { + operator = fillColor.every((c, i) => c === strokeColor[i]) ? "f" : "B"; + } else { + operator = "f"; + } + } else { + operator = "S"; + } + const borderWidth = this.borderStyle.width || 1, + borderAdjust = 2 * borderWidth; + const bbox = BBOX_INIT.slice(); + for (let i = 0, ii = vertices.length; i < ii; i += 2) { + Util.rectBoundingBox(vertices[i] - borderAdjust, vertices[i + 1] - borderAdjust, vertices[i] + borderAdjust, vertices[i + 1] + borderAdjust, bbox); + } + if (!Util.intersect(this.rectangle, bbox)) { + this.rectangle = bbox; + } + this._setDefaultAppearance({ + xref, + extra: `${borderWidth} w`, + strokeColor, + strokeAlpha, + fillColor, + fillAlpha: fillColor ? strokeAlpha : null, + 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(operator); + return [points[0], points[7], points[2], points[3]]; + } + }); + } + } +} +class PolygonAnnotation extends PolylineAnnotation {} +class CaretAnnotation extends MarkupAnnotation {} +class InkAnnotation extends MarkupAnnotation { + constructor(params) { + super(params); + this.data.hasOwnCanvas = this.data.noRotate; + this.data.noHTML = false; + const { + dict, + xref + } = params; + this.data.inkLists = []; + this.data.isEditable = !this.data.noHTML; + this.data.noHTML = false; + this.data.opacity = dict.get("CA") || 1; + const rawInkLists = dict.getArray("InkList"); + if (!Array.isArray(rawInkLists)) { + return; + } + for (const rawInkList of rawInkLists) { + if (!Array.isArray(rawInkList)) { + continue; + } + const inkList = new Float32Array(rawInkList.length); + this.data.inkLists.push(inkList); + for (let j = 0, jj = rawInkList.length; j < jj; j += 2) { + const x = xref.fetchIfRef(rawInkList[j]), + y = xref.fetchIfRef(rawInkList[j + 1]); + if (typeof x === "number" && typeof y === "number") { + inkList[j] = x; + inkList[j + 1] = y; + } + } + } + if (!this.appearance) { + const strokeColor = getPdfColorArray(this.color, [0, 0, 0]); + const strokeAlpha = dict.get("CA"); + const borderWidth = this.borderStyle.width || 1, + borderAdjust = 2 * borderWidth; + const bbox = BBOX_INIT.slice(); + for (const inkList of this.data.inkLists) { + for (let i = 0, ii = inkList.length; i < ii; i += 2) { + Util.rectBoundingBox(inkList[i] - borderAdjust, inkList[i + 1] - borderAdjust, inkList[i] + borderAdjust, inkList[i + 1] + borderAdjust, bbox); + } + } + 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[7], points[2], points[3]]; + } + }); + } + } + static createNewDict(annotation, xref, { + apRef, + ap + }) { + const { + oldAnnotation, + color, + date, + opacity, + paths, + outlines, + rect, + rotation, + thickness, + user + } = annotation; + const ink = oldAnnotation || new Dict(xref); + ink.setIfNotExists("Type", Name.get("Annot")); + ink.setIfNotExists("Subtype", Name.get("Ink")); + ink.set(oldAnnotation ? "M" : "CreationDate", `D:${getModificationDate(date)}`); + ink.setIfArray("Rect", rect); + ink.setIfArray("InkList", outlines?.points || paths?.points); + ink.setIfNotExists("F", 4); + ink.setIfNumber("Rotate", rotation); + ink.setIfDefined("T", stringToAsciiOrUTF16BE(user)); + if (outlines) { + ink.setIfName("IT", "InkHighlight"); + } + if (thickness > 0) { + const bs = new Dict(xref); + ink.set("BS", bs); + bs.set("W", thickness); + } + ink.setIfArray("C", getPdfColorArray(color)); + ink.setIfNumber("CA", opacity); + if (ap || apRef) { + const n = new Dict(xref); + ink.set("AP", n); + n.set("N", apRef || ap); + } + return ink; + } + static async createNewAppearanceStream(annotation, xref, params) { + if (annotation.outlines) { + return this.createNewAppearanceStreamForHighlight(annotation, xref, params); + } + const { + color, + rect, + paths, + thickness, + opacity + } = annotation; + if (!color) { + return null; + } + const appearanceBuffer = [`${thickness} w 1 J 1 j`, `${getPdfColor(color, false)}`]; + if (opacity !== 1) { + appearanceBuffer.push("/R0 gs"); + } + for (const outline of paths.lines) { + writeLineToCurveToAppearance(outline, appearanceBuffer, true); + } + appearanceBuffer.push("S"); + const appearance = appearanceBuffer.join("\n"); + const appearanceStreamDict = new Dict(xref); + appearanceStreamDict.set("FormType", 1); + appearanceStreamDict.setIfName("Subtype", "Form"); + appearanceStreamDict.setIfName("Type", "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.setIfName("Type", "ExtGState"); + extGState.set("R0", r0); + resources.set("ExtGState", extGState); + appearanceStreamDict.set("Resources", resources); + } + return new StringStream(appearance, appearanceStreamDict); + } + static async createNewAppearanceStreamForHighlight(annotation, xref, params) { + const { + color, + rect, + outlines: { + outline + }, + opacity + } = annotation; + if (!color) { + return null; + } + const appearanceBuffer = [`${getPdfColor(color, true)}`, "/R0 gs"]; + writeLineToCurveToAppearance(outline, appearanceBuffer); + appearanceBuffer.push("h f"); + const appearance = appearanceBuffer.join("\n"); + const appearanceStreamDict = new Dict(xref); + appearanceStreamDict.set("FormType", 1); + appearanceStreamDict.setIfName("Subtype", "Form"); + appearanceStreamDict.setIfName("Type", "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.setIfName("BM", "Multiply"); + if (opacity !== 1) { + r0.set("ca", opacity); + r0.setIfName("Type", "ExtGState"); + } + return new StringStream(appearance, appearanceStreamDict); + } +} +class HighlightAnnotation extends MarkupAnnotation { + constructor(params) { + super(params); + const { + dict, + xref + } = params; + 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) { + if (!this.appearance) { + const fillColor = getPdfColorArray(this.color, [1, 1, 0]); + const fillAlpha = dict.get("CA"); + this._setDefaultAppearance({ + xref, + fillColor, + blendMode: "Multiply", + 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 [points[0], points[7], points[2], points[3]]; + } + }); + } + } else { + this.data.popupRef = null; + } + } + get overlaysTextContent() { + return true; + } + static createNewDict(annotation, xref, { + apRef, + ap + }) { + const { + color, + date, + oldAnnotation, + opacity, + rect, + rotation, + user, + quadPoints + } = annotation; + const highlight = oldAnnotation || new Dict(xref); + highlight.setIfNotExists("Type", Name.get("Annot")); + highlight.setIfNotExists("Subtype", Name.get("Highlight")); + highlight.set(oldAnnotation ? "M" : "CreationDate", `D:${getModificationDate(date)}`); + highlight.setIfArray("Rect", rect); + highlight.setIfNotExists("F", 4); + highlight.setIfNotExists("Border", [0, 0, 0]); + highlight.setIfNumber("Rotate", rotation); + highlight.setIfArray("QuadPoints", quadPoints); + highlight.setIfArray("C", getPdfColorArray(color)); + highlight.setIfNumber("CA", opacity); + highlight.setIfDefined("T", stringToAsciiOrUTF16BE(user)); + if (apRef || ap) { + const n = new Dict(xref); + highlight.set("AP", n); + n.set("N", apRef || ap); + } + return highlight; + } + static async createNewAppearanceStream(annotation, xref, params) { + const { + color, + rect, + outlines, + opacity + } = annotation; + if (!color) { + return null; + } + const appearanceBuffer = [`${getPdfColor(color, true)}`, "/R0 gs"]; + const buffer = []; + for (const outline of outlines) { + buffer.length = 0; + buffer.push(`${core_utils_numberToString(outline[0])} ${core_utils_numberToString(outline[1])} m`); + for (let i = 2, ii = outline.length; i < ii; i += 2) { + buffer.push(`${core_utils_numberToString(outline[i])} ${core_utils_numberToString(outline[i + 1])} l`); + } + buffer.push("h"); + appearanceBuffer.push(buffer.join("\n")); + } + appearanceBuffer.push("f*"); + const appearance = appearanceBuffer.join("\n"); + const appearanceStreamDict = new Dict(xref); + appearanceStreamDict.set("FormType", 1); + appearanceStreamDict.setIfName("Subtype", "Form"); + appearanceStreamDict.setIfName("Type", "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.setIfName("BM", "Multiply"); + if (opacity !== 1) { + r0.set("ca", opacity); + r0.setIfName("Type", "ExtGState"); + } + return new StringStream(appearance, appearanceStreamDict); + } +} +class UnderlineAnnotation extends MarkupAnnotation { + constructor(params) { + super(params); + const { + dict, + xref + } = params; + const quadPoints = this.data.quadPoints = getQuadPoints(dict, null); + if (quadPoints) { + if (!this.appearance) { + const strokeColor = getPdfColorArray(this.color, [0, 0, 0]); + const strokeAlpha = dict.get("CA"); + this._setDefaultAppearance({ + xref, + extra: "[] 0 d 0.571 w", + 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[7], points[2], points[3]]; + } + }); + } + } else { + this.data.popupRef = null; + } + } + get overlaysTextContent() { + return true; + } +} +class SquigglyAnnotation extends MarkupAnnotation { + constructor(params) { + super(params); + const { + dict, + xref + } = params; + const quadPoints = this.data.quadPoints = getQuadPoints(dict, null); + if (quadPoints) { + if (!this.appearance) { + const strokeColor = getPdfColorArray(this.color, [0, 0, 0]); + const strokeAlpha = dict.get("CA"); + this._setDefaultAppearance({ + xref, + extra: "[] 0 d 1 w", + 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 { + x += 2; + shift = shift === 0 ? dy : 0; + buffer.push(`${x} ${y + shift} l`); + } while (x < xEnd); + buffer.push("S"); + return [points[4], y - 2 * dy, xEnd, y + 2 * dy]; + } + }); + } + } else { + this.data.popupRef = null; + } + } + get overlaysTextContent() { + return true; + } +} +class StrikeOutAnnotation extends MarkupAnnotation { + constructor(params) { + super(params); + const { + dict, + xref + } = params; + const quadPoints = this.data.quadPoints = getQuadPoints(dict, null); + if (quadPoints) { + if (!this.appearance) { + const strokeColor = getPdfColorArray(this.color, [0, 0, 0]); + const strokeAlpha = dict.get("CA"); + this._setDefaultAppearance({ + xref, + extra: "[] 0 d 1 w", + 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 [points[0], points[7], points[2], points[3]]; + } + }); + } + } else { + this.data.popupRef = null; + } + } + get overlaysTextContent() { + return true; + } +} +class StampAnnotation extends MarkupAnnotation { + #savedHasOwnCanvas = null; + constructor(params) { + super(params); + this.data.hasOwnCanvas = this.data.noRotate; + this.data.isEditable = !this.data.noHTML; + this.data.noHTML = false; + } + mustBeViewedWhenEditing(isEditing, modifiedIds = null) { + if (isEditing) { + if (!this.data.isEditable) { + return true; + } + this.#savedHasOwnCanvas ??= this.data.hasOwnCanvas; + this.data.hasOwnCanvas = true; + return true; + } + if (this.#savedHasOwnCanvas !== null) { + this.data.hasOwnCanvas = this.#savedHasOwnCanvas; + this.#savedHasOwnCanvas = null; + } + return !modifiedIds?.has(this.data.id); + } + static createNewDict(annotation, xref, { + apRef, + ap + }) { + const { + date, + oldAnnotation, + rect, + rotation, + user + } = annotation; + const stamp = oldAnnotation || new Dict(xref); + stamp.setIfNotExists("Type", Name.get("Annot")); + stamp.setIfNotExists("Subtype", Name.get("Stamp")); + stamp.set(oldAnnotation ? "M" : "CreationDate", `D:${getModificationDate(date)}`); + stamp.setIfArray("Rect", rect); + stamp.setIfNotExists("F", 4); + stamp.setIfNotExists("Border", [0, 0, 0]); + stamp.setIfNumber("Rotate", rotation); + stamp.setIfDefined("T", stringToAsciiOrUTF16BE(user)); + if (apRef || ap) { + const n = new Dict(xref); + stamp.set("AP", n); + n.set("N", apRef || ap); + } + return stamp; + } + static async #createNewAppearanceStreamForDrawing(annotation, xref) { + const { + areContours, + color, + rect, + lines, + thickness + } = annotation; + if (!color) { + return null; + } + const appearanceBuffer = [`${thickness} w 1 J 1 j`, `${getPdfColor(color, areContours)}`]; + for (const line of lines) { + writeLineToCurveToAppearance(line, appearanceBuffer, true); + } + appearanceBuffer.push(areContours ? "F" : "S"); + const appearance = appearanceBuffer.join("\n"); + const appearanceStreamDict = new Dict(xref); + appearanceStreamDict.set("FormType", 1); + appearanceStreamDict.setIfName("Subtype", "Form"); + appearanceStreamDict.setIfName("Type", "XObject"); + appearanceStreamDict.set("BBox", rect); + appearanceStreamDict.set("Length", appearance.length); + return new StringStream(appearance, appearanceStreamDict); + } + static async createNewAppearanceStream(annotation, xref, params) { + if (annotation.oldAnnotation) { + return null; + } + if (annotation.isSignature) { + return this.#createNewAppearanceStreamForDrawing(annotation, xref); + } + 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.setIfName("Subtype", "Form"); + appearanceStreamDict.setIfName("Type", "XObject"); + appearanceStreamDict.set("BBox", [0, 0, width, height]); + appearanceStreamDict.set("Resources", resources); + if (rotation) { + const matrix = getRotationMatrix(rotation, width, height); + appearanceStreamDict.set("Matrix", matrix); + } + return new StringStream(appearance, appearanceStreamDict); + } +} +class FileAttachmentAnnotation extends MarkupAnnotation { + constructor(params) { + super(params); + const { + annotationGlobals, + dict + } = params; + const fsDict = dict.get("FS"); + this.data.hasOwnCanvas = this.data.noRotate; + this.data.noHTML = false; + this.data.fileId = this._getAttachmentId(fsDict, dict.getRaw("FS"), annotationGlobals); + this.data.file = new FileSpec(fsDict).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; + } +} +class MediaAnnotation extends Annotation { + static #MEDIA_MIME_TYPE_RE = /^(?:video|audio)\/[a-z0-9][\w!#$&^.+-]{0,126}$/i; + static #MEDIA_CONTENT_TYPE_RE = /^(?:video|audio)\/[a-z0-9][\w!#$&^.+-]{0,126}(?: *; *[a-z0-9][\w!#$&^.+-]{0,126} *= *(?:[-!#$%&'*+.^\x60{|}~\w]+|"(?:[\x20\x21\x23-\x5b\x5d-\x7e]|\\[\x20-\x7e])*"))* *$/i; + constructor(params) { + super(params); + this.data.noHTML = true; + } + _setMediaData({ + assetRef, + assetDict, + filename, + contentType, + wrapSound = false + }, annotationGlobals) { + this.data.noHTML = false; + this.data.richMedia = { + fileId: this._getAttachmentId(assetDict, assetRef, annotationGlobals, wrapSound), + filename, + contentType + }; + } + static _getContentType(assetDict, filename, contentType = null, contentTypeIsName = false) { + if (typeof contentType === "string" && (contentTypeIsName ? MediaAnnotation.#MEDIA_MIME_TYPE_RE : MediaAnnotation.#MEDIA_CONTENT_TYPE_RE).test(contentType)) { + return contentType; + } + const stream = FileSpec.pickPlatformItem(assetDict.get("EF")); + const subtype = stream instanceof BaseStream ? stream.dict?.get("Subtype") : null; + if (subtype instanceof Name && MediaAnnotation.#MEDIA_MIME_TYPE_RE.test(subtype.name)) { + return subtype.name; + } + const extPos = filename.lastIndexOf(".") + 1, + ext = extPos > 0 && filename.substring(extPos).toLowerCase(); + switch (ext) { + case "mp4": + case "m4v": + return "video/mp4"; + case "webm": + return "video/webm"; + case "ogv": + return "video/ogg"; + case "mov": + return "video/quicktime"; + case "mp3": + return "audio/mpeg"; + case "m4a": + return "audio/mp4"; + case "wav": + return "audio/wav"; + case "oga": + case "ogg": + return "audio/ogg"; + default: + return null; + } + } +} +class RichMediaAnnotation extends MediaAnnotation { + constructor(params) { + super(params); + const { + dict, + xref, + annotationGlobals + } = params; + const content = dict.get("RichMediaContent"); + if (!(content instanceof Dict)) { + return; + } + const asset = RichMediaAnnotation.#findAsset(content, xref); + if (!asset) { + warn("RichMedia annotation has no playable asset."); + return; + } + this._setMediaData(asset, annotationGlobals); + } + static #findAsset(content, xref) { + const configurations = content.get("Configurations"); + if (!Array.isArray(configurations)) { + return null; + } + for (const configRef of configurations) { + const config = xref.fetchIfRef(configRef); + if (!(config instanceof Dict)) { + continue; + } + const instances = config.get("Instances"); + if (!Array.isArray(instances)) { + continue; + } + for (const instanceRef of instances) { + const instance = xref.fetchIfRef(instanceRef); + if (!(instance instanceof Dict)) { + continue; + } + if (isName(instance.get("Subtype"), "Flash")) { + continue; + } + const rawAsset = instance.getRaw("Asset"); + const asset = xref.fetchIfRef(rawAsset); + if (!(asset instanceof Dict)) { + continue; + } + if (!FileSpec.hasEmbeddedFile(asset)) { + continue; + } + const { + filename + } = new FileSpec(asset).serializable; + const contentType = MediaAnnotation._getContentType(asset, filename); + if (!contentType) { + continue; + } + return { + assetRef: rawAsset instanceof Ref ? rawAsset : null, + assetDict: asset, + filename, + contentType + }; + } + } + return null; + } +} +class ScreenAnnotation extends MediaAnnotation { + constructor(params) { + super(params); + const { + dict, + xref, + annotationGlobals + } = params; + const asset = ScreenAnnotation.#findAsset(dict, xref); + if (!asset) { + return; + } + this._setMediaData(asset, annotationGlobals); + } + static #findAsset(dict, xref) { + for (const action of this.#renditionActions(dict)) { + const asset = this.#findRenditionAsset(action.get("R"), xref, new RefSet()); + if (asset) { + return asset; + } + } + return null; + } + static *#renditionActions(dict) { + const action = dict.get("A"); + if (this.#isPlayAction(action)) { + yield action; + } + const additionalActions = dict.get("AA"); + if (additionalActions instanceof Dict) { + for (const [, aa] of additionalActions) { + if (this.#isPlayAction(aa)) { + yield aa; + } + } + } + } + static #isPlayAction(action) { + if (!(action instanceof Dict) || !isName(action.get("S"), "Rendition")) { + return false; + } + const operation = action.get("OP"); + return operation === undefined || operation === AnnotationRenditionOperation.PLAY_OR_RESUME || operation === AnnotationRenditionOperation.PLAY; + } + static #findRenditionAsset(rendition, xref, seen) { + if (!(rendition instanceof Dict)) { + return null; + } + const subtype = rendition.get("S"); + if (isName(subtype, "MR")) { + return this.#findClipAsset(rendition.get("C"), xref); + } + if (isName(subtype, "SR")) { + const renditions = rendition.get("R"); + if (Array.isArray(renditions)) { + for (const ref of renditions) { + if (ref instanceof Ref) { + if (seen.has(ref)) { + continue; + } + seen.put(ref); + } + const asset = this.#findRenditionAsset(xref.fetchIfRef(ref), xref, seen); + if (asset) { + return asset; + } + } + } + } + return null; + } + static #findClipAsset(clip, xref) { + if (!(clip instanceof Dict) || !isName(clip.get("S"), "MCD")) { + return null; + } + const rawData = clip.getRaw("D"); + const data = xref.fetchIfRef(rawData); + const contentTypeHint = clip.get("CT"); + let explicitType = typeof contentTypeHint === "string" ? contentTypeHint : null; + let explicitTypeIsName = false; + let assetDict, filename; + if (data instanceof BaseStream) { + assetDict = data.dict; + const name = clip.get("N"); + filename = typeof name === "string" ? stringToPDFString(name) : ""; + if (!explicitType) { + const subtype = data.dict.get("Subtype"); + if (subtype instanceof Name) { + explicitType = subtype.name; + explicitTypeIsName = true; + } + } + } else if (data instanceof Dict) { + if (!FileSpec.hasEmbeddedFile(data)) { + return null; + } + assetDict = data; + ({ + filename + } = new FileSpec(data).serializable); + } else { + return null; + } + const contentType = MediaAnnotation._getContentType(assetDict, filename, explicitType, explicitTypeIsName); + if (!contentType) { + return null; + } + return { + assetRef: rawData instanceof Ref ? rawData : null, + assetDict, + filename, + contentType + }; + } +} +class SoundAnnotation extends MediaAnnotation { + constructor(params) { + super(params); + const { + dict, + xref, + annotationGlobals + } = params; + const soundRef = dict.getRaw("Sound"); + if (!(soundRef instanceof Ref)) { + return; + } + let sound; + try { + sound = xref.fetch(soundRef); + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn(`SoundAnnotation: "${ex}".`); + return; + } + if (!(sound instanceof BaseStream) || !getSoundFormat(sound.dict)) { + return; + } + this._setMediaData({ + assetRef: soundRef, + assetDict: sound.dict, + filename: "sound.wav", + contentType: "audio/wav", + wrapSound: true + }, annotationGlobals); + } +} + +;// ./src/core/calculate_md5.js + + + + + + +const PARAMS = { + get r() { + return util_shadow(this, "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])); + }, + get k() { + return util_shadow(this, "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 calculateMD5(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; + if (i < n) { + i = n; + } + 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; + i += 3; + const w = new Int32Array(16); + const { + k, + r + } = PARAMS; + for (i = 0; i < paddedLength;) { + for (j = 0; j < 16; ++j, i += 4) { + w[j] = padded[i] | padded[i + 1] << 8 | padded[i + 2] << 16 | padded[i + 3] << 24; + } + let a = h0, + b = h1, + c = h2, + d = h3, + f, + g; + for (j = 0; j < 64; ++j) { + if (j < 16) { + f = b & c | ~b & d; + g = j; + } else if (j < 32) { + f = d & b | ~d & c; + g = 5 * j + 1 & 15; + } else if (j < 48) { + f = b ^ c ^ d; + g = 3 * j + 5 & 15; + } else { + f = c ^ (b | ~d); + g = 7 * j & 15; + } + const tmp = d, + rotateArg = a + f + k[j] + w[g] | 0, + rotate = r[j]; + d = c; + c = b; + b = b + (rotateArg << rotate | rotateArg >>> 32 - rotate) | 0; + a = tmp; + } + h0 = h0 + a | 0; + h1 = h1 + b | 0; + h2 = h2 + c | 0; + h3 = h3 + d | 0; + } + return new Uint8Array([h0 & 0xFF, h0 >> 8 & 0xFF, h0 >> 16 & 0xFF, h0 >>> 24 & 0xFF, h1 & 0xFF, h1 >> 8 & 0xFF, h1 >> 16 & 0xFF, h1 >>> 24 & 0xFF, h2 & 0xFF, h2 >> 8 & 0xFF, h2 >> 16 & 0xFF, h2 >>> 24 & 0xFF, h3 & 0xFF, h3 >> 8 & 0xFF, h3 >> 16 & 0xFF, h3 >>> 24 & 0xFF]); +} + +;// ./src/core/dataset_reader.js + + + + + +function decodeString(str) { + try { + return stringToUTF8String(str); + } catch (ex) { + warn(`UTF-8 decoding failed: "${ex}".`); + return str; + } +} +class DatasetXMLParser extends SimpleXMLParser { + node = null; + onEndElement(name) { + const node = super.onEndElement(name); + if (node && name === "xfa:datasets") { + this.node = node; + throw new Error("Aborting DatasetXMLParser."); + } + } +} +class DatasetReader { + constructor(data) { + if (data.datasets) { + this.node = new SimpleXMLParser({ + hasAttributes: true + }).parseFromString(data.datasets).documentElement; + } else { + const parser = new DatasetXMLParser({ + hasAttributes: true + }); + try { + parser.parseFromString(data["xdp:xdp"]); + } catch {} + this.node = parser.node; + } + } + getValue(path) { + if (!this.node || !path) { + return ""; + } + const node = this.node.searchNode(parseXFAPath(path), 0); + if (!node) { + return ""; + } + const first = node.firstChild; + return first?.nodeName === "value" ? node.children.map(child => decodeString(child.textContent)) : decodeString(node.textContent); + } +} + +;// ./src/core/intersector.js + +class SingleIntersector { + #annotation; + minX = Infinity; + minY = Infinity; + maxX = -Infinity; + maxY = -Infinity; + #quadPoints = null; + #text = []; + #extraChars = []; + #lastIntersectingQuadIndex = -1; + #canTakeExtraChars = false; + constructor(annotation) { + this.#annotation = annotation; + const quadPoints = annotation.data.quadPoints; + if (!quadPoints) { + [this.minX, this.minY, this.maxX, this.maxY] = annotation.data.rect; + return; + } + for (let i = 0, ii = quadPoints.length; i < ii; i += 8) { + this.minX = Math.min(this.minX, quadPoints[i]); + this.maxX = Math.max(this.maxX, quadPoints[i + 2]); + this.minY = Math.min(this.minY, quadPoints[i + 5]); + this.maxY = Math.max(this.maxY, quadPoints[i + 1]); + } + if (quadPoints.length > 8) { + this.#quadPoints = quadPoints; + } + } + #intersects(x, y) { + if (this.minX >= x || this.maxX <= x || this.minY >= y || this.maxY <= y) { + return false; + } + const quadPoints = this.#quadPoints; + if (!quadPoints) { + return true; + } + if (this.#lastIntersectingQuadIndex >= 0) { + const i = this.#lastIntersectingQuadIndex; + if (!(quadPoints[i] >= x || quadPoints[i + 2] <= x || quadPoints[i + 5] >= y || quadPoints[i + 1] <= y)) { + return true; + } + this.#lastIntersectingQuadIndex = -1; + } + for (let i = 0, ii = quadPoints.length; i < ii; i += 8) { + if (!(quadPoints[i] >= x || quadPoints[i + 2] <= x || quadPoints[i + 5] >= y || quadPoints[i + 1] <= y)) { + this.#lastIntersectingQuadIndex = i; + return true; + } + } + return false; + } + addGlyph(x, y, glyph) { + if (!this.#intersects(x, y)) { + this.disableExtraChars(); + return false; + } + if (this.#extraChars.length > 0) { + this.#text.push(this.#extraChars.join("")); + this.#extraChars.length = 0; + } + this.#text.push(glyph); + this.#canTakeExtraChars = true; + return true; + } + addExtraChar(char) { + if (this.#canTakeExtraChars) { + this.#extraChars.push(char); + } + } + disableExtraChars() { + if (!this.#canTakeExtraChars) { + return; + } + this.#canTakeExtraChars = false; + this.#extraChars.length = 0; + } + setText() { + this.#annotation.data.overlaidText = this.#text.join(""); + } +} +const STEPS = 64; +class Intersector { + #intersectors = []; + #grid = []; + #minX; + #maxX; + #minY; + #maxY; + #invXRatio; + #invYRatio; + constructor(annotations) { + let minX = Infinity; + let minY = Infinity; + let maxX = -Infinity; + let maxY = -Infinity; + const intersectors = this.#intersectors; + for (const annotation of annotations) { + if (!annotation.data.quadPoints && !annotation.data.rect) { + continue; + } + const intersector = new SingleIntersector(annotation); + intersectors.push(intersector); + minX = Math.min(minX, intersector.minX); + minY = Math.min(minY, intersector.minY); + maxX = Math.max(maxX, intersector.maxX); + maxY = Math.max(maxY, intersector.maxY); + } + this.#minX = minX; + this.#minY = minY; + this.#maxX = maxX; + this.#maxY = maxY; + this.#invXRatio = (STEPS - 1) / (maxX - minX); + this.#invYRatio = (STEPS - 1) / (maxY - minY); + for (const intersector of intersectors) { + const iMin = this.#getGridIndex(intersector.minX, intersector.minY); + const iMax = this.#getGridIndex(intersector.maxX, intersector.maxY); + const w = (iMax - iMin) % STEPS; + const h = Math.floor((iMax - iMin) / STEPS); + for (let i = iMin; i <= iMin + h * STEPS; i += STEPS) { + for (let j = 0; j <= w; j++) { + (this.#grid[i + j] ??= []).push(intersector); + } + } + } + } + #getGridIndex(x, y) { + const i = Math.floor((x - this.#minX) * this.#invXRatio); + const j = Math.floor((y - this.#minY) * this.#invYRatio); + return i + j * STEPS; + } + addGlyph(transform, width, height, glyph) { + const x = transform[4] + width / 2; + const y = transform[5] + height / 2; + if (x < this.#minX || y < this.#minY || x > this.#maxX || y > this.#maxY) { + return; + } + const intersectors = this.#grid[this.#getGridIndex(x, y)]; + if (!intersectors) { + return; + } + for (const intersector of intersectors) { + intersector.addGlyph(x, y, glyph); + } + } + addExtraChar(char) { + for (const intersector of this.#intersectors) { + intersector.addExtraChar(char); + } + } + setText() { + for (const intersector of this.#intersectors) { + intersector.setText(); + } + } +} + +;// ./src/core/calculate_sha_other.js + + + + + + +class Word64 { + constructor(highInteger, lowInteger) { + this.high = highInteger | 0; + this.low = lowInteger | 0; + } + and(word) { + this.high &= word.high; + this.low &= word.low; + } + xor(word) { + this.high ^= word.high; + this.low ^= word.low; + } + shiftRight(places) { + this.low = this.low >>> places | this.high << 32 - places; + this.high = this.high >>> places | 0; + } + rotateRight(places) { + let low, high; + if (places & 32) { + high = this.low; + low = this.high; + } else { + low = this.low; + high = this.high; + } + places &= 31; + this.low = low >>> places | high << 32 - places; + this.high = high >>> places | low << 32 - places; + } + not() { + this.high = ~this.high; + this.low = ~this.low; + } + add(word) { + const lowAdd = (this.low >>> 0) + (word.low >>> 0); + let highAdd = (this.high >>> 0) + (word.high >>> 0); + if (lowAdd > 0xffffffff) { + highAdd += 1; + } + this.low = lowAdd | 0; + this.high = highAdd | 0; + } + copyTo(bytes, offset) { + bytes[offset] = this.high >>> 24 & 0xff; + bytes[offset + 1] = this.high >> 16 & 0xff; + bytes[offset + 2] = this.high >> 8 & 0xff; + bytes[offset + 3] = this.high & 0xff; + bytes[offset + 4] = this.low >>> 24 & 0xff; + bytes[offset + 5] = this.low >> 16 & 0xff; + bytes[offset + 6] = this.low >> 8 & 0xff; + bytes[offset + 7] = this.low & 0xff; + } + assign(word) { + this.high = word.high; + this.low = word.low; + } +} +const calculate_sha_other_PARAMS = { + get k() { + return util_shadow(this, "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 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); +} +function calculateSHA512(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; + if (i < n) { + i = n; + } + i += 11; + 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); + } + const { + k + } = calculate_sha_other_PARAMS; + 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; +} +function calculateSHA384(data, offset, length) { + return calculateSHA512(data, offset, length, true); +} + +;// ./src/core/calculate_sha256.js + + + + + + +const calculate_sha256_PARAMS = { + get k() { + return util_shadow(this, "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 rotr(x, n) { + return x >>> n | x << 32 - n; +} +function calculate_sha256_ch(x, y, z) { + return x & y ^ ~x & z; +} +function calculate_sha256_maj(x, y, z) { + return x & y ^ x & z ^ y & z; +} +function calculate_sha256_sigma(x) { + return rotr(x, 2) ^ rotr(x, 13) ^ rotr(x, 22); +} +function calculate_sha256_sigmaPrime(x) { + return rotr(x, 6) ^ rotr(x, 11) ^ rotr(x, 25); +} +function calculate_sha256_littleSigma(x) { + return rotr(x, 7) ^ rotr(x, 18) ^ x >>> 3; +} +function calculate_sha256_littleSigmaPrime(x) { + return rotr(x, 17) ^ rotr(x, 19) ^ x >>> 10; +} +function calculateSHA256(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; + if (i < n) { + i = n; + } + i += 3; + 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); + const { + k + } = calculate_sha256_PARAMS; + 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] = calculate_sha256_littleSigmaPrime(w[j - 2]) + w[j - 7] + calculate_sha256_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 + calculate_sha256_sigmaPrime(e) + calculate_sha256_ch(e, f, g) + k[j] + w[j]; + t2 = calculate_sha256_sigma(a) + calculate_sha256_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]); +} + +;// ./src/core/decrypt_stream.js + +const chunkSize = 512; +class DecryptStream extends DecodeStream { + #nextChunk = null; + constructor(str, maybeLength, decrypt) { + super(maybeLength); + this.stream = str; + this.dict = str.dict; + this.decrypt = decrypt; + } + readBlock() { + let chunk = this.#nextChunk ?? this.stream.getBytes(chunkSize); + if (!chunk.length) { + this.eof = true; + return; + } + this.#nextChunk = this.stream.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; + } + getOriginalStream() { + return this; + } +} + +;// ./src/core/sasl_prep.js + + + + + + + +const NON_ASCII_SPACES = new Set([0x00a0, 0x1680, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200a, 0x200b, 0x202f, 0x205f, 0x3000]); +const COMMONLY_MAPPED_TO_NOTHING = new Set([0x00ad, 0x034f, 0x1806, 0x180b, 0x180c, 0x180d, 0x200b, 0x200c, 0x200d, 0x2060, 0xfe00, 0xfe01, 0xfe02, 0xfe03, 0xfe04, 0xfe05, 0xfe06, 0xfe07, 0xfe08, 0xfe09, 0xfe0a, 0xfe0b, 0xfe0c, 0xfe0d, 0xfe0e, 0xfe0f, 0xfeff]); +function saslPrep(str) { + let mapped = ""; + for (const char of str) { + const code = char.codePointAt(0); + if (NON_ASCII_SPACES.has(code)) { + mapped += " "; + } else if (!COMMONLY_MAPPED_TO_NOTHING.has(code)) { + mapped += char; + } + } + return mapped.normalize("NFKC"); +} + +;// ./src/core/crypto.js + + + + + + + + + + + + + + + + + + +class ARCFourCipher { + a = 0; + b = 0; + constructor(key) { + const s = Uint8Array.from({ + length: 256 + }, (_, i) => i); + const keyLength = key.length; + for (let i = 0, j = 0; i < 256; ++i) { + const tmp = s[i]; + j = j + tmp + key[i % keyLength] & 0xff; + s[i] = s[j]; + s[j] = tmp; + } + this.s = s; + } + encryptBlock(data) { + let a = this.a, + b = this.b; + const s = this.s; + const n = data.length; + const output = new Uint8Array(n); + for (let i = 0; i < n; ++i) { + a = a + 1 & 0xff; + const tmp = s[a]; + b = b + tmp & 0xff; + const tmp2 = s[b]; + s[a] = tmp2; + s[b] = tmp; + output[i] = data[i] ^ s[tmp + tmp2 & 0xff]; + } + this.a = a; + this.b = b; + return output; + } + decryptBlock(data) { + return this.encryptBlock(data); + } + encrypt(data) { + return this.encryptBlock(data); + } +} +class NullCipher { + decryptBlock(data) { + return data; + } + encrypt(data) { + return data; + } +} +class AESBaseCipher { + _s = new Uint8Array([0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 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]); + _inv_s = new Uint8Array([0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 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]); + _mix = new Uint32Array([0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927, 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45, 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb, 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381, 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf, 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66, 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28, 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012, 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec, 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e, 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd, 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7, 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89, 0xf9082b94, 0xf701269f, 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]); + _mixCol = Uint8Array.from({ + length: 256 + }, (_, i) => i < 128 ? i << 1 : i << 1 ^ 0x1b); + constructor() { + this.buffer = new Uint8Array(16); + this.bufferPosition = 0; + } + _expandKey(cipherKey) { + unreachable("Cannot call `_expandKey` on the base class"); + } + _decrypt(input, key) { + let t, u, v; + const state = new Uint8Array(16); + state.set(input); + for (let j = 0, k = this._keySize; j < 16; ++j, ++k) { + state[j] ^= key[k]; + } + for (let i = this._cyclesOfRepetition - 1; i >= 1; --i) { + t = state[13]; + state[13] = state[9]; + state[9] = state[5]; + state[5] = state[1]; + state[1] = t; + t = state[14]; + u = state[10]; + state[14] = state[6]; + state[10] = state[2]; + state[6] = t; + state[2] = u; + t = state[15]; + u = state[11]; + v = state[7]; + state[15] = state[3]; + state[11] = t; + state[7] = u; + state[3] = v; + for (let j = 0; j < 16; ++j) { + state[j] = this._inv_s[state[j]]; + } + for (let j = 0, k = i * 16; j < 16; ++j, ++k) { + state[j] ^= key[k]; + } + for (let j = 0; j < 16; j += 4) { + const s0 = this._mix[state[j]]; + const s1 = this._mix[state[j + 1]]; + const s2 = this._mix[state[j + 2]]; + const s3 = this._mix[state[j + 3]]; + t = s0 ^ s1 >>> 8 ^ s1 << 24 ^ s2 >>> 16 ^ s2 << 16 ^ s3 >>> 24 ^ s3 << 8; + state[j] = t >>> 24 & 0xff; + state[j + 1] = t >> 16 & 0xff; + state[j + 2] = t >> 8 & 0xff; + state[j + 3] = t & 0xff; + } + } + t = state[13]; + state[13] = state[9]; + state[9] = state[5]; + state[5] = state[1]; + state[1] = t; + t = state[14]; + u = state[10]; + state[14] = state[6]; + state[10] = state[2]; + state[6] = t; + state[2] = u; + t = state[15]; + u = state[11]; + v = state[7]; + state[15] = state[3]; + state[11] = t; + state[7] = u; + state[3] = v; + for (let j = 0; j < 16; ++j) { + state[j] = this._inv_s[state[j]]; + state[j] ^= key[j]; + } + return state; + } + _encrypt(input, key) { + const s = this._s; + let t, u, v; + const state = new Uint8Array(16); + state.set(input); + for (let j = 0; j < 16; ++j) { + state[j] ^= key[j]; + } + for (let i = 1; i < this._cyclesOfRepetition; i++) { + for (let j = 0; j < 16; ++j) { + state[j] = s[state[j]]; + } + v = state[1]; + state[1] = state[5]; + state[5] = state[9]; + state[9] = state[13]; + state[13] = v; + v = state[2]; + u = state[6]; + state[2] = state[10]; + state[6] = state[14]; + state[10] = v; + state[14] = u; + v = state[3]; + u = state[7]; + t = state[11]; + state[3] = state[15]; + state[7] = v; + state[11] = u; + state[15] = t; + for (let j = 0; j < 16; j += 4) { + const s0 = state[j]; + const s1 = state[j + 1]; + const s2 = state[j + 2]; + const s3 = state[j + 3]; + t = s0 ^ s1 ^ s2 ^ s3; + state[j] ^= t ^ this._mixCol[s0 ^ s1]; + state[j + 1] ^= t ^ this._mixCol[s1 ^ s2]; + state[j + 2] ^= t ^ this._mixCol[s2 ^ s3]; + state[j + 3] ^= t ^ this._mixCol[s3 ^ s0]; + } + for (let j = 0, k = i * 16; j < 16; ++j, ++k) { + state[j] ^= key[k]; + } + } + for (let j = 0; j < 16; ++j) { + state[j] = s[state[j]]; + } + v = state[1]; + state[1] = state[5]; + state[5] = state[9]; + state[9] = state[13]; + state[13] = v; + v = state[2]; + u = state[6]; + state[2] = state[10]; + state[6] = state[14]; + state[10] = v; + state[14] = u; + v = state[3]; + u = state[7]; + t = state[11]; + state[3] = state[15]; + state[7] = v; + state[11] = u; + state[15] = t; + for (let j = 0, k = this._keySize; j < 16; ++j, ++k) { + state[j] ^= key[k]; + } + return state; + } + _decryptBlock2(data, finalize) { + const sourceLength = data.length; + let buffer = this.buffer, + bufferLength = this.bufferPosition; + const result = []; + let iv = this.iv; + for (let i = 0; i < sourceLength; ++i) { + buffer[bufferLength] = data[i]; + ++bufferLength; + if (bufferLength < 16) { + continue; + } + const plain = this._decrypt(buffer, this._key); + for (let j = 0; j < 16; ++j) { + plain[j] ^= iv[j]; + } + iv = buffer; + result.push(plain); + buffer = new Uint8Array(16); + bufferLength = 0; + } + this.buffer = buffer; + this.bufferLength = bufferLength; + this.iv = iv; + if (result.length === 0) { + return new Uint8Array(0); + } + let outputLength = 16 * result.length; + if (finalize) { + const lastBlock = result.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; + } + } + outputLength -= psLen; + result[result.length - 1] = lastBlock.subarray(0, 16 - psLen); + } + } + const output = new Uint8Array(outputLength); + for (let i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) { + output.set(result[i], j); + } + return output; + } + decryptBlock(data, finalize, iv = null) { + const sourceLength = data.length; + const buffer = this.buffer; + let bufferLength = this.bufferPosition; + if (iv) { + this.iv = iv; + } else { + for (let i = 0; bufferLength < 16 && i < sourceLength; ++i, ++bufferLength) { + buffer[bufferLength] = data[i]; + } + if (bufferLength < 16) { + this.bufferLength = bufferLength; + return new Uint8Array(0); + } + this.iv = buffer; + data = data.subarray(16); + } + this.buffer = new Uint8Array(16); + this.bufferLength = 0; + this.decryptBlock = this._decryptBlock2; + return this.decryptBlock(data, finalize); + } + encrypt(data, iv) { + const sourceLength = data.length; + let buffer = this.buffer, + bufferLength = this.bufferPosition; + const result = []; + iv ||= new Uint8Array(16); + for (let i = 0; i < sourceLength; ++i) { + buffer[bufferLength] = data[i]; + ++bufferLength; + if (bufferLength < 16) { + continue; + } + for (let j = 0; j < 16; ++j) { + buffer[j] ^= iv[j]; + } + const cipher = this._encrypt(buffer, this._key); + iv = cipher; + result.push(cipher); + buffer = new Uint8Array(16); + bufferLength = 0; + } + this.buffer = buffer; + this.bufferLength = bufferLength; + this.iv = iv; + if (result.length === 0) { + return new Uint8Array(0); + } + const outputLength = 16 * result.length; + const output = new Uint8Array(outputLength); + for (let i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) { + output.set(result[i], j); + } + return output; + } +} +class AES128Cipher extends AESBaseCipher { + _rcon = new Uint8Array([0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d]); + constructor(key) { + super(); + this._cyclesOfRepetition = 10; + this._keySize = 160; + this._key = this._expandKey(key); + } + _expandKey(cipherKey) { + const b = 176; + const s = this._s; + const rcon = this._rcon; + const result = new Uint8Array(b); + result.set(cipherKey); + for (let j = 16, i = 1; j < b; ++i) { + let t1 = result[j - 3]; + let t2 = result[j - 2]; + let t3 = result[j - 1]; + let t4 = result[j - 4]; + t1 = s[t1]; + t2 = s[t2]; + t3 = s[t3]; + t4 = s[t4]; + t1 ^= rcon[i]; + for (let n = 0; n < 4; ++n) { + result[j] = t1 ^= result[j - 16]; + j++; + result[j] = t2 ^= result[j - 16]; + j++; + result[j] = t3 ^= result[j - 16]; + j++; + result[j] = t4 ^= result[j - 16]; + j++; + } + } + return result; + } +} +class AES256Cipher extends AESBaseCipher { + constructor(key) { + super(); + this._cyclesOfRepetition = 14; + this._keySize = 224; + this._key = this._expandKey(key); + } + _expandKey(cipherKey) { + const b = 240; + const s = this._s; + const result = new Uint8Array(b); + result.set(cipherKey); + let r = 1; + let t1, t2, t3, t4; + for (let j = 32, i = 1; j < b; ++i) { + if (j % 32 === 16) { + t1 = s[t1]; + t2 = s[t2]; + t3 = s[t3]; + t4 = s[t4]; + } else if (j % 32 === 0) { + t1 = result[j - 3]; + t2 = result[j - 2]; + t3 = result[j - 1]; + t4 = result[j - 4]; + t1 = s[t1]; + t2 = s[t2]; + t3 = s[t3]; + t4 = s[t4]; + t1 ^= r; + if ((r <<= 1) >= 256) { + r = (r ^ 0x1b) & 0xff; + } + } + for (let n = 0; n < 4; ++n) { + result[j] = t1 ^= result[j - 32]; + j++; + result[j] = t2 ^= result[j - 32]; + j++; + result[j] = t3 ^= result[j - 32]; + j++; + result[j] = t4 ^= result[j - 32]; + j++; + } + } + return result; + } +} +class PDFBase { + _hash(password, input, userBytes) { + unreachable("Abstract method `_hash` called"); + } + 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(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(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(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 PDF17 extends PDFBase { + _hash(password, input, userBytes) { + return calculateSHA256(input, 0, input.length); + } +} +class PDF20 extends PDFBase { + _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 = Math.sumPrecise(e.slice(0, 16)) % 3; + if (remainder === 0) { + k = calculateSHA256(e, 0, e.length); + } else if (remainder === 1) { + k = calculateSHA384(e, 0, e.length); + } else if (remainder === 2) { + k = calculateSHA512(e, 0, e.length); + } + i++; + } + return k.subarray(0, 32); + } +} +class CipherTransform { + #cipherCache = new Map(); + embeddedFilterName = null; + constructor(resolveCipher, stringFilterName = null, streamFilterName = null) { + this.resolveCipher = resolveCipher; + this.streamFilterName = streamFilterName; + this.stringFilterName = stringFilterName; + } + #getCipher(filterName = null) { + const key = filterName instanceof Name ? filterName.name : "__default__"; + return this.#cipherCache.getOrInsertComputed(key, () => this.resolveCipher(filterName)); + } + createStream(stream, length, cryptFilterName = null) { + const defaultFilterName = this.embeddedFilterName && isDict(stream.dict, "EmbeddedFile") ? this.embeddedFilterName : this.streamFilterName; + const Cipher = this.#getCipher(cryptFilterName || defaultFilterName); + const cipher = new Cipher(); + return new DecryptStream(stream, length, function cipherTransformDecryptStream(data, finalize) { + return cipher.decryptBlock(data, finalize); + }); + } + decryptString(s) { + const Cipher = this.#getCipher(this.stringFilterName); + const cipher = new Cipher(); + let data = stringToBytes(s); + data = cipher.decryptBlock(data, true); + return bytesToString(data); + } + encryptString(s) { + const Cipher = this.#getCipher(this.stringFilterName); + const cipher = new Cipher(); + if (cipher instanceof AESBaseCipher) { + const strLen = s.length; + const pad = 16 - strLen % 16; + s += String.fromCharCode(pad).repeat(pad); + const iv = new Uint8Array(16); + crypto.getRandomValues(iv); + 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 data = stringToBytes(s); + data = cipher.encrypt(data); + return bytesToString(data); + } +} +function utf8PasswordToBytes(password) { + try { + password = utf8StringToString(password); + } catch { + warn("CipherTransformFactory: Unable to convert UTF8 encoded password."); + } + return stringToBytes(password); +} +class CipherTransformFactory { + #fileId; + static get _defaultPasswordBytes() { + return util_shadow(this, "_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])); + } + #createEncryptionKey20(revision, password, ownerPassword, ownerValidationSalt, ownerKeySalt, uBytes, userPassword, userValidationSalt, userKeySalt, ownerEncryption, userEncryption, perms) { + if (password) { + const passwordLength = Math.min(127, password.length); + password = password.subarray(0, passwordLength); + } else { + password = []; + } + 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; + } + #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++]; + } + hashData.set(ownerPassword, i); + i += ownerPassword.length; + hashData[i++] = flags & 0xff; + hashData[i++] = flags >> 8 & 0xff; + hashData[i++] = flags >> 16 & 0xff; + hashData[i++] = flags >>> 24 & 0xff; + hashData.set(fileId, i); + i += fileId.length; + if (revision >= 4 && !encryptMetadata) { + hashData.fill(0xff, i, i + 4); + i += 4; + } + 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) { + i = 0; + hashData.set(CipherTransformFactory._defaultPasswordBytes, i); + i += 32; + hashData.set(fileId, i); + i += fileId.length; + 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); + } + } else { + cipher = new ARCFourCipher(encryptionKey); + checkData = cipher.encryptBlock(CipherTransformFactory._defaultPasswordBytes); + } + return checkData.every((data, k) => userPassword[k] === data) ? encryptionKey : null; + } + #decodeUserPassword(password, ownerPassword, revision, keyLength) { + const hashData = new Uint8Array(32); + let i = 0; + const n = Math.min(32, password.length); + for (; i < n; ++i) { + hashData[i] = password[i]; + } + let j = 0; + while (i < 32) { + hashData[i++] = 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; + } + #buildObjectKey(num, gen, encryptionKey, isAes = false) { + const n = encryptionKey.length; + const key = new Uint8Array(n + 9); + key.set(encryptionKey); + let i = n; + 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(n + 5, 16)); + } + constructor(dict, fileId, password) { + const filter = dict.get("Filter"); + if (!isName(filter, "Standard")) { + throw new FormatError("unknown encryption method"); + } + this.filterName = filter.name; + this.dict = dict; + this.#fileId = fileId; + 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 = 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(keyLength) || keyLength < 40 || keyLength % 8 !== 0) { + throw new FormatError("invalid key length"); + } + let cf = null; + let stmf = Name.get("Identity"); + let strf = Name.get("Identity"); + let eff = stmf; + if (algorithm >= 4) { + cf = dict.get("CF"); + if (cf instanceof Dict) { + cf.suppressEncryption = true; + } + stmf = dict.get("StmF") || Name.get("Identity"); + strf = dict.get("StrF") || Name.get("Identity"); + eff = dict.get("EFF") || stmf; + } + this.cf = cf; + this.stmf = stmf; + this.strf = strf; + this.eff = eff; + 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, rawPasswordBytes; + if (password) { + if (revision === 6) { + const preppedPassword = saslPrep(password); + passwordBytes = utf8PasswordToBytes(preppedPassword); + if (preppedPassword !== password) { + rawPasswordBytes = utf8PasswordToBytes(password); + } + } else if (algorithm === 5) { + passwordBytes = utf8PasswordToBytes(password); + } else { + passwordBytes = stringToBytes(password); + } + } + 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")); + for (const candidate of rawPasswordBytes ? [passwordBytes, rawPasswordBytes] : [passwordBytes]) { + encryptionKey = this.#createEncryptionKey20(revision, candidate, ownerPassword, ownerValidationSalt, ownerKeySalt, uBytes, userPassword, userValidationSalt, userKeySalt, ownerEncryption, userEncryption, perms); + if (encryptionKey) { + break; + } + } + } + if (!encryptionKey) { + if (!password) { + if (this.algorithm >= 4 && isName(this.stmf, "Identity") && isName(this.strf, "Identity")) { + const effCF = this.cf?.get(this.eff.name); + const authEvent = effCF?.get("AuthEvent"); + if (isName(authEvent, "EFOpen")) { + this.encryptionKey = null; + return; + } + } + throw new PasswordException("No password given", PasswordResponses.NEED_PASSWORD); + } + const decodedPassword = this.#decodeUserPassword(passwordBytes, ownerPassword, revision, keyLength); + encryptionKey = this.#prepareKeyData(fileIdBytes, decodedPassword, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata); + } + if (!encryptionKey) { + throw new PasswordException("Incorrect Password", PasswordResponses.INCORRECT_PASSWORD); + } + if (algorithm === 4 && encryptionKey.length < 16) { + this.encryptionKey = new Uint8Array(16); + this.encryptionKey.set(encryptionKey); + } else { + this.encryptionKey = encryptionKey; + } + } + setPassword(password) { + const transform = new CipherTransformFactory(this.dict, this.#fileId, password); + this.encryptionKey = transform.encryptionKey; + } + createCipherTransform(num, gen) { + if (this.algorithm === 4 || this.algorithm === 5) { + const resolveCipher = filterName => { + if (!(filterName instanceof Name)) { + throw new FormatError("Invalid crypt filter name."); + } + const cryptFilter = this.cf.get(filterName.name); + const cfm = cryptFilter?.get("CFM"); + if (!cfm || cfm.name === "None") { + return NullCipher; + } + if (!this.encryptionKey) { + throw new PasswordException("No password given", PasswordResponses.NEED_PASSWORD); + } + if (this.algorithm === 5 || cfm.name === "AESV3") { + return AES256Cipher.bind(null, this.encryptionKey); + } + if (cfm.name === "V2") { + return ARCFourCipher.bind(null, this.#buildObjectKey(num, gen, this.encryptionKey, false)); + } + if (cfm.name === "AESV2") { + return AES128Cipher.bind(null, this.#buildObjectKey(num, gen, this.encryptionKey, true)); + } + throw new FormatError("Unknown crypto method"); + }; + const transform = new CipherTransform(resolveCipher, this.strf, this.stmf); + transform.embeddedFilterName = this.eff; + return transform; + } + const resolveCipher = () => ARCFourCipher.bind(null, this.#buildObjectKey(num, gen, this.encryptionKey, false)); + return new CipherTransform(resolveCipher); + } +} + +;// ./src/core/xref.js + + + + + + + + + + + + + + + + + + + + + +class XRef { + #cacheMap = new Map(); + #entries = []; + #newPersistentRefNum = null; + #newTemporaryRefNum = null; + #parsedWithRecovery = false; + #pendingRefs = new RefSet(); + #persistentRefsCache = null; + #xrefSectionOffsets = new Set(); + #xrefSectionsComplete = true; + #xrefStms = new Set(); + constructor(stream, pdfManager) { + this.stream = stream; + this.pdfManager = pdfManager; + } + 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 (this.#newTemporaryRefNum === null) { + this.#newTemporaryRefNum = this.#entries.length || 1; + if (this.#newPersistentRefNum) { + this.#persistentRefsCache = new Map(); + for (let i = this.#newTemporaryRefNum; i < this.#newPersistentRefNum; i++) { + this.#persistentRefsCache.set(i, this.#cacheMap.get(i)); + this.#cacheMap.delete(i); + } + } + } + return Ref.get(this.#newTemporaryRefNum++, 0); + } + resetNewTemporaryRef() { + this.#newTemporaryRefNum = null; + if (this.#persistentRefsCache) { + for (const [num, obj] of this.#persistentRefsCache) { + this.#cacheMap.set(num, obj); + } + } + this.#persistentRefsCache = null; + } + setStartXRef(startXRef) { + this.startXRefQueue = [startXRef]; + } + parse(recoveryMode = false) { + this.#parsedWithRecovery = recoveryMode; + let trailerDict; + if (!recoveryMode) { + trailerDict = this.readXRef(); + } else { + warn("Indexing all PDF objects"); + trailerDict = this.indexObjects(); + } + trailerDict.assignXref(this); + this.trailer = trailerDict; + let encrypt; + try { + encrypt = trailerDict.get("Encrypt"); + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn(`XRef.parse - Invalid "Encrypt" reference: "${ex}".`); + } + 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 { + root = trailerDict.get("Root"); + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn(`XRef.parse - Invalid "Root" reference: "${ex}".`); + } + if (root instanceof Dict) { + try { + const pages = root.get("Pages"); + if (pages instanceof Dict) { + this.root = root; + return; + } + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn(`XRef.parse - Invalid "Pages" reference: "${ex}".`); + } + } + if (!recoveryMode) { + throw new XRefParseException(); + } + throw new InvalidPDFException("Invalid Root reference."); + } + processXRefTable(parser) { + this._tableState ??= { + entryNum: 0, + 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 dict = parser.getObj(); + if (dict instanceof BaseStream) { + dict = dict.dict; + } + if (!(dict instanceof Dict)) { + throw new FormatError("Invalid XRef table: could not parse trailer dictionary"); + } + delete this._tableState; + return dict; + } + readXRefTable(parser) { + const stream = parser.lexer.stream; + const tableState = this._tableState; + stream.pos = tableState.streamPos; + parser.buf1 = tableState.parserBuf1; + parser.buf2 = tableState.parserBuf2; + let obj; + while (true) { + if (!("firstEntryNum" in tableState) || !("entryCount" in tableState)) { + if (isCmd(obj = parser.getObj(), "trailer")) { + break; + } + tableState.firstEntryNum = obj; + tableState.entryCount = parser.getObj(); + } + let first = tableState.firstEntryNum; + const count = tableState.entryCount; + if (!Number.isInteger(first) || !Number.isInteger(count)) { + throw new FormatError("Invalid XRef table: wrong types in subsection header"); + } + for (let i = tableState.entryNum; i < count; i++) { + tableState.streamPos = stream.pos; + tableState.entryNum = i; + tableState.parserBuf1 = parser.buf1; + tableState.parserBuf2 = parser.buf2; + const entry = { + offset: parser.getObj(), + gen: parser.getObj(), + free: false, + uncompressed: false + }; + const type = parser.getObj(); + if (type instanceof Cmd) { + switch (type.cmd) { + case "f": + entry.free = true; + break; + case "n": + entry.uncompressed = true; + break; + } + } + if (!Number.isInteger(entry.offset) || !Number.isInteger(entry.gen) || !(entry.free || entry.uncompressed)) { + throw new FormatError(`Invalid entry in XRef subsection: ${first}, ${count}`); + } + if (i === 0 && entry.free && first === 1) { + first = 0; + } + this.#entries[first + i] ??= entry; + } + 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) { + throw new FormatError("Invalid XRef table: unexpected first object"); + } + return obj; + } + processXRefStream(stream) { + if (!("streamState" in this)) { + const { + dict, + pos + } = stream; + const byteWidths = dict.get("W"); + const range = dict.get("Index") || [0, dict.get("Size")]; + this.streamState = { + entryRanges: range, + byteWidths, + entryNum: 0, + streamPos: pos + }; + } + this.readXRefStream(stream); + delete this.streamState; + return stream.dict; + } + 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 (![typeFieldWidth, offsetFieldWidth, generationFieldWidth].every(width => Number.isInteger(width) && width >= 0) || typeFieldWidth + offsetFieldWidth + generationFieldWidth === 0) { + 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'."); + } + type = type << 8 | typeByte; + } + 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'."); + } + offset = offset << 8 | offsetByte; + } + for (let j = 0; j < generationFieldWidth; ++j) { + const generationByte = stream.getByte(); + if (generationByte === -1) { + throw new FormatError("Invalid XRef byteWidths 'generation'."); + } + generation = generation << 8 | generationByte; + } + const entry = { + offset, + gen: generation, + free: false, + uncompressed: false + }; + switch (type) { + case 0: + entry.free = true; + break; + case 1: + entry.uncompressed = true; + break; + case 2: + break; + default: + throw new FormatError(`Invalid XRef entry type: ${type}`); + } + this.#entries[first + i] ??= entry; + } + streamState.entryNum = 0; + streamState.streamPos = stream.pos; + entryRanges.splice(0, 2); + } + } + indexObjects() { + 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 token; + } + 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 skipped; + } + 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 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 (ch === PERCENT) { + do { + ++position; + if (position >= length) { + break; + } + ch = buffer[position]; + } while (ch !== LF && ch !== CR); + continue; + } + const token = readToken(buffer, position); + let m; + if (token.startsWith("xref") && (token.length === 4 || /\s/.test(token[4]))) { + position += skipUntil(buffer, position, trailerBytes); + trailers.push(position); + position += skipUntil(buffer, position, startxrefBytes); + } else if (m = objRegExp.exec(token)) { + const num = m[1] | 0, + gen = m[2] | 0; + 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; + } + } + } + if (updateEntries) { + this.#entries[num] = { + offset: position - stream.start, + gen, + free: false, + 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 xrefStm of xrefStms) { + this.startXRefQueue.push(xrefStm); + this.readXRef(true); + } + const trailerDicts = []; + let isEncrypted = false; + for (const trailer of trailers) { + stream.pos = trailer; + const parser = new Parser({ + lexer: new Lexer(stream), + xref: this, + allowStreams: true, + recoveryMode: true + }); + const obj = parser.getObj(); + if (!isCmd(obj, "trailer")) { + continue; + } + 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 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 (validPagesDict && (!isEncrypted || dict.has("Encrypt")) && dict.has("ID")) { + return dict; + } + trailerDict = dict; + } + if (trailerDict) { + return trailerDict; + } + if (this.topDict) { + return this.topDict; + } + if (!trailerDicts.length) { + for (const num in this.#entries) { + const entry = this.#entries[num]; + if (!entry) { + continue; + } + const ref = Ref.get(parseInt(num, 10), entry.gen); + let obj; + try { + obj = this.fetch(ref); + } catch { + continue; + } + if (obj instanceof BaseStream) { + obj = obj.dict; + } + if (obj instanceof Dict && obj.has("Root")) { + return obj; + } + } + } + throw new InvalidPDFException("Invalid PDF structure."); + } + readXRef(recoveryMode = false) { + const stream = this.stream; + const startXRefParsedCache = new Set(); + while (this.startXRefQueue.length) { + try { + const startXRef = this.startXRefQueue[0]; + if (startXRefParsedCache.has(startXRef)) { + warn("readXRef - skipping XRef table since it was already parsed."); + this.startXRefQueue.shift(); + continue; + } + startXRefParsedCache.add(startXRef); + stream.pos = startXRef + stream.start; + const parser = new Parser({ + lexer: new Lexer(stream), + xref: this, + allowStreams: true + }); + let obj = parser.getObj(); + let dict; + if (isCmd(obj, "xref")) { + dict = this.processXRefTable(parser); + this.topDict ||= dict; + obj = dict.get("XRefStm"); + if (Number.isInteger(obj) && !this.#xrefStms.has(obj)) { + this.#xrefStms.add(obj); + this.startXRefQueue.push(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); + this.topDict ||= dict; + if (!dict) { + throw new FormatError("Failed to read XRef stream"); + } + } else { + throw new FormatError("Invalid XRef stream header"); + } + this.#xrefSectionOffsets.add(startXRef); + obj = dict.get("Prev"); + if (Number.isInteger(obj)) { + this.startXRefQueue.push(obj); + } else if (obj instanceof Ref) { + this.startXRefQueue.push(obj.num); + } + } catch (e) { + if (e instanceof MissingDataException) { + throw e; + } + this.#xrefSectionsComplete = false; + info("(while reading XRef): " + e); + } + this.startXRefQueue.shift(); + } + if (this.topDict) { + return this.topDict; + } + if (recoveryMode) { + return undefined; + } + throw new XRefParseException(); + } + countUpdatesAfter(offset) { + if (this.#parsedWithRecovery || !this.#xrefSectionsComplete) { + return null; + } + const relativeOffset = offset - this.stream.start; + let count = 0; + for (const sectionOffset of this.#xrefSectionOffsets) { + if (sectionOffset >= relativeOffset && !this.#xrefStms.has(sectionOffset)) { + count++; + } + } + return count; + } + getEntry(i) { + const entry = this.#entries[i]; + return entry && !entry.free && entry.offset ? entry : null; + } + fetchIfRef(obj, suppressEncryption = false) { + return obj instanceof Ref ? this.fetch(obj, suppressEncryption) : obj; + } + fetch(ref, suppressEncryption = false) { + if (!(ref instanceof Ref)) { + throw new Error("ref object is not a reference"); + } + 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; + } + let xrefEntry = this.getEntry(num); + if (xrefEntry === null) { + return xrefEntry; + } + if (this.#pendingRefs.has(ref)) { + this.#pendingRefs.remove(ref); + warn(`Ignoring circular reference: ${ref}.`); + return CIRCULAR_REF; + } + this.#pendingRefs.put(ref); + try { + 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; + } + if (xrefEntry instanceof Dict) { + xrefEntry.objId = ref.toString(); + } else if (xrefEntry instanceof BaseStream) { + xrefEntry.dict.objId = ref.toString(); + } + return xrefEntry; + } + 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(msg); + } + 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: ${ref}`); + } + 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(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 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; + const entry = this.getEntry(num); + if (entry?.offset === tableOffset && entry.gen !== i) { + entry.gen = i; + } + 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: true + }); + 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); + } + } + xrefEntry = entries[xrefEntry.gen]; + if (xrefEntry === undefined) { + throw new XRefEntryException(`Bad (compressed) XRef entry: ${ref}`); + } + return xrefEntry; + } + async fetchIfRefAsync(obj, suppressEncryption) { + return obj instanceof Ref ? this.fetchAsync(obj, suppressEncryption) : obj; + } + async fetchAsync(ref, suppressEncryption) { + try { + 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; + } +} + +;// ./src/core/document.js + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +const LETTER_SIZE_MEDIABOX = [0, 0, 612, 792]; +const SIGNATURE_TAIL_CHUNK_SIZE = 65536; +class Page { + #resourcesPromise = null; + constructor({ + pdfManager, + xref, + pageIndex, + pageDict, + ref, + globalIdFactory, + fontCache, + builtInCMapCache, + standardFontDataCache, + globalColorSpaceCache, + globalImageCache, + systemFontCache, + nonBlendModesSet, + xfaFactory + }) { + 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.globalColorSpaceCache = globalColorSpaceCache; + this.globalImageCache = globalImageCache; + this.systemFontCache = systemFontCache; + this.nonBlendModesSet = nonBlendModesSet; + this.evaluatorOptions = pdfManager.evaluatorOptions; + this.xfaFactory = xfaFactory; + const idCounters = { + obj: 0 + }; + this._localIdFactory = class extends globalIdFactory { + static createObjId() { + return `p${pageIndex}_${++idCounters.obj}`; + } + static getPageObjId() { + return `p${ref.toString()}`; + } + }; + } + _createPartialEvaluator(handler, pageIndex = this.pageIndex, pageProxyId = null) { + return new PartialEvaluator({ + xref: this.xref, + handler, + pageIndex, + pageProxyId, + idFactory: this._localIdFactory, + fontCache: this.fontCache, + builtInCMapCache: this.builtInCMapCache, + standardFontDataCache: this.standardFontDataCache, + globalColorSpaceCache: this.globalColorSpaceCache, + globalImageCache: this.globalImageCache, + systemFontCache: this.systemFontCache, + options: this.evaluatorOptions + }); + } + #getInheritableProperty(key, getArray = false) { + const value = getInheritableProperty({ + dict: this.pageDict, + key, + getArray, + stopWhenFound: false + }); + if (!Array.isArray(value)) { + return value; + } + return value.length === 1 || !(value[0] instanceof Dict) ? value[0] : Dict.merge({ + xref: this.xref, + dictArray: value + }); + } + get content() { + return this.pageDict.getArray("Contents"); + } + get resources() { + const resources = this.#getInheritableProperty("Resources"); + return util_shadow(this, "resources", resources instanceof Dict ? resources : Dict.empty); + } + 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 util_shadow(this, "mediaBox", this.getBoundingBox("MediaBox") || LETTER_SIZE_MEDIABOX); + } + get cropBox() { + return util_shadow(this, "cropBox", this.getBoundingBox("CropBox") || this.mediaBox); + } + get userUnit() { + const obj = this.pageDict.get("UserUnit"); + return util_shadow(this, "userUnit", typeof obj === "number" && obj > 0 ? obj : 1.0); + } + get view() { + 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 util_shadow(this, "view", box); + } + warn("Empty /CropBox and /MediaBox intersection."); + } + return util_shadow(this, "view", mediaBox); + } + get rotate() { + 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 util_shadow(this, "rotate", rotate); + } + #onSubStreamError(reason, objId) { + if (this.evaluatorOptions.ignoreErrors) { + warn(`getContentStream - ignoring sub-stream (${objId}): "${reason}".`); + return; + } + throw reason; + } + async getContentStream() { + const content = await this.pdfManager.ensure(this, "content"); + if (content instanceof BaseStream && !content.isImageStream) { + if (content.isAsync) { + const bytes = await content.asyncGetBytes(); + if (bytes) { + return new Stream(bytes, 0, bytes.length, content.dict); + } + } + return content; + } + if (Array.isArray(content)) { + const promises = []; + for (let i = 0, ii = content.length; i < ii; i++) { + const item = content[i]; + if (item instanceof BaseStream && item.isAsync) { + promises.push(item.asyncGetBytes().then(bytes => { + if (bytes) { + content[i] = new Stream(bytes, 0, bytes.length, item.dict); + } + })); + } + } + if (promises.length > 0) { + await Promise.all(promises); + } + return new StreamsSequenceStream(content, this.#onSubStreamError.bind(this)); + } + return new NullStream(); + } + get xfaData() { + return util_shadow(this, "xfaData", this.xfaFactory ? { + bbox: this.xfaFactory.getBoundingBox(this.pageIndex) + } : null); + } + async #replaceIdByRef(annotations, deletedAnnotations, existingAnnotations) { + const promises = []; + for (const annotation of annotations) { + if (!annotation.id) { + continue; + } + const ref = Ref.fromString(annotation.id); + if (!ref) { + warn(`A non-linked annotation cannot be modified: ${annotation.id}`); + continue; + } + if (annotation.deleted) { + deletedAnnotations.put(ref); + if (annotation.popupRef) { + const popupRef = Ref.fromString(annotation.popupRef); + if (popupRef) { + deletedAnnotations.put(popupRef); + } + } + continue; + } + if (annotation.popup?.deleted) { + const popupRef = Ref.fromString(annotation.popupRef); + if (popupRef) { + deletedAnnotations.put(popupRef); + } + } + 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(handler, task, annotations, imagePromises, changes) { + if (this.xfaFactory) { + throw new Error("XFA: Cannot save new annotations."); + } + const partialEvaluator = this._createPartialEvaluator(handler); + const deletedAnnotations = new RefSet(); + 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, this.xref, task, annotations, imagePromises, changes); + for (const { + ref + } of newData.annotations) { + if (ref instanceof Ref && !existingAnnotations.has(ref)) { + annotationsArray.push(ref); + } + } + const dict = pageDict.clone(); + dict.set("Annots", annotationsArray); + changes.put(this.ref, { + data: dict + }); + for (const deletedRef of deletedAnnotations) { + changes.put(deletedRef, { + data: null + }); + } + } + async save(handler, task, annotationStorage, changes) { + const partialEvaluator = this._createPartialEvaluator(handler); + const annotations = await this._parsedAnnotations; + const promises = []; + for (const annotation of annotations) { + promises.push(annotation.save(partialEvaluator, task, annotationStorage, changes).catch(reason => { + warn("save - ignoring annotation data during " + `"${task.name}" task: "${reason}".`); + return null; + })); + } + return Promise.all(promises); + } + async loadResources(keys) { + await (this.#resourcesPromise ??= this.pdfManager.ensure(this, "resources")); + await ObjectLoader.load(this.resources, keys, this.xref); + } + async #getMergedResources(streamDict, keys) { + const localResources = streamDict?.get("Resources"); + if (!(localResources instanceof Dict && localResources.size)) { + return this.resources; + } + await ObjectLoader.load(localResources, keys, this.xref); + return Dict.merge({ + xref: this.xref, + dictArray: [localResources, this.resources], + mergeSubDicts: true + }); + } + async getOperatorList({ + handler, + sink, + task, + intent, + cacheKey, + pageIndex = this.pageIndex, + pageProxyId = null, + annotationStorage = null, + modifiedIds = null + }) { + const contentStreamPromise = this.getContentStream(); + const resourcesPromise = this.loadResources(RESOURCES_KEYS_OPERATOR_LIST); + const partialEvaluator = this._createPartialEvaluator(handler, pageIndex, pageProxyId); + 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(async ([contentStream]) => { + const resources = await this.#getMergedResources(contentStream.dict, RESOURCES_KEYS_OPERATOR_LIST); + const opList = new OperatorList(intent, sink); + handler.send("StartRenderPage", { + transparency: partialEvaluator.hasBlendModes(resources, this.nonBlendModesSet), + pageProxyId, + cacheKey + }); + await partialEvaluator.getOperatorList({ + stream: contentStream, + task, + resources, + operatorList: opList + }); + return opList; + }); + let [pageOpList, annotations, newAnnotations] = await Promise.all([pageListPromise, this._parsedAnnotations, newAnnotationsPromise]); + 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 (j >= 0) { + annotations.splice(j, 1, newAnnotation); + newAnnotations.splice(i--, 1); + ii--; + } + } + } + annotations = annotations.concat(newAnnotations); + } + if (annotations.length === 0 || intent & RenderingIntentFlag.ANNOTATIONS_DISABLE) { + pageOpList.flush(true); + return; + } + 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(reason => { + warn("getOperatorList - ignoring annotation data during " + `"${task.name}" task: "${reason}".`); + return { + opList: null, + separateForm: false, + separateCanvas: false + }; + })); + } + } + const opLists = await Promise.all(opListPromises); + let form = false, + canvas = false; + for (const { + opList, + separateForm, + separateCanvas + } of opLists) { + pageOpList.addOpList(opList); + form ||= separateForm; + canvas ||= separateCanvas; + } + pageOpList.flush(true, { + form, + canvas + }); + } + async extractTextContent({ + handler, + task, + includeMarkedContent, + disableNormalization, + sink, + intersector = null + }) { + const contentStreamPromise = this.getContentStream(); + const resourcesPromise = this.loadResources(RESOURCES_KEYS_TEXT_CONTENT); + const langPromise = this.pdfManager.ensureCatalog("lang"); + const [contentStream,, lang] = await Promise.all([contentStreamPromise, resourcesPromise, langPromise]); + const resources = await this.#getMergedResources(contentStream.dict, RESOURCES_KEYS_TEXT_CONTENT); + const partialEvaluator = this._createPartialEvaluator(handler); + return partialEvaluator.getTextContent({ + stream: contentStream, + task, + resources, + includeMarkedContent, + disableNormalization, + sink, + viewBox: this.view, + lang, + intersector + }); + } + async getStructTree() { + const structTreeRoot = await this.pdfManager.ensureCatalog("structTreeRoot"); + if (!structTreeRoot) { + return null; + } + await this._parsedAnnotations; + try { + const structTree = await this.pdfManager.ensure(this, "_parseStructTree", [structTreeRoot]); + return await this.pdfManager.ensure(structTree, "serializable"); + } catch (ex) { + warn(`getStructTree: "${ex}".`); + return null; + } + } + _parseStructTree(structTreeRoot) { + const tree = new StructTreePage(structTreeRoot, this.pageDict); + tree.parse(this.ref); + return tree; + } + 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); + const highlightedAnnotations = []; + 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 ??= this._createPartialEvaluator(handler); + textContentPromises.push(annotation.extractTextContent(partialEvaluator, task, [-Infinity, -Infinity, Infinity, Infinity]).catch(reason => { + warn(`getAnnotationsData - ignoring textContent during "${task.name}" task: "${reason}".`); + })); + } else if (annotation.overlaysTextContent && isVisible) { + highlightedAnnotations.push(annotation); + } + } + if (highlightedAnnotations.length > 0) { + const intersector = new Intersector(highlightedAnnotations); + textContentPromises.push(this.extractTextContent({ + handler, + task, + includeMarkedContent: false, + disableNormalization: false, + sink: null, + intersector + }).then(() => { + intersector.setText(); + })); + } + await Promise.all(textContentPromises); + return annotationsData; + } + get annotations() { + const annots = this.#getInheritableProperty("Annots"); + return util_shadow(this, "annotations", Array.isArray(annots) ? annots : []); + } + get _parsedAnnotations() { + 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, annotationRef, annotationGlobals, this._localIdFactory, false, orphanFields, null, this.ref).catch(reason => { + warn(`_parsedAnnotations: "${reason}".`); + return null; + })); + } + 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 util_shadow(this, "_parsedAnnotations", promise); + } + get jsActions() { + const actions = collectActions(this.xref, this.pageDict, PageActionEventType); + return util_shadow(this, "jsActions", actions); + } + async collectAnnotationsByType(handler, task, types, promises, annotationGlobals) { + const { + pageIndex + } = this; + if (Object.hasOwn(this, "_parsedAnnotations")) { + const cachedAnnotations = await this._parsedAnnotations; + for (const { + data + } of cachedAnnotations) { + if (!types || types.has(data.annotationType)) { + data.pageIndex = pageIndex; + promises.push(Promise.resolve(data)); + } + } + return; + } + const annots = await this.pdfManager.ensure(this, "annotations"); + let partialEvaluator; + for (const annotationRef of annots) { + promises.push(AnnotationFactory.create(this.xref, annotationRef, annotationGlobals, this._localIdFactory, false, null, types, this.ref).then(async annotation => { + if (!annotation) { + return null; + } + annotation.data.pageIndex = pageIndex; + if (annotation.hasTextContent && annotation.viewable) { + partialEvaluator ??= this._createPartialEvaluator(handler); + await annotation.extractTextContent(partialEvaluator, task, [-Infinity, -Infinity, Infinity, Infinity]); + } + return annotation.data; + }).catch(reason => { + warn(`collectAnnotationsByType: "${reason}".`); + return null; + })); + } + } +} +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 document_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++; + } + if (j >= signatureLength) { + stream.pos += pos - signatureEnd; + return true; + } + pos--; + } + } else { + let pos = 0; + while (pos <= scanLength) { + let j = 0; + while (j < signatureLength && scanBytes[pos + j] === signature[j]) { + j++; + } + if (j >= signatureLength) { + stream.pos += pos; + return true; + } + pos++; + } + } + return false; +} +class PDFDocument { + #pagePromises = new Map(); + #signatureData = null; + #version = null; + constructor(pdfManager, stream) { + if (stream.length <= 0) { + throw new InvalidPDFException("The PDF file is empty, i.e. its size is zero bytes."); + } + this.pdfManager = pdfManager; + this.stream = stream; + this.xref = new XRef(stream, pdfManager); + const idCounters = { + font: 0 + }; + this._globalIdFactory = class { + static getDocId() { + return `g_${pdfManager.docId}`; + } + static createFontId() { + return `f${++idCounters.font}`; + } + static createObjId() { + unreachable("Abstract method `createObjId` called."); + } + static getPageObjId() { + unreachable("Abstract method `getPageObjId` called."); + } + }; + } + parse(recoveryMode) { + this.xref.parse(recoveryMode); + this.catalog = new Catalog(this.pdfManager, this.xref); + } + get linearization() { + let linearization = null; + try { + linearization = Linearization.create(this.stream); + } catch (err) { + if (err instanceof MissingDataException) { + throw err; + } + info(err); + } + return util_shadow(this, "linearization", linearization); + } + get startXRef() { + const stream = this.stream; + let startXRef = 0; + if (this.linearization) { + stream.reset(); + if (document_find(stream, ENDOBJ_SIGNATURE)) { + stream.skip(6); + let ch = stream.peekByte(); + while (isWhiteSpace(ch)) { + stream.pos++; + ch = stream.peekByte(); + } + startXRef = stream.pos - stream.start; + } + } else { + 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 = document_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; + } + } + } + return util_shadow(this, "startXRef", startXRef); + } + checkHeader() { + const stream = this.stream; + stream.reset(); + if (!document_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 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 util_shadow(this, "numPages", num); + } + #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; + } + return this.#hasOnlyDocumentSignatures(field.get("Kids"), recursionDepth); + } + const isSignature = isName(getInheritableProperty({ + dict: field, + key: "FT" + }), "Sig"); + const rectangle = field.get("Rect"); + const isInvisible = Array.isArray(rectangle) && rectangle.every(value => value === 0); + return isSignature && isInvisible; + }); + } + get _xfaStreams() { + const { + acroForm + } = this.catalog; + if (!acroForm) { + return null; + } + const xfa = acroForm.get("XFA"); + const entries = new Map(["xdp:xdp", "template", "datasets", "config", "connectionSet", "localeSet", "stylesheet", "/xdp:xdp"].map(e => [e, null])); + if (xfa instanceof BaseStream && !xfa.isEmpty) { + entries.set("xdp:xdp", xfa); + return entries; + } + 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.has(name)) { + continue; + } + const data = this.xref.fetchIfRef(xfa[i + 1]); + if (!(data instanceof BaseStream) || data.isEmpty) { + continue; + } + entries.set(name, data); + } + return entries; + } + get xfaDatasets() { + const streams = this._xfaStreams; + if (!streams) { + return util_shadow(this, "xfaDatasets", null); + } + for (const key of ["datasets", "xdp:xdp"]) { + const stream = streams.get(key); + if (!stream) { + continue; + } + try { + const str = stringToUTF8String(stream.getString()); + const data = { + [key]: str + }; + return util_shadow(this, "xfaDatasets", new DatasetReader(data)); + } catch { + warn("XFA - Invalid utf-8 string."); + break; + } + } + return util_shadow(this, "xfaDatasets", null); + } + get xfaData() { + const streams = this._xfaStreams; + if (!streams) { + return null; + } + const data = new Map(); + for (const [key, stream] of streams) { + if (!stream) { + continue; + } + try { + data.set(key, stringToUTF8String(stream.getString())); + } catch { + warn("XFA - Invalid utf-8 string."); + return null; + } + } + return data; + } + get xfaFactory() { + let data; + if (this.pdfManager.enableXfa && this.catalog.needsRendering && this.formInfo.hasXfa && !this.formInfo.hasAcroForm) { + data = this.xfaData; + } + return util_shadow(this, "xfaFactory", data ? new XFAFactory(data) : null); + } + get isPureXfa() { + return this.xfaFactory ? this.xfaFactory.isValid() : false; + } + get htmlForXfa() { + return this.xfaFactory ? this.xfaFactory.getPages() : null; + } + async #loadXfaImages() { + const xfaImages = await this.pdfManager.ensureCatalog("xfaImages"); + if (!xfaImages) { + return; + } + this.xfaFactory.setImages(xfaImages); + } + async #loadXfaFonts(handler, task) { + const acroForm = await this.pdfManager.ensureCatalog("acroForm"); + if (!acroForm) { + return; + } + const resources = await acroForm.getAsync("DR"); + if (!(resources instanceof Dict)) { + return; + } + await ObjectLoader.load(resources, ["Font"], this.xref); + const fontRes = resources.get("Font"); + if (!(fontRes instanceof Dict)) { + return; + } + const options = Object.assign(Object.create(null), this.pdfManager.evaluatorOptions, { + useSystemFonts: false + }); + const { + builtInCMapCache, + fontCache, + standardFontDataCache + } = this.catalog; + const partialEvaluator = new PartialEvaluator({ + xref: this.xref, + handler, + pageIndex: -1, + idFactory: this._globalIdFactory, + fontCache, + builtInCMapCache, + standardFontDataCache, + options + }); + const operatorList = new OperatorList(); + const pdfFonts = []; + const initialState = { + get font() { + return pdfFonts.at(-1); + }, + set font(font) { + pdfFonts.push(font); + }, + clone() { + return this; + } + }; + const parseFont = (fontName, fallbackFontDict, cssFontInfo) => partialEvaluator.handleSetFont(resources, [Name.get(fontName), 1], null, operatorList, task, initialState, fallbackFontDict, cssFontInfo).catch(reason => { + warn(`loadXfaFonts: "${reason}".`); + return null; + }); + const promises = []; + for (const [fontName, font] of fontRes) { + const descriptor = font.get("FontDescriptor"); + if (!(descriptor instanceof Dict)) { + continue; + } + const fontFamily = normalizeCSSFontFamily(descriptor.get("FontFamily")); + const fontWeight = descriptor.get("FontWeight"); + const italicAngle = -descriptor.get("ItalicAngle"); + const cssFontInfo = { + fontFamily, + fontWeight, + italicAngle + }; + if (!validateCSSFont(cssFontInfo)) { + continue; + } + promises.push(parseFont(fontName, null, cssFontInfo)); + } + 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}`; + promises.push(parseFont(name, getXfaFontDict(name), { + fontFamily: missing, + fontWeight: fontInfo.fontWeight, + italicAngle: fontInfo.italicAngle + })); + } + } + await Promise.all(promises); + this.xfaFactory.appendFonts(pdfFonts, reallyMissingFonts); + } + loadXfaResources(handler, task) { + return Promise.all([this.#loadXfaFonts(handler, task).catch(() => {}), this.#loadXfaImages()]); + } + serializeXfaData(annotationStorage) { + return this.xfaFactory ? this.xfaFactory.serializeData(annotationStorage) : null; + } + get version() { + return this.catalog.version || this.#version; + } + get formInfo() { + const formInfo = { + hasFields: false, + hasAcroForm: false, + hasXfa: false, + hasSignatures: false + }; + const { + acroForm + } = this.catalog; + if (!acroForm) { + return util_shadow(this, "formInfo", formInfo); + } + 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 util_shadow(this, "formInfo", formInfo); + } + get documentInfo() { + const { + catalog, + formInfo, + xref + } = this; + const docInfo = { + PDFFormatVersion: this.version, + Language: catalog.lang, + EncryptFilterName: xref.encrypt?.filterName ?? null, + IsLinearized: !!this.linearization, + IsAcroFormPresent: formInfo.hasAcroForm, + IsXFAPresent: formInfo.hasXfa, + IsCollectionPresent: !!catalog.collection, + IsSignaturesPresent: formInfo.hasSignatures + }; + let infoDict; + try { + infoDict = xref.trailer.get("Info"); + } catch (err) { + if (err instanceof MissingDataException) { + throw err; + } + info("The document information dictionary is invalid."); + } + if (!(infoDict instanceof Dict)) { + return util_shadow(this, "documentInfo", docInfo); + } + for (const [key, value] of infoDict) { + switch (key) { + case "Title": + case "Author": + case "Subject": + case "Keywords": + case "Creator": + case "Producer": + case "CreationDate": + case "ModDate": + if (typeof value === "string") { + docInfo[key] = stringToPDFString(value); + continue; + } + break; + case "Trapped": + if (value instanceof Name) { + docInfo[key] = value; + continue; + } + break; + default: + let customValue; + switch (typeof value) { + case "string": + customValue = stringToPDFString(value); + break; + case "number": + case "boolean": + customValue = value; + break; + default: + if (value instanceof Name) { + customValue = value; + break; + } + warn(`Bad value, for custom key "${key}", in Info: ${value}.`); + continue; + } + (docInfo.Custom ??= new Map()).set(key, customValue); + continue; + } + warn(`Bad value, for key "${key}", in Info: ${value}.`); + } + return util_shadow(this, "documentInfo", docInfo); + } + get fingerprints() { + const FINGERPRINT_FIRST_BYTES = 1024; + const EMPTY_FINGERPRINT = "\x00".repeat(16); + function validate(data) { + return typeof data === "string" && data.length === 16 && data !== EMPTY_FINGERPRINT; + } + 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]); + } + } else { + hashOriginal = calculateMD5(this.stream.getByteRange(0, FINGERPRINT_FIRST_BYTES), 0, FINGERPRINT_FIRST_BYTES); + } + return util_shadow(this, "fingerprints", [hashOriginal.toHex(), hashModified?.toHex() ?? null]); + } + async #getLinearizationPage(pageIndex) { + const { + catalog, + linearization, + xref + } = this; + const ref = Ref.get(linearization.objectNumberFirst, 0); + try { + 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(type, "Page") || !obj.has("Type") && !obj.has("Kids") && obj.has("Contents")) { + 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 (reason) { + warn(`_getLinearizationPage: "${reason.message}".`); + return catalog.getPageDict(pageIndex); + } + } + 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]) => new Page({ + pdfManager: this.pdfManager, + xref: this.xref, + pageIndex, + pageDict, + ref, + globalIdFactory: this._globalIdFactory, + fontCache: catalog.fontCache, + builtInCMapCache: catalog.builtInCMapCache, + standardFontDataCache: catalog.standardFontDataCache, + globalColorSpaceCache: catalog.globalColorSpaceCache, + globalImageCache: catalog.globalImageCache, + systemFontCache: catalog.systemFontCache, + nonBlendModesSet: catalog.nonBlendModesSet, + xfaFactory + })); + this.#pagePromises.set(pageIndex, promise); + return promise; + } + 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(recoveryMode = false) { + const { + catalog, + pdfManager + } = this; + catalog.setActualNumPages(); + let numPages; + try { + await Promise.all([pdfManager.ensureDoc("xfaFactory"), pdfManager.ensureDoc("linearization"), pdfManager.ensureCatalog("numPages")]); + 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."); + } else if (numPages <= 1) { + return; + } + 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, + xref: this.xref, + pageIndex, + pageDict, + ref, + globalIdFactory: this._globalIdFactory, + fontCache: catalog.fontCache, + builtInCMapCache: catalog.builtInCMapCache, + standardFontDataCache: catalog.standardFontDataCache, + globalColorSpaceCache: this.globalColorSpaceCache, + globalImageCache: catalog.globalImageCache, + systemFontCache: catalog.systemFontCache, + nonBlendModesSet: catalog.nonBlendModesSet, + xfaFactory: null + })); + } + this.#pagePromises.set(pageIndex, promise); + } + catalog.setActualNumPages(pagesTree.size); + } + } + async fontFallback(id, handler) { + const { + catalog, + pdfManager + } = this; + for (const translatedFont of await Promise.all(catalog.fontCache)) { + if (translatedFont.loadedName === id) { + translatedFont.fallback(handler, pdfManager.evaluatorOptions); + return; + } + } + } + async cleanup(manuallyTriggered = false) { + return this.catalog ? this.catalog.cleanup(manuallyTriggered) : clearGlobalCaches(); + } + 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; + } + let subtype = await field.getAsync("Subtype"); + subtype = subtype instanceof Name ? subtype.name : null; + switch (subtype) { + case "Link": + return; + } + if (field.has("T")) { + const partName = stringToPDFString(await field.getAsync("T")); + name = name === "" ? partName : `${name}.${partName}`; + } else { + let obj = field; + const walkedRefs = new RefSet(); + while (true) { + obj = obj.getRaw("Parent") || parentRef; + if (obj instanceof Ref) { + if (visitedRefs.has(obj) || walkedRefs.has(obj)) { + break; + } + walkedRefs.put(obj); + obj = await xref.fetchAsync(obj); + } + if (!(obj instanceof Dict)) { + break; + } + if (obj.has("T")) { + const partName = stringToPDFString(await obj.getAsync("T")); + name = name === "" ? partName : `${name}.${partName}`; + break; + } + } + } + if (parentRef && !field.has("Parent") && isName(field.get("Subtype"), "Widget")) { + orphanFields.put(fieldRef, parentRef); + } + promises.getOrInsertComputed(name, makeArr).push(AnnotationFactory.create(xref, fieldRef, annotationGlobals, null, true, orphanFields, null, null).then(annotation => annotation?.getFieldObject()).catch(reason => { + warn(`#collectFieldObjects: "${reason}".`); + return null; + })); + 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() { + const promise = this.pdfManager.ensureDoc("formInfo").then(async formInfo => { + if (!formInfo.hasFields) { + return null; + } + const annotationGlobals = await this.annotationGlobals; + if (!annotationGlobals) { + return null; + } + const { + acroForm + } = annotationGlobals; + const visitedRefs = new RefSet(); + const allFields = new Map(); + const fieldPromises = new Map(); + const orphanFields = new RefMap(); + for (const fieldRef of acroForm.get("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(Boolean); + if (fields.length > 0) { + allFields.set(name, fields); + } + })); + } + await Promise.all(allPromises); + return { + allFields: allFields.size ? allFields : null, + orphanFields + }; + }); + return util_shadow(this, "fieldObjects", promise); + } + async #collectSignatureFields(fields, out, visitedRefs) { + if (!Array.isArray(fields)) { + return; + } + for (const fieldRef of fields) { + if (fieldRef instanceof Ref) { + if (visitedRefs.has(fieldRef)) { + continue; + } + visitedRefs.put(fieldRef); + } + const field = await this.xref.fetchIfRefAsync(fieldRef); + if (!(field instanceof Dict)) { + continue; + } + if (isName(await field.getAsync("FT"), "Sig")) { + const sigDict = await field.getAsync("V"); + if (sigDict instanceof Dict) { + const parsed = await this.#parseSignatureDict(field, sigDict, fieldRef); + if (parsed) { + out.push(parsed); + } + } + } + if (field.has("Kids")) { + await this.#collectSignatureFields(await field.getAsync("Kids"), out, visitedRefs); + } + } + } + async #getByteRange(begin, end) { + try { + return this.stream.getByteRange(begin, end); + } catch (ex) { + if (!(ex instanceof MissingDataException)) { + throw ex; + } + await this.pdfManager.requestRange(begin, end); + return this.#getByteRange(begin, end); + } + } + async #coversWholeDocument(signedEnd, modificationsAfterSignature) { + if (modificationsAfterSignature > 0) { + return false; + } + const fileLength = this.stream.end; + for (let begin = signedEnd; begin < fileLength; begin += SIGNATURE_TAIL_CHUNK_SIZE) { + const end = Math.min(begin + SIGNATURE_TAIL_CHUNK_SIZE, fileLength); + const tail = await this.#getByteRange(begin, end); + for (const byte of tail) { + if (byte !== 0x00 && byte !== 0x09 && byte !== 0x0a && byte !== 0x0c && byte !== 0x0d && byte !== 0x20) { + return false; + } + } + } + return true; + } + async #parseSignatureDict(field, sigDict, fieldRef) { + const byteRange = await sigDict.getAsync("ByteRange"); + if (!Array.isArray(byteRange) || byteRange.length !== 4 || byteRange.some(n => !Number.isInteger(n) || n < 0)) { + return null; + } + const [a, b, c, d] = byteRange; + const fileLength = this.stream.end || 0; + if (a !== 0 || b <= 0 || a + b > c || c + d > fileLength || fileLength === 0) { + return null; + } + const contents = await sigDict.getAsync("Contents"); + if (typeof contents !== "string" || contents.length === 0) { + return null; + } + const [filterName, subFilterName, t, name, reason, location, contactInfo, m] = await Promise.all([sigDict.getAsync("Filter"), sigDict.getAsync("SubFilter"), field.getAsync("T"), sigDict.getAsync("Name"), sigDict.getAsync("Reason"), sigDict.getAsync("Location"), sigDict.getAsync("ContactInfo"), sigDict.getAsync("M")]); + const filter = filterName instanceof Name ? filterName.name : null, + subFilter = subFilterName instanceof Name ? subFilterName.name : null; + let signatureType = null; + if (subFilter === "adbe.pkcs7.detached") { + signatureType = 0; + } else if (subFilter === "adbe.pkcs7.sha1") { + signatureType = 1; + } + const refKey = fieldRef instanceof Ref ? fieldRef.toString() : "inline"; + return { + id: `${refKey}:${a}-${b}-${c}-${d}`, + fieldName: typeof t === "string" ? stringToPDFString(t) : "", + signerName: typeof name === "string" ? stringToPDFString(name) : null, + reason: typeof reason === "string" ? stringToPDFString(reason) : null, + location: typeof location === "string" ? stringToPDFString(location) : null, + contactInfo: typeof contactInfo === "string" ? stringToPDFString(contactInfo) : null, + signingTime: typeof m === "string" ? m : null, + filter, + subFilter, + signatureType, + byteRange, + pkcs7: stringToBytes(contents), + revisionIndex: 0, + parentId: null + }; + } + get signatures() { + const promise = this.pdfManager.ensureDoc("formInfo").then(async formInfo => { + if (!formInfo.hasSignatures || !formInfo.hasFields) { + return null; + } + const annotationGlobals = await this.annotationGlobals; + if (!annotationGlobals) { + return null; + } + const fields = annotationGlobals.acroForm.get("Fields"); + const collected = []; + await this.#collectSignatureFields(fields, collected, new RefSet()); + await Promise.all(collected.map(async signature => { + const signedEnd = signature.byteRange[2] + signature.byteRange[3]; + signature.modificationsAfterSignature = this.xref.countUpdatesAfter(signedEnd); + signature.coversWholeDocument = await this.#coversWholeDocument(signedEnd, signature.modificationsAfterSignature); + })); + collected.sort((a, b) => b.byteRange[2] + b.byteRange[3] - (a.byteRange[2] + a.byteRange[3])); + for (let i = 0, ii = collected.length; i < ii; i++) { + const sig = collected[i]; + sig.revisionIndex = i; + for (let j = i - 1; j >= 0; j--) { + const candidate = collected[j]; + if (candidate.byteRange[2] + candidate.byteRange[3] > sig.byteRange[2] + sig.byteRange[3]) { + sig.parentId = candidate.id; + break; + } + } + } + const signatureData = new Map(); + const metadata = collected.map(sig => { + const { + pkcs7, + ...rest + } = sig; + signatureData.set(sig.id, { + byteRange: sig.byteRange, + pkcs7 + }); + return rest; + }); + this.#signatureData = signatureData; + return metadata.length ? metadata : null; + }); + return util_shadow(this, "signatures", promise); + } + async getSignatureData(id) { + await this.signatures; + const signature = this.#signatureData?.get(id); + if (!signature) { + return null; + } + const { + byteRange, + pkcs7 + } = signature; + const [a, b, c, d] = byteRange; + const data = await Promise.all([this.#getByteRange(a, a + b), this.#getByteRange(c, c + d)]); + return { + data, + pkcs7 + }; + } + get hasJSActions() { + const promise = Promise.all([this.pdfManager.ensureCatalog("jsActions"), this.pdfManager.ensureDoc("fieldObjects")]).then(([catalogJsActions, fieldObjects]) => { + if (catalogJsActions) { + return true; + } + if (fieldObjects?.allFields) { + return fieldObjects.allFields.values().some(fieldObj => fieldObj.some(obj => obj.actions !== null)); + } + return false; + }); + return util_shadow(this, "hasJSActions", promise); + } + get calculationOrderIds() { + const calculationOrder = this.catalog.acroForm?.get("CO"); + if (!Array.isArray(calculationOrder) || calculationOrder.length === 0) { + return util_shadow(this, "calculationOrderIds", null); + } + const ids = []; + for (const id of calculationOrder) { + if (id instanceof Ref) { + ids.push(id.toString()); + } + } + return util_shadow(this, "calculationOrderIds", ids.length ? ids : null); + } + get annotationGlobals() { + return util_shadow(this, "annotationGlobals", AnnotationFactory.createGlobals(this.pdfManager)); + } + async toJSObject(value, firstCall = true) { + throw new Error("Not implemented: toJSObject"); + } +} + +;// ./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({ + docBaseUrl, + docId, + enableXfa, + evaluatorOptions, + handler, + password + }) { + this._docBaseUrl = parseDocBaseUrl(docBaseUrl); + this._docId = docId; + this._password = password; + this.enableXfa = enableXfa; + evaluatorOptions.isOffscreenCanvasSupported &&= FeatureTest.isOffscreenCanvasSupported; + evaluatorOptions.isImageDecoderSupported &&= FeatureTest.isImageDecoderSupported; + this.evaluatorOptions = Object.freeze(evaluatorOptions); + ImageResizer.setOptions(evaluatorOptions); + JpegStream.setOptions(evaluatorOptions); + OperatorList.setOptions(evaluatorOptions); + const options = { + ...evaluatorOptions, + handler + }; + IccColorSpace.setOptions(options); + CmykICCBasedCS.setOptions(options); + PDFFunctionFactory.setOptions(options); + Pattern.setOptions(options); + WasmImage.setOptions(options); + } + get docId() { + return this._docId; + } + get password() { + return this._password; + } + get docBaseUrl() { + return this._docBaseUrl; + } + ensureDoc(prop, args) { + return this.ensure(this.pdfDocument, prop, args); + } + ensureCatalog(prop, args) { + return this.ensure(this.pdfDocument.catalog, prop, args); + } + async initDocument(recoveryMode) { + await this.ensureDoc("checkHeader"); + await this.ensureDoc("parseStartXRef"); + await this.ensureDoc("parse", [recoveryMode]); + await this.ensureDoc("checkFirstPage", [recoveryMode]); + await this.ensureDoc("checkLastPage", [recoveryMode]); + } + getPage(pageIndex) { + return this.pdfDocument.getPage(pageIndex); + } + fontFallback(id, handler) { + return this.pdfDocument.fontFallback(id, handler); + } + cleanup(manuallyTriggered = false) { + return this.pdfDocument.cleanup(manuallyTriggered); + } + async ensure(obj, prop, args) { + unreachable("Abstract method `ensure` called"); + } + requestRange(begin, end) { + unreachable("Abstract method `requestRange` called"); + } + requestLoadedStream(noFetch = false) { + unreachable("Abstract method `requestLoadedStream` called"); + } + sendProgressiveData(chunk) { + unreachable("Abstract method `sendProgressiveData` called"); + } + updatePassword(password) { + this._password = password; + this.pdfDocument.xref.encrypt?.setPassword(password); + } + terminate(reason) { + unreachable("Abstract method `terminate` called"); + } +} +class LocalPdfManager extends BasePdfManager { + constructor(args) { + super(args); + const stream = new Stream(args.source); + this.pdfDocument = new PDFDocument(this, stream); + this._loadedStreamPromise = Promise.resolve(stream); + } + async ensure(obj, prop, args) { + const value = obj[prop]; + return typeof value === "function" ? value.apply(obj, args) : value; + } + requestLoadedStream(noFetch = false) { + return this._loadedStreamPromise; + } + terminate(reason) {} +} +class NetworkPdfManager extends BasePdfManager { + 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(obj, prop, args) { + try { + const value = obj[prop]; + return typeof value === "function" ? await value.apply(obj, args) : value; + } catch (ex) { + if (!(ex instanceof MissingDataException)) { + throw ex; + } + await this.requestRange(ex.begin, ex.end); + return this.ensure(obj, prop, args); + } + } + requestRange(begin, end) { + return this.streamManager.requestRange(begin, end); + } + requestLoadedStream(noFetch = false) { + return this.streamManager.requestAllChunks(noFetch); + } + sendProgressiveData(chunk) { + this.streamManager.onReceiveData({ + chunk + }); + } + terminate(reason) { + this.streamManager.abort(reason); + } +} + +;// ./node_modules/core-js/modules/es.promise.try.js +es_promise_try_namespaceFn(); + +;// ./src/shared/message_handler.js + + + + +const CallbackKind = { + DATA: 1, + ERROR: 2 +}; +const StreamKind = { + CANCEL: 1, + CANCEL_COMPLETE: 2, + CLOSE: 3, + ENQUEUE: 4, + ERROR: 5, + PULL: 6, + PULL_COMPLETE: 7, + START_COMPLETE: 8 +}; +function onFn() {} +function wrapReason(ex) { + if (ex instanceof AbortException || ex instanceof InvalidPDFException || ex instanceof PasswordException || ex instanceof ResponseException || ex instanceof UnknownErrorException) { + return ex; + } + if (!(ex instanceof Error || typeof ex === "object" && ex !== null)) { + unreachable('wrapReason: Expected "reason" to be a (possibly cloned) Error.'); + } + switch (ex.name) { + case "AbortException": + return new AbortException(ex.message); + case "InvalidPDFException": + return new InvalidPDFException(ex.message); + case "PasswordException": + return new PasswordException(ex.message, ex.code); + case "ResponseException": + return new ResponseException(ex.message, ex.status, ex.missing); + case "UnknownErrorException": + return new UnknownErrorException(ex.message, ex.details); + } + return new UnknownErrorException(ex.message, ex.toString()); +} +class MessageHandler { + #actions = new Map(); + #callbackCapabilities = new Map(); + #callbackId = 1; + #comObj; + #messageAC = new AbortController(); + #sourceName; + #streamControllers = new Map(); + #streamId = 1; + #streamSinks = new Map(); + #targetName; + constructor(sourceName, targetName, comObj) { + this.#sourceName = sourceName; + this.#targetName = targetName; + this.#comObj = comObj; + comObj.addEventListener("message", this.#onMessage.bind(this), { + signal: this.#messageAC.signal + }); + } + #onMessage({ + data + }) { + if (data.targetName !== this.#sourceName) { + return; + } + if (data.stream) { + this.#processStreamMessage(data); + return; + } + if (data.callback) { + const { + callbackId, + callback + } = data; + const capability = this.#callbackCapabilities.get(callbackId); + if (!capability) { + throw new Error(`Cannot resolve callback ${callbackId}`); + } + this.#callbackCapabilities.delete(callbackId); + if (callback === CallbackKind.DATA) { + capability.resolve(data.data); + } else if (callback === CallbackKind.ERROR) { + capability.reject(wrapReason(data.reason)); + } else { + throw new Error("Unexpected callback case"); + } + return; + } + const action = this.#actions.get(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; + Promise.try(action, data.data).then(result => { + comObj.postMessage({ + sourceName, + targetName, + callback: CallbackKind.DATA, + callbackId: data.callbackId, + data: result + }); + }, 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); + } + on(actionName, handler) { + const ah = this.#actions; + if (ah.has(actionName)) { + throw new Error(`There is already a "${actionName}" handler.`); + } + ah.set(actionName, handler); + } + send(actionName, data, transfers) { + this.#comObj.postMessage({ + sourceName: this.#sourceName, + targetName: this.#targetName, + action: actionName, + data + }, transfers); + } + sendWithPromise(actionName, data, transfers) { + const callbackId = this.#callbackId++, + capability = Promise.withResolvers(); + this.#callbackCapabilities.set(callbackId, capability); + try { + this.#comObj.postMessage({ + sourceName: this.#sourceName, + targetName: this.#targetName, + action: actionName, + callbackId, + data + }, transfers); + } catch (ex) { + capability.reject(ex); + } + return capability.promise; + } + sendWithStream(actionName, data, queueingStrategy, transfers) { + const streamId = this.#streamId++, + sourceName = this.#sourceName, + targetName = this.#targetName, + comObj = this.#comObj; + return new ReadableStream({ + start: controller => { + const startCapability = Promise.withResolvers(); + this.#streamControllers.set(streamId, { + controller, + startCall: startCapability, + pullCall: null, + cancelCall: null, + isClosed: false + }); + comObj.postMessage({ + sourceName, + targetName, + action: actionName, + streamId, + data, + desiredSize: controller.desiredSize + }, transfers); + return startCapability.promise; + }, + pull: controller => { + const pullCapability = Promise.withResolvers(); + this.#streamControllers.get(streamId).pullCall = pullCapability; + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL, + streamId, + desiredSize: controller.desiredSize + }); + return pullCapability.promise; + }, + cancel: reason => { + util_assert(reason instanceof Error, "cancel must have a valid reason"); + const cancelCapability = Promise.withResolvers(); + this.#streamControllers.get(streamId).cancelCall = cancelCapability; + this.#streamControllers.get(streamId).isClosed = true; + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.CANCEL, + streamId, + reason: wrapReason(reason) + }); + return cancelCapability.promise; + } + }, queueingStrategy); + } + #createStreamSink(data) { + const streamId = data.streamId, + sourceName = this.#sourceName, + targetName = data.sourceName, + comObj = this.#comObj; + const streamSinks = this.#streamSinks, + action = this.#actions.get(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 + }); + streamSinks.delete(streamId); + }, + error(reason) { + util_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; + streamSinks.set(streamId, streamSink); + Promise.try(action, data.data, streamSink).then(() => { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.START_COMPLETE, + streamId, + success: true + }); + }, reason => { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.START_COMPLETE, + streamId, + reason: wrapReason(reason) + }); + }); + } + #processStreamMessage(data) { + const streamId = data.streamId, + sourceName = this.#sourceName, + targetName = data.sourceName, + comObj = this.#comObj; + const streamController = this.#streamControllers.get(streamId), + streamSink = this.#streamSinks.get(streamId); + switch (data.stream) { + case StreamKind.START_COMPLETE: + if (data.success) { + streamController.startCall.resolve(); + } else { + streamController.startCall.reject(wrapReason(data.reason)); + } + break; + case StreamKind.PULL_COMPLETE: + if (data.success) { + streamController.pullCall.resolve(); + } else { + streamController.pullCall.reject(wrapReason(data.reason)); + } + break; + case StreamKind.PULL: + if (!streamSink) { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL_COMPLETE, + streamId, + success: true + }); + break; + } + if (streamSink.desiredSize <= 0 && data.desiredSize > 0) { + streamSink.sinkCapability.resolve(); + } + streamSink.desiredSize = data.desiredSize; + Promise.try(streamSink.onPull || onFn).then(() => { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL_COMPLETE, + streamId, + success: true + }); + }, reason => { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL_COMPLETE, + streamId, + reason: wrapReason(reason) + }); + }); + break; + case StreamKind.ENQUEUE: + util_assert(streamController, "enqueue should have stream controller"); + if (streamController.isClosed) { + break; + } + streamController.controller.enqueue(data.chunk); + break; + case StreamKind.CLOSE: + util_assert(streamController, "close should have stream controller"); + if (streamController.isClosed) { + break; + } + streamController.isClosed = true; + streamController.controller.close(); + this.#deleteStreamController(streamController, streamId); + break; + case StreamKind.ERROR: + util_assert(streamController, "error should have stream controller"); + streamController.controller.error(wrapReason(data.reason)); + this.#deleteStreamController(streamController, streamId); + break; + case StreamKind.CANCEL_COMPLETE: + if (data.success) { + streamController.cancelCall.resolve(); + } else { + streamController.cancelCall.reject(wrapReason(data.reason)); + } + this.#deleteStreamController(streamController, streamId); + break; + case StreamKind.CANCEL: + if (!streamSink) { + break; + } + const dataReason = wrapReason(data.reason); + Promise.try(streamSink.onCancel || onFn, dataReason).then(() => { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.CANCEL_COMPLETE, + streamId, + success: true + }); + }, reason => { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.CANCEL_COMPLETE, + streamId, + reason: wrapReason(reason) + }); + }); + streamSink.sinkCapability.reject(dataReason); + streamSink.isCancelled = true; + this.#streamSinks.delete(streamId); + break; + default: + throw new Error("Unexpected stream case"); + } + } + async #deleteStreamController(streamController, streamId) { + await Promise.allSettled([streamController.startCall?.promise, streamController.pullCall?.promise, streamController.cancelCall?.promise]); + this.#streamControllers.delete(streamId); + } + destroy() { + this.#messageAC?.abort(); + this.#messageAC = null; + } +} + +;// ./src/core/editor/print_appearances.js +/* unused harmony import specifier */ var print_appearances_Ref; +/* unused harmony import specifier */ var print_appearances_Dict; +/* unused harmony import specifier */ var print_appearances_EOF; +/* unused harmony import specifier */ var print_appearances_Cmd; +/* unused harmony import specifier */ var print_appearances_RefMap; +/* unused harmony import specifier */ var print_appearances_stringToBytes; +/* unused harmony import specifier */ var print_appearances_warn; +/* unused harmony import specifier */ var print_appearances_BaseStream; +/* unused harmony import specifier */ var print_appearances_EvaluatorPreprocessor; +/* unused harmony import specifier */ var print_appearances_Lexer; +/* unused harmony import specifier */ var print_appearances_LocalPdfManager; +/* unused harmony import specifier */ var print_appearances_Stream; + + + + + + + + + + + + + + + + + + + + + + + + +const MARKED_CONTENT_OPS = new Set(["BDC", "BMC", "DP", "EMC", "MP"]); +class ChangesXRefWrapper { + #changes; + #xref; + constructor(changes, xref) { + this.#changes = changes; + this.#xref = xref; + } + getNewTemporaryRef() { + return this.#xref.getNewTemporaryRef(); + } + fetch(ref) { + return this.#changes.has(ref) ? this.#changes.get(ref).data : this.#xref.fetch(ref); + } + fetchIfRef(obj) { + return obj instanceof print_appearances_Ref ? this.fetch(obj) : obj; + } + async fetchAsync(ref) { + return this.fetch(ref); + } + async fetchIfRefAsync(obj) { + return this.fetchIfRef(obj); + } +} +async function copyObject(obj, sourceXref, target) { + const { + changes, + refs, + xref, + xrefWrapper + } = target; + if (obj instanceof print_appearances_Ref) { + let newRef = refs.get(obj); + if (!newRef) { + refs.put(obj, newRef = xref.getNewTemporaryRef()); + const value = await sourceXref.fetchAsync(obj); + changes.put(newRef, { + data: await copyObject(value, sourceXref, target) + }); + } + return newRef; + } + if (Array.isArray(obj)) { + return Promise.all(obj.map(value => copyObject(value, sourceXref, target))); + } + let dict, stream; + if (obj instanceof print_appearances_BaseStream) { + ({ + dict + } = stream = obj.getOriginalStream().clone()); + } else if (obj instanceof print_appearances_Dict) { + dict = obj.clone(); + } else { + return obj; + } + dict.xref = xrefWrapper; + const promises = []; + for (const [key, value] of dict.getRawEntries()) { + promises.push(copyObject(value, sourceXref, target).then(newValue => dict.set(key, newValue))); + } + await Promise.all(promises); + return stream ?? dict; +} +function filterContentStream(bytes, isWidget) { + const lexer = new print_appearances_Lexer(new print_appearances_Stream(bytes), print_appearances_EvaluatorPreprocessor.opMap); + const parts = isWidget ? [print_appearances_stringToBytes("/Tx BMC\n")] : []; + let start = 0; + let end = 0; + try { + while (true) { + const obj = lexer.getObj(); + if (obj === print_appearances_EOF) { + break; + } + if (!(obj instanceof print_appearances_Cmd) || !print_appearances_EvaluatorPreprocessor.opMap[obj.cmd]) { + continue; + } + if (obj.cmd === "BI") { + print_appearances_warn("filterContentStream: inline images aren't supported."); + return null; + } + const cmdEnd = lexer.currentChar < 0 ? bytes.length : lexer.stream.pos - 1; + if (MARKED_CONTENT_OPS.has(obj.cmd)) { + parts.push(bytes.subarray(start, end)); + start = cmdEnd; + } + end = cmdEnd; + } + } catch (reason) { + print_appearances_warn(`filterContentStream: "${reason}".`); + return null; + } + parts.push(bytes.subarray(start)); + if (isWidget) { + parts.push(print_appearances_stringToBytes("\nEMC")); + } + const data = new Uint8Array(parts.reduce((length, part) => length + part.length, 0)); + let offset = 0; + for (const part of parts) { + data.set(part, offset); + offset += part.length; + } + return data; +} +async function importPrintedAppearances({ + buffer, + changes, + docId, + entries, + evaluatorOptions, + handler, + xref +}) { + const pdfManager = new print_appearances_LocalPdfManager({ + source: buffer, + docId: `${docId}_printToPDF`, + handler, + evaluatorOptions + }); + await pdfManager.initDocument(false); + const { + pdfDocument + } = pdfManager; + if (pdfDocument.numPages !== entries.length) { + throw new Error("The generated PDF must have one page per appearance."); + } + const appearances = new Map(); + const target = { + changes, + refs: new print_appearances_RefMap(), + xref, + xrefWrapper: new ChangesXRefWrapper(changes, xref) + }; + for (let i = 0, ii = entries.length; i < ii; i++) { + const { + key, + isWidget, + matrix, + data + } = entries[i]; + const page = await pdfDocument.getPage(i); + const contentStream = await page.getContentStream(); + contentStream.reset(); + const bytes = filterContentStream(contentStream.getBytes(), isWidget); + if (!bytes) { + continue; + } + const dict = new print_appearances_Dict(xref); + dict.setIfName("Type", "XObject"); + dict.setIfName("Subtype", "Form"); + dict.set("FormType", 1); + dict.set("BBox", [0, 0, data.width, data.height]); + dict.setIfArray("Matrix", matrix); + dict.set("Resources", await copyObject(page.resources, pdfDocument.xref, target)); + const ref = xref.getNewTemporaryRef(); + changes.put(ref, { + data: new print_appearances_Stream(bytes, 0, bytes.length, dict) + }); + appearances.set(key, ref); + } + return appearances; +} + +;// ./src/core/writer.js + + + + + + + + + + + + + + + + +async function writeObject(ref, obj, buffer, { + encrypt = null, + encryptRef = null +}) { + const transform = encrypt && encryptRef !== ref ? encrypt.createCipherTransform(ref.num, ref.gen) : null; + buffer.push(`${ref.num} ${ref.gen} obj\n`); + await writeValue(obj, buffer, transform); + buffer.push("\nendobj\n"); +} +async function writeDict(dict, buffer, transform) { + buffer.push("<<"); + for (const [key, rawObj] of dict.getRawEntries()) { + buffer.push(` /${escapePDFName(key)} `); + await writeValue(rawObj, buffer, transform); + } + buffer.push(">>"); +} +async function writeStream(stream, buffer, transform) { + stream = stream.getOriginalStream(); + stream.reset(); + 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 isFilterZeroImageDecode = isName(filterZero, "DCTDecode") || isName(filterZero, "JPXDecode") || isName(filterZero, "JBIG2Decode") || isName(filterZero, "CCITTFaxDecode") || isName(filterZero, "LZWDecode"); + const isFilterZeroCompressedObject = isFilterZeroFlateDecode || isFilterZeroImageDecode || isName(filterZero, "BrotliDecode"); + const MIN_LENGTH_FOR_COMPRESSING = 256; + if (!isFilterZeroCompressedObject && bytes.length >= MIN_LENGTH_FOR_COMPRESSING) { + try { + 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(() => {}); + bytes = await new Response(cs.readable).bytes(); + 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]; + } + } + if (newFilter) { + dict.set("Filter", newFilter); + } + if (newParams) { + dict.set("DecodeParms", newParams); + } + } catch (ex) { + info(`writeStream - cannot compress data: "${ex}".`); + } + } + let string = bytesToString(bytes); + if (transform) { + string = transform.encryptString(string); + } + dict.set("Length", string.length); + await writeDict(dict, buffer, transform); + buffer.push(" stream\n", string, "\nendstream"); +} +async function writeArray(array, buffer, transform) { + buffer.push("["); + for (let i = 0, ii = array.length; i < ii; i++) { + await writeValue(array[i], buffer, transform); + if (i < ii - 1) { + buffer.push(" "); + } + } + buffer.push("]"); +} +function numberToPDFString(value) { + if (Number.isInteger(value) && Math.abs(value) >= 1e21) { + return BigInt(value).toString(); + } + const str = value.toFixed(10); + let end = str.length; + while (str[end - 1] === "0") { + end--; + } + if (str[end - 1] === ".") { + end--; + } + return str.slice(0, end); +} +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(numberToPDFString(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.`); + } +} +function writeInt(number, size, offset, buffer) { + for (let i = size + offset - 1; i > offset - 1; i--) { + buffer[i] = number & 0xff; + number >>= 8; + } + return offset + size; +} +function writeString(string, offset, buffer) { + const ii = string.length; + for (let i = 0; i < ii; i++) { + buffer[offset + i] = string.charCodeAt(i) & 0xff; + } + return offset + ii; +} +function computeMD5(filesize, xrefInfo) { + const time = Math.floor(Date.now() / 1000); + const filename = xrefInfo.filename || ""; + const md5Buffer = [time.toString(), filename, filesize.toString(), ...xrefInfo.infoMap.values()]; + const md5BufferLen = Math.sumPrecise(md5Buffer.map(str => str.length)); + const array = new Uint8Array(md5BufferLen); + let offset = 0; + for (const str of md5Buffer) { + offset = writeString(str, offset, array); + } + return bytesToString(calculateMD5(array, 0, array.length)); +} +function writeXFADataForAcroform(str, changes) { + const xml = new SimpleXMLParser({ + hasAttributes: true + }).parseFromString(str); + for (const { + xfa + } of changes) { + if (!xfa) { + continue; + } + const { + path, + value + } = xfa; + if (!path || value === null) { + 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, + changes +}) { + 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); + } + changes.put(acroFormRef, { + data: dict + }); +} +function updateXFA({ + xfaData, + xfaDatasetsRef, + changes, + xref +}) { + if (xfaData === null) { + const datasets = xref.fetchIfRef(xfaDatasetsRef); + xfaData = writeXFADataForAcroform(datasets.getString(), changes); + } + const xfaDataStream = new StringStream(xfaData, new Dict(xref)); + xfaDataStream.dict.setIfName("Type", "EmbeddedFile"); + changes.put(xfaDatasetsRef, { + data: xfaDataStream + }); +} +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, null); + 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, + objStreamRef, + index + } of newRefs) { + let gen; + maxOffset = Math.max(maxOffset, baseOffset); + if (objStreamRef) { + gen = index; + xrefTableData.push([2, objStreamRef.num, gen]); + } else 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 = Math.sumPrecise(sizes); + 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, md5]); + } +} +function getTrailerDict(xrefInfo, changes, useXrefStream) { + const newXref = new Dict(null); + newXref.setIfDefined("Prev", xrefInfo?.startXRef); + const refForXrefTable = xrefInfo.newRef; + if (useXrefStream) { + changes.put(refForXrefTable, { + data: "" + }); + newXref.set("Size", refForXrefTable.num + 1); + newXref.setIfName("Type", "XRef"); + } else { + newXref.set("Size", refForXrefTable.num); + } + newXref.setIfDefined("Root", xrefInfo?.rootRef); + newXref.setIfDefined("Info", xrefInfo?.infoRef); + newXref.setIfDefined("Encrypt", xrefInfo?.encryptRef); + return newXref; +} +async function writeChanges(changes, xref, buffer = []) { + const newRefs = []; + for (const [ref, { + data, + objStreamRef, + index + }] of changes.items()) { + if (objStreamRef) { + newRefs.push({ + ref, + data, + objStreamRef, + index + }); + continue; + } + if (data === null || typeof data === "string") { + newRefs.push({ + ref, + data + }); + continue; + } + await writeObject(ref, data, buffer, xref); + newRefs.push({ + ref, + data: buffer.join("") + }); + buffer.length = 0; + } + return newRefs.sort((a, b) => a.ref.num - b.ref.num); +} +async function incrementalUpdate({ + originalData, + xrefInfo, + changes, + xref = null, + hasXfa = false, + xfaDatasetsRef = null, + hasXfaDatasetsEntry = false, + needAppearances, + acroFormRef = null, + acroForm = null, + xfaData = null, + useXrefStream = false +}) { + await updateAcroform({ + xref, + acroForm, + acroFormRef, + hasXfa, + hasXfaDatasetsEntry, + xfaDatasetsRef, + needAppearances, + changes + }); + if (hasXfa) { + updateXFA({ + xfaData, + xfaDatasetsRef, + changes, + xref + }); + } + const newXref = getTrailerDict(xrefInfo, changes, useXrefStream); + const buffer = []; + const newRefs = await writeChanges(changes, xref, buffer); + let baseOffset = originalData.length; + const lastByte = originalData.at(-1); + if (lastByte !== 0x0a && lastByte !== 0x0d) { + buffer.push("\n"); + baseOffset += 1; + } + 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 = originalData.length + Math.sumPrecise(buffer.map(str => str.length)); + const array = new Uint8Array(totalLength); + array.set(originalData); + let offset = originalData.length; + for (const str of buffer) { + offset = writeString(str, offset, array); + } + return array; +} + +;// ./src/core/editor/pdf_editor.js + + + + + + + + + + + + + + + + + + + + + + + + + + + + +const MAX_LEAVES_PER_PAGES_NODE = 16; +const MAX_IN_NAME_TREE_NODE = 64; +class PageData { + constructor(page, documentData) { + this.page = page; + this.documentData = documentData; + this.annotations = null; + this.pointingNamedDestinations = null; + this.copyLevel = 0; + documentData.pagesMap.put(page.ref, this); + } +} +class DocumentData { + constructor(document) { + this.document = document; + this.destinations = null; + this.pageLabels = null; + this.pagesMap = new RefMap(); + this.oldRefMapping = new RefMap(); + this.dedupNamedDestinations = new Map(); + this.usedNamedDestinations = new Set(); + this.postponedRefCopies = new RefMap(); + this.resourceStreamPromises = new Map(); + this.usedStructParents = new Set(); + this.oldStructParentMapping = new Map(); + this.structTreeRoot = null; + this.parentTree = null; + this.idTree = null; + this.roleMap = null; + this.classMap = null; + this.namespaces = null; + this.structTreeAF = null; + this.structTreePronunciationLexicon = []; + this.acroForm = null; + this.acroFormDefaultAppearance = ""; + this.acroFormDefaultResources = null; + this.acroFormQ = 0; + this.hasSignatureAnnotations = false; + this.fieldToParent = new RefMap(); + this.outline = null; + this.embeddedFiles = null; + } +} +class XRefWrapper { + constructor(entries, getNewRef) { + this.entries = entries; + this._getNewRef = getNewRef; + } + getNewTemporaryRef() { + return this._getNewRef(); + } + countUpdatesAfter(offset) { + return null; + } + fetchIfRef(obj) { + return obj instanceof Ref ? this.fetch(obj) : obj; + } + fetch(ref) { + if (!(ref instanceof Ref)) { + throw new Error("ref object is not a reference"); + } + return this.entries[ref.num]; + } + async fetchIfRefAsync(obj) { + return obj instanceof Ref ? this.fetchAsync(obj) : obj; + } + async fetchAsync(ref) { + return this.fetch(ref); + } +} +class PDFEditor { + isSingleFile = false; + #newAnnotationsParams = null; + #primaryDocument = null; + #resourceStreamCache = new Map(); + currentDocument = null; + oldPages = []; + newPages = []; + xref = [null]; + xrefWrapper = new XRefWrapper(this.xref, () => this.newRef); + newRefCount = 1; + namesDict = null; + version = "1.7"; + pageLabels = null; + namedDestinations = new Map(); + parentTree = new Map(); + structTreeKids = []; + idTree = new Map(); + classMap = new Dict(); + roleMap = new Dict(); + namespaces = new Map(); + structTreeAF = []; + structTreePronunciationLexicon = []; + fields = []; + acroFormDefaultAppearance = ""; + acroFormDefaultResources = null; + acroFormNeedAppearances = false; + acroFormSigFlags = 0; + acroFormCalculationOrder = null; + acroFormQ = 0; + outlineItems = null; + embeddedFiles = new Map(); + constructor({ + useObjectStreams = true, + title = "", + author = "" + } = {}) { + [this.rootRef, this.rootDict] = this.newDict; + [this.infoRef, this.infoDict] = this.newDict; + [this.pagesRef, this.pagesDict] = this.newDict; + this.useObjectStreams = useObjectStreams; + this.objStreamRefs = useObjectStreams ? new Set() : null; + this.title = title; + this.author = author; + } + get newRef() { + return Ref.get(this.newRefCount++, 0); + } + get newDict() { + const ref = this.newRef; + const dict = this.xref[ref.num] = new Dict(); + return [ref, dict]; + } + async #cloneObject(obj, xref) { + const ref = this.newRef; + this.xref[ref.num] = await this.#collectDependencies(obj, true, xref); + return ref; + } + cloneDict(dict) { + const newDict = dict.clone(); + newDict.xref = this.xrefWrapper; + return newDict; + } + async #collectDependencies(obj, mustClone, xref, resourceStreamPath = new RefSet()) { + if (obj instanceof Ref) { + const { + currentDocument: { + fieldToParent, + oldRefMapping + } + } = this; + const existingRef = oldRefMapping.get(obj); + if (existingRef) { + return existingRef; + } + const oldRef = obj; + obj = await xref.fetchAsync(oldRef); + const mappedRef = oldRefMapping.get(oldRef); + if (mappedRef) { + return mappedRef; + } + if (typeof obj === "number") { + return obj; + } + if (obj instanceof BaseStream && this.#isResourceStream(obj.dict)) { + return this.#collectResourceStream(oldRef, obj, xref, resourceStreamPath); + } + const newRef = this.newRef; + oldRefMapping.put(oldRef, newRef); + let cloneSource = true; + if (fieldToParent.has(oldRef) && obj instanceof Dict) { + obj = this.cloneDict(obj); + obj.delete("Parent"); + cloneSource = false; + } + this.xref[newRef.num] = await this.#collectDependencies(obj, cloneSource, xref, resourceStreamPath); + return newRef; + } + const promises = []; + const { + currentDocument: { + postponedRefCopies + } + } = this; + if (Array.isArray(obj)) { + if (mustClone) { + obj = obj.slice(); + } + for (let i = 0, ii = obj.length; i < ii; i++) { + const postponedActions = obj[i] instanceof Ref && postponedRefCopies.get(obj[i]); + if (postponedActions) { + postponedActions.push(ref => obj[i] = ref); + continue; + } + promises.push(this.#collectDependencies(obj[i], true, xref, resourceStreamPath).then(newObj => obj[i] = newObj)); + } + await Promise.all(promises); + return obj; + } + let dict; + if (obj instanceof BaseStream) { + ({ + dict + } = obj = obj.getOriginalStream().clone()); + dict.xref = this.xrefWrapper; + } else if (obj instanceof Dict) { + if (mustClone) { + obj = obj.clone(); + obj.xref = this.xrefWrapper; + } + dict = obj; + } + if (dict) { + for (const [key, rawObj] of dict.getRawEntries()) { + const postponedActions = rawObj instanceof Ref && postponedRefCopies.get(rawObj); + if (postponedActions) { + postponedActions.push(ref => dict.set(key, ref)); + continue; + } + promises.push(this.#collectDependencies(rawObj, true, xref, resourceStreamPath).then(newObj => dict.set(key, newObj))); + } + await Promise.all(promises); + } + return obj; + } + #isResourceStream(dict) { + const subtype = dict.get("Subtype"); + return isName(subtype, "Image") || dict.has("Length1") || isName(subtype, "Type1C") || isName(subtype, "CIDFontType0C") || isName(subtype, "OpenType"); + } + #rawStreamBytes(stream) { + const original = stream.getOriginalStream(); + original.reset(); + return original.getBytes(); + } + async #serializeDict(dict) { + const buffer = []; + await writeValue(dict, buffer, null); + return buffer.join(""); + } + #resourceStreamKey(dictStr, bytes) { + const SAMPLE_SIZE = 256; + const SAMPLE_COUNT = 4; + const { + length + } = bytes; + const hash = new MurmurHash3_64(); + hash.update(dictStr); + hash.update(`#${length}`); + if (length <= SAMPLE_SIZE * SAMPLE_COUNT) { + hash.update(bytes); + } else { + const step = Math.floor((length - SAMPLE_SIZE) / (SAMPLE_COUNT - 1)); + for (let i = 0; i < SAMPLE_COUNT; i++) { + const start = Math.min(i * step, length - SAMPLE_SIZE); + hash.update(bytes.subarray(start, start + SAMPLE_SIZE)); + } + } + return hash.hexdigest(); + } + async #collectResourceStream(oldRef, stream, xref, resourceStreamPath) { + const { + currentDocument: { + oldRefMapping, + resourceStreamPromises + } + } = this; + if (resourceStreamPath.has(oldRef)) { + return oldRefMapping.getOrPutComputed(oldRef, () => this.newRef); + } + const key = oldRef.toString(); + const pending = resourceStreamPromises.get(key); + if (pending) { + return pending; + } + const childPath = new RefSet(resourceStreamPath); + childPath.put(oldRef); + const promise = Promise.resolve().then(async () => { + const collected = await this.#collectDependencies(stream, true, xref, childPath); + const cycleRef = oldRefMapping.get(oldRef); + if (cycleRef) { + this.xref[cycleRef.num] = collected; + return cycleRef; + } + const ref = await this.#dedupResourceStream(collected); + oldRefMapping.put(oldRef, ref); + return ref; + }); + resourceStreamPromises.set(key, promise); + try { + return await promise; + } finally { + if (resourceStreamPromises.get(key) === promise) { + resourceStreamPromises.delete(key); + } + } + } + async #dedupResourceStream(stream) { + const dictStr = await this.#serializeDict(stream.dict); + const bytes = this.#rawStreamBytes(stream); + const key = this.#resourceStreamKey(dictStr, bytes); + const bucket = this.#resourceStreamCache.getOrInsertComputed(key, makeArr); + for (const entry of bucket) { + if (entry.dictStr === dictStr && isArrayEqual(this.#rawStreamBytes(entry.stream), bytes)) { + return entry.ref; + } + } + const ref = this.newRef; + this.xref[ref.num] = stream; + bucket.push({ + ref, + dictStr, + stream + }); + return ref; + } + async #resolveStructKids(rawKids, xref) { + if (rawKids instanceof Ref) { + const fetched = await xref.fetchAsync(rawKids); + return Array.isArray(fetched) ? fetched : [rawKids]; + } + return Array.isArray(rawKids) ? rawKids : [rawKids]; + } + async #cloneStructTreeNode(parentStructRef, node, xref, removedStructElements, dedupIDs, dedupClasses, dedupRoles, visited = new RefSet()) { + const { + currentDocument: { + pagesMap, + oldRefMapping + } + } = this; + const pg = node.getRaw("Pg"); + if (pg instanceof Ref && !pagesMap.has(pg)) { + return null; + } + const k = node.getRaw("K"); + if (k instanceof Ref && visited.has(k)) { + return null; + } + const kids = await this.#resolveStructKids(k, xref); + const newKids = []; + const structElemIndices = []; + for (let kid of kids) { + const kidRef = kid instanceof Ref ? kid : null; + if (kidRef) { + if (visited.has(kidRef)) { + continue; + } + visited.put(kidRef); + kid = await xref.fetchAsync(kidRef); + } + if (typeof kid === "number") { + newKids.push(kid); + continue; + } + if (!(kid instanceof Dict)) { + continue; + } + const pgRef = kid.getRaw("Pg"); + if (pgRef instanceof Ref && !pagesMap.has(pgRef)) { + continue; + } + const type = kid.get("Type"); + if (!type || isName(type, "StructElem")) { + let setAsSpan = false; + if (kidRef && removedStructElements.has(kidRef)) { + if (!isName(kid.get("S"), "Link")) { + continue; + } + setAsSpan = true; + } + const newKidRef = await this.#cloneStructTreeNode(kidRef, kid, xref, removedStructElements, dedupIDs, dedupClasses, dedupRoles, visited); + if (newKidRef) { + structElemIndices.push(newKids.length); + newKids.push(newKidRef); + if (kidRef) { + oldRefMapping.put(kidRef, newKidRef); + } + if (setAsSpan) { + this.xref[newKidRef.num].setIfName("S", "Span"); + } + } + continue; + } + if (isName(type, "OBJR")) { + if (!kidRef) { + continue; + } + const oldObjRef = kid.getRaw("Obj"); + if (oldObjRef instanceof Ref && !oldRefMapping.get(oldObjRef)) { + continue; + } + const newKidRef = oldRefMapping.get(kidRef) || (await this.#collectDependencies(kidRef, true, xref)); + const newKid = this.xref[newKidRef.num]; + const objRef = newKid.getRaw("Obj"); + if (objRef instanceof Ref) { + const obj = this.xref[objRef.num]; + if (obj instanceof Dict && !obj.has("StructParent") && parentStructRef) { + const structParent = this.parentTree.size; + this.parentTree.set(structParent, [oldRefMapping, parentStructRef]); + obj.set("StructParent", structParent); + } + } + newKids.push(newKidRef); + continue; + } + if (isName(type, "MCR")) { + const newKid = await this.#collectDependencies(kidRef || kid, true, xref); + newKids.push(newKid); + continue; + } + if (kidRef) { + const newKidRef = await this.#collectDependencies(kidRef, true, xref); + newKids.push(newKidRef); + } + } + if (kids.length !== 0 && newKids.length === 0) { + return null; + } + const newNodeRef = this.newRef; + const newNode = this.xref[newNodeRef.num] = this.cloneDict(node); + newNode.delete("ID"); + newNode.delete("C"); + newNode.delete("K"); + newNode.delete("P"); + newNode.delete("S"); + await this.#collectDependencies(newNode, false, xref); + const classNames = node.get("C"); + if (classNames instanceof Name) { + const newClassName = dedupClasses.get(classNames.name); + newNode.set("C", newClassName ? Name.get(newClassName) : classNames); + } else if (Array.isArray(classNames)) { + const newClassNames = []; + for (const className of classNames) { + if (className instanceof Name) { + const newClassName = dedupClasses.get(className.name); + newClassNames.push(newClassName ? Name.get(newClassName) : className); + } + } + newNode.set("C", newClassNames); + } + const roleName = node.get("S"); + if (roleName instanceof Name) { + const newRoleName = dedupRoles.get(roleName.name); + newNode.set("S", newRoleName ? Name.get(newRoleName) : roleName); + } + const id = node.get("ID"); + if (typeof id === "string") { + const stringId = stringToPDFString(id, false); + const newId = dedupIDs.get(stringId); + newNode.set("ID", newId ? stringToAsciiOrUTF16BE(newId) : id); + } + let attributes = newNode.get("A"); + if (attributes) { + if (!Array.isArray(attributes)) { + attributes = [attributes]; + } + for (let attr of attributes) { + attr = this.xrefWrapper.fetchIfRef(attr); + if (!(attr instanceof Dict)) { + continue; + } + if (isName(attr.get("O"), "Table") && attr.has("Headers")) { + const headers = this.xrefWrapper.fetchIfRef(attr.getRaw("Headers")); + if (Array.isArray(headers)) { + for (let i = 0, ii = headers.length; i < ii; i++) { + const header = this.xrefWrapper.fetchIfRef(headers[i]); + if (typeof header !== "string") { + continue; + } + const newId = dedupIDs.get(stringToPDFString(header, false)); + if (newId) { + headers[i] = newId; + } + } + } + } + } + } + for (const index of structElemIndices) { + const structElemRef = newKids[index]; + const structElem = this.xref[structElemRef.num]; + structElem.set("P", newNodeRef); + } + if (newKids.length === 1) { + newNode.set("K", newKids[0]); + } else if (newKids.length > 1) { + newNode.set("K", newKids); + } + return newNodeRef; + } + #getFilteredPageIndices({ + document, + includePages, + excludePages + }) { + if (!document) { + return []; + } + const compile = list => { + if (!list?.length) { + return null; + } + const indices = new Set(); + const ranges = []; + for (const item of list) { + if (Array.isArray(item)) { + ranges.push(item); + } else { + indices.add(item); + } + } + return { + indices, + ranges + }; + }; + const matches = (index, { + indices, + ranges + }) => indices.has(index) || ranges.some(([start, end]) => index >= start && index <= end); + const inc = compile(includePages); + const exc = compile(excludePages); + const result = []; + for (let i = 0, ii = document.numPages; i < ii; i++) { + if (exc && matches(i, exc)) { + continue; + } + if (!inc || matches(i, inc)) { + result.push(i); + } + } + return result; + } + #resolveInsertAfterIndices(pageInfos) { + const counts = new Array(pageInfos.length); + const sequence = []; + const insertAfterList = []; + for (let i = 0; i < pageInfos.length; i++) { + const info = pageInfos[i]; + let count; + if (info.image) { + count = counts[i] = 1; + } else if (!info.document) { + counts[i] = 0; + continue; + } else { + count = counts[i] = this.#getFilteredPageIndices(info).length; + } + if (info.pageIndices) { + continue; + } + if (info.insertAfter === undefined) { + for (let j = 0; j < count; j++) { + sequence.push(i); + } + } else { + insertAfterList.push({ + i, + insertAfter: info.insertAfter, + count + }); + } + } + if (insertAfterList.length === 0) { + return pageInfos; + } + const hasContent = info => !!(info.document || info.image); + for (let i = 0; i < pageInfos.length; i++) { + const info = pageInfos[i]; + if (hasContent(info) && info.pageIndices && info.pageIndices.length < counts[i]) { + throw new Error("extractPages: partial pageIndices cannot be combined with insertAfter entries."); + } + } + insertAfterList.sort((a, b) => a.insertAfter - b.insertAfter || a.i - b.i); + if (sequence.length === 0 && pageInfos.some(info => hasContent(info) && info.pageIndices)) { + const updatedPageInfos = pageInfos.slice(); + let maxExistingPos = -1; + for (const info of pageInfos) { + if (!hasContent(info) || !info.pageIndices) { + continue; + } + for (const idx of info.pageIndices) { + if (idx > maxExistingPos) { + maxExistingPos = idx; + } + } + } + let offset = 0; + for (const { + i, + insertAfter, + count + } of insertAfterList) { + const threshold = Math.min(Math.max(insertAfter, -1) + offset, maxExistingPos); + for (let j = 0; j < updatedPageInfos.length; j++) { + const existingInfo = updatedPageInfos[j]; + if (!hasContent(existingInfo) || !existingInfo.pageIndices || existingInfo.pageIndices.every(idx => idx <= threshold)) { + continue; + } + updatedPageInfos[j] = { + ...existingInfo, + pageIndices: existingInfo.pageIndices.map(idx => idx > threshold ? idx + count : idx) + }; + } + const pageIndices = []; + for (let k = 0; k < count; k++) { + pageIndices.push(threshold + 1 + k); + } + const result = { + ...updatedPageInfos[i], + pageIndices + }; + delete result.insertAfter; + updatedPageInfos[i] = result; + offset += count; + maxExistingPos += count; + } + return updatedPageInfos; + } + let offset = 0; + for (const { + i, + insertAfter, + count + } of insertAfterList) { + const insertPos = Math.max(insertAfter, -1) + 1 + offset; + sequence.splice(insertPos, 0, ...new Array(count).fill(i)); + offset += count; + } + const pageIndicesArr = new Array(pageInfos.length); + for (let pos = 0; pos < sequence.length; pos++) { + const infoIdx = sequence[pos]; + (pageIndicesArr[infoIdx] ||= []).push(pos); + } + return pageInfos.map((info, i) => { + if (!hasContent(info) || info.pageIndices) { + return info; + } + const result = { + ...info, + pageIndices: pageIndicesArr[i] || [] + }; + delete result.insertAfter; + return result; + }); + } + async extractPages(pageInfos, annotationStorage, primaryDocument, handler, task) { + this.#primaryDocument = primaryDocument; + pageInfos = this.#resolveInsertAfterIndices(pageInfos); + const promises = []; + let newIndex = 0; + const reservePageSlot = newPageIndex => { + if (!Number.isInteger(newPageIndex) || newPageIndex < 0) { + throw new Error("extractPages: invalid page index."); + } + if (this.oldPages[newPageIndex] !== undefined) { + throw new Error("extractPages: overlapping pageIndices."); + } + this.oldPages[newPageIndex] = null; + }; + const allDocumentData = []; + if (annotationStorage) { + this.#newAnnotationsParams = { + handler, + task, + newAnnotationsByPage: getNewAnnotationsMap(annotationStorage), + imagesPromises: AnnotationFactory.generateImages(annotationStorage.values(), this.xrefWrapper, true) + }; + } + const imageEntries = []; + for (const pageInfo of pageInfos) { + const { + document, + image, + includePages, + excludePages, + pageIndices + } = pageInfo; + if (image) { + if (pageIndices) { + newIndex = -1; + if (pageIndices.length > 1) { + throw new Error("extractPages: too many pageIndices."); + } + } + let newPageIndex; + if (pageIndices?.length) { + newPageIndex = pageIndices[0]; + } else if (newIndex !== -1) { + newPageIndex = newIndex++; + } else { + for (newPageIndex = 0; this.oldPages[newPageIndex] !== undefined; newPageIndex++) {} + } + reservePageSlot(newPageIndex); + imageEntries.push({ + image, + slot: newPageIndex + }); + continue; + } + if (!document) { + continue; + } + if (pageIndices) { + newIndex = -1; + } + const filteredPageIndices = this.#getFilteredPageIndices({ + document, + includePages, + excludePages + }); + if (pageIndices && pageIndices.length > filteredPageIndices.length) { + throw new Error("extractPages: too many pageIndices."); + } + const documentData = new DocumentData(document); + allDocumentData.push(documentData); + promises.push(this.#collectDocumentData(documentData)); + let pageIndex = 0; + for (const i of filteredPageIndices) { + let newPageIndex; + if (pageIndices) { + newPageIndex = pageIndices[pageIndex++]; + } + if (newPageIndex === undefined) { + if (newIndex !== -1) { + newPageIndex = newIndex++; + } else { + for (newPageIndex = 0; this.oldPages[newPageIndex] !== undefined; newPageIndex++) {} + } + } + reservePageSlot(newPageIndex); + promises.push(document.getPage(i).then(page => { + this.oldPages[newPageIndex] = new PageData(page, documentData); + })); + } + } + await Promise.all(promises); + if (this.oldPages.length === 0) { + throw new Error("extractPages: nothing to extract."); + } + const copyCounts = new Map(); + const documents = new Set(); + for (let i = 0, ii = this.oldPages.length; i < ii; i++) { + const pageData = this.oldPages[i]; + if (pageData === undefined) { + throw new Error("extractPages: sparse pageIndices."); + } + if (pageData) { + const { + page + } = pageData; + const copyLevel = copyCounts.get(page) ?? 0; + copyCounts.set(page, copyLevel + 1); + pageData.copyLevel = copyLevel; + documents.add(pageData.documentData.document); + } + } + this.isSingleFile = documents.size === 1; + promises.length = 0; + this.#collectValidDestinations(allDocumentData); + this.#collectOutlineDestinations(allDocumentData); + this.#collectPageLabels(); + for (const page of this.oldPages) { + if (page) { + promises.push(this.#postCollectPageData(page)); + } + } + await Promise.all(promises); + this.#findDuplicateNamedDestinations(); + this.#setPostponedRefCopies(allDocumentData); + const imageSlots = new Map(); + for (const entry of imageEntries) { + imageSlots.set(entry.slot, entry); + } + const modalPageSize = imageSlots.size > 0 ? this.#modalPageSize() : null; + for (let i = 0, ii = this.oldPages.length; i < ii; i++) { + const imageEntry = imageSlots.get(i); + if (imageEntry) { + this.newPages[i] = await this.#makeImagePage(imageEntry.image, modalPageSize); + } else { + this.newPages[i] = await this.#makePageCopy(i, null); + } + } + this.#fixPostponedRefCopies(allDocumentData); + await this.#mergeStructTrees(allDocumentData); + await this.#mergeAcroForms(allDocumentData); + this.#buildOutline(allDocumentData); + await this.#collectEmbeddedFiles(allDocumentData); + return this.writePDF(); + } + async #collectDocumentData(documentData) { + const { + document: { + pdfManager, + xref + } + } = documentData; + await Promise.all([pdfManager.ensureCatalog("destinations").then(destinations => documentData.destinations = destinations), pdfManager.ensureCatalog("rawPageLabels").then(pageLabels => documentData.pageLabels = pageLabels), pdfManager.ensureCatalog("structTreeRoot").then(structTreeRoot => documentData.structTreeRoot = structTreeRoot), pdfManager.ensureCatalog("acroForm").then(acroForm => documentData.acroForm = acroForm), pdfManager.ensureCatalog("documentOutlineForEditor").then(outline => documentData.outline = outline), pdfManager.ensureCatalog("rawEmbeddedFiles").then(ef => documentData.embeddedFiles = ef)]); + const structTreeRoot = documentData.structTreeRoot; + if (structTreeRoot) { + const rootDict = structTreeRoot.dict; + const parentTree = rootDict.get("ParentTree"); + if (parentTree) { + const numberTree = new NumberTree(parentTree, xref); + documentData.parentTree = numberTree.getAll(true); + } + const idTree = rootDict.get("IDTree"); + if (idTree) { + const nameTree = new NameTree(idTree, xref); + documentData.idTree = nameTree.getAll(true); + } + documentData.roleMap = rootDict.get("RoleMap") || null; + documentData.classMap = rootDict.get("ClassMap") || null; + let namespaces = rootDict.get("Namespaces") || null; + if (namespaces && !Array.isArray(namespaces)) { + namespaces = [namespaces]; + } + documentData.namespaces = namespaces; + documentData.structTreeAF = rootDict.get("AF") || null; + documentData.structTreePronunciationLexicon = rootDict.get("PronunciationLexicon") || null; + } + } + async #postCollectPageData(pageData) { + const { + page: { + xref, + annotations + }, + documentData: { + pagesMap, + destinations, + usedNamedDestinations, + fieldToParent + } + } = pageData; + if (!annotations) { + return; + } + const promises = []; + let newAnnotations = []; + let newIndex = 0; + let { + hasSignatureAnnotations + } = pageData.documentData; + for (const annotationRef of annotations) { + const newAnnotationIndex = newIndex++; + promises.push(xref.fetchIfRefAsync(annotationRef).then(async annotationDict => { + if (!isName(annotationDict.get("Subtype"), "Link")) { + if (isName(annotationDict.get("Subtype"), "Widget")) { + hasSignatureAnnotations ||= isName(getInheritableProperty({ + dict: annotationDict, + key: "FT" + }), "Sig"); + const parentRef = annotationDict.getRaw("Parent") || null; + fieldToParent.put(annotationRef, parentRef); + } + newAnnotations[newAnnotationIndex] = annotationRef; + return; + } + const action = annotationDict.get("A"); + if (action instanceof Dict && !isName(action.get("S"), "GoTo")) { + newAnnotations[newAnnotationIndex] = annotationRef; + return; + } + const dest = action instanceof Dict ? action.get("D") : annotationDict.get("Dest"); + if (!dest || Array.isArray(dest) && (!(dest[0] instanceof Ref) || pagesMap.has(dest[0]))) { + newAnnotations[newAnnotationIndex] = annotationRef; + } else if (dest instanceof Name || typeof dest === "string") { + const destString = stringToPDFString(dest instanceof Name ? dest.name : dest, true); + if (destinations.has(destString)) { + newAnnotations[newAnnotationIndex] = annotationRef; + usedNamedDestinations.add(destString); + } + } + })); + } + await Promise.all(promises); + newAnnotations = newAnnotations.filter(Boolean); + pageData.annotations = newAnnotations.length > 0 ? newAnnotations : null; + pageData.documentData.hasSignatureAnnotations ||= hasSignatureAnnotations; + } + #setPostponedRefCopies(allDocumentData) { + for (const { + postponedRefCopies, + pagesMap + } of allDocumentData) { + for (const oldPageRef of pagesMap.keys()) { + postponedRefCopies.put(oldPageRef, []); + } + } + } + #fixPostponedRefCopies(allDocumentData) { + for (const { + postponedRefCopies, + oldRefMapping + } of allDocumentData) { + for (const [oldRef, actions] of postponedRefCopies.items()) { + const newRef = oldRefMapping.get(oldRef); + for (const action of actions) { + action(newRef); + } + } + postponedRefCopies.clear(); + } + } + #visitObject(obj, callback, visited = new RefSet()) { + if (obj instanceof Ref) { + if (!visited.has(obj)) { + visited.put(obj); + this.#visitObject(this.xref[obj.num], callback, visited); + } + return; + } + if (Array.isArray(obj)) { + for (const item of obj) { + this.#visitObject(item, callback, visited); + } + return; + } + let dict; + if (obj instanceof BaseStream) { + ({ + dict + } = obj); + } else if (obj instanceof Dict) { + dict = obj; + } + if (dict) { + callback(dict); + for (const value of dict.getRawValues()) { + this.#visitObject(value, callback, visited); + } + } + } + async #mergeStructTrees(allDocumentData) { + let newStructParentId = 0; + const { + parentTree: newParentTree + } = this; + for (let i = 0, ii = this.newPages.length; i < ii; i++) { + if (!this.oldPages[i]) { + continue; + } + const { + documentData: { + parentTree, + oldRefMapping, + oldStructParentMapping, + usedStructParents, + document: { + xref + } + } + } = this.oldPages[i]; + if (!parentTree) { + continue; + } + const pageRef = this.newPages[i]; + const pageDict = this.xref[pageRef.num]; + const visited = new RefSet(); + visited.put(pageRef); + this.#visitObject(pageDict, dict => { + const structParent = dict.get("StructParent") ?? dict.get("StructParents"); + if (typeof structParent !== "number") { + return; + } + usedStructParents.add(structParent); + let parent = parentTree.get(structParent); + const parentRef = parent instanceof Ref ? parent : null; + if (parentRef) { + const array = xref.fetch(parentRef); + if (Array.isArray(array)) { + parent = array; + } + } + if (Array.isArray(parent) && parent.every(ref => ref === null)) { + parent = null; + } + if (!parent) { + if (dict.has("StructParent")) { + dict.delete("StructParent"); + } else { + dict.delete("StructParents"); + } + return; + } + let newStructParent = oldStructParentMapping.get(structParent); + if (newStructParent === undefined) { + newStructParent = newStructParentId++; + oldStructParentMapping.set(structParent, newStructParent); + newParentTree.set(newStructParent, [oldRefMapping, parent]); + } + if (dict.has("StructParent")) { + dict.set("StructParent", newStructParent); + } else { + dict.set("StructParents", newStructParent); + } + }, visited); + } + const { + structTreeKids, + idTree: newIdTree, + classMap: newClassMap, + roleMap: newRoleMap, + namespaces: newNamespaces, + structTreeAF: newStructTreeAF, + structTreePronunciationLexicon: newStructTreePronunciationLexicon + } = this; + for (const documentData of allDocumentData) { + const { + document: { + xref + }, + oldRefMapping, + parentTree, + usedStructParents, + structTreeRoot, + idTree, + classMap, + roleMap, + namespaces, + structTreeAF, + structTreePronunciationLexicon + } = documentData; + if (!structTreeRoot) { + continue; + } + this.currentDocument = documentData; + const removedStructElements = new RefSet(); + for (const [key, value] of parentTree || []) { + if (!usedStructParents.has(key) && value instanceof Ref) { + removedStructElements.put(value); + } + } + const dedupIDs = new Map(); + for (const [id, nodeRef] of idTree || []) { + let _id = id; + if (newIdTree.has(id)) { + for (let i = 1;; i++) { + const newId = `${id}_${i}`; + if (!newIdTree.has(newId)) { + dedupIDs.set(id, newId); + _id = newId; + break; + } + } + } + newIdTree.set(_id, nodeRef); + } + const dedupClasses = new Map(); + if (classMap?.size > 0) { + for (let [className, classDict] of classMap) { + classDict = await this.#collectDependencies(classDict, true, xref); + if (newClassMap.has(className)) { + for (let i = 1;; i++) { + const newClassName = `${className}_${i}`; + if (!newClassMap.has(newClassName)) { + dedupClasses.set(className, newClassName); + className = newClassName; + break; + } + } + } + newClassMap.set(className, classDict); + } + } + const dedupRoles = new Map(); + if (roleMap?.size > 0) { + for (const [roleName, mappedName] of roleMap) { + const newMappedName = newRoleMap.get(roleName); + if (!newMappedName) { + newRoleMap.set(roleName, mappedName); + continue; + } + if (newMappedName === mappedName) { + continue; + } + for (let i = 1;; i++) { + const newRoleName = `${roleName}_${i}`; + if (!newRoleMap.has(newRoleName)) { + dedupRoles.set(roleName, newRoleName); + newRoleMap.set(newRoleName, mappedName); + break; + } + } + } + } + if (namespaces?.length > 0) { + for (const namespaceRef of namespaces) { + const namespace = await xref.fetchIfRefAsync(namespaceRef); + let ns = namespace.get("NS"); + if (!ns || newNamespaces.has(ns)) { + continue; + } + ns = stringToPDFString(ns, false); + const newNamespace = await this.#collectDependencies(namespace, true, xref); + newNamespaces.set(ns, newNamespace); + } + } + if (structTreeAF) { + for (const afRef of structTreeAF) { + newStructTreeAF.push(await this.#collectDependencies(afRef, true, xref)); + } + } + if (structTreePronunciationLexicon) { + for (const lexiconRef of structTreePronunciationLexicon) { + newStructTreePronunciationLexicon.push(await this.#collectDependencies(lexiconRef, true, xref)); + } + } + const rawKids = structTreeRoot.dict.getRaw("K"); + if (!rawKids) { + continue; + } + const kids = await this.#resolveStructKids(rawKids, xref); + for (let kid of kids) { + const kidRef = kid instanceof Ref ? kid : null; + kid = await xref.fetchIfRefAsync(kid); + if (!(kid instanceof Dict)) { + continue; + } + let setAsSpan = false; + if (kidRef && removedStructElements.has(kidRef)) { + if (!isName(kid.get("S"), "Link")) { + continue; + } + setAsSpan = true; + } + const newKidRef = await this.#cloneStructTreeNode(kidRef, kid, xref, removedStructElements, dedupIDs, dedupClasses, dedupRoles); + if (newKidRef) { + structTreeKids.push(newKidRef); + if (kidRef) { + oldRefMapping.put(kidRef, newKidRef); + } + if (setAsSpan) { + this.xref[newKidRef.num].setIfName("S", "Span"); + } + } + } + for (const [id, nodeRef] of idTree || []) { + const newNodeRef = nodeRef instanceof Ref && oldRefMapping.get(nodeRef); + const newId = dedupIDs.get(id) || id; + if (newNodeRef) { + newIdTree.set(newId, newNodeRef); + } else { + newIdTree.delete(newId); + } + } + } + for (const [key, [oldRefMapping, parent]] of newParentTree) { + if (!parent) { + newParentTree.delete(key); + continue; + } + if (!Array.isArray(parent)) { + const newParent = oldRefMapping.get(parent); + if (newParent === undefined) { + newParentTree.delete(key); + } else { + newParentTree.set(key, newParent); + } + continue; + } + const newParents = parent.map(ref => ref instanceof Ref && oldRefMapping.get(ref) || null); + if (newParents.length === 0 || newParents.every(ref => ref === null)) { + newParentTree.delete(key); + continue; + } + newParentTree.set(key, newParents); + } + this.currentDocument = null; + } + #collectValidDestinations(allDocumentData) { + for (const documentData of allDocumentData) { + if (!documentData.destinations) { + continue; + } + const { + destinations, + pagesMap + } = documentData; + const newDestinations = documentData.destinations = new Map(); + for (const [key, dest] of destinations) { + const pageRef = dest[0]; + const pageData = pageRef instanceof Ref && pagesMap.get(pageRef); + if (!pageData) { + continue; + } + (pageData.pointingNamedDestinations ||= new Set()).add(key); + newDestinations.set(key, dest); + } + } + } + #findDuplicateNamedDestinations() { + const { + namedDestinations + } = this; + const getUniqueDestinationName = name => { + if (!namedDestinations.has(name)) { + return name; + } + for (let i = 1;; i++) { + const dedupedName = `${name}_${i}`; + if (!namedDestinations.has(dedupedName)) { + return dedupedName; + } + } + }; + for (let i = 0, ii = this.oldPages.length; i < ii; i++) { + const page = this.oldPages[i]; + if (!page) { + continue; + } + const { + documentData: { + destinations, + dedupNamedDestinations, + usedNamedDestinations + } + } = page; + let { + pointingNamedDestinations + } = page; + if (!pointingNamedDestinations) { + continue; + } + page.pointingNamedDestinations = pointingNamedDestinations = pointingNamedDestinations.intersection(usedNamedDestinations); + for (const pointingDest of pointingNamedDestinations) { + if (!usedNamedDestinations.has(pointingDest)) { + continue; + } + const dest = destinations.get(pointingDest).slice(); + if (!namedDestinations.has(pointingDest)) { + namedDestinations.set(pointingDest, dest); + continue; + } + const newName = getUniqueDestinationName(`${pointingDest}_p${i + 1}`); + dedupNamedDestinations.set(pointingDest, newName); + namedDestinations.set(newName, dest); + } + } + } + #fixNamedDestinations(annotations, dedupNamedDestinations) { + if (dedupNamedDestinations.size === 0) { + return; + } + const fixDestination = (dict, key, dest) => { + if (typeof dest === "string") { + dict.set(key, dedupNamedDestinations.get(stringToPDFString(dest, true)) || dest); + } + }; + for (const annotRef of annotations) { + const annotDict = this.xref[annotRef.num]; + if (!isName(annotDict.get("Subtype"), "Link")) { + continue; + } + const action = annotDict.get("A"); + if (action instanceof Dict && action.has("D")) { + const dest = action.get("D"); + fixDestination(action, "D", dest); + continue; + } + const dest = annotDict.get("Dest"); + fixDestination(annotDict, "Dest", dest); + } + } + #collectOutlineDestinations(allDocumentData) { + const collect = (items, destinations, usedNamedDestinations) => { + for (const item of items) { + if (typeof item.dest === "string" && destinations?.has(item.dest)) { + usedNamedDestinations.add(item.dest); + } + if (item.items.length > 0) { + collect(item.items, destinations, usedNamedDestinations); + } + } + }; + for (const documentData of allDocumentData) { + const { + outline, + destinations, + usedNamedDestinations + } = documentData; + if (outline?.length) { + collect(outline, destinations, usedNamedDestinations); + } + } + } + #isValidOutlineDest(item, documentData) { + const { + dest, + action, + url, + unsafeUrl, + attachment, + setOCGState + } = item; + if (action || url || unsafeUrl || attachment || setOCGState) { + return true; + } + if (!dest) { + return false; + } + if (typeof dest === "string") { + const name = documentData.dedupNamedDestinations.get(dest) || dest; + return this.namedDestinations.has(name); + } + return Array.isArray(dest) && dest[0] instanceof Ref && !!documentData.oldRefMapping.get(dest[0]); + } + #filterOutlineItems(items, documentData) { + const result = []; + for (const item of items) { + const filteredChildren = this.#filterOutlineItems(item.items, documentData); + const hasValidOwnDest = this.#isValidOutlineDest(item, documentData); + if (hasValidOwnDest || filteredChildren.length > 0) { + result.push({ + ...item, + dest: hasValidOwnDest ? item.dest : null, + rawDict: hasValidOwnDest ? item.rawDict : null, + items: filteredChildren, + _documentData: documentData + }); + } + } + return result; + } + #buildOutline(allDocumentData) { + const outlineItems = []; + for (const documentData of allDocumentData) { + const { + outline + } = documentData; + if (!outline?.length) { + continue; + } + outlineItems.push(...this.#filterOutlineItems(outline, documentData)); + } + this.outlineItems = outlineItems.length > 0 ? outlineItems : null; + } + async #setOutlineItemDest(itemDict, item) { + const { + dest, + rawDict + } = item; + const documentData = item._documentData; + if (dest) { + if (typeof dest === "string") { + const name = documentData.dedupNamedDestinations.get(dest) || dest; + itemDict.set("Dest", stringToAsciiOrUTF16BE(name)); + } else if (Array.isArray(dest)) { + const newDest = dest.slice(); + if (newDest[0] instanceof Ref) { + newDest[0] = documentData.oldRefMapping.get(newDest[0]) || newDest[0]; + } + itemDict.set("Dest", newDest); + } + return; + } + const actionDict = rawDict?.get("A"); + if (actionDict instanceof Dict) { + this.currentDocument = documentData; + const actionRef = await this.#cloneObject(actionDict, documentData.document.xref); + this.currentDocument = null; + itemDict.set("A", actionRef); + } + } + async #makeOutline() { + const { + outlineItems + } = this; + if (!outlineItems?.length) { + return; + } + const [outlineRootRef, outlineRootDict] = this.newDict; + outlineRootDict.setIfName("Type", "Outlines"); + const assignRefs = items => { + for (const item of items) { + [item._ref] = this.newDict; + if (item.items.length > 0) { + assignRefs(item.items); + } + } + }; + assignRefs(outlineItems); + const fillItems = async (items, parentRef) => { + let totalCount = 0; + for (let i = 0; i < items.length; i++) { + const item = items[i]; + const dict = this.xref[item._ref.num]; + dict.set("Title", stringToAsciiOrUTF16BE(item.title)); + dict.set("Parent", parentRef); + if (i > 0) { + dict.set("Prev", items[i - 1]._ref); + } + if (i < items.length - 1) { + dict.set("Next", items[i + 1]._ref); + } + if (item.items.length > 0) { + dict.set("First", item.items[0]._ref); + dict.set("Last", item.items.at(-1)._ref); + const childCount = await fillItems(item.items, item._ref); + if (item.count !== undefined) { + dict.set("Count", item.count < 0 ? -childCount : childCount); + } + totalCount += item.count !== undefined && item.count < 0 ? 1 : childCount + 1; + } else { + totalCount += 1; + } + await this.#setOutlineItemDest(dict, item); + const flags = (item.bold ? 2 : 0) | (item.italic ? 1 : 0); + if (flags !== 0) { + dict.set("F", flags); + } + if (item.color && (item.color[0] !== 0 || item.color[1] !== 0 || item.color[2] !== 0)) { + dict.set("C", [item.color[0] / 255, item.color[1] / 255, item.color[2] / 255]); + } + } + return totalCount; + }; + const totalCount = await fillItems(outlineItems, outlineRootRef); + outlineRootDict.set("First", outlineItems[0]._ref); + outlineRootDict.set("Last", outlineItems.at(-1)._ref); + outlineRootDict.set("Count", totalCount); + this.rootDict.set("Outlines", outlineRootRef); + } + async #mergeAcroForms(allDocumentData) { + this.#setAcroFormDefaultBasicValues(allDocumentData); + this.#setAcroFormDefaultAppearance(allDocumentData); + this.#setAcroFormQ(allDocumentData); + await this.#setAcroFormDefaultResources(allDocumentData); + const newFields = this.fields; + for (const documentData of allDocumentData) { + let fields = documentData.acroForm?.get("Fields") || null; + if (!fields && documentData.fieldToParent.size > 0) { + fields = this.#fixFields(documentData.fieldToParent, documentData.document.xref); + } + if (Array.isArray(fields) && fields.length > 0) { + this.currentDocument = documentData; + await this.#cloneFields(newFields, fields); + this.currentDocument = null; + } + } + this.#setAcroFormCalculationOrder(allDocumentData); + } + #setAcroFormQ(allDocumentData) { + let firstQ = 0; + let firstDocData = null; + for (const documentData of allDocumentData) { + const q = documentData.acroForm?.get("Q"); + if (typeof q !== "number" || q === 0) { + continue; + } + if (firstDocData?.acroFormQ > 0) { + documentData.acroFormQ = q; + continue; + } + if (firstQ === 0) { + firstQ = q; + firstDocData = documentData; + continue; + } + if (q === firstQ) { + continue; + } + firstDocData.acroFormQ ||= firstQ; + documentData.acroFormQ = q; + firstQ = 0; + } + if (firstQ > 0) { + this.acroFormQ = firstQ; + } + } + #setAcroFormDefaultBasicValues(allDocumentData) { + let sigFlags = 0; + let needAppearances = false; + for (const documentData of allDocumentData) { + if (!documentData.acroForm) { + continue; + } + const sf = documentData.acroForm.get("SigFlags"); + if (typeof sf === "number" && documentData.hasSignatureAnnotations) { + sigFlags |= sf; + } + if (documentData.acroForm.get("NeedAppearances") === true) { + needAppearances = true; + } + } + this.acroFormSigFlags = sigFlags; + this.acroFormNeedAppearances = needAppearances; + } + #setAcroFormCalculationOrder(allDocumentData) { + const calculationOrder = []; + for (const documentData of allDocumentData) { + const co = documentData.acroForm?.get("CO") || null; + if (!Array.isArray(co)) { + continue; + } + const { + oldRefMapping + } = documentData; + for (const coRef of co) { + const newCoRef = coRef instanceof Ref && oldRefMapping.get(coRef); + if (newCoRef) { + calculationOrder.push(newCoRef); + } + } + } + this.acroFormCalculationOrder = calculationOrder.length > 0 ? calculationOrder : null; + } + #setAcroFormDefaultAppearance(allDocumentData) { + let firstDA = null; + let firstDocData = null; + for (const documentData of allDocumentData) { + const da = documentData.acroForm?.get("DA") || null; + if (!da || typeof da !== "string") { + continue; + } + if (firstDocData?.acroFormDefaultAppearance) { + documentData.acroFormDefaultAppearance = da; + continue; + } + if (!firstDA) { + firstDA = da; + firstDocData = documentData; + continue; + } + if (da === firstDA) { + continue; + } + firstDocData.acroFormDefaultAppearance ||= firstDA; + documentData.acroFormDefaultAppearance = da; + firstDA = null; + } + if (firstDA) { + this.acroFormDefaultAppearance = firstDA; + } + } + async #setAcroFormDefaultResources(allDocumentData) { + let firstDR = null; + let firstDRRef = null; + let firstDocData = null; + for (const documentData of allDocumentData) { + const dr = documentData.acroForm?.get("DR") || null; + if (!dr || !(dr instanceof Dict)) { + continue; + } + if (firstDocData?.acroFormDefaultResources) { + documentData.acroFormDefaultResources = dr; + continue; + } + if (!firstDR) { + firstDR = dr; + firstDRRef = documentData.acroForm.getRaw("DR"); + firstDocData = documentData; + continue; + } + if (deepCompare(firstDR, dr)) { + continue; + } + firstDocData.acroFormDefaultResources ||= firstDR; + documentData.acroFormDefaultResources = dr; + firstDR = null; + firstDRRef = null; + } + if (firstDR) { + this.currentDocument = firstDocData; + this.acroFormDefaultResources = await this.#collectDependencies(firstDRRef, true, firstDocData.document.xref); + this.currentDocument = null; + } + } + #fixFields(fieldToParent, xref) { + const newFields = []; + const processed = new RefSet(); + for (const [fieldRef, parentRef] of fieldToParent.items()) { + if (!parentRef) { + newFields.push(fieldRef); + continue; + } + let parent = parentRef; + let lastNonNullParent = parentRef; + const visited = new RefSet(); + while (true) { + if (parent instanceof Ref) { + if (visited.has(parent)) { + break; + } + visited.put(parent); + } + const parentDict = xref.fetchIfRef(parent); + if (!(parentDict instanceof Dict)) { + break; + } + parent = parentDict.getRaw("Parent") || null; + if (!parent) { + break; + } + lastNonNullParent = parent; + } + if (lastNonNullParent instanceof Ref && !processed.has(lastNonNullParent)) { + newFields.push(lastNonNullParent); + processed.put(lastNonNullParent); + } + } + return newFields; + } + async #cloneFields(newFields, fields) { + const processed = new RefSet(); + const stack = [{ + kids: fields, + newKids: newFields, + pos: 0, + oldParentRef: null, + parentRef: null, + parent: null + }]; + const { + document: { + xref + }, + oldRefMapping, + fieldToParent, + acroFormDefaultAppearance, + acroFormDefaultResources, + acroFormQ + } = this.currentDocument; + const daToFix = []; + const drToFix = []; + while (stack.length > 0) { + const data = stack.at(-1); + const { + kids, + newKids, + parent, + pos + } = data; + if (pos === kids.length) { + stack.pop(); + if (newKids.length === 0 || !parent) { + continue; + } + const parentDict = this.xref[data.parentRef.num] = this.cloneDict(parent); + parentDict.delete("Parent"); + parentDict.delete("Kids"); + await this.#collectDependencies(parentDict, false, xref); + parentDict.set("Kids", newKids); + if (stack.length > 0) { + const lastData = stack.at(-1); + if (!lastData.parentRef && lastData.oldParentRef) { + const parentRef = lastData.parentRef = this.newRef; + parentDict.set("Parent", parentRef); + oldRefMapping.put(lastData.oldParentRef, parentRef); + } + lastData.newKids.push(data.parentRef); + } + continue; + } + const oldKidRef = kids[data.pos++]; + if (!(oldKidRef instanceof Ref) || processed.has(oldKidRef)) { + continue; + } + processed.put(oldKidRef); + const kid = xref.fetchIfRef(oldKidRef); + if (!(kid instanceof Dict)) { + continue; + } + if (kid.has("Kids")) { + const kidsArray = kid.get("Kids"); + if (!Array.isArray(kidsArray)) { + continue; + } + stack.push({ + kids: kidsArray, + newKids: [], + pos: 0, + oldParentRef: oldKidRef, + parentRef: null, + parent: kid + }); + continue; + } + if (!fieldToParent.has(oldKidRef)) { + continue; + } + const newRef = oldRefMapping.get(oldKidRef); + if (!newRef) { + continue; + } + newKids.push(newRef); + if (!data.parentRef && data.oldParentRef) { + data.parentRef = this.newRef; + oldRefMapping.put(data.oldParentRef, data.parentRef); + } + const newKid = this.xref[newRef.num]; + if (data.parentRef) { + newKid.set("Parent", data.parentRef); + } + if (acroFormDefaultAppearance && !newKid.has("DA")) { + daToFix.push(newKid); + } + if (acroFormDefaultResources && !newKid.has("Kids") && newKid.get("AP") instanceof Dict) { + drToFix.push(newKid); + } + if (acroFormQ && !newKid.has("Q")) { + newKid.set("Q", acroFormQ); + } + } + for (const field of daToFix) { + const fieldType = getInheritableProperty({ + dict: field, + key: "FT" + }); + if (!isName(fieldType, "Tx")) { + continue; + } + const da = getInheritableProperty({ + dict: field, + key: "DA" + }); + if (!da) { + field.set("DA", acroFormDefaultAppearance); + } + } + const resourcesValuesCache = new Map(); + const fixAppearanceResources = async stream => { + let resources = stream.dict.getRaw("Resources"); + resources &&= this.xrefWrapper.fetchIfRef(resources); + if (!(resources instanceof Dict)) { + const newResourcesRef = await resourcesValuesCache.getOrInsertComputed(acroFormDefaultResources, () => this.#cloneObject(acroFormDefaultResources, xref)); + stream.dict.set("Resources", newResourcesRef); + return; + } + for (const [resKey, resValue] of acroFormDefaultResources.getRawEntries()) { + if (resources.has(resKey)) { + continue; + } + let newResValue = resValue; + if (resValue instanceof Ref) { + newResValue = await this.#collectDependencies(resValue, true, xref); + } else if (resValue instanceof Dict || resValue instanceof BaseStream || Array.isArray(resValue)) { + newResValue = await resourcesValuesCache.getOrInsertComputed(resValue, () => this.#cloneObject(resValue, xref)); + } + resources.set(resKey, newResValue); + } + }; + for (const field of drToFix) { + const ap = field.get("AP"); + for (const [, value] of ap) { + if (value instanceof BaseStream) { + await fixAppearanceResources(value); + } else if (value instanceof Dict) { + for (const [, stream] of value) { + if (stream instanceof BaseStream) { + await fixAppearanceResources(stream); + } + } + } + } + } + } + async #collectPageLabels() { + if (!this.isSingleFile) { + return; + } + const firstRealPage = this.oldPages.find(p => !!p); + if (!firstRealPage) { + return; + } + const { + documentData: { + document, + pageLabels + } + } = firstRealPage; + if (!pageLabels) { + return; + } + const numPages = document.numPages; + const labelsByPageIndex = new Map(); + const oldPageIndices = new Set(this.oldPages.filter(Boolean).map(({ + page: { + pageIndex + } + }) => pageIndex)); + let currentLabel = null; + let stFirstIndex = -1; + for (let i = 0; i < numPages; i++) { + const newLabel = pageLabels.get(i); + if (newLabel) { + currentLabel = newLabel; + stFirstIndex = currentLabel.has("St") ? i : -1; + } + if (!oldPageIndices.has(i)) { + continue; + } + if (stFirstIndex !== -1) { + const st = currentLabel.get("St"); + currentLabel = this.cloneDict(currentLabel); + currentLabel.set("St", st + (i - stFirstIndex)); + stFirstIndex = -1; + } + labelsByPageIndex.set(i, currentLabel); + } + const defaultLabel = index => { + const label = new Dict(); + label.setIfName("S", "D"); + label.set("St", index + 1); + return label; + }; + currentLabel = null; + const newPageLabels = this.pageLabels = []; + for (let i = 0, ii = this.oldPages.length; i < ii; i++) { + const pageData = this.oldPages[i]; + const label = pageData ? labelsByPageIndex.get(pageData.page.pageIndex) || defaultLabel(i) : defaultLabel(i); + if (label === currentLabel) { + continue; + } + currentLabel = label; + newPageLabels.push([i, currentLabel]); + } + } + async #makePageCopy(pageIndex) { + const { + page, + documentData, + annotations, + pointingNamedDestinations, + copyLevel + } = this.oldPages[pageIndex]; + this.currentDocument = documentData; + const { + dedupNamedDestinations, + oldRefMapping + } = documentData; + const { + xref, + rotate, + mediaBox, + resources, + ref: oldPageRef + } = page; + const pageRef = this.newRef; + const pageDict = this.xref[pageRef.num] = this.cloneDict(page.pageDict); + oldRefMapping.put(oldPageRef, pageRef); + if (pointingNamedDestinations) { + for (const pointingDest of pointingNamedDestinations) { + const name = dedupNamedDestinations.get(pointingDest) || pointingDest; + const dest = this.namedDestinations.get(name); + dest[0] = pageRef; + } + } + for (const key of ["Rotate", "MediaBox", "CropBox", "BleedBox", "TrimBox", "ArtBox", "Resources", "Annots", "Parent", "UserUnit"]) { + pageDict.delete(key); + } + const lastRef = this.newRefCount; + await this.#collectDependencies(pageDict, false, xref); + pageDict.set("Rotate", rotate); + pageDict.set("MediaBox", mediaBox); + for (const boxName of ["CropBox", "BleedBox", "TrimBox", "ArtBox"]) { + const box = page.getBoundingBox(boxName); + if (box?.some((value, index) => value !== mediaBox[index])) { + pageDict.set(boxName, box); + } + } + const userUnit = page.userUnit; + if (userUnit !== 1) { + pageDict.set("UserUnit", userUnit); + } + pageDict.setIfDict("Resources", await this.#collectDependencies(resources, true, xref)); + let newAnnots = null; + if (annotations) { + const newAnnotations = await this.#collectDependencies(annotations, true, xref); + this.#fixNamedDestinations(newAnnotations, dedupNamedDestinations); + if (Array.isArray(newAnnotations) && newAnnotations.length > 0) { + newAnnots = newAnnotations; + } + } + const newAnnotations = documentData.document === this.#primaryDocument ? this.#newAnnotationsParams?.newAnnotationsByPage?.get(page.pageIndex)?.filter(({ + copyLevel: level + }) => (level ?? 0) === copyLevel) : null; + if (newAnnotations?.length) { + const { + handler, + task, + imagesPromises + } = this.#newAnnotationsParams; + const changes = new RefMap(); + const newData = await AnnotationFactory.saveNewAnnotations(page._createPartialEvaluator(handler), this.xrefWrapper, task, newAnnotations, imagesPromises, changes); + for (const [ref, { + data + }] of changes.items()) { + this.xref[ref.num] = data; + } + newAnnots ||= []; + for (const { + ref + } of newData.annotations) { + newAnnots.push(ref); + } + } + pageDict.setIfArray("Annots", newAnnots); + if (this.useObjectStreams) { + const newLastRef = this.newRefCount; + const pageObjectRefs = []; + for (let i = lastRef; i < newLastRef; i++) { + const obj = this.xref[i]; + if (obj instanceof BaseStream) { + continue; + } + pageObjectRefs.push(Ref.get(i, 0)); + } + for (let i = 0; i < pageObjectRefs.length; i += 0xffff) { + const objStreamRef = this.newRef; + this.objStreamRefs.add(objStreamRef.num); + this.xref[objStreamRef.num] = pageObjectRefs.slice(i, i + 0xffff); + } + } + this.currentDocument = null; + return pageRef; + } + #modalPageSize() { + const counts = new Map(); + for (const pageData of this.oldPages) { + if (!pageData) { + continue; + } + const { + page + } = pageData; + const [x0, y0, x1, y1] = page.view; + let width = x1 - x0; + let height = y1 - y0; + if (width <= 0 || height <= 0) { + continue; + } + if (page.rotate % 180 !== 0) { + [width, height] = [height, width]; + } + const key = `${width}x${height}`; + const entry = counts.get(key); + if (entry) { + entry.count++; + } else { + counts.set(key, { + width, + height, + count: 1 + }); + } + } + if (counts.size === 0) { + const [,, width, height] = LETTER_SIZE_MEDIABOX; + return { + width, + height + }; + } + let best = null; + for (const entry of counts.values()) { + if (!best || entry.count > best.count || entry.count === best.count && entry.width * entry.height > best.width * best.height) { + best = entry; + } + } + return { + width: best.width, + height: best.height + }; + } + async #makeImagePage(bitmap, pageSize) { + const { + width: pageW, + height: pageH + } = pageSize; + const DEFAULT_MARGIN_RATIO = 0.1; + const margin = pageW * DEFAULT_MARGIN_RATIO; + const availW = Math.max(1, pageW - 2 * margin); + const availH = Math.max(1, pageH - 2 * margin); + const lastRef = this.newRefCount; + const { + imageStream, + smaskStream, + width: imgW, + height: imgH + } = await createImage(bitmap, this.xrefWrapper, { + closeBitmap: true + }); + const scale = Math.min(availW / imgW, availH / imgH); + const drawW = imgW * scale; + const drawH = imgH * scale; + const tx = (pageW - drawW) / 2; + const ty = (pageH - drawH) / 2; + if (smaskStream) { + const smaskRef = this.newRef; + this.xref[smaskRef.num] = smaskStream; + imageStream.dict.set("SMask", smaskRef); + } + const imageRef = this.newRef; + this.xref[imageRef.num] = imageStream; + const xobjectDict = new Dict(this.xrefWrapper); + xobjectDict.set("Im0", imageRef); + const resourcesDict = new Dict(this.xrefWrapper); + resourcesDict.set("XObject", xobjectDict); + resourcesDict.set("ProcSet", [Name.get("PDF"), Name.get("ImageC")]); + const content = `q ${core_utils_numberToString(drawW)} 0 0 ${core_utils_numberToString(drawH)} ` + `${core_utils_numberToString(tx)} ${core_utils_numberToString(ty)} cm /Im0 Do Q`; + const contentsStream = new StringStream(content, new Dict(this.xrefWrapper)); + const contentsRef = this.newRef; + this.xref[contentsRef.num] = contentsStream; + const pageRef = this.newRef; + const pageDict = this.xref[pageRef.num] = new Dict(this.xrefWrapper); + pageDict.setIfName("Type", "Page"); + pageDict.set("MediaBox", [0, 0, pageW, pageH]); + pageDict.set("Resources", resourcesDict); + pageDict.set("Contents", contentsRef); + if (this.useObjectStreams) { + const newLastRef = this.newRefCount; + const pageObjectRefs = []; + for (let i = lastRef; i < newLastRef; i++) { + const obj = this.xref[i]; + if (obj instanceof BaseStream) { + continue; + } + pageObjectRefs.push(Ref.get(i, 0)); + } + for (let i = 0; i < pageObjectRefs.length; i += 0xffff) { + const objStreamRef = this.newRef; + this.objStreamRefs.add(objStreamRef.num); + this.xref[objStreamRef.num] = pageObjectRefs.slice(i, i + 0xffff); + } + } + return pageRef; + } + #makePageTree() { + const { + newPages: pages, + rootDict, + pagesRef, + pagesDict + } = this; + rootDict.set("Pages", pagesRef); + pagesDict.setIfName("Type", "Pages"); + pagesDict.set("Count", pages.length); + const maxLeaves = false ? 0 : MAX_LEAVES_PER_PAGES_NODE; + const stack = [{ + dict: pagesDict, + kids: pages, + parentRef: pagesRef + }]; + while (stack.length > 0) { + const { + dict, + kids, + parentRef + } = stack.pop(); + if (kids.length <= maxLeaves) { + dict.set("Kids", kids); + for (const ref of kids) { + this.xref[ref.num].set("Parent", parentRef); + } + continue; + } + const chunkSize = Math.max(maxLeaves, Math.ceil(kids.length / maxLeaves)); + const kidsChunks = []; + for (let i = 0; i < kids.length; i += chunkSize) { + kidsChunks.push(kids.slice(i, i + chunkSize)); + } + const kidsRefs = []; + dict.set("Kids", kidsRefs); + for (const chunk of kidsChunks) { + const [kidRef, kidDict] = this.newDict; + kidsRefs.push(kidRef); + kidDict.setIfName("Type", "Pages"); + kidDict.set("Parent", parentRef); + kidDict.set("Count", chunk.length); + stack.push({ + dict: kidDict, + kids: chunk, + parentRef: kidRef + }); + } + } + } + #makeNameNumTree(map, areNames) { + const allEntries = map.sort(areNames ? ([keyA], [keyB]) => { + if (keyA < keyB) { + return -1; + } + return keyA > keyB ? 1 : 0; + } : ([keyA], [keyB]) => keyA - keyB); + const maxLeaves = false ? 0 : MAX_IN_NAME_TREE_NODE; + const [treeRef, treeDict] = this.newDict; + const stack = [{ + dict: treeDict, + entries: allEntries, + isRoot: true + }]; + const valueType = areNames ? "Names" : "Nums"; + while (stack.length > 0) { + const { + dict, + entries, + isRoot + } = stack.pop(); + if (entries.length <= maxLeaves) { + if (!isRoot) { + dict.set("Limits", [entries[0][0], entries.at(-1)[0]]); + } + dict.set(valueType, entries.flat()); + continue; + } + const entriesChunks = []; + const chunkSize = Math.max(maxLeaves, Math.ceil(entries.length / maxLeaves)); + for (let i = 0; i < entries.length; i += chunkSize) { + entriesChunks.push(entries.slice(i, i + chunkSize)); + } + const entriesRefs = []; + dict.set("Kids", entriesRefs); + for (const chunk of entriesChunks) { + const [entriesRef, entriesDict] = this.newDict; + entriesRefs.push(entriesRef); + entriesDict.set("Limits", [chunk[0][0], chunk.at(-1)[0]]); + stack.push({ + dict: entriesDict, + entries: chunk + }); + } + } + return treeRef; + } + #makePageLabelsTree() { + const { + pageLabels + } = this; + if (!pageLabels?.length) { + return; + } + const { + rootDict + } = this; + const pageLabelsRef = this.#makeNameNumTree(this.pageLabels, false); + rootDict.set("PageLabels", pageLabelsRef); + } + async #collectEmbeddedFiles(allDocumentData) { + const { + embeddedFiles + } = this; + for (const documentData of allDocumentData) { + const { + embeddedFiles: docEmbeddedFiles, + document: { + xref + } + } = documentData; + if (!docEmbeddedFiles?.size) { + continue; + } + this.currentDocument = documentData; + for (const [key, valueRef] of docEmbeddedFiles) { + let name = key; + if (embeddedFiles.has(name)) { + const displayName = stringToPDFString(key, true); + for (let i = 1;; i++) { + const deduped = stringToAsciiOrUTF16BE(`${displayName}_${i}`); + if (!embeddedFiles.has(deduped)) { + name = deduped; + break; + } + } + } + embeddedFiles.set(name, await this.#collectDependencies(valueRef, true, xref)); + } + this.currentDocument = null; + } + } + #makeEmbeddedFilesTree() { + const { + embeddedFiles + } = this; + if (embeddedFiles.size === 0) { + return; + } + if (!this.namesDict) { + [this.namesRef, this.namesDict] = this.newDict; + this.rootDict.set("Names", this.namesRef); + } + this.namesDict.set("EmbeddedFiles", this.#makeNameNumTree(Array.from(embeddedFiles.entries()), true)); + } + #makeDestinationsTree() { + const { + namedDestinations + } = this; + if (namedDestinations.size === 0) { + return; + } + if (!this.namesDict) { + [this.namesRef, this.namesDict] = this.newDict; + this.rootDict.set("Names", this.namesRef); + } + this.namesDict.set("Dests", this.#makeNameNumTree(Array.from(namedDestinations, ([name, dest]) => [stringToAsciiOrUTF16BE(name), dest]), true)); + } + #makeStructTree() { + const { + structTreeKids + } = this; + if (!structTreeKids?.length) { + return; + } + const { + rootDict + } = this; + const structTreeRef = this.newRef; + const structTree = this.xref[structTreeRef.num] = new Dict(); + structTree.setIfName("Type", "StructTreeRoot"); + structTree.setIfArray("K", structTreeKids); + for (const kidRef of structTreeKids) { + const kid = this.xref[kidRef.num]; + const type = kid.get("Type"); + if (!type || isName(type, "StructElem")) { + kid.set("P", structTreeRef); + } + } + if (this.parentTree.size > 0) { + const parentTreeRef = this.#makeNameNumTree(Array.from(this.parentTree.entries()), false); + const parentTree = this.xref[parentTreeRef.num]; + parentTree.setIfName("Type", "ParentTree"); + structTree.set("ParentTree", parentTreeRef); + let nextKey = 0; + for (const key of this.parentTree.keys()) { + nextKey = Math.max(nextKey, key + 1); + } + structTree.set("ParentTreeNextKey", nextKey); + } + if (this.idTree.size > 0) { + const idTreeRef = this.#makeNameNumTree(Array.from(this.idTree.entries()), true); + const idTree = this.xref[idTreeRef.num]; + idTree.setIfName("Type", "IDTree"); + structTree.set("IDTree", idTreeRef); + } + if (this.classMap.size > 0) { + const classMapRef = this.newRef; + this.xref[classMapRef.num] = this.classMap; + structTree.set("ClassMap", classMapRef); + } + if (this.roleMap.size > 0) { + const roleMapRef = this.newRef; + this.xref[roleMapRef.num] = this.roleMap; + structTree.set("RoleMap", roleMapRef); + } + if (this.namespaces.size > 0) { + const namespacesRef = this.newRef; + this.xref[namespacesRef.num] = Array.from(this.namespaces.values()); + structTree.set("Namespaces", namespacesRef); + } + if (this.structTreeAF.length > 0) { + const structTreeAFRef = this.newRef; + this.xref[structTreeAFRef.num] = this.structTreeAF; + structTree.set("AF", structTreeAFRef); + } + if (this.structTreePronunciationLexicon.length > 0) { + const structTreePronunciationLexiconRef = this.newRef; + this.xref[structTreePronunciationLexiconRef.num] = this.structTreePronunciationLexicon; + structTree.set("PronunciationLexicon", structTreePronunciationLexiconRef); + } + rootDict.set("StructTreeRoot", structTreeRef); + } + #makeAcroForm() { + if (this.fields.length === 0) { + return; + } + const { + rootDict + } = this; + const acroFormRef = this.newRef; + const acroForm = this.xref[acroFormRef.num] = new Dict(); + rootDict.set("AcroForm", acroFormRef); + acroForm.set("Fields", this.fields); + if (this.acroFormNeedAppearances) { + acroForm.set("NeedAppearances", true); + } + if (this.acroFormSigFlags > 0) { + acroForm.set("SigFlags", this.acroFormSigFlags); + } + acroForm.setIfArray("CO", this.acroFormCalculationOrder); + acroForm.setIfDefined("DR", this.acroFormDefaultResources); + if (this.acroFormDefaultAppearance) { + acroForm.set("DA", this.acroFormDefaultAppearance); + } + if (this.acroFormQ > 0) { + acroForm.set("Q", this.acroFormQ); + } + } + async #makeRoot() { + const { + rootDict + } = this; + rootDict.setIfName("Type", "Catalog"); + rootDict.setIfName("Version", this.version); + this.#makeAcroForm(); + this.#makePageTree(); + this.#makePageLabelsTree(); + this.#makeEmbeddedFilesTree(); + this.#makeDestinationsTree(); + this.#makeStructTree(); + await this.#makeOutline(); + } + #makeInfo() { + const infoMap = new Map(); + if (this.isSingleFile) { + const firstRealPage = this.oldPages.find(p => !!p); + const { + xref: { + trailer + } + } = firstRealPage.documentData.document; + const oldInfoDict = trailer.get("Info"); + for (const [key, value] of oldInfoDict || []) { + if (typeof value === "string") { + infoMap.set(key, stringToPDFString(value)); + } + } + } + infoMap.delete("ModDate"); + infoMap.set("CreationDate", getModificationDate()); + infoMap.set("Creator", "PDF.js"); + infoMap.set("Producer", "Firefox"); + if (this.author) { + infoMap.set("Author", this.author); + } + if (this.title) { + infoMap.set("Title", this.title); + } + for (const [key, value] of infoMap) { + this.infoDict.set(key, stringToAsciiOrUTF16BE(value)); + } + return infoMap; + } + async #makeEncrypt() { + if (!this.isSingleFile) { + return [null, null, null]; + } + const firstRealPage = this.oldPages.find(p => !!p); + const { + documentData + } = firstRealPage; + const { + document: { + xref: { + trailer, + encrypt + } + } + } = documentData; + if (!trailer.has("Encrypt")) { + return [null, null, null]; + } + const encryptDict = trailer.get("Encrypt"); + if (!(encryptDict instanceof Dict)) { + return [null, null, null]; + } + this.currentDocument = documentData; + const result = [await this.#cloneObject(encryptDict, trailer.xref), encrypt, trailer.get("ID")]; + this.currentDocument = null; + return result; + } + async #createChanges() { + const changes = new RefMap(); + changes.put(Ref.get(0, 0xffff), { + data: null + }); + for (let i = 1, ii = this.xref.length; i < ii; i++) { + if (this.objStreamRefs?.has(i)) { + await this.#createObjectStream(Ref.get(i, 0), this.xref[i], changes); + } else { + changes.put(Ref.get(i, 0), { + data: this.xref[i] + }); + } + } + return [changes, this.newRef]; + } + async #createObjectStream(objStreamRef, objRefs, changes) { + const streamBuffer = [""]; + const objOffsets = []; + let offset = 0; + const buffer = []; + for (let i = 0, ii = objRefs.length; i < ii; i++) { + const objRef = objRefs[i]; + changes.put(objRef, { + data: null, + objStreamRef, + index: i + }); + objOffsets.push(`${objRef.num} ${offset}`); + const data = this.xref[objRef.num]; + await writeValue(data, buffer, null); + const obj = buffer.join(""); + buffer.length = 0; + streamBuffer.push(obj); + offset += obj.length + 1; + } + streamBuffer[0] = objOffsets.join("\n"); + const dict = new Dict(); + dict.setIfName("Type", "ObjStm"); + dict.set("N", objRefs.length); + dict.set("First", streamBuffer[0].length + 1); + const objStream = new StringStream(streamBuffer.join("\n"), dict); + changes.put(objStreamRef, { + data: objStream + }); + } + async writePDF() { + await this.#makeRoot(); + const infoMap = this.#makeInfo(); + const [encryptRef, encrypt, fileIds] = await this.#makeEncrypt(); + const [changes, xrefTableRef] = await this.#createChanges(); + const header = stringToBytes(`%PDF-${this.version}\n%\xfa\xde\xfa\xce`); + return incrementalUpdate({ + originalData: header, + changes, + xrefInfo: { + startXRef: null, + rootRef: this.rootRef, + infoRef: this.infoRef, + encryptRef, + newRef: xrefTableRef, + fileIds: fileIds || [null, null], + infoMap + }, + useXrefStream: this.useObjectStreams, + xref: { + encrypt, + encryptRef + } + }); + } +} + +;// ./src/shared/base_pdf_stream.js + + + + + + + + +class BasePDFStream { + #PDFStreamReader = null; + #PDFStreamRangeReader = null; + _fullReader = null; + _rangeReaders = new Set(); + _source = null; + constructor(source, PDFStreamReader, PDFStreamRangeReader) { + this._source = source; + this.#PDFStreamReader = PDFStreamReader; + this.#PDFStreamRangeReader = PDFStreamRangeReader; + } + get _progressiveDataLength() { + return this._fullReader?._loaded ?? 0; + } + getFullReader() { + util_assert(!this._fullReader, "BasePDFStream.getFullReader can only be called once."); + return this._fullReader = new this.#PDFStreamReader(this); + } + getRangeReader(begin, end) { + if (end <= this._progressiveDataLength) { + return null; + } + const reader = new this.#PDFStreamRangeReader(this, begin, end); + this._rangeReaders.add(reader); + return reader; + } + cancelAllRequests(reason) { + this._fullReader?.cancel(reason); + for (const reader of new Set(this._rangeReaders)) { + reader.cancel(reason); + } + } +} +class BasePDFStreamReader { + onProgress = null; + _contentLength = 0; + _filename = null; + _headersCapability = Promise.withResolvers(); + _isRangeSupported = false; + _isStreamingSupported = false; + _loaded = 0; + _stream = null; + constructor(stream) { + this._stream = stream; + } + _callOnProgress() { + this.onProgress?.({ + loaded: this._loaded, + total: this._contentLength + }); + } + get headersReady() { + return this._headersCapability.promise; + } + get filename() { + return this._filename; + } + get contentLength() { + return this._contentLength; + } + get isRangeSupported() { + return this._isRangeSupported; + } + get isStreamingSupported() { + return this._isStreamingSupported; + } + async read() { + unreachable("Abstract method `read` called"); + } + cancel(reason) { + unreachable("Abstract method `cancel` called"); + } +} +class BasePDFStreamRangeReader { + _stream = null; + constructor(stream, begin, end) { + this._stream = stream; + } + async read() { + unreachable("Abstract method `read` called"); + } + cancel(reason) { + unreachable("Abstract method `cancel` called"); + } +} + +;// ./src/core/worker_stream.js + +class PDFWorkerStream extends BasePDFStream { + constructor(source) { + super(source, PDFWorkerStreamReader, PDFWorkerStreamRangeReader); + } +} +class PDFWorkerStreamReader extends BasePDFStreamReader { + _reader = null; + constructor(stream) { + super(stream); + const { + msgHandler + } = stream._source; + const readableStream = msgHandler.sendWithStream("GetReader"); + this._reader = readableStream.getReader(); + msgHandler.sendWithPromise("ReaderHeadersReady").then(data => { + this._contentLength = data.contentLength; + this._isStreamingSupported = data.isStreamingSupported; + this._isRangeSupported = data.isRangeSupported; + this._headersCapability.resolve(); + }, this._headersCapability.reject); + } + async read() { + const { + value, + done + } = await this._reader.read(); + if (done) { + return { + value: undefined, + done: true + }; + } + return { + value: value.buffer, + done: false + }; + } + cancel(reason) { + this._reader.cancel(reason); + } +} +class PDFWorkerStreamRangeReader extends BasePDFStreamRangeReader { + _reader = null; + constructor(stream, begin, end) { + super(stream, begin, end); + const { + msgHandler + } = stream._source; + const readableStream = msgHandler.sendWithStream("GetRangeReader", { + begin, + end + }); + this._reader = readableStream.getReader(); + } + async read() { + const { + value, + done + } = await this._reader.read(); + return done ? { + value: undefined, + done: true + } : { + value: value.buffer, + done: false + }; + } + cancel(reason) { + this._reader.cancel(reason); + } +} + +;// ./src/core/worker.js + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +class WorkerTask { + #capability = Promise.withResolvers(); + terminated = false; + constructor(name) { + this.name = name; + } + get finished() { + return this.#capability.promise; + } + finish() { + this.#capability.resolve(); + } + terminate() { + this.terminated = true; + } + ensureNotTerminated() { + if (this.terminated) { + throw new Error("Worker task was terminated"); + } + } +} +class WorkerMessageHandler { + static { + if (typeof window === "undefined" && !isNodeJS && typeof self !== "undefined" && typeof self.postMessage === "function" && "onmessage" in self) { + this.initializeFromPort(self); + } + } + static setup(handler, port) { + handler.on("configure", data => { + setVerbosityLevel(data.verbosity); + }); + handler.on("GetDocRequest", data => this.createDocumentHandler(data, port)); + } + static createDocumentHandler(docParams, port) { + let pdfManager; + let terminated = false; + let cancelXHRs = null; + const WorkerTasks = new Set(); + const { + docId, + apiVersion + } = docParams; + const workerVersion = "6.4.299"; + if (apiVersion !== workerVersion) { + throw new Error(`The API version "${apiVersion}" does not match ` + `the Worker version "${workerVersion}".`); + } + const buildMsg = (type, prop) => `The \`${type}.prototype\` contains unexpected enumerable property ` + `"${prop}", thus breaking e.g. \`for...in\` iteration of ${type}s.`; + for (const prop in {}) { + throw new Error(buildMsg("Object", prop)); + } + for (const prop in []) { + throw new Error(buildMsg("Array", prop)); + } + const workerHandlerName = docId + "_worker"; + let handler = new MessageHandler(workerHandlerName, docId, port); + function ensureNotTerminated() { + if (terminated) { + throw new Error("Worker was terminated"); + } + } + function startWorkerTask(task) { + WorkerTasks.add(task); + } + function finishWorkerTask(task) { + task.finish(); + WorkerTasks.delete(task); + } + async function loadDocument(recoveryMode) { + await pdfManager.initDocument(recoveryMode); + const isPureXfa = await pdfManager.ensureDoc("isPureXfa"); + if (isPureXfa) { + const task = new WorkerTask("loadXfaResources"); + startWorkerTask(task); + await pdfManager.ensureDoc("loadXfaResources", [handler, task]); + finishWorkerTask(task); + } + const [numPages, fingerprints] = await Promise.all([pdfManager.ensureDoc("numPages"), pdfManager.ensureDoc("fingerprints")]); + const htmlForXfa = isPureXfa ? await pdfManager.ensureDoc("htmlForXfa") : null; + return { + numPages, + fingerprints, + htmlForXfa + }; + } + async function getPdfManager({ + data, + password, + disableAutoFetch, + rangeChunkSize, + docBaseUrl, + enableXfa, + evaluatorOptions + }) { + const pdfManagerArgs = { + source: null, + disableAutoFetch, + docBaseUrl, + docId, + enableXfa, + evaluatorOptions, + handler, + length: 0, + password, + rangeChunkSize + }; + if (data) { + pdfManagerArgs.source = data; + return new LocalPdfManager(pdfManagerArgs); + } + const pdfStream = new PDFWorkerStream({ + msgHandler: handler + }), + fullReader = pdfStream.getFullReader(); + const { + promise, + resolve, + reject + } = Promise.withResolvers(); + let newPdfManager, + cachedChunks = []; + cancelXHRs = reason => pdfStream.cancelAllRequests(reason); + fullReader.headersReady.then(() => { + if (!fullReader.isRangeSupported) { + return; + } + pdfManagerArgs.source = pdfStream; + pdfManagerArgs.length = fullReader.contentLength; + pdfManagerArgs.disableAutoFetch ||= fullReader.isStreamingSupported; + newPdfManager = new NetworkPdfManager(pdfManagerArgs); + for (const chunk of cachedChunks) { + newPdfManager.sendProgressiveData(chunk); + } + cachedChunks = null; + resolve(newPdfManager); + cancelXHRs = null; + }).catch(reason => { + reject(reason); + cancelXHRs = null; + }); + async function readData() { + let loaded = 0; + while (true) { + const { + value, + done + } = await fullReader.read(); + ensureNotTerminated(); + if (done) { + break; + } + loaded += value.byteLength; + if (!fullReader.isStreamingSupported) { + handler.send("DocProgress", { + loaded, + total: fullReader.contentLength + }); + } + if (newPdfManager) { + newPdfManager.sendProgressiveData(value); + } else { + cachedChunks.push(value); + } + } + if (!newPdfManager) { + pdfManagerArgs.source = arrayBuffersToBytes(cachedChunks); + cachedChunks = null; + newPdfManager = new LocalPdfManager(pdfManagerArgs); + resolve(newPdfManager); + } + cancelXHRs = null; + } + readData().catch(reason => { + reject(reason); + cancelXHRs = null; + }); + return promise; + } + async function getPassword(ex) { + const task = new WorkerTask(`PasswordException: response ${ex.code}`); + startWorkerTask(task); + try { + const res = await handler.sendWithPromise("PasswordRequest", ex); + return res.password; + } finally { + Promise.resolve().then(() => { + finishWorkerTask(task); + }); + } + } + function setupDoc(data) { + function onSuccess(doc) { + ensureNotTerminated(); + handler.send("GetDoc", { + pdfInfo: doc + }); + } + function onFailure(ex) { + if (terminated) { + return; + } + if (ex instanceof PasswordException) { + getPassword(ex).then(password => { + pdfManager.updatePassword(password); + pdfManagerReady(); + }).catch(() => { + handler.send("DocException", ex); + }); + } else { + handler.send("DocException", wrapReason(ex)); + } + } + 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); + }, 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", async function ({ + pageIndex + }) { + const page = await pdfManager.getPage(pageIndex); + const [rotate, ref, userUnit, view] = await Promise.all([pdfManager.ensure(page, "rotate"), pdfManager.ensure(page, "ref"), pdfManager.ensure(page, "userUnit"), pdfManager.ensure(page, "view")]); + return { + rotate, + ref, + refStr: ref?.toString() ?? null, + userUnit, + view + }; + }); + handler.on("GetPageIndex", function ({ + num, + gen + }) { + return pdfManager.ensureCatalog("getPageIndex", [Ref.get(num, gen)]); + }); + handler.on("GetDestinations", function () { + return pdfManager.ensureCatalog("destinations"); + }); + handler.on("GetDestination", function ({ + id + }) { + return pdfManager.ensureCatalog("getDestination", [id]); + }); + handler.on("GetPageLabels", function () { + return pdfManager.ensureCatalog("pageLabels"); + }); + handler.on("GetPageLayout", function () { + return pdfManager.ensureCatalog("pageLayout"); + }); + handler.on("GetPageMode", function () { + return pdfManager.ensureCatalog("pageMode"); + }); + handler.on("GetViewerPreferences", function () { + return pdfManager.ensureCatalog("viewerPreferences"); + }); + handler.on("GetOpenAction", function () { + return pdfManager.ensureCatalog("openAction"); + }); + handler.on("GetAttachments", function () { + return pdfManager.ensureCatalog("attachments"); + }); + handler.on("GetAttachmentContent", async function (id) { + let passwordEx; + while (true) { + const password = passwordEx ? await getPassword(passwordEx) : null; + try { + if (password) { + pdfManager.updatePassword(password); + } + return await pdfManager.ensureCatalog("attachmentContent", [id]); + } catch (ex) { + if (ex instanceof PasswordException) { + passwordEx = ex; + continue; + } + throw ex; + } + } + }); + handler.on("GetDocJSActions", function () { + return pdfManager.ensureCatalog("jsActions"); + }); + handler.on("GetPageJSActions", async function ({ + pageIndex + }) { + const page = await pdfManager.getPage(pageIndex); + return pdfManager.ensure(page, "jsActions"); + }); + handler.on("GetAnnotationsByType", async function ({ + types, + pageIndexesToSkip + }) { + const [numPages, annotationGlobals] = await Promise.all([pdfManager.ensureDoc("numPages"), pdfManager.ensureDoc("annotationGlobals")]); + if (!annotationGlobals) { + return null; + } + const pagePromises = []; + const annotationPromises = []; + let task = null; + try { + for (let i = 0; i < numPages; i++) { + if (pageIndexesToSkip?.has(i)) { + continue; + } + if (!task) { + task = new WorkerTask("GetAnnotationsByType"); + startWorkerTask(task); + } + pagePromises.push(pdfManager.getPage(i).then(page => page.collectAnnotationsByType(handler, task, types, annotationPromises, annotationGlobals))); + } + await Promise.all(pagePromises); + const annotations = await Promise.all(annotationPromises); + return annotations.filter(Boolean); + } finally { + if (task) { + finishWorkerTask(task); + } + } + }); + handler.on("GetOutline", function () { + return pdfManager.ensureCatalog("documentOutline"); + }); + handler.on("GetOptionalContentConfig", function () { + return pdfManager.ensureCatalog("optionalContentConfig"); + }); + handler.on("GetPermissions", function () { + return pdfManager.ensureCatalog("permissions"); + }); + handler.on("GetMetadata", function () { + return Promise.all([pdfManager.ensureDoc("documentInfo"), pdfManager.ensureCatalog("metadata"), pdfManager.ensureCatalog("hasStructTree")]); + }); + handler.on("GetMarkInfo", function () { + return pdfManager.ensureCatalog("markInfo"); + }); + handler.on("GetData", async function () { + const stream = await pdfManager.requestLoadedStream(); + return stream.bytes; + }); + handler.on("GetAnnotations", async function ({ + pageIndex, + intent + }) { + const page = await pdfManager.getPage(pageIndex); + const task = new WorkerTask(`GetAnnotations: page ${pageIndex}`); + startWorkerTask(task); + try { + return await page.getAnnotationsData(handler, task, intent); + } finally { + finishWorkerTask(task); + } + }); + handler.on("GetFieldObjects", async function () { + const fieldObjects = await pdfManager.ensureDoc("fieldObjects"); + return fieldObjects?.allFields || null; + }); + handler.on("GetSignatures", function () { + return pdfManager.ensureDoc("signatures"); + }); + handler.on("GetSignatureData", function (id) { + return pdfManager.ensureDoc("getSignatureData", [id]); + }); + handler.on("HasJSActions", function () { + return pdfManager.ensureDoc("hasJSActions"); + }); + handler.on("GetCalculationOrderIds", function () { + return pdfManager.ensureDoc("calculationOrderIds"); + }); + handler.on("ExtractPages", async function ({ + pageInfos, + annotationStorage + }) { + if (!pageInfos) { + warn("extractPages: nothing to extract."); + return null; + } + if (!Array.isArray(pageInfos)) { + pageInfos = [pageInfos]; + } + let newDocumentId = 0; + for (const pageInfo of pageInfos) { + if (pageInfo.image) { + continue; + } + if (pageInfo.document === null) { + pageInfo.document = pdfManager.pdfDocument; + } else if (ArrayBuffer.isView(pageInfo.document)) { + const manager = new LocalPdfManager({ + source: pageInfo.document, + docId: `${docId}_extractPages_${newDocumentId++}`, + handler, + password: pageInfo.password ?? null, + evaluatorOptions: Object.assign({}, pdfManager.evaluatorOptions) + }); + let recoveryMode = false; + let isValid = true; + while (true) { + try { + await manager.requestLoadedStream(); + await manager.initDocument(recoveryMode); + break; + } catch (e) { + if (e instanceof XRefParseException) { + if (recoveryMode === false) { + recoveryMode = true; + continue; + } else { + isValid = false; + warn("extractPages: XRefParseException."); + } + } else if (e instanceof PasswordException) { + try { + const password = await getPassword(e); + manager.updatePassword(password); + } catch { + isValid = false; + warn("extractPages: invalid password."); + } + } else { + isValid = false; + warn("extractPages: invalid document."); + } + if (!isValid) { + break; + } + } + } + if (!isValid) { + pageInfo.document = null; + } + const isPureXfa = await manager.ensureDoc("isPureXfa"); + if (isPureXfa) { + pageInfo.document = null; + warn("extractPages does not support pure XFA documents."); + } else { + pageInfo.document = manager.pdfDocument; + } + } else { + warn("extractPages: invalid document."); + } + } + let task; + try { + const pdfEditor = new PDFEditor(); + task = new WorkerTask(`ExtractPages: ${pageInfos.length} page(s)`); + startWorkerTask(task); + return await pdfEditor.extractPages(pageInfos, annotationStorage, pdfManager.pdfDocument, handler, task); + } catch (reason) { + warn(`extractPages: "${reason}".`); + return null; + } finally { + if (task) { + finishWorkerTask(task); + } + } + }); + handler.on("SaveDocument", async function ({ + isPureXfa, + numPages, + annotationStorage, + supportsPrintToPDF, + filename + }) { + const globalPromises = [pdfManager.requestLoadedStream(), pdfManager.ensureCatalog("acroForm"), pdfManager.ensureCatalog("acroFormRef"), pdfManager.ensureDoc("startXRef"), pdfManager.ensureDoc("xref"), pdfManager.ensureCatalog("structTreeRoot")]; + const changes = new RefMap(); + const promises = []; + const newAnnotationsByPage = !isPureXfa ? getNewAnnotationsMap(annotationStorage) : null; + const [stream, acroForm, acroFormRef, startXRef, xref, _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; + } + } else if (await _structTreeRoot.canUpdateStructTree({ + pdfManager, + 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}`); + startWorkerTask(task); + return page.saveNewAnnotations(handler, task, annotations, imagePromises, changes).finally(() => { + finishWorkerTask(task); + }); + })); + } + if (structTreeRoot === null) { + promises.push(Promise.all(newAnnotationPromises).then(() => StructTreeRoot.createStructureTree({ + newAnnotationsByPage, + xref, + catalogRef, + pdfManager, + changes + }))); + } else if (structTreeRoot) { + promises.push(Promise.all(newAnnotationPromises).then(() => structTreeRoot.updateStructureTree({ + newAnnotationsByPage, + pdfManager, + changes + }))); + } + } + if (isPureXfa) { + promises.push(pdfManager.ensureDoc("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}`); + startWorkerTask(task); + return page.save(handler, task, annotationStorage, changes).finally(() => { + finishWorkerTask(task); + }); + })); + } + } + const refs = await Promise.all(promises); + let xfaData = null; + if (isPureXfa) { + xfaData = refs[0]; + if (!xfaData) { + return stream.bytes; + } + } else if (changes.size === 0) { + return stream.bytes; + } + const needAppearances = acroFormRef && acroForm instanceof Dict && changes.values().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 infoMap = new Map(); + const xrefInfo = xref.trailer.get("Info") || null; + if (xrefInfo instanceof Dict) { + for (const [key, value] of xrefInfo) { + if (typeof value === "string") { + infoMap.set(key, stringToPDFString(value)); + } + } + } + newXrefInfo = { + rootRef: catalogRef, + encryptRef: xref.trailer.getRaw("Encrypt") || null, + newRef: xref.getNewTemporaryRef(), + infoRef: xref.trailer.getRaw("Info") || null, + infoMap, + fileIds: xref.trailer.get("ID") || null, + startXRef, + filename + }; + } + return incrementalUpdate({ + originalData: stream.bytes, + xrefInfo: newXrefInfo, + changes, + xref, + hasXfa: !!xfa, + xfaDatasetsRef, + hasXfaDatasetsEntry, + needAppearances, + acroFormRef, + acroForm, + xfaData, + useXrefStream: isDict(xref.topDict, "XRef") + }).finally(() => { + xref.resetNewTemporaryRef(); + }); + }); + handler.on("GetOperatorList", function ({ + pageId, + pageIndex, + pageProxyId, + intent, + cacheKey, + annotationStorage, + modifiedIds + }, sink) { + pdfManager.getPage(pageId).then(function (page) { + const task = new WorkerTask(`GetOperatorList: page ${pageIndex}`); + startWorkerTask(task); + page.getOperatorList({ + handler, + sink, + task, + intent, + cacheKey, + annotationStorage, + modifiedIds, + pageIndex, + pageProxyId + }).then(() => { + sink.close(); + }, reason => { + if (task.terminated) { + return; + } + sink.error(reason); + }).finally(() => { + finishWorkerTask(task); + }); + }); + }); + handler.on("GetTextContent", function ({ + pageId, + pageIndex, + includeMarkedContent, + disableNormalization + }, sink) { + pdfManager.getPage(pageId).then(function (page) { + const task = new WorkerTask("GetTextContent: page " + pageIndex); + startWorkerTask(task); + page.extractTextContent({ + handler, + task, + sink, + includeMarkedContent, + disableNormalization + }).then(() => { + sink.close(); + }, reason => { + if (task.terminated) { + return; + } + sink.error(reason); + }).finally(() => { + finishWorkerTask(task); + }); + }); + }); + handler.on("GetStructTree", async function ({ + pageIndex + }) { + const page = await pdfManager.getPage(pageIndex); + return pdfManager.ensure(page, "getStructTree"); + }); + handler.on("FontFallback", function ({ + id + }) { + return pdfManager.fontFallback(id, handler); + }); + handler.on("Cleanup", function () { + return pdfManager.cleanup(true); + }); + handler.on("Terminate", async function () { + 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(); + } + await Promise.all(waitOn); + handler.destroy(); + handler = null; + }); + handler.on("Ready", function () { + setupDoc(docParams); + docParams = null; + }); + return workerHandlerName; + } + static initializeFromPort(port) { + const handler = new MessageHandler("worker", "main", port); + this.setup(handler, port); + const testObj = new Uint8Array(); + handler.send("ready", testObj, [testObj.buffer]); + } +} + +;// ./src/pdf.worker.js + +globalThis.pdfjsWorker = { + WorkerMessageHandler: WorkerMessageHandler +}; + +export { WorkerMessageHandler }; + +//# sourceMappingURL=pdf.worker.mjs.map \ No newline at end of file diff --git a/tests/digital-attachments-445.unit.php b/tests/digital-attachments-445.unit.php index 2efb74bb7..d179f0d39 100644 --- a/tests/digital-attachments-445.unit.php +++ b/tests/digital-attachments-445.unit.php @@ -85,6 +85,12 @@ function check(bool $ok, string $message): void { global $checks; if (!$ok) thro ob_start();$book=$saved;include __DIR__.'/../storage/plugins/digital-library/views/badge-icons.php';$badge=(string)ob_get_clean(); check(str_contains($badge,'ebook-icon') && str_contains($badge,'audio-icon'),'an edition and a track still show both badges'); check(!str_contains($html,'sandbox'),'PDFs are not sandboxed, which would stop the browser PDF viewer'); +$readerRoot = __DIR__ . '/../public/assets/vendor/pdfjs-6.4.299/'; +foreach (['build/pdf.mjs','build/pdf.worker.mjs','web/viewer.html','web/viewer.mjs','web/viewer.css','web/pinakes-viewer.css','web/wasm/openjpeg.wasm','web/locale/it/viewer.ftl'] as $asset) { + check(is_file($readerRoot . $asset),'the self-hosted reader includes its required asset: '.$asset); +} +$readerHtml = (string) file_get_contents($readerRoot . 'web/viewer.html'); +check(str_contains($readerHtml,"connect-src 'self' blob: data:") && !preg_match('~<(?:script|link)\\b[^>]*(?:src|href)=["\'](?:https?:)?//~i', $readerHtml),'the reader loads local scripts/styles and limits network connections to this origin'); // A root-relative path outside /uploads/ was stored and shown by the old single-file // field; after the upgrade it must still be shown and savable, not hidden or blocking. $legacyPath=Attachments::fromBook(['file_url'=>'/files/manual.pdf','digital_attachments'=>null]); From 92d930aae6e56acca8a683d68bfad8dd48b249aa Mon Sep 17 00:00:00 2001 From: fabiodalez-dev Date: Mon, 12 Oct 2026 16:37:29 +0200 Subject: [PATCH 13/20] Keep PDF side margins independent of global iframe rules --- storage/plugins/digital-library/assets/css/digital-library.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/storage/plugins/digital-library/assets/css/digital-library.css b/storage/plugins/digital-library/assets/css/digital-library.css index 7aabb8c15..d6109cfb1 100644 --- a/storage/plugins/digital-library/assets/css/digital-library.css +++ b/storage/plugins/digital-library/assets/css/digital-library.css @@ -354,7 +354,7 @@ dialog.digital-pdf-lightbox::backdrop { .digital-pdf-lightbox__action:focus-visible { outline: 2px solid var(--pk-accent, #d70161); outline-offset: 2px; } .digital-pdf-lightbox__frame { flex: 1; min-height: 0; align-self: center; - width: calc(100% - clamp(32px, 8vw, 144px)); max-width: 1280px; + width: min(1280px, calc(100% - clamp(32px, 8vw, 144px))); margin: 20px 0 max(20px, env(safe-area-inset-bottom)); border: 1px solid var(--pk-line, #ece8ea); border-radius: 12px; background: rgba(250, 248, 249, .8); From f5c0b1f8a6a779752a937edac7abf34ecb8bf2ea Mon Sep 17 00:00:00 2001 From: fabiodalez-dev Date: Mon, 12 Oct 2026 16:41:21 +0200 Subject: [PATCH 14/20] Open PDFs as single pages for readable mobile layouts --- storage/plugins/digital-library/views/frontend-pdf-script.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/storage/plugins/digital-library/views/frontend-pdf-script.php b/storage/plugins/digital-library/views/frontend-pdf-script.php index f09b645c1..bcdb85e39 100644 --- a/storage/plugins/digital-library/views/frontend-pdf-script.php +++ b/storage/plugins/digital-library/views/frontend-pdf-script.php @@ -22,6 +22,8 @@ options.set('viewerCssTheme', 1); options.set('defaultZoomValue', 'auto'); options.set('sidebarViewOnLoad', 0); + options.set('spreadModeOnLoad', 0); + options.set('scrollModeOnLoad', 0); options.set('enableScripting', false); options.set('enableAltTextModelDownload', false); options.set('enableGuessAltText', false); From be588179d40d208460b18e472556b199944e3503 Mon Sep 17 00:00:00 2001 From: fabiodalez-dev Date: Mon, 12 Oct 2026 16:44:57 +0200 Subject: [PATCH 15/20] Make Escape close the reader consistently from PDF controls --- .../digital-library/views/frontend-pdf-script.php | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/storage/plugins/digital-library/views/frontend-pdf-script.php b/storage/plugins/digital-library/views/frontend-pdf-script.php index bcdb85e39..90491727c 100644 --- a/storage/plugins/digital-library/views/frontend-pdf-script.php +++ b/storage/plugins/digital-library/views/frontend-pdf-script.php @@ -30,14 +30,10 @@ options.set('annotationEditorMode', -1); source.document.addEventListener('keydown', function (keyEvent) { if (keyEvent.key !== 'Escape') return; - var findbar = source.document.getElementById('findbar'); - var searchWasOpen = findbar && !findbar.classList.contains('hidden'); - // Let the reader close its search/menu first, if it consumes Esc. - queueMicrotask(function () { - if (searchWasOpen || keyEvent.defaultPrevented || source.document.querySelector('dialog[open]')) return; - var dialog = frame.closest('dialog'); - if (dialog && dialog.open) dialog.close(); - }); + // Esc consistently exits the lightbox, even with focus in the PDF. + keyEvent.preventDefault(); + var dialog = frame.closest('dialog'); + if (dialog && dialog.open) dialog.close(); }); }); function openViewer(toggle, event) { From f30cc86d93c9615f5c0c480f8d6d367fb81bf9f6 Mon Sep 17 00:00:00 2001 From: fabiodalez-dev Date: Mon, 12 Oct 2026 16:47:00 +0200 Subject: [PATCH 16/20] Document PDF reading, CORS checks and refresh the light reader screenshot --- docs/demo/pdf.jpg | Bin 203249 -> 145057 bytes docs/demo/verification.md | 3 ++- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/demo/pdf.jpg b/docs/demo/pdf.jpg index b8894a4e6f38825a27958d94fa96728151d4fa87..3faf455222c95346ae9599b56ac0120c24f3e025 100644 GIT binary patch literal 145057 zcmeFZ2UL{HvM@S`Fd&jdGQ%K2P?CbgA#Nmzf})axzURKR@4aW8_1^pMu=uK{yT9t{>guZMuI{-SznTY-Jdu%?0bpSP z09cqmz||B$3V?eZ2N&l$E-nr(5QvL+gXG2yeEb`?iHL8KP~N7ZqP$H(K?7m|)6g=} zQBW{&FfiR^y?6f}HJI}OC))!SwtH+pkYE9Uz#Dis$Zp&qW22#cR|Wa9iF_uoFiYuFfi@qU!5lK`-;U&F#=0C8}zfp|ECSb!g; zq`0^40LdQSW|Vw^$HS|vXA@5TGNN&S={NoN3lx!Ql+3RTY>NjU2}s%5dzHXh`1l1M zJ2-wy-z)ugm&)*C#y$o$CDxD6zcu|+XsUD$c;_x&SSQF?2Bir&9@6by6fJ!#>jwDZTVjKdsVTI zN2FNS7$lEKNp7G%l8}-<*ZmEJ_=rV{N&el#{V^T}{e9incV2mKFfyD`j_h&g{A^8( zJ0Mf?33v5l@ZZ1UF1h~-@vF|?k@Y7k|EphfqR?8_jumO^hq|=dAFSUndp1{EdWK2b zkkj`7cl6PK9$p2TO zxZyR&C}R)pvKfH3qw%;I*%fis74Yu_18QV7S?9er?u*6~Pq$s%`2kukuy9Osj!nhw zDEF@a0_5o#6RDTox(#H%0}_>hP-E`}GOW{5(zyh6hc=;a|+nQrpJT z^t%)|MVsyA@a&p^uL>;uSmChXH7=>JWzHqI2dhShs_1k5wI?VuL*_sO=!9V%t=R=1 z3R+#HxK=5W@~~r|chQFYA^EmaczAMe)7w+8%HVJs_`=@UrPPQS$T;@W z#Px{4@T_hH!Ou{>_*RY7ZiQ9LAP%SFtsqNz%9k1nT6m)kyTyBxOS)kl%NGiZ6EiyNSU1Y0#OgB5z4wGE zG9#mhlVz864?uJU@M>+bV;?P{63L23S~wM{l#t+#N7Qm!C}=UciS2Ri0OJr#^Lb>q z*iJ(2=t`#r0+)Hn_h$#9{X~zM%g65oo^ut+F&Xtb)eQDKY$CeiJvqJkIz%3=5C=SQ z$m{P^OQtVDhtoY9M>$x`4ve+P-L=<}y@f1?j}-?yQaI-Jtviw=%HQNWf8 z)WYLrwj`Y!-gI7Y*>8$&Hj3+S`7L+Jf3UJR#8dSJ;p}^1@bz0yP_M`qk6*x_@82rr zEMfKv5o@|@wTch`%BKy`d#gFrttD+cQup0rUWyY*77x>33Yq3(ta<*r$jEX#LJ!Zv z-#|eQmVjt0o@B)#1ErVNliyk~|HfI{uIz0xW*wpcL z|6ZQxGpab}D-y3&hZR&sXra&FWYT^8VF5=}Ayy_-BKX~JVU8?rFRlP!__8x?D4aJd zUUj~?@9t1Wv?`VG?Bk?qI`^gGIxdA!!vk*QF!aqA{^n>wZHPyorE<;HWf|Is@WZc?UsZ&wU@cjZPPh~G7jbWKLTAQsT3!YAl^ERJzTZVPhD5&KmxQw~hB)ggarGRWt7rGH=NM(Rjux=k(dw{G z&WNUxW(!8RUb;V$i5BCb)ZC}NjB3}0TTuEmw{bjFxP#j@eK1>vCq8LkihHtMqFAwZ z%a&6{fPhFiStggYn9t&tuuL0Afy>8&H#osIko9q9r|prnaUA?Tk)+~g5s~W6Dw>G# z+OtG6RihsyI9Ezwr!uH;%@NI@OCZc zC>`f-&Q7YS56+%XO)44PL65e~l$nH-RbjFD_t&G%^!agp);2uCW;XkMp(`_z{fzHX zXzNQcAyxlF0^Vo(!+Zt$wz#r|B+N5tGht$K8yEFCsTh3KbHl$Wnm6JTPV8YW3 z{tB!+xHf& zEtgKUJ!A=MEb~9MkA5-6r51@}U^p!S!9MstX`JhCef6b-x9qLjv05>+j$t3Es=+d; zzac}IaOj&y_^k6-Z2T>^Ve{oOpHLjhJXvj1k<{Vwr4bzlJ@&ohc9~Gy$40$xp>{H5J9)|xzg>V;C!slvw3$#dogK)8mWAl+RefH^vqUa#eq5*V4<^Z zp|LxNFAj2)WB%~Go&o7XFWPas6?3$JCHrOO%u4(#6av2r2mNA6Zz2a0XTOi(pjy5}w1@I@ZSkLF@V)@pBWnpu3; z+q7^EtvmWIKbJjUWa%8TB80`~Rgq9}*_izu@z$kQmkBj1 zx%EQ69ZMO8Z$z;&=wh0SnvV=S1JWX_&56k#y98b%!q3s;KBpBczVvbI^_eb)$qk#X z5b=P9B?Pmr^=r)#a@q)Uz|>r2DiBj@S_v)muYFox#*Q{sUpQADsD94ulI6YOp zUa-2T*8{Vbfj5)Y4X@nvhR-&*)?8DPgj{zGK5o4NMDTvd92Y6}^m zp+z?@aosb8&u5A z6`-7glCqO-j=I_CsXmiyB7e}E-HiPAlXDAY2_}Q$=X#Phn!ek}D**R-REssZBH^Nb zM_T9ca~~iGJ-jc{#?fsX6wSm9n!<`su-f*eYR}@d^iX=PXC04EL@TP3<6n218Ww#Z zf@_zIyw~^Sm=$C|zn)%QN1?Govczm3 z8nxQxpi_eMy5ySzIAYcNoabII4`96le4;zLDEhWI-_jOdoKh3y1-ltOAd6$#)Rovj zuXR}G$lyUB{mm}!o{I_(;`KKeuWe$PQ@Flz`-ivC&ku*Oj2rvkG7w7;+j}{vcwT6w z9MfI_U{Nb3SAdp|D}Y}8NtL7xDXDbk%7u9hM^mEli(}dsgFLEuy8T)jjx$Mac)*M3 zZ4z4-F@oT(lJRc!diSB`_V`m{Kx03;Xzfg5-RZg6Tw5kP#f5OQma&>9JR9) zY0GNpp|2GRmR&`^;}e?Q;%Mp}E<#La%U=jHmYw93B6OKSRzL$p%|*X&=L=7H%K=Ty z!xwg_c-)2Olb;5bbQiH)le4VZ6#YQd@IHNzKn}&#NMai;c$d+66IeZ#KqOtI`ji=D zrw%o)Th;y!0X*WH(vHearq|9_cG8wpS8FPKmSp1+|Ee?69=roM6pzYwWj9% z=HMIWsK9W2TQ`I*1fr2Syi9(kPLLknR%}YM!MQdY@*Y&M&m~CUF@R&Q;>UvOWuN7lm4(f=<5-oq z2(Opi-_A<@2n17JYm*Hvd_2=3uUIB9;6>RzIG$lAMN~JJKPW5-VIVtHS=u`%$4+(E z6uN&X6&y;^pUf96#soV3Aui06Lk7l9y~(SU4tyE631r>1TdXdudU8tc~Ty zu=ViltO1mCww1goPTP`W;DVD_Cp&HxNFuAgAL9*N|#kgc&g4I-Z-e*Cv@>k`&&!tFE*p>=Q?6Xc-_x6 zvxN*BKWvrtLN>2&CFh?opG8#X-wiY0N13ucFV?}&i{rR;YT3c6Rp??0ePM%o2LP1< z0EC>lkfuCN4iy2)5yw_;(1T))%pq(3b~-Kmew;}gRz+qH0{CN^dzC#xF7|Z6gA>$v z7V&vlOI-&Y6HrBj`^iQHg+A|C^c|+fO*5#LAyB|z7`j-HPNaFSvFKD$Jg8ZRtc!wg zACZYR{_NjGuV*5`#m8K5V@c6!F`8#Z={@+`evq8-c;@;mbEGR`_ejl~M06Q+SasLWHzz}~}~ z@6H?mbdI!$=>iQ51_;d$oNpSxycg6y zm%pmnTDALi@dS%Dc{YYV%vHWwciHPbNcns}*<<@?h#|!`hl0pUtA#dZHC*`Zt5c zWisT1uDVced0wPLO|2D6V;yAuh!s&@&gPw1|IPXG+=YODA8mMwzd2E|D=dkW2V7${ zg-B&$jhli)Mmv4Tz)}xCb-pTGnd^uRu5z7r>*K7uxuxinFjYj0$`4>z%14mxkh_a@6f`93W~x{p?4^RWhMd^>L@REto=SSMB0T zNRBVrG+EYDH1)o`4b_%~O^8>yNV|C~M;Be#X$Y6|Eue#0bCQ?C8O{VFk?|D(dr1H_ zLN9JXO0f4mdBS3p$WDrGW^Ic^Y1Hvp@z|*h8isOjts;_vRawH2$<5blFDZ=t;SZph zqIqwLm`olAhaM1oeN1E7M%|2jaI?wK{B#`Eblvihj_zBJeRM5->O$HaOv4+~XGeN1 z%h*%q08P%y(@Z#fHgBm}iA&auUV|eD?a4RJNMu3TSh;g=JZ7K`FSDiNQJF5XwyH3y zjz_4uW{wL~zKtfJnDe>N7-7qW(4nTt{Vm&=Rg6MpgD^v2%)7%o-3Uq>{5xOpTk48NznT^YRq#rs za&aBZWp8h9*a$nGM@^>R)KU>EXQzG%{*9MhIGi8PfQxJ0K!T8#IWiUaMU~@B_6lIh z-r19)=G$D$P?_I!eCQc-*|}IjX>rSYLxL^0E3Dla+G0y>R>EKGuH46#?EK+?AAgxX zG=gErmwt}KX@7EafV6LJVVv%Rdd_zLA$6QRv{qytm}o$F^Se_`>gc7mtCNbY8)e9H zMs=4x-Lo#sdiDvCAkXAhpK_T>K?)Mwx*5+F`*!beF*+OF2?P3WgNy>sgr0{JQ6>Dg z0B+0oGjGChzr*r^l&&v1`xI2> zD!WJjJ|Da~eFb>nwSn0p&N~e~4@Pr;S9*8_u&HlB`*AbEk>Wc7sQLkswo8orOnJso z8_*Yf1*n``yaGHv1fS4e=&pGku!|X>mplV6$+|tKq5Gcc1nvKQRP+|Vqw4vEYI8xw zZS42PSrh+gnev6&VbagW5wt|$Y48tP3qKkp$etKrh*h>qnYjX-we!UEaJ;lb7hVBI zbww-Cg=jXO@9}EMQ&#}hE5PmJxwCpyYS*BdJ`8%Pd+~D0bK?rI=*=yk<-1*f~vtv5RKoeW3?)`blE_PZIes#Xk{=*8J$ykK!LaP@S{-N%2vb z@!e?F@+$zQt+TG(@*h<(%qWdln;rFZx&mx^ro+@P=dJ+xXg?l%#Jc|Zi_7sJ!)`8K z^MjK-rGb=_p*wAufjr-q-68%l)YNRnb(!cbPs%ga(v(W^z)KRt!d%)(?ek)c03c3x z&b={w$NlY$LOgNzr*KGrfBMH@QRC&g6#gz)e18ZQW?fSMQ?T6sYeMwLYa+iyf&mfG z_J>qRANKw(GdDk|&DtS;3S^(>PvPKsVQ{+plLTFnlV6hDAsxI5`CYhA+u+EDqt<03h9%xC6avW@24FZv*5~wdQr!HcHVgYn73Bcrr;L*r zGXBw@zhQ%pVakum=Rd~!`&`P&cj)*j>Pfc0XsQkv)B4{!|3BkTKHePIG!v^Hx2gvF zV27+g>31Ew8TnHlfpgne02j)0_!Yokyy9|Mcc%}{a`^xCO45hF491Q6UwvXm&z*#O z)`+8`{$x`AH8qIqr_cx7CzuV2TW9UxcPc9D& zuU!6QGsQMMXJye_SAf?i=bp3DKT?aY{%lz9|Iy9J|5+We4ZHEq2JvsbSAhNdmE%-1 z0-iidUsNuBS!>pRGu4#g>c14NpBN(}Cd&J_58`;~BR7dxUt^kYlS@T?%df(zxPK$R z)62_?vgdvP>bcvX8JQ`~v%5p4VrFi4+}Rf-(9e5=J8-9;Tv8eFf&An1S2${t&voq)I47nA8$WiY z{YxcJ6xMY4-%CD!jU)FOM_Td~`JGoJ?wC@_VVom3f{klum{2jn;@L+W7PtFZhjRDW z7clGLJ2-4#2Tw6;q}M;Q77G=SVakZYYF&G;sD0JU!5gGM9>1L-)*pE&AoVU8GfPLtP=X^fcov|ebs!G+Jip2p{ir68w1jG?xKoz zXWA!Id#5KF=F>5dxcHSD&XyL{7H#*6Db(sdMjZK6eURF9mj(MaRVSSKRI8P!RawDA z9OKuWQiYS!J+aqRnkJS`!Hf4FW&2lgsSn40n|Na4IFadoRF~*(rS2FV5@odgr^J*(;IuT!d zIiYu+vd^C6sLB^r@5m(z!ZUyQX)K~=v<_|Qy~!732J$%?Rx0=o;n)$1DRw`(XSms> zc~82>a?8JEpitX@1(u&(9TE9CT3 z7db!3uxqf7rxj%yUUOa7mGrh1KFSp{pj1_AGO2gxRNZD1Uo*H|KnHS*Gc{W3wWamf zHM_ODxn2Qk(YbLo);IW4^ryRha4o*dCSk$T;HP2UPUlaE&q%HS&YtNWgWl*5;~ zT6(#JM@vQJCHrA~p=Ti7D}cNw8b@0#J*LO9h%e$X+84LB(iMCB7)83L=0+PK*;V-& zBBVmi5HN**kjW4&RKRKH2muLYLYFqmZ(jip@_f;?o(JOrg%b>yy4wpDIs@X%TECuI~!x45{tS`?a=|;!RXwV7`o;zo*?`3UJ}TEVuT-8wHF69zRNC&$1)> z_B~0_Ul$oFeyRe`ufNwJxA_kk+karp4*OAG^#x8LOUfdeFb?^Tg)39Mqa=7imW#mhGMByp5d)c)++ z`7iRDdzKfQpC4C^pTK(pK)jmM5&RE48MN>(C|qwUe2mH!(}{s(Ygf0U)-60O1kfS7 zCoPt|;7d(`Q_opS(zuQqYC5Q~*wIdj>@yj@mU{mwuS#Lh$(}1fM$P5E(jN&eC}-0Sbn7hBW>3>A8v<*_+q){ZGr<7fbJAAJ#W!u+Zb!;=7@h^$z2my@ZBYxJ+s15~ z49uWW*?%PR33f&d62~Uq7g#7H-h4*_)K{7(N4B@gFk4I-Fy#o+H@h8&S&RRo^ABj6 zR-xfMiL#VpqT6|g6d}<*7)Rxq+1=Lfdfkd>5-sUscC+!W^XrnTxxnKB)r*JA2}A!N z{NH+@aaS{+i4L{(8V4t$N@8U(J%(BIDD)CE zw;SN`3$7fvbUO-w9k+9B@a|Q7_3#B!cw8qszaSsCb;z{JuA6=OdYLrN=uV#Fzv|_mcRCNc0sT5Y>02N{aKpmHxFXpn!+1+SEE>W}X#)zD`kZ z$r!|1>>aL`{FXbg5!W+fZr_s{{bjl0LbuiPD`t3CxVVpDQ&)f~2)Mj9Mc^2^g*+8A zDU2Fffo3lt>JMKM)Aue3QHW0!jZT>ts_VftG_wgUNhBCf=rb0*#ea#ztDi2A_=uL) zN4FT3&W^AIvU7Ujk?m(1f|yXXC{lnTLW>SC0i1V0rEdIGprJ=fKh<7U%5fQHD~DDv z(98AHLdB!!(e3-AS_Bf~!0gl{?`f`(sGNeqLTh;Sd@_F*ZCQR<(;M_h;AjaeC2nQJ zP&VLjeA87F{n+E{?^?7t$8$xU`!dz@Amfz@w^DGMymi?_Q7=BUI$}{ z9&NdWrV(t2m-b$~zXH^s{n=0dN8Tg0*i8Mg(&d7#3iUB&iCE&fd*h6VDRC+wl(|Vs zf0&$VLp9BCX#Cg_pY9DOy>Y0#DC@jCv3}WwMWmj^K~P?dUFGMa=b3#EmerYbj^obW zg?&FFEk-mAJJKpMhnJ{)?`*9@RKFcpsS7E*qyeAk0eM@YuR0DDrJ%It1P<=ei5~X1 zfJK$m9nk07MRaq+TvadVEdA>q7Uw}bG9*=g9!v3#2;pc0)wow~>27N|)DV|8(rpE( z=^R#+`i9XBZdZ~x^2-E#TN=xMjuay8$SsMQu8-O>77|{tV=@~Sbp=meTfHR)*cb&+w=9&ksIL5%) z47_bWAkT)kXYuno3Ttmaj~IGdx*h!Ptn|@^yOyKkNfu&hyHi%Gv!@!L^YKBWi0Fqc z`cO{vW@xh$EvSYwo?+0IxIFXa&5N|2C%`9X}m$&K(D#N}99K zgvafz6v1wR@k&#|B7pov*~e>GR#?D+IWsp zkBnUDW!n!tFscy$cYw#0^Rh))Fi_{NN=%BRn@zcXAe+*QNZddomqU${Z^CDRQjZ2* zl{}iiBuu`!#7s@H-vNn@#|=r33d~sop6AcB9Rsds*T<{jZsAe3brRffbaXnnUnOJg zHZB{b{#g`0`!>>w(9Tt20Ms~VRFmJjOAKtiH7hz~NKMKJ=O|}A@>iJDWSElj@qRB_ zj(ct;Cl}ybTuU5o#5vcY-Z7DGshR)KoAu}nYxPU>h9ESMGXZM&AU z#pppI8CghgY+W^8wO0E$4VAz|w&Gi6x5nKAZH>QM=l-Ml^PlDs-c=%tEVDU$wXB-+ zZJzJ?b5%Rdsd-&$(M$K2)czeKl^yxE>|=V?C)bNqEwrZ=)u}}5VB|HAsniS6pD_+Q z9CO0qn~HgbK80E#2M;t|CK{s4_~>;r>8f9>W%iali%7(In!{xEyGDS8YhEjDIu&Rq z0&ik>XwIUbX{k^d6ABod@Z>_5VD$>#d4bXQ~ya_N{ z6C-d;P+~z^hY`+aoh9PI3N|01ReIYluWXtTRSXb^Lt~FmJleT{MZm@1qU`?gpm+)x zh3bOg#>f22)BNiDWnX$^M6^m?-@T z)rOSnJ!GpiP^Mw1WRV`5j-c_4=;M>Y*nt-`yxyl(=F$0!>~c%(oLa?9&DLB6Yb!Td z>up9>VD;D;1ud4eA38?&N_rV@y79~mcN@vm4K`6HH4ALwUP_JM0;YiXKkk#DIidpCjhgVoy&vjNf8n#ghYlz>&MoyHazU)Qs))(MgE z#0{UO_%)qXpxdK)S4T;)q~U5mMoldl;&3zUuEi3kY zr&Q}G6K(Itp!Lfok2Xm$XDuy`FL-0;E;(*y7g`NDVSV!SF^M4^6NFE}%7f&a zVPns;0m0WH;-;Ja+ZNb#TFCQ)p=BG$(fVwk3|c(QTK)7M>M-9R_(YAW1V!Mj{RD4v zCjt{YwX~z3ad4BTrI}9kW2DuRy}RK;lfM*J-m`JEl%WqHt&1&qUyz(lvfsa5YY((c zy65sE!b?G~3&K?i+?e3u%k<@!OBzH?6HOl1%uDXTNpS-Sd@2Z=JO!K$c?k7#zPGDyHznk%0A2xNLeE(&Mw@=6fHHo8QU9%t4w+$W$`dddy}GAlNqfK8QxRdADb(I%x0)h1c}raY&y zXxkyP6%dP?E+YG0CvvV!n@i{@>1(Ua=r)j~EhUh4SPpeE)?`w(AQ3|Q{<>)ZiRZzj zcfkIrDgwq4&|iHozpk0|QQG!cgFRo}6`&`}kRgP@Ylnw@q=(I<=YTcN(-^Bdin<_1 zOll2AIx0Kn_zp}yX_KhBB|^wy2Inj^4$bKKbmG)@@$NhJJb=L1k3)PLvko=%oP7a4 z#(3i;;=62rKIHiiZbx_xw={0A*_aLN@S)sBK(^>p%!0@>y#QJ;*N*YBe@h$V-c30Z zIAhhSM|iHyt@*wGe@TW{9L+i(QoK+n>8Tm|N$8#Wg)4w#-&#RBfsT}C6M8#kK*Z+? z;CneGo?h+8>4LGA#OLLnj}K_k;1f%9z>nppz=inE#3gyFLvdPORF5eNx73s6h(vhh z^6&~EgNb5o#+>wB(q5AO#VqCZyWleuk6?7bT&dD1?J5K%`~7vDhADa?hr9W7j$Omp z(I16-1(1$gt~ohC2crXNurA@^e95WsUm5WnN zoY%kLtG^(tKdUIO7^PT_xcrd59G-=96|{xWo8QIH@2`sPKcU`DYQ)G~e6#12kWtTZ z!Nn*OdZP2|;p->SU&H=tM^uT&oR-DotMes~=1z%`g=}JsXP7|lKmPv@*J-`F=d|m? z(N8{V{eqJJ;R5eJCIp8|Mg6!(H8Bsq9q-KrE`uWB(Kp4-=Xy-oy#79f{Qorj|HmwB z{A0F8Yt5PO_UMamCw?vDd-cWq%U_M&;=FZtLQ9?Ic6Ng?;kGce`N3cDq`R*G+9^Nz z_DABM&bSfVyr?{J`ueam2}2GQ|H1O&SgBFK#EGBqcD>gyO1;wvSqmgU=3M;k9CwXUL?(?M>?c}&> zmvV7jRe+Bp;z%$(-q{x&Ttew%d1iTPy}g+a_LEG+EFmiC*?XZ#k*CXUD#wh%gw10C z#+@841+n6f=^Jo^NvG0XF{$2guTn=^!Gp#V?O})$7(I8Lc3C7D!x?8Ko zF7>6CX>~fDDz$~&W7?u8>!=HgQ!EM}g3~cO&D$(Z&Aq~%`f4RQ{e!E0!&sqRN7$N> z@7t)n3l*IZ6@{&~aZ6-y%&X!-qBwSqF^b)#)cra)M^Q=1WK4Ud7c~+3s2FfXT(27W z+NkyPwq<2x>S(AxYY{q76yW(k8zuw6%BW z)46|PYnY;#AWOQ*oX%=_OauzG z0ynuzmSc>tw6_JfOo2`a7mU#AJU@I-DqUfU3TJf>JI5o3H~i;Oa|&OK5D2h$54Gzp z=6`r!Od~L*SKtt#S>e?%-$T`?STRf__s+%0%3qlHIC1D2ai)u?8&$vHUsYK*w0`KjLLqgNDL!1S zpX!c-%44KHzW2qy-=D;xcOEky(V}N=Y1i~l-}=N^yEemQrS6MZC|vQn0z8~4rNO$8 z0NT>bU%Z-ktO{?KYB9P37#Y2-!08+kBNpa?Sqdf4ey0(SMWu$Ii0oLnnfGO}MXHMZ zb0wqAMtYta!*#nqL=YsdLNd2V2>h`%2PPLQcYxtbh!9k-nHMrH-f_QJ%-N0iQXozZ`s8?p{M&5iMD^~l3(`%b&wM+p@HPMDeV@& zVyFri_cyI!I$<$VSY)FBamcf(qJf86@mwW`1eu2fQm&y+xLYAJ?%q)v*)%05^5I0$~==24l*;GALgrR*bW*QD#3ayTDG}S#cxu@F(+MH?sgE=#WQ?BY*y59d8)BV+BT>oX(vI%j7zbG z27StCtrb{CAzY$Y9IHOU1P;jKu$L~QuPbtz5>81S)8K*LU%${Qd*I9-75J?-6i1{a zBS*W0L%5?E(gQ_I5Xc^%?I0@LFnhBjmzpXZfJK&(uPuTtaxZPX0)} zYL|$2BFLAh8m$x(;PFUdalKij+$oGk!MD^A#EC6&wzXS{t>-fzr$K+;@buHfMkMbY z?J~pkX}h=~T8E(_)aD1Ln=%etyVksUkeg&uyu2Z7{6J)_IfVPoTeB@!N2i_lgPFS& zl@hBLVo!OY^BW7P@DJ7A^C+JYswY!k-$SvEA} zZWoECYIN^vR<=n_QY1W`Usx)6aUA_((Zr|NcFTmL-9U(MO8J=vzXt4{N^qo*7a4*3 z7*X`@mmcQGxssVCj}zg2rH8Fs#@0j4HfMZEY%S^zCR)Y3*k|2AqLRTt$<#B<-75|e zC2#6H!dz6ZXfKxm%IH*^W4u+x;5SMyN>&5x+Ke8+4*8O z(2|WwG5Uc`ZSeXQflwg1QTa~F!{#I62k+DBg4X~PolxA%)> z)KpEddo78?PbcPrJ|N>lq}ooKU3{J~z-{$H+Z$J*9l`HTt#FbOKEGQ8Y=}O_*Qm$p zmR-!$>eZ3eFyZlQtS45F#KBDuS<;Vi@>pYI z(Sd13@mxyvuu_43OTsX~#dD38uBe!G%8s`b@Kcw4+x-)z+jrkKYWGDytZc%T;Jp5B zo6@c0#feXa;ruMI9s2ceGpAez2hm?8ub0!IgcH})CP36%t6uX8p|;oJzP#l~f>LtX znV6W1mYc({bAs%AQi&{lG7k}mN&cNAdh{B~tVo9lMy~k6x7}p5qLr6dt!Ns?UM?WZ zTqkxKX;@j2X@87uUb*PrY`AOUT)j%9zZj=7S+k-IJQ6&~{H`CE z3I_ECFf4eG+j2aPz3_k~s(0K%CHK zT!oW}xf(94YKhM_`T!Sp+x@sfcJv4vbFR=MGu2-#y7z7j&}RUf^sZU**vJtKEB`|5 zOSn>3@@lOtWv^gQ9=)wVb>5_%F7?o&^I4%8iuBCYd%QpuyQNmD`FZFqq0c;{Vt4(P zY7B0#P8$GI=MwtmK-Gz$Lx|-2#m^dAGBBV0n>YKK+d6DtimiN2UJib9=KvRSUI@!P zYpUEm)L7N-+~cO*)AG1kpuo~r1yXl?(>~!IGn&jFSuS^=J!n7UR_) zU=t~vx0k*hyP~~z(?oR=*bDoTWP4&t`W~tuza3oEGd9}g*or#N*V#h#J7l!BWofY< zR*cj!0EkKn%4?EoE!Zgs$zt>ikR{YNNS5v-<5||)|E7bCpc(ZkwJ?Ngj+QHZJ=Oh| z*t4PalCqO`{31jkWIUk9Wg&GfzhfnspHD3#Q$amj1NxoND6N;V*pPk7cVH*_R zC?v1tkBrl5HhxeQSELnrYn7(Lz(kGHDVJ_0ICNQ#!OPq4k%)4`o`;nRwbiu8Qo_v% zZUWT|zm7||@KFVQ@b?t$keTn~I&=qWF8Iqsdv3jkD;Z67K@F>13L<3%0`5ElJ$CQS zoa9*DL&|Z#SErl`^eMGLJqD1sCRd`7xvbkxFHH>z3m-&tQ7mJeDU zW{8S&<2PR3wHiB>wS7Ext6%b@8UVFgqfg4?c$#?9Y)vxzvMt}p9GO4qR>mCofH9kZ z`l0E^k+N*S=vn10C0mCHd2$hvF5Q(xC|?)+HV>K2aji;p7MYF(mz~5$T+0p(s82zH zmKjYT8M0?0^sdA3{yx2f9dQfKt!nk+?!2}RO4U(IWr#bd1_;0dKy!jqhgae{OOhY$ zZ-J7vquZn+me5nSG(7P1d;C&U_=NqmrbE+o3v;rSqxIlkxE9$*=j@xO3UU4@v~-zG zInOQXEP9)DsAlNs`q|7mh;+(T8B)tv2lN|Heiqd8BKIX_sP+AF!6hxs?+&>KUMy5N zZ8;P)74OzrL4n4_VE+7eyCU7J&SchNI;unMy(dHE!UEK~;~+MLq13tEa(15#vYM04l&x&F+X}Dc9saaf^T&o^7<))_!e(&20A&~5b{J#3!<3M($!?u{e|e$)c?Zt7en3oCh@Qn|Kg{u>+>t67 z+g7A!imoQ`fZcYPbHCQNq|H^gP=t$nZBv{Q_F;D)95;rVzW6S3{!aCqty?k|UH;f; zG@GkP`Fh6edOw%g{?-93uQRz|;o ziS}r2Gd=#N6|Ib5qjeMWr75q(2_O82J1N~^o9@=PDrWkzC9tPYL`&(MZbtI8xoIFp zo+ZXGMPyF%+VYw7s2%pWzyyqDN_#3JFqe4U$}2l-L)innoE?mP8TwW%b-LT6*u&lZ zb%Sb<;#ocKBS`R|Z|PcbkB??QrG@QPFhw8}eIc-Ll?TXTWxds0BED{p_e~PTNQ2#A zqGb};@u}V10c-nm<9zVu+412FRXMH<)uQBEjFmldfTvs_b}WzJOyLNZ6lsus(2@iFcX?qhpTLV~e|iAqHkJBTtGJziVHI~#fTE^Ca= z6w^)!nfBW)!7{k8hw2r-LkKtLD>=$#A-zJF6;jjET#OM1l}{dFtC8sYf%aocVUzG# zsp3@pb*$|2&KTzua7IhztT?{ELEMv1zpqE!cWE=4H2QtzQ%Xok_^a#T~wI)msNs3wDVDsIEXOHl-u-aIgH-m>L4{=s9s&(YWq z41|RVs-+StEKFcWJ5FnrTiia=p;&E#2yxQRF9d@4EDsg#K5UF;bcO`T;3Evr8$uBssd+ciMB9sc*5&A&p2+s4dLx90m5FL#C#yBAI&oEK z^%?El8^Dg&-DUNQ^)vQ;^waJg4UT17fK{8VO!f2i=|ONt_A$2RY}wTCu4kw7ma5pN z*vh1cuBL4@*>Su1YSauhG0as>cEqG+CZm`+B|v?TJ#2EG$yceTZA*CQXvn|v*oziP z8Oc;#ejuFm*$cOQcN}ZnmYdLaLQKoXnr!SUS)KSB(|6U}8Dkus2faY{ zQ-TjwT1M+O@LmADP0%A>N7VW}IJsi~mDED7MaaPx(!gugtUo`|DZw`B%(|!@xm%Ua z34=u}+QXc75e*K>U>h1O)}Th;H0H?fRYOYp82wlXfz6zzU<8mvMu(v>1-{fq`)y!l zBF{tMo=kH@llIm%hSns%HpOy@tyN!&2sxC6ycbfafYf*2BX2@;B6|Oep5S_ka@>kp ztWc_GTg|&W**eLH1Z5qVmyxXw+oI41>Wwg7YJ$xsdDN=>aGMu+gf&rg37!tXmcm#c z9rkbjQ;|rx3EaW^C#?riLZXyXnrod`YI4c0vqw@CoAjdPxuqxSYIs+AQapKW*pDoWz0 z9)?eH5*+0ubVqcLRy7U?E&D{K z%F%omErr?Z+}(?(XRx6a&UTa_9b{84f?IET`2JHdei=AVumcgcD$;YZ@Hap{9 zzkbWrU(-^+Yohyh#X~AZC)X7G3Z@jUhh>xN@ony=6Azh-Nb6my#ovpLR=dW@xU+FJ zwpjIN@LBWGy4AcDR!gA@_wE|f8l15zxDMXg)L`RwR`21_dWK+FI4ys2tY1N1h8M7I z@VS`zrBGwqY-VzgXb01mneW%aQDDDuF&pD)Dw#RUsMxWNZ9Z+h0bv@}u>oz&28mBa z0D7#-e0BTgto}fS$7<9Hux237fZtWEUk(rfOWw@?yI(2$r^M}u3$6f|z@3Y__hvmN z-l_9f;+^U#oA96U&R_7K9PfNF7nIDPyLS!>s(J}Le?kz$l(XvJq(HYFM$==}?33h# z?JCL0DF%*M;Fk&c?vDTc#Vk`ZTJmMH7L;n0PDg~- z?*DN2o=apA(06yUX23785=ozncK7gk zg-TfVc;=%__2Ib4VzH@npTUT7=d5@W`jE6>sD384{SQ>(>%E94%^dhQlf}-x22TmU zRw_@4UjL9(t+>5y-3iI&B$0~j$xx1|9wEx6%*KW%m&u4H?Wo5T#P-j1_C!Y%k2n6_ zMsOm0u)T}Z0?F>~(58-1=OE3Ocg$pLtD%t07O4;*Z(_bGu27tVi?hfsdI%=dIx@I$ zTejs;KIG^Pu{lvB$owq7%!*vGc%>sck8BK<2Bp&wvWl`X%+6V+;$YH=yDUh}R7O{=nTiypj@A$5cQ<7ARrzalf32PsAtV5 zF1KS4)5zQ|6X2_t>+zOegVHwVa7{Q282FkM3nvpPr%$pkMBpw9SOe zrx0?!Lb%!6h#3a^kjpRL_fx%JS4t~n2P+(Lmv4z9_@cx$vY_;u+)>{K@*KGa$kC6{ z_Rf=1>~xdocXKtI`b9FZt^GD%33cB0h}MeM-?+-nTH8a!@=MEsO6p4b8h^MgMbF`S zhW>4LW;HP;H0AGlqGGud+Fu;2C)Pb34-!|NFF>zaCa6-|0=bt+6~(_t%Wx1Ojkw2| zZ3ZEc!k*zIZj%>sL)yKLoVPjr(9+&)sh0`~gBD8yV_2>9mFI0@zZHhhtkV{wEK~|P zk4a&Jo`LOKECmIIB_%HBapMJDNYx1mxb7HG)8t|j0!klva4v@HRSFE|2I&;1ZD>BR;IQ)qx7clv z#Lp;Q#(BT`QYSc6>Y5RxKh9x4q>581$C$?U-YrG?gX&ym5R7geozdy#ZXw|U_^;dyY~{%q={g%j?N8#CzrhZne(>e z!JQ!Om-H^zeY6UCqJRZV2y1cyi<%TG$W>N)k~uS?PE$j1Qkj<{amsrtNGHNaq@`|$ z$Vq^yqpBGVzZ}}j?gaMPxx{FrbApFy{ZD;@v<&|t;aTxPM09D%Txp{r$VL@%jhP>D z2_z#dl+_i|n@afln>2r)kjThKC&)q`2+OPFq{gcpd6m4I=bvAMyNsrH;O7#Nc8PT< z61`MV4L}DVQCfOvSO9ZLAT@Y z^BA-@sZpM4D~Yv3M+lcO`bW%?wPPYyNjag1q&cl>?DS3Xm3dQcXL2sd4Fe*e_hE#! z0S~%2$qwp%HbOCoKd?upwsJW^h8iJ%@2ZC77Sl#~y&eb|Kl|v&#+$*XqLHu5pB7bt zYA@LwH7!TVa(heTTAWT}rMnD?+>cw&Zpy%%#&c$a`3S3S@ySPGB^JQ}5C7Epr*x4= zg?;~rlC0eVj+Z*l#2du-6o`Vw2l8KLDhgVPcSR*|>XODZQyPX^s)yl^e(MexIY>I_SxFkMK;~SpUB)Mh}BbuK~f6xDY4A$zU{;E3OIY=|Tc$BUb2si*A zRe`(5_xX-_qw!0ft4)_Tj% zlCXgV(yljr#$J1(;B6TJwz5x4b~sPuts?yE4&4`*B0Ea}5Mloa`~e!3x!BgTfkwujeZDx`ye?^KNMP+d2# z!ZM2k%K&fJ$PDCl!6&yk9}f^qY_KRfB@Xr2W#|$&_7I^NUn`X9Yb51YZ**jIq;_a% z<>%Ft*U*kM!M}#n$Gw`IwtK@l{v>p*{2(S^P!#TluszwvMYS$@F-UYYKbUHBe!DE7 zYK!hb++fP1{(?mv!7?;WrQw|MC5w{#F-np6Np)tQqnZ({&iVltAFSRxgGE~O9wJWq zW<`+hmLh1dPL79#6-)d4*5p%$UQd)*^9{3=J(u4TxrrCjNqibIb%u}Wg1-+NQ`W13 z8`z9{kOMHPQLkQcAZb|1y5n2;bHs_^@rRN>as}`8;dnnwTj+$X^wIa&P-5ynuG)f7 zXKi_jk*E=mdhS>OH<}n38*7d^&il>EXD!@BZ|UX8O{RrNjl9?5msYit@Q4IOloUOp zNdb6Fm?E-fW~H;O`1bmNNp0^s^t)Vn^1_qeq=bkdOAxVd?c@mh_?@|W&Bd~{f9`v*tKGy<`Y%jf7b};KKonbFP8EB z-@oe)!@2gWQ%N0gvSg;nROcs1dF|Me_;VI{`n8`)nA6-pxB;le@2=EuZ2Cz*jiBa% zr2=W+);Sv%q+%^W9s1F@yN$0GQBTUwWE|OIn2`f=%BaBM-o3%jRIG;--;~GL8QaU? z#f9EQ)Idip%Oy7b#7F|!eEN%mTqa~cuK zV7dxYxx58YxEy7EvtI3!$)bl36Fb&sResU1Tz%?bq*u8e9T6hX03D6ADke`*<3zP( zrbu3o*RSFwRTJZwB!}J=v7*| zSL7t)^368K+yw|~ct{wjx7FPjhi5wc%aR#MMTRPmgF7(KZRfP%p;IWc1u>+BD5dUP zf}uM)HsGmbr_0Vu!6A4ojSa9TXJ49xkJ-Dv7U>p$<)3hP&K?BgTLM{hD8r^f zFu~-OmGa^ON2F~%@&iKM{coE5f)mzg?$jwQG<4tCe1KtHmypJ%1fizpoM|qg17v&M2Sv7-P?gO-!ZP<*2wz#*R)}x64Czz6EJ5jU9sWIx z7Hc??=TEz8d>wRaG0HB!N+{N)XOdFPZ1+_j5izr0WaNe1%ZeNU{_fayUPxuji_ba{&e_l zb8Og#N-N%w65y)Qbx6J?Q4So7v4~rq#bPwH)=xX0fA+f5TM*sOP<$AWOg87s>=8zYNU`|zqsU?%OMZp~AnHgEP=8v@N7S^WZn!Pud(t26Ka^8T<|b28 zts_{+DdJRCWVNvpA5ZpbH(uy-mK&?48?8~ME8sRN-vJUTJg+QZYkv)bUbY-qaKu(H z%Z8SJ=Z=*@HED+no?~njb8dK}?%KGaz@GdgP^MR8L(h*Jyeb1~2Xw@W5?u6X1fW!vsiFlfV__F)Xj(mWZNYx+SZH zp@Qvso@LQQJzqYk^&12nEm`N`bi#d)`LC(N4M2!vtYle(bv?;T4O;0+iadA znEsx(+CL=n7$rq=ci9=3r>q2MZy3HTa#d z3MsZ8?C_nRM=h=~q&AQN=h^Qvm(_gcWHVY6V-}M`98#7WoZBPOPKgFd36UXw4g>V~(9b_4i$xFEuL_9tR(MDR}MyXuIZiUvG&O@DG4 zd57+y^6{{eqC9n0x9ba5?`~`tsv!8#N3Ohme-zfHo$osLOX?E_Bxojb+oNDhSz5xz zve=1Eww9Ve&Ewg@AuCf?eBb?Nb>RNbvW1hlj(%+Q_8{~&N!2}7=|Pr5*XT+)#x6m= zPFGfm?n+(CDS=?P)N%qw$aWoC&q@=GRqrjR$0fYrlq<+ui+{$ z0Ci21SV=hs6y?-<+mh1;7-4Bw8aLzRq7751(Sc&O5_#Z%ZYER*Tg5$#u4`O_Pug<7 z$b2wEq~W0jAAh@tLnn35P&2qPW`X$v8`e!pD5`@Cr)|kL>1Q)bq5)Z+nN-VyG%{Kp z1_ZBPyEX!reD7kXPFBR*%%XPDH)u=#0{YBcU(5O7g5_8jd5Mjfeb0<9dPvL?G&k=0 z@EkFOdpnLsT&DaOB7e{&KV3qPZ=bgbBBUIgvMOm%7#14+xHc0zP}}kCAV~Ko8W-Gi zQR=}41C}m{OOVG8qmxJ5kII)@29SX31Bnw_odghJe}inHUR3b~F+3;XnrVQ}|53FT z9S!I013A(dU}T;xXMv3u&oaKQpgW0Ycj&~9mSeP~8!`+<;cC=C7o0|o^ts(#uOhLq zr5c|{dpO#wZfk=$%+iK_IgjuQtDf~Lz+zL>;$z_ zIp;C%^8R3$Otoh8zUozE?J4wh+|VY!LdtAkn&CppYGY%*dU#k~R-h;un~m=E{E;TW zo!&>Jz+?Qal*g-)jkkeiSV_?UGWSt$#FkT?$Ta(xtC%{Uc@EmHvc}lxo|sYrjrM?b z;}KAFoKTYi$$1}X!Tgq}axG5V=iUM&MxtBzs8Y_NEcNzkX}~?QJaEty>z z3KgKGBEP!e20UYMrNNhfyk)+6Us~FzA!J&)6W0ZGW|CrJan4cb7gT;ip`jW5)uuuJ0ss8^B+X7(1|Jt_DSp2V={K>zI;{WXx-@wt-e>Z#lYy7`! z_IQ%L4sqg*+$%ZOxt-o=zV#u2-8X*QCY_B#@B6lUw0->W%9XTMYq(sJ|5?m{|0b{h z0YNc^Kn77?b1AHI{M08CSJ80+`q(%=yTNy%;w=bbNBp`OK_G+2VwE#;yj0lm^5zBI9?X?$>+Hl^K`g>PRm*!pY z64zv_)l*|J5YSYK-6bq@O?vrAb4{BLJu}Fx6`F^KEA!Ytt;?A^@vI?Mn2%N z*D6n3y1oDKJwIuyithE_c1QEzx|-u&MK+QF5&w82w#eQN%cf|M#lz3k4iT-v<;t{G z_Vb&R%q4%7<|of;SMI)HW_52buSJeDcM8Sn7t&?5X_n3Z(!B-r@WVRV4(-5289+^3 z&cDjatbQy_md9qPD1n-sPqOCRC5#(@b*M6YFg!mOaz(Zzr^=1cyL|cjZl7M) zNaS4$`|pIGwqez{51~#f2$r*L3zsH?fTjMjUK;)UDc(4)7>Ntw?nq%l9a~IF+A|bj zVlj)fE741mE}?vzCb7}nOvwJ`%$8Vf{Ql4xk4WkVA2zisIw;NHjJC@-g?e7?M|da& z>iXd@1aRZWV*?b$zPGel3!zdiztP1N_%SUB$sSqTBca$LH9IMeCDbnC_I&Q5|C8!) zx9A22IUVKGt4i7V9kwu_^yS_6{%u$E&u5QHTzw4RD;Q3ZrrJW9khomui@fHA8lr3Q zebm%m`SK@eeljp;l1$5rSl(#zWlE-uN~g=zRoJAe5d29>%~J>aHwf?c0F}&{iBdl^ z`82u6=00@1FYlf}QlDvJv}#8R*qx5AKEq)DUZJJD?T*XtXcYO)KHKB|v2O8N z+CA#Da5B$>l2;cRDO;b5J?|c6D*)c3uS;W2@D)c2sCif}>9xd@+QgQw@MJrlv%qpi ziFaUGQskkn9T?$(-u(WfF*^*T&X@$3;OKN2+bPFObesk3&-$_)tc{%ByKmL4Zg&25 zC=s|6^*O^>YYys^@>?VNvOn0@kAz?T3+6%EIiD-blt!ptgiLUS=C{pA_9o@dzb6}H zJ+fE)w`5svvENk$41S^WsHx9b9Omz08V_%PY#4b_@TwUjj@QL^WCr zc1dCsPNmy5EJ~-*iM1xBNu#^G|BxIV3P9K2fnc6q(Gk|6DqNrPKqG640+ZJ#x2bY= z9hFm1-Cl9WFPle!Ze@zkVCkeovS*-kXSki{v7-K4 zD`^E8((FEl@K`*)vN_ZpD*2zk77Q8b>bm^YiX6Sd%?usuqVI9d-P&lh^flHo_ieZq~ z0lt)rTcHGfd~MvB$R4{625k`?hJF^jLPbeSANd zeG|9!bRo$4sDr_hXNs2PiaQ~HtVROJ2En3im_5byMn)<8*;X3X?4U}(XkGAb`x60# zO3}BIP`voBKG+V==Ps!bgE))d24=QCuCD>fM(g9g%*{kQnAX$+b0hXnpO!l`O*@!| zIq5o7&LZ#e+`DSbYYWABY{UA7o2LmGI#O&QRHUF21CA3f1$AcF;h)ccKe>d9O&mfAlK&i#RT$Vsb+yISscz4MXZm$6aCJ@rvMt_q4BU5P$Sdraf_*X=p2 z%EDPG%Yaoees8Lqv2^_Aa0_`$zb)X!@exTJ4O+Z-1+sg;by?oV3U<0tOO`&N!uQ9G z(HoGhyh|L8KBEv%=2++c^QdhE`6jk~CamICn*&TAn;b-PNSV3kx=Yu8DwKtR&3yb` zH8alDS223^p+BW}^B(Ks%+}BhepsIT9*#X5C?Doy&C$!5=f@@)#mN9HY8l#MX5Rc6 zpvnnd{$5#m-35v;-51PF9vCcgl*<;E=s7kr(J4L`@y8EGp2>&;32Z^fE~A-m631$P zEj#8zZ(1J;D^;kc(=;R!cThA??;4eeQxrE?wA?dnS577v+1O|Ow@hKwLEr|LJp!Gf z2GBnxZ^r{7>IB$2oplisya?^*)@idR>q$jx*+SUGitEgV3O~xcUYMg;Na3q-O|e&v z5*7zVjB1sl-W!{?;2!rpG_?M+YYMc_f9-_BzKsYnhk#gV)&Hi`y5l%z;qqe5d%HZ~ zfgd(fjLQ*rtGORfQA)w7=Vm$CeCG@aD|MTM=5}&yX!l^BMQ(E#%6OY6gpdUYEyrC` zj`dtSJM(-J(8bXKsD770Th<>*lz-U@8`yef-W4iY#A4E@e|7x*_W0y-rFQ?S*FR2+ zE&N2NN=9Z$TcoT{?%BJfnnz#e1mk1u?4X)|GB^Fn*_<;@B36a%vF5NUhq?F?9~Tv_ zUZmr(t}lopb_|zmB)s1qsny;sa}VXW!u3-|XrSPE!?E4R{k(PI-c^UC08%O28O>5x z^lPlx7BqEXrOy5?{FY+h^7V9SH>lNl*y$3dSHSkoTte6B!+KiZI|_JQYi?&(5t>QrAnh@%Bi&(n$yb$WFl0xzjw ztob%%?k^&VW%buU5TQwIf>7SsFTtRnVJ-C!$-CfQF1W}jwL`S?#LvL3;E_}fM7u~z zenI#E0jVD&!kcG_@g*C>_#rQqTiYt}{s5%WL0`AaBZgk+QOzG`VUpWq#`Wa(F&Jo| zBX7tmY*r+$InDAQW#&mJv$4Fn9n4tvShX|9qOqn*`WM@8sZet_FJrbqOc&-7o;f+K zkqnB_X8Q50DwSXX(!GXZ<**V=x&S$@v)?Ggab?BCucuGME3j!eWAwcMlzaI{1g(Dk3G9KQ%=qf1#<+Xkr^{e4*PC6T z3W{FwlbCj-+?PMcgVIJ)2jcW>7%!F28T$S2)2%XD`OBDus^2iJh7c5NBc8F}yJv`S zz!p`8%M}f|A27{83?#eH?zk=$iOP9LrIjReW!jVzkBObT#;&Q_WN*CM|G+b zG9#;=PG-;Sym*}OY*h>`48GwjeX>m?TMBaPc8y}?r8D7)>mCVav&rks9F9q=51AP% zMV8M(eUp4(@#YYI2*0VT*sdZdgu9;6DVH!-!kTk+(+d~9v_V6+P%XLf(kAis`n3zO z?~{j$ey!TWfjH6aRilT+-^;?8hMVg z+lM=EH7V1o2kP<-2ix?PnAY~WOgOsSFjd*k*$TURiPhChF*W_tU*V$kUe#7&e}G&X z!6W~WfS=G}8nW1Iu3|B75h3xv5-T>S9{*HL?)9DcNh>^{JJEU@9u!cK%NJ!Rn_;@d6)A18ei$NXCq*ROGkRW&F`-k6X)h(PdDG$f1{%XgG;@u~6GLf!)VurW+CcCv_X>>UmsrvRa zM%I*S^O{4@A0%Q{_NLCCGmI?PloD$eA6JXg#)-2Ghu`AogBq+24od}Im!Na55DHVt z{`ako+9D5KaW{h{9Oftdl;wE%#QLb5Vfw(q3Dh*a`e-0$dRHK#>@WXXy&zA8dPn%z zs%X>|^bd|O47^fckB^ncV@O2&Yp)CP3aTcRn%gQV6DQtH(DaooL1I57laM+v{eTnx zt}j_HDtl_;_X^`}b+jyDWLSodUzLHn-voX@3NJ|&-$Y`3wiIva`Bx<^elfwQ$HU^@pF zW+_O9n*>pU9rem=474XB8^acO2egOfd4T%?2y^IE2OSrGEaVc_$XRKMa~w$arKB}< z+@8!#f~{?9y#j@{)w>~F)jIlZ>u5Ljp9Pk1$az)II~miUS0 zO?dFbtr)@2orc4$?&URcZf@eV7CALOp&SC-w_Pvq+jOcKi?AcfQYV^?>jj;i%w|sx z0R~clH;bVHpv_#8 z_*+V_3(AYEGPb?Lbw^sfE%u(D0bpeBP#=)q z=?A53r}4YGH7h;$x!eyFJz02rMw%mryD^h&1MdbxNElU@HT(co%E;lP2ryF$nq17Q zo!Sr1j{|XDIoWPk9O~Rr&RYORpJ7vCZ>eY>Re}wAzk4NCIi)ehEjD02MIlU5@Qx&> zj8IzP_d*@E3oVTG{imH=fArOTvro=ZQ6Sn-_f=Od?CwZd zo$@%k#G`Q3baSX4cgFKxx=nIGzAzfqRmO@~m|2V=7=g;2#!9GVu}(^5rKeUs0Lg{Z z{uk5MarK;!t{=N>iq`FMeJ#`IK86!ayP1}L zm6~=9tQR1Gv(sOh(9MQaQZB08Y+ZUf-$6{LGx$vsq9fX=t2pV=sM$z+(o|dE*J9kf zm_pN>TAo-PSbU*v%vna3HM#06O`#e{<%RP_71Xb}GOjq@u@B)Y-DdWQmAVCFj~&=9 zBMTek^me+UBnxuYMR`2PPYbE4ruyrUP}OXFn`s|gJ{Rh|62BJgGae!;mLry9OCn05 zFZaI9Sq2#=5^rJFsX{6coyh1`b$Lirdy3qMM9hf42Qo=o}jb+Yup);0TWKd6jTo;q=AZhyynaRLPb?IJgp!{*D z4nxNdadtIl>!M|T9fz7F+gbNe4Q2x?mk58pUw(u~YBi9%DA8Y|Ut<+W^s_WEd!YQI zxlW-noLE2pK)nicKmv9m9vLht_WVOqCS!5jBaEv^yLcB(OUxUy9m;pX5Vd)?S}*xDUU8x@7EUg z5AEnvhOe_`hJ>0Tmm9_K%=V3E(x+1UhUKNUFymu!Uq52Bvwil(pAz(480v~13n5!? z777m<`Z+k=(*EZ;pg@(J^enbTUxqTOL4v_*vIbPFKw%&(-)qYnTvX(J$*2(qxpM_{ zVcBkCZ&hMy8lLeLmhoE1jJr;Mo!>n;%TE8UNhN7tS0_|q3YBLg578}x3<#C4jyLQ(yz>hW?#D>@EsM0U13O6lA}Rb`$UVT z4bTx{V!<_~V5K!wQ{6W{@NRoU)=&13slu5?h)cgj%kVv0{BM>?zIr{X_>gE4kWrb~ zvA%L%!j%8pkr*^tO#iGX;=H8mt}Fafa`8m+F9@6^|MK*=<^k`-+F&&9 z-Yw~=)2)-!ZR4fuTkHxLO5_O(Ja}i5qOWVX#`z_ELdk^L?wWr{b2N9I3r7YB#hSXr zTkMT47QEs=d`ao8z`2#(mN=U@TXc5kW5ox1t!8rgQ(dzNT}!9;#>1kDY>(r@B=zU% z_E`3GLIilD*MgjEZQfJHnw*A9JO4v+d-9UeEi4Go>EdB?6*nQARwA9^cYCr$netkW zAdIneYGTC#C=QQeO0i2Hu#tpRdu_T&Z>H%o{56GQoGu6(>g$-}S98U=>;Ito1t^qx zZz7b4NOo9o7PHeY!vL4fT%7HWs5!F&{N4;}?@fe#M8d0mIO%j6#XgCn7b{P2O;XpG zkMzy!zL8)ENa|Hp(N(*p%R51Llc!!5&lnGn+#n@48`fDvul6hKPkr0@h>6%Ov!`ld z!e=Xh8)_+phkoag{R3$96>p(FD|1?xjSx()ccIvHOSmnrrfR=NMK)UY$0Td$@~Mw< zIJJ=z<>?!Pw|Ye##63-NibmHLt*ztWU441otqYt1YNsZ{Ak5VB2MmjKi6anFgE<~@ z=VMpDyEnHxad}y4A}riuplVc(HH3X2yVC)?053+vbH_pcQN-&Plc;ACbI(;*(kf*8 zoyKvR*PS@<^+FPKEQn!cj95~Ujv;*IU6zWR5n*w|vPJ4OC1+jb-24);;5ctS{Stj998!WpLC}95KlGLuP>9O7O^$UQ*mwzRk2Ey-{};v01THT#8TI4i(TXsS9+N4jC?g|y(~{P` zME0-PoLlO*>?)xTJBMC=LzG-=^XJ~_G_}Md#qR07+RxLN@%Bl=C@vPslYUDL{@rCl zN7FaJO&nlRvS{yY$QETPd|>sgPU^l>AJELL>;;SWH9nPAIR@iBeklHn$o924#07{N zH!rrF`iRzgNfi~F-|W?n-8iRplRN=eS3qJk@p*fOCSlgGtmQH?pT|sL_T}XhKHD@@ z+?$etqi`nDiC@#V#axJ979$#rA(xBOqXO zj53VyfN?wFsuG60vOZ}xI`?CZ7!ce$iGTs0=`E$csx4L!?J^q0ZX(tN?8vVjT^_vG z3734>yM(DMX;#4FumW*b_MrzRg8A`o(KOMvRe>`W#`$)8Sr43jSe22NHY~Z+-AL-| z{S4j9o&b^xKWULS*!1?;V!%eZ@}`{roh{(RsAGMT^@8!0A|`(mrOz73$~bH;n>bz^ zJ}8Lk^DGElB)?-=$^Gp1-`nVj`i9Y^~~ADwQy+XkmC8PZ1WGp`RMwY6T{pIV+s zXKcF7VKYk`RdskGw{tX$?4YNMZLxTWU0la#eC2o@!f;sSqjuS~qgkle`9Be{o>^b$ z_(AEe(=V4({uAHxw5adnQ~lrnlQ-wzQn>%um7?K)vbHM!)dtM@ukFSEjV!NHe!^zS zKOtA=U*p^V1ySgK^$ir&|AQ|0ag~?v!aAqtf4~KUX{T!s^t##qlRFg_kT<|^CU*HI zOE3_l=fHaz%Fc6PX6sUVm!xy$#x21el1YyGxQUwtS`rW0RxK+~aCus>Rq|}E^Nkm- zw1I3KGj%(+0DBKZRmggtrIjcPtePa@MJxqRBOD=&pJ|NxGD7MUiqTom-zMcc=@FCx7)l8K47kzr> zCmYTd4;b_yw?8qYCriYP*4o4`Q@n?GD?Uz}VoRYXQ&G2w&ZekxB6249zI8TvMSImt z6#Rz-Qs}?eU3{9E+%vX}ia7Rq+%0AheIUei$$sFVCLZon`An!y`PPvO)SWm#p-JGr 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

t{N;1O6K@aR`(2vpP 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

@@ -10,5 +11,5 @@