From a0274ce059cd8716f96d372580f1c8d5f7a94314 Mon Sep 17 00:00:00 2001 From: Anthony Ronning <101225832+AnthonyRonning@users.noreply.github.com> Date: Mon, 20 Jul 2026 23:05:05 +0000 Subject: [PATCH 1/2] fix: harden PDF extraction against parser panics --- .gitattributes | 5 + frontend/src-tauri/Cargo.lock | 88 +- frontend/src-tauri/Cargo.toml | 6 +- .../patches/pdf-extract-0.12.0/Cargo.lock | 1212 +++++ .../patches/pdf-extract-0.12.0/Cargo.toml | 84 + .../pdf-extract-0.12.0/Cargo.toml.orig | 34 + .../pdf-extract-0.12.0/MAPLE_PATCHES.md | 24 + .../patches/pdf-extract-0.12.0/README.md | 24 + .../pdf-extract-0.12.0/src/core_fonts.rs | 18 + .../pdf-extract-0.12.0/src/encodings.rs | 1810 +++++++ .../src/glyphlist-export.py | 41 + .../src/glyphlist-extended.txt | 4553 ++++++++++++++++ .../pdf-extract-0.12.0/src/glyphnames.rs | 4711 +++++++++++++++++ .../patches/pdf-extract-0.12.0/src/lib.rs | 2423 +++++++++ .../pdf-extract-0.12.0/src/zapfglyphnames.rs | 210 + frontend/src-tauri/src/pdf_extractor.rs | 120 +- frontend/src-tauri/tests/fixtures/invalid.pdf | Bin 0 -> 78 bytes .../fixtures/page-font-name-collision.pdf | Bin 0 -> 1202 bytes .../tests/fixtures/type4-separation.pdf | Bin 0 -> 857 bytes .../fixtures/xobject-font-name-collision.pdf | Bin 0 -> 1188 bytes 20 files changed, 15344 insertions(+), 19 deletions(-) create mode 100644 .gitattributes create mode 100644 frontend/src-tauri/patches/pdf-extract-0.12.0/Cargo.lock create mode 100644 frontend/src-tauri/patches/pdf-extract-0.12.0/Cargo.toml create mode 100644 frontend/src-tauri/patches/pdf-extract-0.12.0/Cargo.toml.orig create mode 100644 frontend/src-tauri/patches/pdf-extract-0.12.0/MAPLE_PATCHES.md create mode 100644 frontend/src-tauri/patches/pdf-extract-0.12.0/README.md create mode 100644 frontend/src-tauri/patches/pdf-extract-0.12.0/src/core_fonts.rs create mode 100644 frontend/src-tauri/patches/pdf-extract-0.12.0/src/encodings.rs create mode 100644 frontend/src-tauri/patches/pdf-extract-0.12.0/src/glyphlist-export.py create mode 100644 frontend/src-tauri/patches/pdf-extract-0.12.0/src/glyphlist-extended.txt create mode 100644 frontend/src-tauri/patches/pdf-extract-0.12.0/src/glyphnames.rs create mode 100644 frontend/src-tauri/patches/pdf-extract-0.12.0/src/lib.rs create mode 100644 frontend/src-tauri/patches/pdf-extract-0.12.0/src/zapfglyphnames.rs create mode 100644 frontend/src-tauri/tests/fixtures/invalid.pdf create mode 100644 frontend/src-tauri/tests/fixtures/page-font-name-collision.pdf create mode 100644 frontend/src-tauri/tests/fixtures/type4-separation.pdf create mode 100644 frontend/src-tauri/tests/fixtures/xobject-font-name-collision.pdf diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..b9a574c6 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,5 @@ +# Preserve vendored crate bytes while excluding upstream whitespace from checks. +frontend/src-tauri/patches/pdf-extract-0.12.0/** -whitespace + +# PDF xref tables contain byte-offset-sensitive, fixed-width records. +frontend/src-tauri/tests/fixtures/*.pdf binary diff --git a/frontend/src-tauri/Cargo.lock b/frontend/src-tauri/Cargo.lock index 8422d4a4..d9b53e03 100644 --- a/frontend/src-tauri/Cargo.lock +++ b/frontend/src-tauri/Cargo.lock @@ -301,7 +301,7 @@ dependencies = [ "asn1-rs-derive", "asn1-rs-impl", "displaydoc", - "nom", + "nom 7.1.3", "num-traits", "rusticata-macros", "thiserror 1.0.69", @@ -727,6 +727,15 @@ dependencies = [ "hybrid-array", ] +[[package]] +name = "block-padding" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" +dependencies = [ + "generic-array", +] + [[package]] name = "block2" version = "0.5.1" @@ -971,6 +980,15 @@ dependencies = [ "toml 0.9.8", ] +[[package]] +name = "cbc" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" +dependencies = [ + "cipher", +] + [[package]] name = "cc" version = "1.2.61" @@ -1000,6 +1018,12 @@ dependencies = [ "uuid", ] +[[package]] +name = "cff-parser" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5810ca1a2b5870df2aab1c03e11c40c361ba51d6e3e361e56310f1cb3b4e087" + [[package]] name = "cfg-expr" version = "0.15.8" @@ -1697,7 +1721,7 @@ checksum = "5cd0a5c643689626bec213c4d8bd4d96acc8ffdb4ad4bb6bc16abf27d5f4b553" dependencies = [ "asn1-rs", "displaydoc", - "nom", + "nom 7.1.3", "num-bigint", "num-traits", "rusticata-macros", @@ -1957,6 +1981,15 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" +[[package]] +name = "ecb" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a8bfa975b1aec2145850fcaa1c6fe269a16578c44705a532ae3edc92b8881c7" +dependencies = [ + "cipher", +] + [[package]] name = "ecdsa" version = "0.16.9" @@ -2167,7 +2200,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74fef4569247a5f429d9156b9d0a2599914385dd189c539334c625d8099d90ab" dependencies = [ "futures-core", - "nom", + "nom 7.1.3", "pin-project-lite", ] @@ -2677,9 +2710,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" dependencies = [ "cfg-if", + "js-sys", "libc", "r-efi 6.0.0", "rand_core 0.10.1", + "wasm-bindgen", ] [[package]] @@ -3591,6 +3626,7 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" dependencies = [ + "block-padding", "generic-array", ] @@ -3986,19 +4022,28 @@ dependencies = [ [[package]] name = "lopdf" -version = "0.34.0" +version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5c8ecfc6c72051981c0459f75ccc585e7ff67c70829560cda8e647882a9abff" +checksum = "25aab26d99567469098e64a02f42679f8965c6401263eefa31d8f2dcc37a221c" dependencies = [ + "aes", + "bitflags 2.10.0", + "cbc", + "ecb", "encoding_rs", "flate2", + "getrandom 0.4.3", "indexmap 2.12.0", "itoa", "log", "md-5", - "nom", + "nom 8.0.0", + "rand 0.10.2", "rangemap", - "time", + "sha2 0.10.9", + "stringprep", + "thiserror 2.0.18", + "ttf-parser", "weezl", ] @@ -4353,6 +4398,15 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "nom" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" +dependencies = [ + "memchr", +] + [[package]] name = "nu-ansi-term" version = "0.50.3" @@ -5085,13 +5139,13 @@ checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" [[package]] name = "pdf-extract" -version = "0.7.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbb3a5387b94b9053c1e69d8abfd4dd6dae7afda65a5c5279bc1f42ab39df575" +version = "0.12.0" dependencies = [ "adobe-cmap-parser", + "cff-parser", "encoding_rs", "euclid", + "log", "lopdf", "postscript", "type1-encoding-parser", @@ -6123,7 +6177,7 @@ version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" dependencies = [ - "nom", + "nom 7.1.3", ] [[package]] @@ -8409,6 +8463,12 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +[[package]] +name = "ttf-parser" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" + [[package]] name = "tungstenite" version = "0.28.0" @@ -8428,9 +8488,9 @@ dependencies = [ [[package]] name = "type1-encoding-parser" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3d6cc09e1a99c7e01f2afe4953789311a1c50baebbdac5b477ecf78e2e92a5b" +checksum = "fa10c302f5a53b7ad27fd42a3996e23d096ba39b5b8dd6d9e683a05b01bee749" dependencies = [ "pom", ] @@ -9786,7 +9846,7 @@ dependencies = [ "data-encoding", "der-parser", "lazy_static", - "nom", + "nom 7.1.3", "oid-registry", "rusticata-macros", "thiserror 1.0.69", diff --git a/frontend/src-tauri/Cargo.toml b/frontend/src-tauri/Cargo.toml index 0a79151f..282a42a1 100644 --- a/frontend/src-tauri/Cargo.toml +++ b/frontend/src-tauri/Cargo.toml @@ -40,7 +40,7 @@ maple-proxy = "0.2.0" tauri-plugin-fs = "2.5.1" anyhow = "1.0" axum = "0.8" -pdf-extract = "0.7" +pdf-extract = "=0.12.0" base64 = "0.22" [target.'cfg(any(target_os = "macos", target_os = "windows"))'.dependencies] @@ -111,6 +111,10 @@ keyring = { version = "3", features = ["windows-native"] } windows = { version = "0.62.2", features = ["Win32_System_Threading"] } [patch.crates-io] +# Carry narrowly scoped fixes for known pdf-extract 0.12 text-decoding +# regressions and remove user-controlled Type 4 function contents from logs. +pdf-extract = { path = "patches/pdf-extract-0.12.0" } + # Local patch for tao 0.35.2 Android intent crashes: # https://github.com/tauri-apps/tao/issues/1217 # diff --git a/frontend/src-tauri/patches/pdf-extract-0.12.0/Cargo.lock b/frontend/src-tauri/patches/pdf-extract-0.12.0/Cargo.lock new file mode 100644 index 00000000..cebe98a3 --- /dev/null +++ b/frontend/src-tauri/patches/pdf-extract-0.12.0/Cargo.lock @@ -0,0 +1,1212 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "adobe-cmap-parser" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae8abfa9a4688de8fc9f42b3f013b6fffec18ed8a554f5f113577e0b9b3212a3" +dependencies = [ + "pom", +] + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures 0.2.17", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "anstream" +version = "0.6.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" + +[[package]] +name = "anstyle-parse" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" +dependencies = [ + "anstyle", + "once_cell", + "windows-sys 0.59.0", +] + +[[package]] +name = "autocfg" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "bitflags" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-padding" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bumpalo" +version = "3.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a45a46ab1f2412e53d3a0ade76ffad2025804294569aae387231a0cd6e0899" + +[[package]] +name = "cbc" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" +dependencies = [ + "cipher", +] + +[[package]] +name = "cc" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" + +[[package]] +name = "cff-parser" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5810ca1a2b5870df2aab1c03e11c40c361ba51d6e3e361e56310f1cb3b4e087" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chacha20" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "rand_core", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + +[[package]] +name = "colorchoice" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" + +[[package]] +name = "colored" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c" +dependencies = [ + "lazy_static", + "windows-sys 0.59.0", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "ecb" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a8bfa975b1aec2145850fcaa1c6fe269a16578c44705a532ae3edc92b8881c7" +dependencies = [ + "cipher", +] + +[[package]] +name = "encoding_rs" +version = "0.8.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "env_filter" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0" +dependencies = [ + "log", +] + +[[package]] +name = "env_logger" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcaee3d8e3cfc3fd92428d477bc97fc29ec8716d180c0d74c643bb26166660e0" +dependencies = [ + "anstream", + "anstyle", + "env_filter", + "log", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "euclid" +version = "0.20.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bb7ef65b3777a325d1eeefefab5b6d4959da54747e33bd6258e789640f307ad" +dependencies = [ + "num-traits", +] + +[[package]] +name = "flate2" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "form_urlencoded" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi", + "rand_core", + "wasm-bindgen", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "idna" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "indexmap" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "block-padding", + "generic-array", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "js-sys" +version = "0.3.88" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7e709f3e3d22866f9c25b3aff01af289b18422cc8b4262fb19103ee80fe513d" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.169" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" + +[[package]] +name = "log" +version = "0.4.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" + +[[package]] +name = "lopdf" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25aab26d99567469098e64a02f42679f8965c6401263eefa31d8f2dcc37a221c" +dependencies = [ + "aes", + "bitflags", + "cbc", + "ecb", + "encoding_rs", + "flate2", + "getrandom", + "indexmap", + "itoa", + "log", + "md-5", + "nom", + "rand", + "rangemap", + "sha2", + "stringprep", + "thiserror", + "ttf-parser", + "weezl", +] + +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", +] + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "nom" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" +dependencies = [ + "memchr", +] + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + +[[package]] +name = "num-traits" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c62be47e61d1842b9170f0fdeec8eba98e60e90e5446449a0545e5152acd7096" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell" +version = "1.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "pdf-extract" +version = "0.12.0" +dependencies = [ + "adobe-cmap-parser", + "cff-parser", + "encoding_rs", + "euclid", + "log", + "lopdf", + "postscript", + "simple_logger", + "test-log", + "type1-encoding-parser", + "unicode-normalization", + "ureq", +] + +[[package]] +name = "percent-encoding" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pom" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60f6ce597ecdcc9a098e7fddacb1065093a3d66446fa16c675e7e71d1b5c28e6" + +[[package]] +name = "postscript" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac1825c05c4f9e2f781202d1a02fff5e5f722bbafca542d818364e1b1ea22575" + +[[package]] +name = "proc-macro2" +version = "1.0.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "rand" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207" +dependencies = [ + "chacha20", + "getrandom", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" + +[[package]] +name = "rangemap" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "973443cf09a9c8656b574a866ab68dfa19f0867d0340648c7d2f6a71b8a8ea68" + +[[package]] +name = "regex" +version = "1.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12de2eff854e5fa4b1295edd650e227e9d8fb0c9e90b12e7f36d6a6811791a29" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata 0.3.7", + "regex-syntax 0.7.5", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", +] + +[[package]] +name = "regex-automata" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49530408a136e16e5b486e883fbb6ba058e8e4e8ae6621a77b048b314336e629" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.7.5", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" + +[[package]] +name = "ring" +version = "0.16.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +dependencies = [ + "cc", + "libc", + "once_cell", + "spin", + "untrusted", + "web-sys", + "winapi", +] + +[[package]] +name = "rustls" +version = "0.20.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fff78fc74d175294f4e83b28343315ffcfb114b156f0185e9741cb5570f50e2f" +dependencies = [ + "log", + "ring", + "sct", + "webpki", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "sct" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "digest", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "simd-adler32" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" + +[[package]] +name = "simple_logger" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8c5dfa5e08767553704aa0ffd9d9794d527103c736aba9854773851fd7497eb" +dependencies = [ + "colored", + "log", + "windows-sys 0.48.0", +] + +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "stringprep" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" +dependencies = [ + "unicode-bidi", + "unicode-normalization", + "unicode-properties", +] + +[[package]] +name = "syn" +version = "2.0.99" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e02e925281e18ffd9d640e234264753c43edc62d64b2d4cf898f1bc5e75f3fc2" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "test-log" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7f46083d221181166e5b6f6b1e5f1d499f3a76888826e6cb1d057554157cd0f" +dependencies = [ + "env_logger", + "test-log-macros", + "tracing-subscriber", +] + +[[package]] +name = "test-log-macros" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "888d0c3c6db53c0fdab160d2ed5e12ba745383d3e85813f2ea0f2b1475ab553f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thiserror" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "sharded-slab", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "ttf-parser" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" + +[[package]] +name = "type1-encoding-parser" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa10c302f5a53b7ad27fd42a3996e23d096ba39b5b8dd6d9e683a05b01bee749" +dependencies = [ + "pom", +] + +[[package]] +name = "typenum" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + +[[package]] +name = "unicode-bidi" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" + +[[package]] +name = "unicode-ident" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034" + +[[package]] +name = "unicode-normalization" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-properties" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" + +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + +[[package]] +name = "ureq" +version = "2.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "338b31dd1314f68f3aabf3ed57ab922df95ffcd902476ca7ba3c4ce7b908c46d" +dependencies = [ + "base64", + "flate2", + "log", + "once_cell", + "rustls", + "url", + "webpki", + "webpki-roots", +] + +[[package]] +name = "url" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wasm-bindgen" +version = "0.2.111" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec1adf1535672f5b7824f817792b1afd731d7e843d2d04ec8f27e8cb51edd8ac" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.111" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19e638317c08b21663aed4d2b9a2091450548954695ff4efa75bff5fa546b3b1" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.111" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c64760850114d03d5f65457e96fc988f11f01d38fbaa51b254e4ab5809102af" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.111" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60eecd4fe26177cfa3339eb00b4a36445889ba3ad37080c2429879718e20ca41" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "web-sys" +version = "0.3.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "webpki-roots" +version = "0.22.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" +dependencies = [ + "webpki", +] + +[[package]] +name = "weezl" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" diff --git a/frontend/src-tauri/patches/pdf-extract-0.12.0/Cargo.toml b/frontend/src-tauri/patches/pdf-extract-0.12.0/Cargo.toml new file mode 100644 index 00000000..95fbda11 --- /dev/null +++ b/frontend/src-tauri/patches/pdf-extract-0.12.0/Cargo.toml @@ -0,0 +1,84 @@ +# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO +# +# When uploading crates to the registry Cargo will automatically +# "normalize" Cargo.toml files for maximal compatibility +# with all versions of Cargo and also rewrite `path` dependencies +# to registry (e.g., crates.io) dependencies. +# +# If you are reading this file be aware that the original Cargo.toml +# will likely look very different (and much more reasonable). +# See Cargo.toml.orig for the original contents. + +[package] +edition = "2018" +name = "pdf-extract" +version = "0.12.0" +authors = ["Jeff Muizelaar "] +build = false +include = [ + "src/**/*", + "README.md", +] +autolib = false +autobins = false +autoexamples = false +autotests = false +autobenches = false +description = "A library to extract content from pdfs" +documentation = "https://docs.rs/crate/pdf-extract/" +readme = "README.md" +keywords = [ + "pdf2text", + "text", + "pdf", + "pdf2txt", +] +license = "MIT" +repository = "https://github.com/jrmuizel/pdf-extract" + +[lib] +name = "pdf_extract" +path = "src/lib.rs" + +[dependencies.adobe-cmap-parser] +version = "0.4.1" + +[dependencies.cff-parser] +version = "0.2.0" + +[dependencies.encoding_rs] +version = "0.8.34" + +[dependencies.euclid] +version = "0.20.5" + +[dependencies.log] +version = "0.4.22" + +[dependencies.lopdf] +version = "0.42" +features = ["wasm_js"] +default-features = false + +[dependencies.postscript] +version = "0.14" + +[dependencies.type1-encoding-parser] +version = "0.1.1" + +[dependencies.unicode-normalization] +version = "0.1.19" + +[dev-dependencies.simple_logger] +version = "5" +features = ["colors"] +default-features = false + +[dev-dependencies.test-log] +version = "0.2.17" + +[dev-dependencies.ureq] +version = "2.6.2" + +[profile.release] +debug = 2 diff --git a/frontend/src-tauri/patches/pdf-extract-0.12.0/Cargo.toml.orig b/frontend/src-tauri/patches/pdf-extract-0.12.0/Cargo.toml.orig new file mode 100644 index 00000000..ebc841a0 --- /dev/null +++ b/frontend/src-tauri/patches/pdf-extract-0.12.0/Cargo.toml.orig @@ -0,0 +1,34 @@ +[package] +authors = ["Jeff Muizelaar "] +description = "A library to extract content from pdfs" +documentation = "https://docs.rs/crate/pdf-extract/" +edition = "2018" +keywords = ["pdf2text", "text", "pdf", "pdf2txt"] +license = "MIT" +name = "pdf-extract" +repository = "https://github.com/jrmuizel/pdf-extract" +version = "0.12.0" +include = ["src/**/*", "README.md"] + +[profile.release] +debug = true + +[dependencies] +adobe-cmap-parser = "0.4.1" +encoding_rs = "0.8.34" +euclid = "0.20.5" +lopdf = {version = "0.42", default-features = false, features = ["wasm_js"]} +postscript = "0.14" +type1-encoding-parser = "0.1.1" +unicode-normalization = "0.1.19" +cff-parser = "0.2.0" +log = "0.4.22" + +[dev-dependencies] +ureq = "2.6.2" +test-log = "0.2.17" + +[dev-dependencies.simple_logger] +version = "5" +default-features = false +features = ["colors"] diff --git a/frontend/src-tauri/patches/pdf-extract-0.12.0/MAPLE_PATCHES.md b/frontend/src-tauri/patches/pdf-extract-0.12.0/MAPLE_PATCHES.md new file mode 100644 index 00000000..8445a5b2 --- /dev/null +++ b/frontend/src-tauri/patches/pdf-extract-0.12.0/MAPLE_PATCHES.md @@ -0,0 +1,24 @@ +# Maple patches to pdf-extract 0.12.0 + +This directory starts from the published `pdf-extract` 0.12.0 crate: + +- upstream commit: `b95bf9f6268772d5088f09b0034e488e64294835` +- crates.io archive SHA-256: + `417e8fdc940f1d5bc62c5f89864c3a2255f74f69aa353c98509213d67df61e73` + +Maple carries three narrowly scoped changes: + +1. Prefer an explicit PDF `/Encoding` over an embedded CFF font's built-in + encoding. This prevents confirmed accented-text corruption introduced in + 0.11.0. +2. Cache fonts by the resolved font dictionary rather than by resource name. + Resource names are local to each PDF resource dictionary, so a document may + legally reuse `/F1` for different fonts across pages or nested XObjects. +3. Do not log the contents of Type 4 calculator-function streams. Those bytes + are user-controlled document content, and the upstream UTF-8 conversion can + itself panic. + +The Type 4 handling and `lopdf` 0.42 dependency otherwise remain exactly as +published in 0.12.0. Maple's PDF extractor tests cover the Type 4 crash and +both page-level and nested-XObject resource-name collisions. The CFF fix was +also compared against the upstream affected corpus during the upgrade audit. diff --git a/frontend/src-tauri/patches/pdf-extract-0.12.0/README.md b/frontend/src-tauri/patches/pdf-extract-0.12.0/README.md new file mode 100644 index 00000000..85ea7b55 --- /dev/null +++ b/frontend/src-tauri/patches/pdf-extract-0.12.0/README.md @@ -0,0 +1,24 @@ +## pdf-extract +[![Build Status](https://github.com/jrmuizel/pdf-extract/actions/workflows/rust.yml/badge.svg)](https://github.com/jrmuizel/pdf-extract/actions) +[![crates.io](https://img.shields.io/crates/v/pdf-extract.svg)](https://crates.io/crates/pdf-extract) +[![Documentation](https://docs.rs/pdf-extract/badge.svg)](https://docs.rs/pdf-extract) + +A rust library to extract content from PDF files. + +```rust +let bytes = std::fs::read("tests/docs/simple.pdf").unwrap(); +let out = pdf_extract::extract_text_from_mem(&bytes).unwrap(); +assert!(out.contains("This is a small demonstration")); +``` + +## See also + +- https://github.com/elacin/PDFExtract/ +- https://github.com/euske/pdfminer / https://github.com/pdfminer/pdfminer.six +- https://gitlab.com/crossref/pdfextract +- https://github.com/VikParuchuri/marker +- https://github.com/kermitt2/pdfalto used by [grobid](https://github.com/kermitt2/grobid/) +- https://github.com/opendatalab/MinerU (uses PyMuPDF and pdfminer.six) + +### Not PDF specific +- https://github.com/Layout-Parser/layout-parser diff --git a/frontend/src-tauri/patches/pdf-extract-0.12.0/src/core_fonts.rs b/frontend/src-tauri/patches/pdf-extract-0.12.0/src/core_fonts.rs new file mode 100644 index 00000000..856b4eb8 --- /dev/null +++ b/frontend/src-tauri/patches/pdf-extract-0.12.0/src/core_fonts.rs @@ -0,0 +1,18 @@ +// Generated by afm/example/metrics.rs +pub fn metrics() -> Box<[(&'static str, &'static str, &'static [(i64, f64, &'static str)])]> { +Box::new([ +("Courier-Bold", "AdobeStandardEncoding", &[(32, 600.0, "space"), (33, 600.0, "exclam"), (34, 600.0, "quotedbl"), (35, 600.0, "numbersign"), (36, 600.0, "dollar"), (37, 600.0, "percent"), (38, 600.0, "ampersand"), (39, 600.0, "quoteright"), (40, 600.0, "parenleft"), (41, 600.0, "parenright"), (42, 600.0, "asterisk"), (43, 600.0, "plus"), (44, 600.0, "comma"), (45, 600.0, "hyphen"), (46, 600.0, "period"), (47, 600.0, "slash"), (48, 600.0, "zero"), (49, 600.0, "one"), (50, 600.0, "two"), (51, 600.0, "three"), (52, 600.0, "four"), (53, 600.0, "five"), (54, 600.0, "six"), (55, 600.0, "seven"), (56, 600.0, "eight"), (57, 600.0, "nine"), (58, 600.0, "colon"), (59, 600.0, "semicolon"), (60, 600.0, "less"), (61, 600.0, "equal"), (62, 600.0, "greater"), (63, 600.0, "question"), (64, 600.0, "at"), (65, 600.0, "A"), (66, 600.0, "B"), (67, 600.0, "C"), (68, 600.0, "D"), (69, 600.0, "E"), (70, 600.0, "F"), (71, 600.0, "G"), (72, 600.0, "H"), (73, 600.0, "I"), (74, 600.0, "J"), (75, 600.0, "K"), (76, 600.0, "L"), (77, 600.0, "M"), (78, 600.0, "N"), (79, 600.0, "O"), (80, 600.0, "P"), (81, 600.0, "Q"), (82, 600.0, "R"), (83, 600.0, "S"), (84, 600.0, "T"), (85, 600.0, "U"), (86, 600.0, "V"), (87, 600.0, "W"), (88, 600.0, "X"), (89, 600.0, "Y"), (90, 600.0, "Z"), (91, 600.0, "bracketleft"), (92, 600.0, "backslash"), (93, 600.0, "bracketright"), (94, 600.0, "asciicircum"), (95, 600.0, "underscore"), (96, 600.0, "quoteleft"), (97, 600.0, "a"), (98, 600.0, "b"), (99, 600.0, "c"), (100, 600.0, "d"), (101, 600.0, "e"), (102, 600.0, "f"), (103, 600.0, "g"), (104, 600.0, "h"), (105, 600.0, "i"), (106, 600.0, "j"), (107, 600.0, "k"), (108, 600.0, "l"), (109, 600.0, "m"), (110, 600.0, "n"), (111, 600.0, "o"), (112, 600.0, "p"), (113, 600.0, "q"), (114, 600.0, "r"), (115, 600.0, "s"), (116, 600.0, "t"), (117, 600.0, "u"), (118, 600.0, "v"), (119, 600.0, "w"), (120, 600.0, "x"), (121, 600.0, "y"), (122, 600.0, "z"), (123, 600.0, "braceleft"), (124, 600.0, "bar"), (125, 600.0, "braceright"), (126, 600.0, "asciitilde"), (161, 600.0, "exclamdown"), (162, 600.0, "cent"), (163, 600.0, "sterling"), (164, 600.0, "fraction"), (165, 600.0, "yen"), (166, 600.0, "florin"), (167, 600.0, "section"), (168, 600.0, "currency"), (169, 600.0, "quotesingle"), (170, 600.0, "quotedblleft"), (171, 600.0, "guillemotleft"), (172, 600.0, "guilsinglleft"), (173, 600.0, "guilsinglright"), (174, 600.0, "fi"), (175, 600.0, "fl"), (177, 600.0, "endash"), (178, 600.0, "dagger"), (179, 600.0, "daggerdbl"), (180, 600.0, "periodcentered"), (182, 600.0, "paragraph"), (183, 600.0, "bullet"), (184, 600.0, "quotesinglbase"), (185, 600.0, "quotedblbase"), (186, 600.0, "quotedblright"), (187, 600.0, "guillemotright"), (188, 600.0, "ellipsis"), (189, 600.0, "perthousand"), (191, 600.0, "questiondown"), (193, 600.0, "grave"), (194, 600.0, "acute"), (195, 600.0, "circumflex"), (196, 600.0, "tilde"), (197, 600.0, "macron"), (198, 600.0, "breve"), (199, 600.0, "dotaccent"), (200, 600.0, "dieresis"), (202, 600.0, "ring"), (203, 600.0, "cedilla"), (205, 600.0, "hungarumlaut"), (206, 600.0, "ogonek"), (207, 600.0, "caron"), (208, 600.0, "emdash"), (225, 600.0, "AE"), (227, 600.0, "ordfeminine"), (232, 600.0, "Lslash"), (233, 600.0, "Oslash"), (234, 600.0, "OE"), (235, 600.0, "ordmasculine"), (241, 600.0, "ae"), (245, 600.0, "dotlessi"), (248, 600.0, "lslash"), (249, 600.0, "oslash"), (250, 600.0, "oe"), (251, 600.0, "germandbls"), (-1, 600.0, "Idieresis"), (-1, 600.0, "eacute"), (-1, 600.0, "abreve"), (-1, 600.0, "uhungarumlaut"), (-1, 600.0, "ecaron"), (-1, 600.0, "Ydieresis"), (-1, 600.0, "divide"), (-1, 600.0, "Yacute"), (-1, 600.0, "Acircumflex"), (-1, 600.0, "aacute"), (-1, 600.0, "Ucircumflex"), (-1, 600.0, "yacute"), (-1, 600.0, "scommaaccent"), (-1, 600.0, "ecircumflex"), (-1, 600.0, "Uring"), (-1, 600.0, "Udieresis"), (-1, 600.0, "aogonek"), (-1, 600.0, "Uacute"), (-1, 600.0, "uogonek"), (-1, 600.0, "Edieresis"), (-1, 600.0, "Dcroat"), (-1, 600.0, "commaaccent"), (-1, 600.0, "copyright"), (-1, 600.0, "Emacron"), (-1, 600.0, "ccaron"), (-1, 600.0, "aring"), (-1, 600.0, "Ncommaaccent"), (-1, 600.0, "lacute"), (-1, 600.0, "agrave"), (-1, 600.0, "Tcommaaccent"), (-1, 600.0, "Cacute"), (-1, 600.0, "atilde"), (-1, 600.0, "Edotaccent"), (-1, 600.0, "scaron"), (-1, 600.0, "scedilla"), (-1, 600.0, "iacute"), (-1, 600.0, "lozenge"), (-1, 600.0, "Rcaron"), (-1, 600.0, "Gcommaaccent"), (-1, 600.0, "ucircumflex"), (-1, 600.0, "acircumflex"), (-1, 600.0, "Amacron"), (-1, 600.0, "rcaron"), (-1, 600.0, "ccedilla"), (-1, 600.0, "Zdotaccent"), (-1, 600.0, "Thorn"), (-1, 600.0, "Omacron"), (-1, 600.0, "Racute"), (-1, 600.0, "Sacute"), (-1, 600.0, "dcaron"), (-1, 600.0, "Umacron"), (-1, 600.0, "uring"), (-1, 600.0, "threesuperior"), (-1, 600.0, "Ograve"), (-1, 600.0, "Agrave"), (-1, 600.0, "Abreve"), (-1, 600.0, "multiply"), (-1, 600.0, "uacute"), (-1, 600.0, "Tcaron"), (-1, 600.0, "partialdiff"), (-1, 600.0, "ydieresis"), (-1, 600.0, "Nacute"), (-1, 600.0, "icircumflex"), (-1, 600.0, "Ecircumflex"), (-1, 600.0, "adieresis"), (-1, 600.0, "edieresis"), (-1, 600.0, "cacute"), (-1, 600.0, "nacute"), (-1, 600.0, "umacron"), (-1, 600.0, "Ncaron"), (-1, 600.0, "Iacute"), (-1, 600.0, "plusminus"), (-1, 600.0, "brokenbar"), (-1, 600.0, "registered"), (-1, 600.0, "Gbreve"), (-1, 600.0, "Idotaccent"), (-1, 600.0, "summation"), (-1, 600.0, "Egrave"), (-1, 600.0, "racute"), (-1, 600.0, "omacron"), (-1, 600.0, "Zacute"), (-1, 600.0, "Zcaron"), (-1, 600.0, "greaterequal"), (-1, 600.0, "Eth"), (-1, 600.0, "Ccedilla"), (-1, 600.0, "lcommaaccent"), (-1, 600.0, "tcaron"), (-1, 600.0, "eogonek"), (-1, 600.0, "Uogonek"), (-1, 600.0, "Aacute"), (-1, 600.0, "Adieresis"), (-1, 600.0, "egrave"), (-1, 600.0, "zacute"), (-1, 600.0, "iogonek"), (-1, 600.0, "Oacute"), (-1, 600.0, "oacute"), (-1, 600.0, "amacron"), (-1, 600.0, "sacute"), (-1, 600.0, "idieresis"), (-1, 600.0, "Ocircumflex"), (-1, 600.0, "Ugrave"), (-1, 600.0, "Delta"), (-1, 600.0, "thorn"), (-1, 600.0, "twosuperior"), (-1, 600.0, "Odieresis"), (-1, 600.0, "mu"), (-1, 600.0, "igrave"), (-1, 600.0, "ohungarumlaut"), (-1, 600.0, "Eogonek"), (-1, 600.0, "dcroat"), (-1, 600.0, "threequarters"), (-1, 600.0, "Scedilla"), (-1, 600.0, "lcaron"), (-1, 600.0, "Kcommaaccent"), (-1, 600.0, "Lacute"), (-1, 600.0, "trademark"), (-1, 600.0, "edotaccent"), (-1, 600.0, "Igrave"), (-1, 600.0, "Imacron"), (-1, 600.0, "Lcaron"), (-1, 600.0, "onehalf"), (-1, 600.0, "lessequal"), (-1, 600.0, "ocircumflex"), (-1, 600.0, "ntilde"), (-1, 600.0, "Uhungarumlaut"), (-1, 600.0, "Eacute"), (-1, 600.0, "emacron"), (-1, 600.0, "gbreve"), (-1, 600.0, "onequarter"), (-1, 600.0, "Scaron"), (-1, 600.0, "Scommaaccent"), (-1, 600.0, "Ohungarumlaut"), (-1, 600.0, "degree"), (-1, 600.0, "ograve"), (-1, 600.0, "Ccaron"), (-1, 600.0, "ugrave"), (-1, 600.0, "radical"), (-1, 600.0, "Dcaron"), (-1, 600.0, "rcommaaccent"), (-1, 600.0, "Ntilde"), (-1, 600.0, "otilde"), (-1, 600.0, "Rcommaaccent"), (-1, 600.0, "Lcommaaccent"), (-1, 600.0, "Atilde"), (-1, 600.0, "Aogonek"), (-1, 600.0, "Aring"), (-1, 600.0, "Otilde"), (-1, 600.0, "zdotaccent"), (-1, 600.0, "Ecaron"), (-1, 600.0, "Iogonek"), (-1, 600.0, "kcommaaccent"), (-1, 600.0, "minus"), (-1, 600.0, "Icircumflex"), (-1, 600.0, "ncaron"), (-1, 600.0, "tcommaaccent"), (-1, 600.0, "logicalnot"), (-1, 600.0, "odieresis"), (-1, 600.0, "udieresis"), (-1, 600.0, "notequal"), (-1, 600.0, "gcommaaccent"), (-1, 600.0, "eth"), (-1, 600.0, "zcaron"), (-1, 600.0, "ncommaaccent"), (-1, 600.0, "onesuperior"), (-1, 600.0, "imacron"), (-1, 600.0, "Euro")][..]), +("Courier-BoldOblique", "AdobeStandardEncoding", &[(32, 600.0, "space"), (33, 600.0, "exclam"), (34, 600.0, "quotedbl"), (35, 600.0, "numbersign"), (36, 600.0, "dollar"), (37, 600.0, "percent"), (38, 600.0, "ampersand"), (39, 600.0, "quoteright"), (40, 600.0, "parenleft"), (41, 600.0, "parenright"), (42, 600.0, "asterisk"), (43, 600.0, "plus"), (44, 600.0, "comma"), (45, 600.0, "hyphen"), (46, 600.0, "period"), (47, 600.0, "slash"), (48, 600.0, "zero"), (49, 600.0, "one"), (50, 600.0, "two"), (51, 600.0, "three"), (52, 600.0, "four"), (53, 600.0, "five"), (54, 600.0, "six"), (55, 600.0, "seven"), (56, 600.0, "eight"), (57, 600.0, "nine"), (58, 600.0, "colon"), (59, 600.0, "semicolon"), (60, 600.0, "less"), (61, 600.0, "equal"), (62, 600.0, "greater"), (63, 600.0, "question"), (64, 600.0, "at"), (65, 600.0, "A"), (66, 600.0, "B"), (67, 600.0, "C"), (68, 600.0, "D"), (69, 600.0, "E"), (70, 600.0, "F"), (71, 600.0, "G"), (72, 600.0, "H"), (73, 600.0, "I"), (74, 600.0, "J"), (75, 600.0, "K"), (76, 600.0, "L"), (77, 600.0, "M"), (78, 600.0, "N"), (79, 600.0, "O"), (80, 600.0, "P"), (81, 600.0, "Q"), (82, 600.0, "R"), (83, 600.0, "S"), (84, 600.0, "T"), (85, 600.0, "U"), (86, 600.0, "V"), (87, 600.0, "W"), (88, 600.0, "X"), (89, 600.0, "Y"), (90, 600.0, "Z"), (91, 600.0, "bracketleft"), (92, 600.0, "backslash"), (93, 600.0, "bracketright"), (94, 600.0, "asciicircum"), (95, 600.0, "underscore"), (96, 600.0, "quoteleft"), (97, 600.0, "a"), (98, 600.0, "b"), (99, 600.0, "c"), (100, 600.0, "d"), (101, 600.0, "e"), (102, 600.0, "f"), (103, 600.0, "g"), (104, 600.0, "h"), (105, 600.0, "i"), (106, 600.0, "j"), (107, 600.0, "k"), (108, 600.0, "l"), (109, 600.0, "m"), (110, 600.0, "n"), (111, 600.0, "o"), (112, 600.0, "p"), (113, 600.0, "q"), (114, 600.0, "r"), (115, 600.0, "s"), (116, 600.0, "t"), (117, 600.0, "u"), (118, 600.0, "v"), (119, 600.0, "w"), (120, 600.0, "x"), (121, 600.0, "y"), (122, 600.0, "z"), (123, 600.0, "braceleft"), (124, 600.0, "bar"), (125, 600.0, "braceright"), (126, 600.0, "asciitilde"), (161, 600.0, "exclamdown"), (162, 600.0, "cent"), (163, 600.0, "sterling"), (164, 600.0, "fraction"), (165, 600.0, "yen"), (166, 600.0, "florin"), (167, 600.0, "section"), (168, 600.0, "currency"), (169, 600.0, "quotesingle"), (170, 600.0, "quotedblleft"), (171, 600.0, "guillemotleft"), (172, 600.0, "guilsinglleft"), (173, 600.0, "guilsinglright"), (174, 600.0, "fi"), (175, 600.0, "fl"), (177, 600.0, "endash"), (178, 600.0, "dagger"), (179, 600.0, "daggerdbl"), (180, 600.0, "periodcentered"), (182, 600.0, "paragraph"), (183, 600.0, "bullet"), (184, 600.0, "quotesinglbase"), (185, 600.0, "quotedblbase"), (186, 600.0, "quotedblright"), (187, 600.0, "guillemotright"), (188, 600.0, "ellipsis"), (189, 600.0, "perthousand"), (191, 600.0, "questiondown"), (193, 600.0, "grave"), (194, 600.0, "acute"), (195, 600.0, "circumflex"), (196, 600.0, "tilde"), (197, 600.0, "macron"), (198, 600.0, "breve"), (199, 600.0, "dotaccent"), (200, 600.0, "dieresis"), (202, 600.0, "ring"), (203, 600.0, "cedilla"), (205, 600.0, "hungarumlaut"), (206, 600.0, "ogonek"), (207, 600.0, "caron"), (208, 600.0, "emdash"), (225, 600.0, "AE"), (227, 600.0, "ordfeminine"), (232, 600.0, "Lslash"), (233, 600.0, "Oslash"), (234, 600.0, "OE"), (235, 600.0, "ordmasculine"), (241, 600.0, "ae"), (245, 600.0, "dotlessi"), (248, 600.0, "lslash"), (249, 600.0, "oslash"), (250, 600.0, "oe"), (251, 600.0, "germandbls"), (-1, 600.0, "Idieresis"), (-1, 600.0, "eacute"), (-1, 600.0, "abreve"), (-1, 600.0, "uhungarumlaut"), (-1, 600.0, "ecaron"), (-1, 600.0, "Ydieresis"), (-1, 600.0, "divide"), (-1, 600.0, "Yacute"), (-1, 600.0, "Acircumflex"), (-1, 600.0, "aacute"), (-1, 600.0, "Ucircumflex"), (-1, 600.0, "yacute"), (-1, 600.0, "scommaaccent"), (-1, 600.0, "ecircumflex"), (-1, 600.0, "Uring"), (-1, 600.0, "Udieresis"), (-1, 600.0, "aogonek"), (-1, 600.0, "Uacute"), (-1, 600.0, "uogonek"), (-1, 600.0, "Edieresis"), (-1, 600.0, "Dcroat"), (-1, 600.0, "commaaccent"), (-1, 600.0, "copyright"), (-1, 600.0, "Emacron"), (-1, 600.0, "ccaron"), (-1, 600.0, "aring"), (-1, 600.0, "Ncommaaccent"), (-1, 600.0, "lacute"), (-1, 600.0, "agrave"), (-1, 600.0, "Tcommaaccent"), (-1, 600.0, "Cacute"), (-1, 600.0, "atilde"), (-1, 600.0, "Edotaccent"), (-1, 600.0, "scaron"), (-1, 600.0, "scedilla"), (-1, 600.0, "iacute"), (-1, 600.0, "lozenge"), (-1, 600.0, "Rcaron"), (-1, 600.0, "Gcommaaccent"), (-1, 600.0, "ucircumflex"), (-1, 600.0, "acircumflex"), (-1, 600.0, "Amacron"), (-1, 600.0, "rcaron"), (-1, 600.0, "ccedilla"), (-1, 600.0, "Zdotaccent"), (-1, 600.0, "Thorn"), (-1, 600.0, "Omacron"), (-1, 600.0, "Racute"), (-1, 600.0, "Sacute"), (-1, 600.0, "dcaron"), (-1, 600.0, "Umacron"), (-1, 600.0, "uring"), (-1, 600.0, "threesuperior"), (-1, 600.0, "Ograve"), (-1, 600.0, "Agrave"), (-1, 600.0, "Abreve"), (-1, 600.0, "multiply"), (-1, 600.0, "uacute"), (-1, 600.0, "Tcaron"), (-1, 600.0, "partialdiff"), (-1, 600.0, "ydieresis"), (-1, 600.0, "Nacute"), (-1, 600.0, "icircumflex"), (-1, 600.0, "Ecircumflex"), (-1, 600.0, "adieresis"), (-1, 600.0, "edieresis"), (-1, 600.0, "cacute"), (-1, 600.0, "nacute"), (-1, 600.0, "umacron"), (-1, 600.0, "Ncaron"), (-1, 600.0, "Iacute"), (-1, 600.0, "plusminus"), (-1, 600.0, "brokenbar"), (-1, 600.0, "registered"), (-1, 600.0, "Gbreve"), (-1, 600.0, "Idotaccent"), (-1, 600.0, "summation"), (-1, 600.0, "Egrave"), (-1, 600.0, "racute"), (-1, 600.0, "omacron"), (-1, 600.0, "Zacute"), (-1, 600.0, "Zcaron"), (-1, 600.0, "greaterequal"), (-1, 600.0, "Eth"), (-1, 600.0, "Ccedilla"), (-1, 600.0, "lcommaaccent"), (-1, 600.0, "tcaron"), (-1, 600.0, "eogonek"), (-1, 600.0, "Uogonek"), (-1, 600.0, "Aacute"), (-1, 600.0, "Adieresis"), (-1, 600.0, "egrave"), (-1, 600.0, "zacute"), (-1, 600.0, "iogonek"), (-1, 600.0, "Oacute"), (-1, 600.0, "oacute"), (-1, 600.0, "amacron"), (-1, 600.0, "sacute"), (-1, 600.0, "idieresis"), (-1, 600.0, "Ocircumflex"), (-1, 600.0, "Ugrave"), (-1, 600.0, "Delta"), (-1, 600.0, "thorn"), (-1, 600.0, "twosuperior"), (-1, 600.0, "Odieresis"), (-1, 600.0, "mu"), (-1, 600.0, "igrave"), (-1, 600.0, "ohungarumlaut"), (-1, 600.0, "Eogonek"), (-1, 600.0, "dcroat"), (-1, 600.0, "threequarters"), (-1, 600.0, "Scedilla"), (-1, 600.0, "lcaron"), (-1, 600.0, "Kcommaaccent"), (-1, 600.0, "Lacute"), (-1, 600.0, "trademark"), (-1, 600.0, "edotaccent"), (-1, 600.0, "Igrave"), (-1, 600.0, "Imacron"), (-1, 600.0, "Lcaron"), (-1, 600.0, "onehalf"), (-1, 600.0, "lessequal"), (-1, 600.0, "ocircumflex"), (-1, 600.0, "ntilde"), (-1, 600.0, "Uhungarumlaut"), (-1, 600.0, "Eacute"), (-1, 600.0, "emacron"), (-1, 600.0, "gbreve"), (-1, 600.0, "onequarter"), (-1, 600.0, "Scaron"), (-1, 600.0, "Scommaaccent"), (-1, 600.0, "Ohungarumlaut"), (-1, 600.0, "degree"), (-1, 600.0, "ograve"), (-1, 600.0, "Ccaron"), (-1, 600.0, "ugrave"), (-1, 600.0, "radical"), (-1, 600.0, "Dcaron"), (-1, 600.0, "rcommaaccent"), (-1, 600.0, "Ntilde"), (-1, 600.0, "otilde"), (-1, 600.0, "Rcommaaccent"), (-1, 600.0, "Lcommaaccent"), (-1, 600.0, "Atilde"), (-1, 600.0, "Aogonek"), (-1, 600.0, "Aring"), (-1, 600.0, "Otilde"), (-1, 600.0, "zdotaccent"), (-1, 600.0, "Ecaron"), (-1, 600.0, "Iogonek"), (-1, 600.0, "kcommaaccent"), (-1, 600.0, "minus"), (-1, 600.0, "Icircumflex"), (-1, 600.0, "ncaron"), (-1, 600.0, "tcommaaccent"), (-1, 600.0, "logicalnot"), (-1, 600.0, "odieresis"), (-1, 600.0, "udieresis"), (-1, 600.0, "notequal"), (-1, 600.0, "gcommaaccent"), (-1, 600.0, "eth"), (-1, 600.0, "zcaron"), (-1, 600.0, "ncommaaccent"), (-1, 600.0, "onesuperior"), (-1, 600.0, "imacron"), (-1, 600.0, "Euro")][..]), +("Courier-Oblique", "AdobeStandardEncoding", &[(32, 600.0, "space"), (33, 600.0, "exclam"), (34, 600.0, "quotedbl"), (35, 600.0, "numbersign"), (36, 600.0, "dollar"), (37, 600.0, "percent"), (38, 600.0, "ampersand"), (39, 600.0, "quoteright"), (40, 600.0, "parenleft"), (41, 600.0, "parenright"), (42, 600.0, "asterisk"), (43, 600.0, "plus"), (44, 600.0, "comma"), (45, 600.0, "hyphen"), (46, 600.0, "period"), (47, 600.0, "slash"), (48, 600.0, "zero"), (49, 600.0, "one"), (50, 600.0, "two"), (51, 600.0, "three"), (52, 600.0, "four"), (53, 600.0, "five"), (54, 600.0, "six"), (55, 600.0, "seven"), (56, 600.0, "eight"), (57, 600.0, "nine"), (58, 600.0, "colon"), (59, 600.0, "semicolon"), (60, 600.0, "less"), (61, 600.0, "equal"), (62, 600.0, "greater"), (63, 600.0, "question"), (64, 600.0, "at"), (65, 600.0, "A"), (66, 600.0, "B"), (67, 600.0, "C"), (68, 600.0, "D"), (69, 600.0, "E"), (70, 600.0, "F"), (71, 600.0, "G"), (72, 600.0, "H"), (73, 600.0, "I"), (74, 600.0, "J"), (75, 600.0, "K"), (76, 600.0, "L"), (77, 600.0, "M"), (78, 600.0, "N"), (79, 600.0, "O"), (80, 600.0, "P"), (81, 600.0, "Q"), (82, 600.0, "R"), (83, 600.0, "S"), (84, 600.0, "T"), (85, 600.0, "U"), (86, 600.0, "V"), (87, 600.0, "W"), (88, 600.0, "X"), (89, 600.0, "Y"), (90, 600.0, "Z"), (91, 600.0, "bracketleft"), (92, 600.0, "backslash"), (93, 600.0, "bracketright"), (94, 600.0, "asciicircum"), (95, 600.0, "underscore"), (96, 600.0, "quoteleft"), (97, 600.0, "a"), (98, 600.0, "b"), (99, 600.0, "c"), (100, 600.0, "d"), (101, 600.0, "e"), (102, 600.0, "f"), (103, 600.0, "g"), (104, 600.0, "h"), (105, 600.0, "i"), (106, 600.0, "j"), (107, 600.0, "k"), (108, 600.0, "l"), (109, 600.0, "m"), (110, 600.0, "n"), (111, 600.0, "o"), (112, 600.0, "p"), (113, 600.0, "q"), (114, 600.0, "r"), (115, 600.0, "s"), (116, 600.0, "t"), (117, 600.0, "u"), (118, 600.0, "v"), (119, 600.0, "w"), (120, 600.0, "x"), (121, 600.0, "y"), (122, 600.0, "z"), (123, 600.0, "braceleft"), (124, 600.0, "bar"), (125, 600.0, "braceright"), (126, 600.0, "asciitilde"), (161, 600.0, "exclamdown"), (162, 600.0, "cent"), (163, 600.0, "sterling"), (164, 600.0, "fraction"), (165, 600.0, "yen"), (166, 600.0, "florin"), (167, 600.0, "section"), (168, 600.0, "currency"), (169, 600.0, "quotesingle"), (170, 600.0, "quotedblleft"), (171, 600.0, "guillemotleft"), (172, 600.0, "guilsinglleft"), (173, 600.0, "guilsinglright"), (174, 600.0, "fi"), (175, 600.0, "fl"), (177, 600.0, "endash"), (178, 600.0, "dagger"), (179, 600.0, "daggerdbl"), (180, 600.0, "periodcentered"), (182, 600.0, "paragraph"), (183, 600.0, "bullet"), (184, 600.0, "quotesinglbase"), (185, 600.0, "quotedblbase"), (186, 600.0, "quotedblright"), (187, 600.0, "guillemotright"), (188, 600.0, "ellipsis"), (189, 600.0, "perthousand"), (191, 600.0, "questiondown"), (193, 600.0, "grave"), (194, 600.0, "acute"), (195, 600.0, "circumflex"), (196, 600.0, "tilde"), (197, 600.0, "macron"), (198, 600.0, "breve"), (199, 600.0, "dotaccent"), (200, 600.0, "dieresis"), (202, 600.0, "ring"), (203, 600.0, "cedilla"), (205, 600.0, "hungarumlaut"), (206, 600.0, "ogonek"), (207, 600.0, "caron"), (208, 600.0, "emdash"), (225, 600.0, "AE"), (227, 600.0, "ordfeminine"), (232, 600.0, "Lslash"), (233, 600.0, "Oslash"), (234, 600.0, "OE"), (235, 600.0, "ordmasculine"), (241, 600.0, "ae"), (245, 600.0, "dotlessi"), (248, 600.0, "lslash"), (249, 600.0, "oslash"), (250, 600.0, "oe"), (251, 600.0, "germandbls"), (-1, 600.0, "Idieresis"), (-1, 600.0, "eacute"), (-1, 600.0, "abreve"), (-1, 600.0, "uhungarumlaut"), (-1, 600.0, "ecaron"), (-1, 600.0, "Ydieresis"), (-1, 600.0, "divide"), (-1, 600.0, "Yacute"), (-1, 600.0, "Acircumflex"), (-1, 600.0, "aacute"), (-1, 600.0, "Ucircumflex"), (-1, 600.0, "yacute"), (-1, 600.0, "scommaaccent"), (-1, 600.0, "ecircumflex"), (-1, 600.0, "Uring"), (-1, 600.0, "Udieresis"), (-1, 600.0, "aogonek"), (-1, 600.0, "Uacute"), (-1, 600.0, "uogonek"), (-1, 600.0, "Edieresis"), (-1, 600.0, "Dcroat"), (-1, 600.0, "commaaccent"), (-1, 600.0, "copyright"), (-1, 600.0, "Emacron"), (-1, 600.0, "ccaron"), (-1, 600.0, "aring"), (-1, 600.0, "Ncommaaccent"), (-1, 600.0, "lacute"), (-1, 600.0, "agrave"), (-1, 600.0, "Tcommaaccent"), (-1, 600.0, "Cacute"), (-1, 600.0, "atilde"), (-1, 600.0, "Edotaccent"), (-1, 600.0, "scaron"), (-1, 600.0, "scedilla"), (-1, 600.0, "iacute"), (-1, 600.0, "lozenge"), (-1, 600.0, "Rcaron"), (-1, 600.0, "Gcommaaccent"), (-1, 600.0, "ucircumflex"), (-1, 600.0, "acircumflex"), (-1, 600.0, "Amacron"), (-1, 600.0, "rcaron"), (-1, 600.0, "ccedilla"), (-1, 600.0, "Zdotaccent"), (-1, 600.0, "Thorn"), (-1, 600.0, "Omacron"), (-1, 600.0, "Racute"), (-1, 600.0, "Sacute"), (-1, 600.0, "dcaron"), (-1, 600.0, "Umacron"), (-1, 600.0, "uring"), (-1, 600.0, "threesuperior"), (-1, 600.0, "Ograve"), (-1, 600.0, "Agrave"), (-1, 600.0, "Abreve"), (-1, 600.0, "multiply"), (-1, 600.0, "uacute"), (-1, 600.0, "Tcaron"), (-1, 600.0, "partialdiff"), (-1, 600.0, "ydieresis"), (-1, 600.0, "Nacute"), (-1, 600.0, "icircumflex"), (-1, 600.0, "Ecircumflex"), (-1, 600.0, "adieresis"), (-1, 600.0, "edieresis"), (-1, 600.0, "cacute"), (-1, 600.0, "nacute"), (-1, 600.0, "umacron"), (-1, 600.0, "Ncaron"), (-1, 600.0, "Iacute"), (-1, 600.0, "plusminus"), (-1, 600.0, "brokenbar"), (-1, 600.0, "registered"), (-1, 600.0, "Gbreve"), (-1, 600.0, "Idotaccent"), (-1, 600.0, "summation"), (-1, 600.0, "Egrave"), (-1, 600.0, "racute"), (-1, 600.0, "omacron"), (-1, 600.0, "Zacute"), (-1, 600.0, "Zcaron"), (-1, 600.0, "greaterequal"), (-1, 600.0, "Eth"), (-1, 600.0, "Ccedilla"), (-1, 600.0, "lcommaaccent"), (-1, 600.0, "tcaron"), (-1, 600.0, "eogonek"), (-1, 600.0, "Uogonek"), (-1, 600.0, "Aacute"), (-1, 600.0, "Adieresis"), (-1, 600.0, "egrave"), (-1, 600.0, "zacute"), (-1, 600.0, "iogonek"), (-1, 600.0, "Oacute"), (-1, 600.0, "oacute"), (-1, 600.0, "amacron"), (-1, 600.0, "sacute"), (-1, 600.0, "idieresis"), (-1, 600.0, "Ocircumflex"), (-1, 600.0, "Ugrave"), (-1, 600.0, "Delta"), (-1, 600.0, "thorn"), (-1, 600.0, "twosuperior"), (-1, 600.0, "Odieresis"), (-1, 600.0, "mu"), (-1, 600.0, "igrave"), (-1, 600.0, "ohungarumlaut"), (-1, 600.0, "Eogonek"), (-1, 600.0, "dcroat"), (-1, 600.0, "threequarters"), (-1, 600.0, "Scedilla"), (-1, 600.0, "lcaron"), (-1, 600.0, "Kcommaaccent"), (-1, 600.0, "Lacute"), (-1, 600.0, "trademark"), (-1, 600.0, "edotaccent"), (-1, 600.0, "Igrave"), (-1, 600.0, "Imacron"), (-1, 600.0, "Lcaron"), (-1, 600.0, "onehalf"), (-1, 600.0, "lessequal"), (-1, 600.0, "ocircumflex"), (-1, 600.0, "ntilde"), (-1, 600.0, "Uhungarumlaut"), (-1, 600.0, "Eacute"), (-1, 600.0, "emacron"), (-1, 600.0, "gbreve"), (-1, 600.0, "onequarter"), (-1, 600.0, "Scaron"), (-1, 600.0, "Scommaaccent"), (-1, 600.0, "Ohungarumlaut"), (-1, 600.0, "degree"), (-1, 600.0, "ograve"), (-1, 600.0, "Ccaron"), (-1, 600.0, "ugrave"), (-1, 600.0, "radical"), (-1, 600.0, "Dcaron"), (-1, 600.0, "rcommaaccent"), (-1, 600.0, "Ntilde"), (-1, 600.0, "otilde"), (-1, 600.0, "Rcommaaccent"), (-1, 600.0, "Lcommaaccent"), (-1, 600.0, "Atilde"), (-1, 600.0, "Aogonek"), (-1, 600.0, "Aring"), (-1, 600.0, "Otilde"), (-1, 600.0, "zdotaccent"), (-1, 600.0, "Ecaron"), (-1, 600.0, "Iogonek"), (-1, 600.0, "kcommaaccent"), (-1, 600.0, "minus"), (-1, 600.0, "Icircumflex"), (-1, 600.0, "ncaron"), (-1, 600.0, "tcommaaccent"), (-1, 600.0, "logicalnot"), (-1, 600.0, "odieresis"), (-1, 600.0, "udieresis"), (-1, 600.0, "notequal"), (-1, 600.0, "gcommaaccent"), (-1, 600.0, "eth"), (-1, 600.0, "zcaron"), (-1, 600.0, "ncommaaccent"), (-1, 600.0, "onesuperior"), (-1, 600.0, "imacron"), (-1, 600.0, "Euro")][..]), +("Courier", "AdobeStandardEncoding", &[(32, 600.0, "space"), (33, 600.0, "exclam"), (34, 600.0, "quotedbl"), (35, 600.0, "numbersign"), (36, 600.0, "dollar"), (37, 600.0, "percent"), (38, 600.0, "ampersand"), (39, 600.0, "quoteright"), (40, 600.0, "parenleft"), (41, 600.0, "parenright"), (42, 600.0, "asterisk"), (43, 600.0, "plus"), (44, 600.0, "comma"), (45, 600.0, "hyphen"), (46, 600.0, "period"), (47, 600.0, "slash"), (48, 600.0, "zero"), (49, 600.0, "one"), (50, 600.0, "two"), (51, 600.0, "three"), (52, 600.0, "four"), (53, 600.0, "five"), (54, 600.0, "six"), (55, 600.0, "seven"), (56, 600.0, "eight"), (57, 600.0, "nine"), (58, 600.0, "colon"), (59, 600.0, "semicolon"), (60, 600.0, "less"), (61, 600.0, "equal"), (62, 600.0, "greater"), (63, 600.0, "question"), (64, 600.0, "at"), (65, 600.0, "A"), (66, 600.0, "B"), (67, 600.0, "C"), (68, 600.0, "D"), (69, 600.0, "E"), (70, 600.0, "F"), (71, 600.0, "G"), (72, 600.0, "H"), (73, 600.0, "I"), (74, 600.0, "J"), (75, 600.0, "K"), (76, 600.0, "L"), (77, 600.0, "M"), (78, 600.0, "N"), (79, 600.0, "O"), (80, 600.0, "P"), (81, 600.0, "Q"), (82, 600.0, "R"), (83, 600.0, "S"), (84, 600.0, "T"), (85, 600.0, "U"), (86, 600.0, "V"), (87, 600.0, "W"), (88, 600.0, "X"), (89, 600.0, "Y"), (90, 600.0, "Z"), (91, 600.0, "bracketleft"), (92, 600.0, "backslash"), (93, 600.0, "bracketright"), (94, 600.0, "asciicircum"), (95, 600.0, "underscore"), (96, 600.0, "quoteleft"), (97, 600.0, "a"), (98, 600.0, "b"), (99, 600.0, "c"), (100, 600.0, "d"), (101, 600.0, "e"), (102, 600.0, "f"), (103, 600.0, "g"), (104, 600.0, "h"), (105, 600.0, "i"), (106, 600.0, "j"), (107, 600.0, "k"), (108, 600.0, "l"), (109, 600.0, "m"), (110, 600.0, "n"), (111, 600.0, "o"), (112, 600.0, "p"), (113, 600.0, "q"), (114, 600.0, "r"), (115, 600.0, "s"), (116, 600.0, "t"), (117, 600.0, "u"), (118, 600.0, "v"), (119, 600.0, "w"), (120, 600.0, "x"), (121, 600.0, "y"), (122, 600.0, "z"), (123, 600.0, "braceleft"), (124, 600.0, "bar"), (125, 600.0, "braceright"), (126, 600.0, "asciitilde"), (161, 600.0, "exclamdown"), (162, 600.0, "cent"), (163, 600.0, "sterling"), (164, 600.0, "fraction"), (165, 600.0, "yen"), (166, 600.0, "florin"), (167, 600.0, "section"), (168, 600.0, "currency"), (169, 600.0, "quotesingle"), (170, 600.0, "quotedblleft"), (171, 600.0, "guillemotleft"), (172, 600.0, "guilsinglleft"), (173, 600.0, "guilsinglright"), (174, 600.0, "fi"), (175, 600.0, "fl"), (177, 600.0, "endash"), (178, 600.0, "dagger"), (179, 600.0, "daggerdbl"), (180, 600.0, "periodcentered"), (182, 600.0, "paragraph"), (183, 600.0, "bullet"), (184, 600.0, "quotesinglbase"), (185, 600.0, "quotedblbase"), (186, 600.0, "quotedblright"), (187, 600.0, "guillemotright"), (188, 600.0, "ellipsis"), (189, 600.0, "perthousand"), (191, 600.0, "questiondown"), (193, 600.0, "grave"), (194, 600.0, "acute"), (195, 600.0, "circumflex"), (196, 600.0, "tilde"), (197, 600.0, "macron"), (198, 600.0, "breve"), (199, 600.0, "dotaccent"), (200, 600.0, "dieresis"), (202, 600.0, "ring"), (203, 600.0, "cedilla"), (205, 600.0, "hungarumlaut"), (206, 600.0, "ogonek"), (207, 600.0, "caron"), (208, 600.0, "emdash"), (225, 600.0, "AE"), (227, 600.0, "ordfeminine"), (232, 600.0, "Lslash"), (233, 600.0, "Oslash"), (234, 600.0, "OE"), (235, 600.0, "ordmasculine"), (241, 600.0, "ae"), (245, 600.0, "dotlessi"), (248, 600.0, "lslash"), (249, 600.0, "oslash"), (250, 600.0, "oe"), (251, 600.0, "germandbls"), (-1, 600.0, "Idieresis"), (-1, 600.0, "eacute"), (-1, 600.0, "abreve"), (-1, 600.0, "uhungarumlaut"), (-1, 600.0, "ecaron"), (-1, 600.0, "Ydieresis"), (-1, 600.0, "divide"), (-1, 600.0, "Yacute"), (-1, 600.0, "Acircumflex"), (-1, 600.0, "aacute"), (-1, 600.0, "Ucircumflex"), (-1, 600.0, "yacute"), (-1, 600.0, "scommaaccent"), (-1, 600.0, "ecircumflex"), (-1, 600.0, "Uring"), (-1, 600.0, "Udieresis"), (-1, 600.0, "aogonek"), (-1, 600.0, "Uacute"), (-1, 600.0, "uogonek"), (-1, 600.0, "Edieresis"), (-1, 600.0, "Dcroat"), (-1, 600.0, "commaaccent"), (-1, 600.0, "copyright"), (-1, 600.0, "Emacron"), (-1, 600.0, "ccaron"), (-1, 600.0, "aring"), (-1, 600.0, "Ncommaaccent"), (-1, 600.0, "lacute"), (-1, 600.0, "agrave"), (-1, 600.0, "Tcommaaccent"), (-1, 600.0, "Cacute"), (-1, 600.0, "atilde"), (-1, 600.0, "Edotaccent"), (-1, 600.0, "scaron"), (-1, 600.0, "scedilla"), (-1, 600.0, "iacute"), (-1, 600.0, "lozenge"), (-1, 600.0, "Rcaron"), (-1, 600.0, "Gcommaaccent"), (-1, 600.0, "ucircumflex"), (-1, 600.0, "acircumflex"), (-1, 600.0, "Amacron"), (-1, 600.0, "rcaron"), (-1, 600.0, "ccedilla"), (-1, 600.0, "Zdotaccent"), (-1, 600.0, "Thorn"), (-1, 600.0, "Omacron"), (-1, 600.0, "Racute"), (-1, 600.0, "Sacute"), (-1, 600.0, "dcaron"), (-1, 600.0, "Umacron"), (-1, 600.0, "uring"), (-1, 600.0, "threesuperior"), (-1, 600.0, "Ograve"), (-1, 600.0, "Agrave"), (-1, 600.0, "Abreve"), (-1, 600.0, "multiply"), (-1, 600.0, "uacute"), (-1, 600.0, "Tcaron"), (-1, 600.0, "partialdiff"), (-1, 600.0, "ydieresis"), (-1, 600.0, "Nacute"), (-1, 600.0, "icircumflex"), (-1, 600.0, "Ecircumflex"), (-1, 600.0, "adieresis"), (-1, 600.0, "edieresis"), (-1, 600.0, "cacute"), (-1, 600.0, "nacute"), (-1, 600.0, "umacron"), (-1, 600.0, "Ncaron"), (-1, 600.0, "Iacute"), (-1, 600.0, "plusminus"), (-1, 600.0, "brokenbar"), (-1, 600.0, "registered"), (-1, 600.0, "Gbreve"), (-1, 600.0, "Idotaccent"), (-1, 600.0, "summation"), (-1, 600.0, "Egrave"), (-1, 600.0, "racute"), (-1, 600.0, "omacron"), (-1, 600.0, "Zacute"), (-1, 600.0, "Zcaron"), (-1, 600.0, "greaterequal"), (-1, 600.0, "Eth"), (-1, 600.0, "Ccedilla"), (-1, 600.0, "lcommaaccent"), (-1, 600.0, "tcaron"), (-1, 600.0, "eogonek"), (-1, 600.0, "Uogonek"), (-1, 600.0, "Aacute"), (-1, 600.0, "Adieresis"), (-1, 600.0, "egrave"), (-1, 600.0, "zacute"), (-1, 600.0, "iogonek"), (-1, 600.0, "Oacute"), (-1, 600.0, "oacute"), (-1, 600.0, "amacron"), (-1, 600.0, "sacute"), (-1, 600.0, "idieresis"), (-1, 600.0, "Ocircumflex"), (-1, 600.0, "Ugrave"), (-1, 600.0, "Delta"), (-1, 600.0, "thorn"), (-1, 600.0, "twosuperior"), (-1, 600.0, "Odieresis"), (-1, 600.0, "mu"), (-1, 600.0, "igrave"), (-1, 600.0, "ohungarumlaut"), (-1, 600.0, "Eogonek"), (-1, 600.0, "dcroat"), (-1, 600.0, "threequarters"), (-1, 600.0, "Scedilla"), (-1, 600.0, "lcaron"), (-1, 600.0, "Kcommaaccent"), (-1, 600.0, "Lacute"), (-1, 600.0, "trademark"), (-1, 600.0, "edotaccent"), (-1, 600.0, "Igrave"), (-1, 600.0, "Imacron"), (-1, 600.0, "Lcaron"), (-1, 600.0, "onehalf"), (-1, 600.0, "lessequal"), (-1, 600.0, "ocircumflex"), (-1, 600.0, "ntilde"), (-1, 600.0, "Uhungarumlaut"), (-1, 600.0, "Eacute"), (-1, 600.0, "emacron"), (-1, 600.0, "gbreve"), (-1, 600.0, "onequarter"), (-1, 600.0, "Scaron"), (-1, 600.0, "Scommaaccent"), (-1, 600.0, "Ohungarumlaut"), (-1, 600.0, "degree"), (-1, 600.0, "ograve"), (-1, 600.0, "Ccaron"), (-1, 600.0, "ugrave"), (-1, 600.0, "radical"), (-1, 600.0, "Dcaron"), (-1, 600.0, "rcommaaccent"), (-1, 600.0, "Ntilde"), (-1, 600.0, "otilde"), (-1, 600.0, "Rcommaaccent"), (-1, 600.0, "Lcommaaccent"), (-1, 600.0, "Atilde"), (-1, 600.0, "Aogonek"), (-1, 600.0, "Aring"), (-1, 600.0, "Otilde"), (-1, 600.0, "zdotaccent"), (-1, 600.0, "Ecaron"), (-1, 600.0, "Iogonek"), (-1, 600.0, "kcommaaccent"), (-1, 600.0, "minus"), (-1, 600.0, "Icircumflex"), (-1, 600.0, "ncaron"), (-1, 600.0, "tcommaaccent"), (-1, 600.0, "logicalnot"), (-1, 600.0, "odieresis"), (-1, 600.0, "udieresis"), (-1, 600.0, "notequal"), (-1, 600.0, "gcommaaccent"), (-1, 600.0, "eth"), (-1, 600.0, "zcaron"), (-1, 600.0, "ncommaaccent"), (-1, 600.0, "onesuperior"), (-1, 600.0, "imacron"), (-1, 600.0, "Euro")][..]), +("Helvetica-Bold", "AdobeStandardEncoding", &[(32, 278.0, "space"), (33, 333.0, "exclam"), (34, 474.0, "quotedbl"), (35, 556.0, "numbersign"), (36, 556.0, "dollar"), (37, 889.0, "percent"), (38, 722.0, "ampersand"), (39, 278.0, "quoteright"), (40, 333.0, "parenleft"), (41, 333.0, "parenright"), (42, 389.0, "asterisk"), (43, 584.0, "plus"), (44, 278.0, "comma"), (45, 333.0, "hyphen"), (46, 278.0, "period"), (47, 278.0, "slash"), (48, 556.0, "zero"), (49, 556.0, "one"), (50, 556.0, "two"), (51, 556.0, "three"), (52, 556.0, "four"), (53, 556.0, "five"), (54, 556.0, "six"), (55, 556.0, "seven"), (56, 556.0, "eight"), (57, 556.0, "nine"), (58, 333.0, "colon"), (59, 333.0, "semicolon"), (60, 584.0, "less"), (61, 584.0, "equal"), (62, 584.0, "greater"), (63, 611.0, "question"), (64, 975.0, "at"), (65, 722.0, "A"), (66, 722.0, "B"), (67, 722.0, "C"), (68, 722.0, "D"), (69, 667.0, "E"), (70, 611.0, "F"), (71, 778.0, "G"), (72, 722.0, "H"), (73, 278.0, "I"), (74, 556.0, "J"), (75, 722.0, "K"), (76, 611.0, "L"), (77, 833.0, "M"), (78, 722.0, "N"), (79, 778.0, "O"), (80, 667.0, "P"), (81, 778.0, "Q"), (82, 722.0, "R"), (83, 667.0, "S"), (84, 611.0, "T"), (85, 722.0, "U"), (86, 667.0, "V"), (87, 944.0, "W"), (88, 667.0, "X"), (89, 667.0, "Y"), (90, 611.0, "Z"), (91, 333.0, "bracketleft"), (92, 278.0, "backslash"), (93, 333.0, "bracketright"), (94, 584.0, "asciicircum"), (95, 556.0, "underscore"), (96, 278.0, "quoteleft"), (97, 556.0, "a"), (98, 611.0, "b"), (99, 556.0, "c"), (100, 611.0, "d"), (101, 556.0, "e"), (102, 333.0, "f"), (103, 611.0, "g"), (104, 611.0, "h"), (105, 278.0, "i"), (106, 278.0, "j"), (107, 556.0, "k"), (108, 278.0, "l"), (109, 889.0, "m"), (110, 611.0, "n"), (111, 611.0, "o"), (112, 611.0, "p"), (113, 611.0, "q"), (114, 389.0, "r"), (115, 556.0, "s"), (116, 333.0, "t"), (117, 611.0, "u"), (118, 556.0, "v"), (119, 778.0, "w"), (120, 556.0, "x"), (121, 556.0, "y"), (122, 500.0, "z"), (123, 389.0, "braceleft"), (124, 280.0, "bar"), (125, 389.0, "braceright"), (126, 584.0, "asciitilde"), (161, 333.0, "exclamdown"), (162, 556.0, "cent"), (163, 556.0, "sterling"), (164, 167.0, "fraction"), (165, 556.0, "yen"), (166, 556.0, "florin"), (167, 556.0, "section"), (168, 556.0, "currency"), (169, 238.0, "quotesingle"), (170, 500.0, "quotedblleft"), (171, 556.0, "guillemotleft"), (172, 333.0, "guilsinglleft"), (173, 333.0, "guilsinglright"), (174, 611.0, "fi"), (175, 611.0, "fl"), (177, 556.0, "endash"), (178, 556.0, "dagger"), (179, 556.0, "daggerdbl"), (180, 278.0, "periodcentered"), (182, 556.0, "paragraph"), (183, 350.0, "bullet"), (184, 278.0, "quotesinglbase"), (185, 500.0, "quotedblbase"), (186, 500.0, "quotedblright"), (187, 556.0, "guillemotright"), (188, 1000.0, "ellipsis"), (189, 1000.0, "perthousand"), (191, 611.0, "questiondown"), (193, 333.0, "grave"), (194, 333.0, "acute"), (195, 333.0, "circumflex"), (196, 333.0, "tilde"), (197, 333.0, "macron"), (198, 333.0, "breve"), (199, 333.0, "dotaccent"), (200, 333.0, "dieresis"), (202, 333.0, "ring"), (203, 333.0, "cedilla"), (205, 333.0, "hungarumlaut"), (206, 333.0, "ogonek"), (207, 333.0, "caron"), (208, 1000.0, "emdash"), (225, 1000.0, "AE"), (227, 370.0, "ordfeminine"), (232, 611.0, "Lslash"), (233, 778.0, "Oslash"), (234, 1000.0, "OE"), (235, 365.0, "ordmasculine"), (241, 889.0, "ae"), (245, 278.0, "dotlessi"), (248, 278.0, "lslash"), (249, 611.0, "oslash"), (250, 944.0, "oe"), (251, 611.0, "germandbls"), (-1, 278.0, "Idieresis"), (-1, 556.0, "eacute"), (-1, 556.0, "abreve"), (-1, 611.0, "uhungarumlaut"), (-1, 556.0, "ecaron"), (-1, 667.0, "Ydieresis"), (-1, 584.0, "divide"), (-1, 667.0, "Yacute"), (-1, 722.0, "Acircumflex"), (-1, 556.0, "aacute"), (-1, 722.0, "Ucircumflex"), (-1, 556.0, "yacute"), (-1, 556.0, "scommaaccent"), (-1, 556.0, "ecircumflex"), (-1, 722.0, "Uring"), (-1, 722.0, "Udieresis"), (-1, 556.0, "aogonek"), (-1, 722.0, "Uacute"), (-1, 611.0, "uogonek"), (-1, 667.0, "Edieresis"), (-1, 722.0, "Dcroat"), (-1, 250.0, "commaaccent"), (-1, 737.0, "copyright"), (-1, 667.0, "Emacron"), (-1, 556.0, "ccaron"), (-1, 556.0, "aring"), (-1, 722.0, "Ncommaaccent"), (-1, 278.0, "lacute"), (-1, 556.0, "agrave"), (-1, 611.0, "Tcommaaccent"), (-1, 722.0, "Cacute"), (-1, 556.0, "atilde"), (-1, 667.0, "Edotaccent"), (-1, 556.0, "scaron"), (-1, 556.0, "scedilla"), (-1, 278.0, "iacute"), (-1, 494.0, "lozenge"), (-1, 722.0, "Rcaron"), (-1, 778.0, "Gcommaaccent"), (-1, 611.0, "ucircumflex"), (-1, 556.0, "acircumflex"), (-1, 722.0, "Amacron"), (-1, 389.0, "rcaron"), (-1, 556.0, "ccedilla"), (-1, 611.0, "Zdotaccent"), (-1, 667.0, "Thorn"), (-1, 778.0, "Omacron"), (-1, 722.0, "Racute"), (-1, 667.0, "Sacute"), (-1, 743.0, "dcaron"), (-1, 722.0, "Umacron"), (-1, 611.0, "uring"), (-1, 333.0, "threesuperior"), (-1, 778.0, "Ograve"), (-1, 722.0, "Agrave"), (-1, 722.0, "Abreve"), (-1, 584.0, "multiply"), (-1, 611.0, "uacute"), (-1, 611.0, "Tcaron"), (-1, 494.0, "partialdiff"), (-1, 556.0, "ydieresis"), (-1, 722.0, "Nacute"), (-1, 278.0, "icircumflex"), (-1, 667.0, "Ecircumflex"), (-1, 556.0, "adieresis"), (-1, 556.0, "edieresis"), (-1, 556.0, "cacute"), (-1, 611.0, "nacute"), (-1, 611.0, "umacron"), (-1, 722.0, "Ncaron"), (-1, 278.0, "Iacute"), (-1, 584.0, "plusminus"), (-1, 280.0, "brokenbar"), (-1, 737.0, "registered"), (-1, 778.0, "Gbreve"), (-1, 278.0, "Idotaccent"), (-1, 600.0, "summation"), (-1, 667.0, "Egrave"), (-1, 389.0, "racute"), (-1, 611.0, "omacron"), (-1, 611.0, "Zacute"), (-1, 611.0, "Zcaron"), (-1, 549.0, "greaterequal"), (-1, 722.0, "Eth"), (-1, 722.0, "Ccedilla"), (-1, 278.0, "lcommaaccent"), (-1, 389.0, "tcaron"), (-1, 556.0, "eogonek"), (-1, 722.0, "Uogonek"), (-1, 722.0, "Aacute"), (-1, 722.0, "Adieresis"), (-1, 556.0, "egrave"), (-1, 500.0, "zacute"), (-1, 278.0, "iogonek"), (-1, 778.0, "Oacute"), (-1, 611.0, "oacute"), (-1, 556.0, "amacron"), (-1, 556.0, "sacute"), (-1, 278.0, "idieresis"), (-1, 778.0, "Ocircumflex"), (-1, 722.0, "Ugrave"), (-1, 612.0, "Delta"), (-1, 611.0, "thorn"), (-1, 333.0, "twosuperior"), (-1, 778.0, "Odieresis"), (-1, 611.0, "mu"), (-1, 278.0, "igrave"), (-1, 611.0, "ohungarumlaut"), (-1, 667.0, "Eogonek"), (-1, 611.0, "dcroat"), (-1, 834.0, "threequarters"), (-1, 667.0, "Scedilla"), (-1, 400.0, "lcaron"), (-1, 722.0, "Kcommaaccent"), (-1, 611.0, "Lacute"), (-1, 1000.0, "trademark"), (-1, 556.0, "edotaccent"), (-1, 278.0, "Igrave"), (-1, 278.0, "Imacron"), (-1, 611.0, "Lcaron"), (-1, 834.0, "onehalf"), (-1, 549.0, "lessequal"), (-1, 611.0, "ocircumflex"), (-1, 611.0, "ntilde"), (-1, 722.0, "Uhungarumlaut"), (-1, 667.0, "Eacute"), (-1, 556.0, "emacron"), (-1, 611.0, "gbreve"), (-1, 834.0, "onequarter"), (-1, 667.0, "Scaron"), (-1, 667.0, "Scommaaccent"), (-1, 778.0, "Ohungarumlaut"), (-1, 400.0, "degree"), (-1, 611.0, "ograve"), (-1, 722.0, "Ccaron"), (-1, 611.0, "ugrave"), (-1, 549.0, "radical"), (-1, 722.0, "Dcaron"), (-1, 389.0, "rcommaaccent"), (-1, 722.0, "Ntilde"), (-1, 611.0, "otilde"), (-1, 722.0, "Rcommaaccent"), (-1, 611.0, "Lcommaaccent"), (-1, 722.0, "Atilde"), (-1, 722.0, "Aogonek"), (-1, 722.0, "Aring"), (-1, 778.0, "Otilde"), (-1, 500.0, "zdotaccent"), (-1, 667.0, "Ecaron"), (-1, 278.0, "Iogonek"), (-1, 556.0, "kcommaaccent"), (-1, 584.0, "minus"), (-1, 278.0, "Icircumflex"), (-1, 611.0, "ncaron"), (-1, 333.0, "tcommaaccent"), (-1, 584.0, "logicalnot"), (-1, 611.0, "odieresis"), (-1, 611.0, "udieresis"), (-1, 549.0, "notequal"), (-1, 611.0, "gcommaaccent"), (-1, 611.0, "eth"), (-1, 500.0, "zcaron"), (-1, 611.0, "ncommaaccent"), (-1, 333.0, "onesuperior"), (-1, 278.0, "imacron"), (-1, 556.0, "Euro")][..]), +("Helvetica-BoldOblique", "AdobeStandardEncoding", &[(32, 278.0, "space"), (33, 333.0, "exclam"), (34, 474.0, "quotedbl"), (35, 556.0, "numbersign"), (36, 556.0, "dollar"), (37, 889.0, "percent"), (38, 722.0, "ampersand"), (39, 278.0, "quoteright"), (40, 333.0, "parenleft"), (41, 333.0, "parenright"), (42, 389.0, "asterisk"), (43, 584.0, "plus"), (44, 278.0, "comma"), (45, 333.0, "hyphen"), (46, 278.0, "period"), (47, 278.0, "slash"), (48, 556.0, "zero"), (49, 556.0, "one"), (50, 556.0, "two"), (51, 556.0, "three"), (52, 556.0, "four"), (53, 556.0, "five"), (54, 556.0, "six"), (55, 556.0, "seven"), (56, 556.0, "eight"), (57, 556.0, "nine"), (58, 333.0, "colon"), (59, 333.0, "semicolon"), (60, 584.0, "less"), (61, 584.0, "equal"), (62, 584.0, "greater"), (63, 611.0, "question"), (64, 975.0, "at"), (65, 722.0, "A"), (66, 722.0, "B"), (67, 722.0, "C"), (68, 722.0, "D"), (69, 667.0, "E"), (70, 611.0, "F"), (71, 778.0, "G"), (72, 722.0, "H"), (73, 278.0, "I"), (74, 556.0, "J"), (75, 722.0, "K"), (76, 611.0, "L"), (77, 833.0, "M"), (78, 722.0, "N"), (79, 778.0, "O"), (80, 667.0, "P"), (81, 778.0, "Q"), (82, 722.0, "R"), (83, 667.0, "S"), (84, 611.0, "T"), (85, 722.0, "U"), (86, 667.0, "V"), (87, 944.0, "W"), (88, 667.0, "X"), (89, 667.0, "Y"), (90, 611.0, "Z"), (91, 333.0, "bracketleft"), (92, 278.0, "backslash"), (93, 333.0, "bracketright"), (94, 584.0, "asciicircum"), (95, 556.0, "underscore"), (96, 278.0, "quoteleft"), (97, 556.0, "a"), (98, 611.0, "b"), (99, 556.0, "c"), (100, 611.0, "d"), (101, 556.0, "e"), (102, 333.0, "f"), (103, 611.0, "g"), (104, 611.0, "h"), (105, 278.0, "i"), (106, 278.0, "j"), (107, 556.0, "k"), (108, 278.0, "l"), (109, 889.0, "m"), (110, 611.0, "n"), (111, 611.0, "o"), (112, 611.0, "p"), (113, 611.0, "q"), (114, 389.0, "r"), (115, 556.0, "s"), (116, 333.0, "t"), (117, 611.0, "u"), (118, 556.0, "v"), (119, 778.0, "w"), (120, 556.0, "x"), (121, 556.0, "y"), (122, 500.0, "z"), (123, 389.0, "braceleft"), (124, 280.0, "bar"), (125, 389.0, "braceright"), (126, 584.0, "asciitilde"), (161, 333.0, "exclamdown"), (162, 556.0, "cent"), (163, 556.0, "sterling"), (164, 167.0, "fraction"), (165, 556.0, "yen"), (166, 556.0, "florin"), (167, 556.0, "section"), (168, 556.0, "currency"), (169, 238.0, "quotesingle"), (170, 500.0, "quotedblleft"), (171, 556.0, "guillemotleft"), (172, 333.0, "guilsinglleft"), (173, 333.0, "guilsinglright"), (174, 611.0, "fi"), (175, 611.0, "fl"), (177, 556.0, "endash"), (178, 556.0, "dagger"), (179, 556.0, "daggerdbl"), (180, 278.0, "periodcentered"), (182, 556.0, "paragraph"), (183, 350.0, "bullet"), (184, 278.0, "quotesinglbase"), (185, 500.0, "quotedblbase"), (186, 500.0, "quotedblright"), (187, 556.0, "guillemotright"), (188, 1000.0, "ellipsis"), (189, 1000.0, "perthousand"), (191, 611.0, "questiondown"), (193, 333.0, "grave"), (194, 333.0, "acute"), (195, 333.0, "circumflex"), (196, 333.0, "tilde"), (197, 333.0, "macron"), (198, 333.0, "breve"), (199, 333.0, "dotaccent"), (200, 333.0, "dieresis"), (202, 333.0, "ring"), (203, 333.0, "cedilla"), (205, 333.0, "hungarumlaut"), (206, 333.0, "ogonek"), (207, 333.0, "caron"), (208, 1000.0, "emdash"), (225, 1000.0, "AE"), (227, 370.0, "ordfeminine"), (232, 611.0, "Lslash"), (233, 778.0, "Oslash"), (234, 1000.0, "OE"), (235, 365.0, "ordmasculine"), (241, 889.0, "ae"), (245, 278.0, "dotlessi"), (248, 278.0, "lslash"), (249, 611.0, "oslash"), (250, 944.0, "oe"), (251, 611.0, "germandbls"), (-1, 278.0, "Idieresis"), (-1, 556.0, "eacute"), (-1, 556.0, "abreve"), (-1, 611.0, "uhungarumlaut"), (-1, 556.0, "ecaron"), (-1, 667.0, "Ydieresis"), (-1, 584.0, "divide"), (-1, 667.0, "Yacute"), (-1, 722.0, "Acircumflex"), (-1, 556.0, "aacute"), (-1, 722.0, "Ucircumflex"), (-1, 556.0, "yacute"), (-1, 556.0, "scommaaccent"), (-1, 556.0, "ecircumflex"), (-1, 722.0, "Uring"), (-1, 722.0, "Udieresis"), (-1, 556.0, "aogonek"), (-1, 722.0, "Uacute"), (-1, 611.0, "uogonek"), (-1, 667.0, "Edieresis"), (-1, 722.0, "Dcroat"), (-1, 250.0, "commaaccent"), (-1, 737.0, "copyright"), (-1, 667.0, "Emacron"), (-1, 556.0, "ccaron"), (-1, 556.0, "aring"), (-1, 722.0, "Ncommaaccent"), (-1, 278.0, "lacute"), (-1, 556.0, "agrave"), (-1, 611.0, "Tcommaaccent"), (-1, 722.0, "Cacute"), (-1, 556.0, "atilde"), (-1, 667.0, "Edotaccent"), (-1, 556.0, "scaron"), (-1, 556.0, "scedilla"), (-1, 278.0, "iacute"), (-1, 494.0, "lozenge"), (-1, 722.0, "Rcaron"), (-1, 778.0, "Gcommaaccent"), (-1, 611.0, "ucircumflex"), (-1, 556.0, "acircumflex"), (-1, 722.0, "Amacron"), (-1, 389.0, "rcaron"), (-1, 556.0, "ccedilla"), (-1, 611.0, "Zdotaccent"), (-1, 667.0, "Thorn"), (-1, 778.0, "Omacron"), (-1, 722.0, "Racute"), (-1, 667.0, "Sacute"), (-1, 743.0, "dcaron"), (-1, 722.0, "Umacron"), (-1, 611.0, "uring"), (-1, 333.0, "threesuperior"), (-1, 778.0, "Ograve"), (-1, 722.0, "Agrave"), (-1, 722.0, "Abreve"), (-1, 584.0, "multiply"), (-1, 611.0, "uacute"), (-1, 611.0, "Tcaron"), (-1, 494.0, "partialdiff"), (-1, 556.0, "ydieresis"), (-1, 722.0, "Nacute"), (-1, 278.0, "icircumflex"), (-1, 667.0, "Ecircumflex"), (-1, 556.0, "adieresis"), (-1, 556.0, "edieresis"), (-1, 556.0, "cacute"), (-1, 611.0, "nacute"), (-1, 611.0, "umacron"), (-1, 722.0, "Ncaron"), (-1, 278.0, "Iacute"), (-1, 584.0, "plusminus"), (-1, 280.0, "brokenbar"), (-1, 737.0, "registered"), (-1, 778.0, "Gbreve"), (-1, 278.0, "Idotaccent"), (-1, 600.0, "summation"), (-1, 667.0, "Egrave"), (-1, 389.0, "racute"), (-1, 611.0, "omacron"), (-1, 611.0, "Zacute"), (-1, 611.0, "Zcaron"), (-1, 549.0, "greaterequal"), (-1, 722.0, "Eth"), (-1, 722.0, "Ccedilla"), (-1, 278.0, "lcommaaccent"), (-1, 389.0, "tcaron"), (-1, 556.0, "eogonek"), (-1, 722.0, "Uogonek"), (-1, 722.0, "Aacute"), (-1, 722.0, "Adieresis"), (-1, 556.0, "egrave"), (-1, 500.0, "zacute"), (-1, 278.0, "iogonek"), (-1, 778.0, "Oacute"), (-1, 611.0, "oacute"), (-1, 556.0, "amacron"), (-1, 556.0, "sacute"), (-1, 278.0, "idieresis"), (-1, 778.0, "Ocircumflex"), (-1, 722.0, "Ugrave"), (-1, 612.0, "Delta"), (-1, 611.0, "thorn"), (-1, 333.0, "twosuperior"), (-1, 778.0, "Odieresis"), (-1, 611.0, "mu"), (-1, 278.0, "igrave"), (-1, 611.0, "ohungarumlaut"), (-1, 667.0, "Eogonek"), (-1, 611.0, "dcroat"), (-1, 834.0, "threequarters"), (-1, 667.0, "Scedilla"), (-1, 400.0, "lcaron"), (-1, 722.0, "Kcommaaccent"), (-1, 611.0, "Lacute"), (-1, 1000.0, "trademark"), (-1, 556.0, "edotaccent"), (-1, 278.0, "Igrave"), (-1, 278.0, "Imacron"), (-1, 611.0, "Lcaron"), (-1, 834.0, "onehalf"), (-1, 549.0, "lessequal"), (-1, 611.0, "ocircumflex"), (-1, 611.0, "ntilde"), (-1, 722.0, "Uhungarumlaut"), (-1, 667.0, "Eacute"), (-1, 556.0, "emacron"), (-1, 611.0, "gbreve"), (-1, 834.0, "onequarter"), (-1, 667.0, "Scaron"), (-1, 667.0, "Scommaaccent"), (-1, 778.0, "Ohungarumlaut"), (-1, 400.0, "degree"), (-1, 611.0, "ograve"), (-1, 722.0, "Ccaron"), (-1, 611.0, "ugrave"), (-1, 549.0, "radical"), (-1, 722.0, "Dcaron"), (-1, 389.0, "rcommaaccent"), (-1, 722.0, "Ntilde"), (-1, 611.0, "otilde"), (-1, 722.0, "Rcommaaccent"), (-1, 611.0, "Lcommaaccent"), (-1, 722.0, "Atilde"), (-1, 722.0, "Aogonek"), (-1, 722.0, "Aring"), (-1, 778.0, "Otilde"), (-1, 500.0, "zdotaccent"), (-1, 667.0, "Ecaron"), (-1, 278.0, "Iogonek"), (-1, 556.0, "kcommaaccent"), (-1, 584.0, "minus"), (-1, 278.0, "Icircumflex"), (-1, 611.0, "ncaron"), (-1, 333.0, "tcommaaccent"), (-1, 584.0, "logicalnot"), (-1, 611.0, "odieresis"), (-1, 611.0, "udieresis"), (-1, 549.0, "notequal"), (-1, 611.0, "gcommaaccent"), (-1, 611.0, "eth"), (-1, 500.0, "zcaron"), (-1, 611.0, "ncommaaccent"), (-1, 333.0, "onesuperior"), (-1, 278.0, "imacron"), (-1, 556.0, "Euro")][..]), +("Helvetica-Oblique", "AdobeStandardEncoding", &[(32, 278.0, "space"), (33, 278.0, "exclam"), (34, 355.0, "quotedbl"), (35, 556.0, "numbersign"), (36, 556.0, "dollar"), (37, 889.0, "percent"), (38, 667.0, "ampersand"), (39, 222.0, "quoteright"), (40, 333.0, "parenleft"), (41, 333.0, "parenright"), (42, 389.0, "asterisk"), (43, 584.0, "plus"), (44, 278.0, "comma"), (45, 333.0, "hyphen"), (46, 278.0, "period"), (47, 278.0, "slash"), (48, 556.0, "zero"), (49, 556.0, "one"), (50, 556.0, "two"), (51, 556.0, "three"), (52, 556.0, "four"), (53, 556.0, "five"), (54, 556.0, "six"), (55, 556.0, "seven"), (56, 556.0, "eight"), (57, 556.0, "nine"), (58, 278.0, "colon"), (59, 278.0, "semicolon"), (60, 584.0, "less"), (61, 584.0, "equal"), (62, 584.0, "greater"), (63, 556.0, "question"), (64, 1015.0, "at"), (65, 667.0, "A"), (66, 667.0, "B"), (67, 722.0, "C"), (68, 722.0, "D"), (69, 667.0, "E"), (70, 611.0, "F"), (71, 778.0, "G"), (72, 722.0, "H"), (73, 278.0, "I"), (74, 500.0, "J"), (75, 667.0, "K"), (76, 556.0, "L"), (77, 833.0, "M"), (78, 722.0, "N"), (79, 778.0, "O"), (80, 667.0, "P"), (81, 778.0, "Q"), (82, 722.0, "R"), (83, 667.0, "S"), (84, 611.0, "T"), (85, 722.0, "U"), (86, 667.0, "V"), (87, 944.0, "W"), (88, 667.0, "X"), (89, 667.0, "Y"), (90, 611.0, "Z"), (91, 278.0, "bracketleft"), (92, 278.0, "backslash"), (93, 278.0, "bracketright"), (94, 469.0, "asciicircum"), (95, 556.0, "underscore"), (96, 222.0, "quoteleft"), (97, 556.0, "a"), (98, 556.0, "b"), (99, 500.0, "c"), (100, 556.0, "d"), (101, 556.0, "e"), (102, 278.0, "f"), (103, 556.0, "g"), (104, 556.0, "h"), (105, 222.0, "i"), (106, 222.0, "j"), (107, 500.0, "k"), (108, 222.0, "l"), (109, 833.0, "m"), (110, 556.0, "n"), (111, 556.0, "o"), (112, 556.0, "p"), (113, 556.0, "q"), (114, 333.0, "r"), (115, 500.0, "s"), (116, 278.0, "t"), (117, 556.0, "u"), (118, 500.0, "v"), (119, 722.0, "w"), (120, 500.0, "x"), (121, 500.0, "y"), (122, 500.0, "z"), (123, 334.0, "braceleft"), (124, 260.0, "bar"), (125, 334.0, "braceright"), (126, 584.0, "asciitilde"), (161, 333.0, "exclamdown"), (162, 556.0, "cent"), (163, 556.0, "sterling"), (164, 167.0, "fraction"), (165, 556.0, "yen"), (166, 556.0, "florin"), (167, 556.0, "section"), (168, 556.0, "currency"), (169, 191.0, "quotesingle"), (170, 333.0, "quotedblleft"), (171, 556.0, "guillemotleft"), (172, 333.0, "guilsinglleft"), (173, 333.0, "guilsinglright"), (174, 500.0, "fi"), (175, 500.0, "fl"), (177, 556.0, "endash"), (178, 556.0, "dagger"), (179, 556.0, "daggerdbl"), (180, 278.0, "periodcentered"), (182, 537.0, "paragraph"), (183, 350.0, "bullet"), (184, 222.0, "quotesinglbase"), (185, 333.0, "quotedblbase"), (186, 333.0, "quotedblright"), (187, 556.0, "guillemotright"), (188, 1000.0, "ellipsis"), (189, 1000.0, "perthousand"), (191, 611.0, "questiondown"), (193, 333.0, "grave"), (194, 333.0, "acute"), (195, 333.0, "circumflex"), (196, 333.0, "tilde"), (197, 333.0, "macron"), (198, 333.0, "breve"), (199, 333.0, "dotaccent"), (200, 333.0, "dieresis"), (202, 333.0, "ring"), (203, 333.0, "cedilla"), (205, 333.0, "hungarumlaut"), (206, 333.0, "ogonek"), (207, 333.0, "caron"), (208, 1000.0, "emdash"), (225, 1000.0, "AE"), (227, 370.0, "ordfeminine"), (232, 556.0, "Lslash"), (233, 778.0, "Oslash"), (234, 1000.0, "OE"), (235, 365.0, "ordmasculine"), (241, 889.0, "ae"), (245, 278.0, "dotlessi"), (248, 222.0, "lslash"), (249, 611.0, "oslash"), (250, 944.0, "oe"), (251, 611.0, "germandbls"), (-1, 278.0, "Idieresis"), (-1, 556.0, "eacute"), (-1, 556.0, "abreve"), (-1, 556.0, "uhungarumlaut"), (-1, 556.0, "ecaron"), (-1, 667.0, "Ydieresis"), (-1, 584.0, "divide"), (-1, 667.0, "Yacute"), (-1, 667.0, "Acircumflex"), (-1, 556.0, "aacute"), (-1, 722.0, "Ucircumflex"), (-1, 500.0, "yacute"), (-1, 500.0, "scommaaccent"), (-1, 556.0, "ecircumflex"), (-1, 722.0, "Uring"), (-1, 722.0, "Udieresis"), (-1, 556.0, "aogonek"), (-1, 722.0, "Uacute"), (-1, 556.0, "uogonek"), (-1, 667.0, "Edieresis"), (-1, 722.0, "Dcroat"), (-1, 250.0, "commaaccent"), (-1, 737.0, "copyright"), (-1, 667.0, "Emacron"), (-1, 500.0, "ccaron"), (-1, 556.0, "aring"), (-1, 722.0, "Ncommaaccent"), (-1, 222.0, "lacute"), (-1, 556.0, "agrave"), (-1, 611.0, "Tcommaaccent"), (-1, 722.0, "Cacute"), (-1, 556.0, "atilde"), (-1, 667.0, "Edotaccent"), (-1, 500.0, "scaron"), (-1, 500.0, "scedilla"), (-1, 278.0, "iacute"), (-1, 471.0, "lozenge"), (-1, 722.0, "Rcaron"), (-1, 778.0, "Gcommaaccent"), (-1, 556.0, "ucircumflex"), (-1, 556.0, "acircumflex"), (-1, 667.0, "Amacron"), (-1, 333.0, "rcaron"), (-1, 500.0, "ccedilla"), (-1, 611.0, "Zdotaccent"), (-1, 667.0, "Thorn"), (-1, 778.0, "Omacron"), (-1, 722.0, "Racute"), (-1, 667.0, "Sacute"), (-1, 643.0, "dcaron"), (-1, 722.0, "Umacron"), (-1, 556.0, "uring"), (-1, 333.0, "threesuperior"), (-1, 778.0, "Ograve"), (-1, 667.0, "Agrave"), (-1, 667.0, "Abreve"), (-1, 584.0, "multiply"), (-1, 556.0, "uacute"), (-1, 611.0, "Tcaron"), (-1, 476.0, "partialdiff"), (-1, 500.0, "ydieresis"), (-1, 722.0, "Nacute"), (-1, 278.0, "icircumflex"), (-1, 667.0, "Ecircumflex"), (-1, 556.0, "adieresis"), (-1, 556.0, "edieresis"), (-1, 500.0, "cacute"), (-1, 556.0, "nacute"), (-1, 556.0, "umacron"), (-1, 722.0, "Ncaron"), (-1, 278.0, "Iacute"), (-1, 584.0, "plusminus"), (-1, 260.0, "brokenbar"), (-1, 737.0, "registered"), (-1, 778.0, "Gbreve"), (-1, 278.0, "Idotaccent"), (-1, 600.0, "summation"), (-1, 667.0, "Egrave"), (-1, 333.0, "racute"), (-1, 556.0, "omacron"), (-1, 611.0, "Zacute"), (-1, 611.0, "Zcaron"), (-1, 549.0, "greaterequal"), (-1, 722.0, "Eth"), (-1, 722.0, "Ccedilla"), (-1, 222.0, "lcommaaccent"), (-1, 317.0, "tcaron"), (-1, 556.0, "eogonek"), (-1, 722.0, "Uogonek"), (-1, 667.0, "Aacute"), (-1, 667.0, "Adieresis"), (-1, 556.0, "egrave"), (-1, 500.0, "zacute"), (-1, 222.0, "iogonek"), (-1, 778.0, "Oacute"), (-1, 556.0, "oacute"), (-1, 556.0, "amacron"), (-1, 500.0, "sacute"), (-1, 278.0, "idieresis"), (-1, 778.0, "Ocircumflex"), (-1, 722.0, "Ugrave"), (-1, 612.0, "Delta"), (-1, 556.0, "thorn"), (-1, 333.0, "twosuperior"), (-1, 778.0, "Odieresis"), (-1, 556.0, "mu"), (-1, 278.0, "igrave"), (-1, 556.0, "ohungarumlaut"), (-1, 667.0, "Eogonek"), (-1, 556.0, "dcroat"), (-1, 834.0, "threequarters"), (-1, 667.0, "Scedilla"), (-1, 299.0, "lcaron"), (-1, 667.0, "Kcommaaccent"), (-1, 556.0, "Lacute"), (-1, 1000.0, "trademark"), (-1, 556.0, "edotaccent"), (-1, 278.0, "Igrave"), (-1, 278.0, "Imacron"), (-1, 556.0, "Lcaron"), (-1, 834.0, "onehalf"), (-1, 549.0, "lessequal"), (-1, 556.0, "ocircumflex"), (-1, 556.0, "ntilde"), (-1, 722.0, "Uhungarumlaut"), (-1, 667.0, "Eacute"), (-1, 556.0, "emacron"), (-1, 556.0, "gbreve"), (-1, 834.0, "onequarter"), (-1, 667.0, "Scaron"), (-1, 667.0, "Scommaaccent"), (-1, 778.0, "Ohungarumlaut"), (-1, 400.0, "degree"), (-1, 556.0, "ograve"), (-1, 722.0, "Ccaron"), (-1, 556.0, "ugrave"), (-1, 453.0, "radical"), (-1, 722.0, "Dcaron"), (-1, 333.0, "rcommaaccent"), (-1, 722.0, "Ntilde"), (-1, 556.0, "otilde"), (-1, 722.0, "Rcommaaccent"), (-1, 556.0, "Lcommaaccent"), (-1, 667.0, "Atilde"), (-1, 667.0, "Aogonek"), (-1, 667.0, "Aring"), (-1, 778.0, "Otilde"), (-1, 500.0, "zdotaccent"), (-1, 667.0, "Ecaron"), (-1, 278.0, "Iogonek"), (-1, 500.0, "kcommaaccent"), (-1, 584.0, "minus"), (-1, 278.0, "Icircumflex"), (-1, 556.0, "ncaron"), (-1, 278.0, "tcommaaccent"), (-1, 584.0, "logicalnot"), (-1, 556.0, "odieresis"), (-1, 556.0, "udieresis"), (-1, 549.0, "notequal"), (-1, 556.0, "gcommaaccent"), (-1, 556.0, "eth"), (-1, 500.0, "zcaron"), (-1, 556.0, "ncommaaccent"), (-1, 333.0, "onesuperior"), (-1, 278.0, "imacron"), (-1, 556.0, "Euro")][..]), +("Helvetica", "AdobeStandardEncoding", &[(32, 278.0, "space"), (33, 278.0, "exclam"), (34, 355.0, "quotedbl"), (35, 556.0, "numbersign"), (36, 556.0, "dollar"), (37, 889.0, "percent"), (38, 667.0, "ampersand"), (39, 222.0, "quoteright"), (40, 333.0, "parenleft"), (41, 333.0, "parenright"), (42, 389.0, "asterisk"), (43, 584.0, "plus"), (44, 278.0, "comma"), (45, 333.0, "hyphen"), (46, 278.0, "period"), (47, 278.0, "slash"), (48, 556.0, "zero"), (49, 556.0, "one"), (50, 556.0, "two"), (51, 556.0, "three"), (52, 556.0, "four"), (53, 556.0, "five"), (54, 556.0, "six"), (55, 556.0, "seven"), (56, 556.0, "eight"), (57, 556.0, "nine"), (58, 278.0, "colon"), (59, 278.0, "semicolon"), (60, 584.0, "less"), (61, 584.0, "equal"), (62, 584.0, "greater"), (63, 556.0, "question"), (64, 1015.0, "at"), (65, 667.0, "A"), (66, 667.0, "B"), (67, 722.0, "C"), (68, 722.0, "D"), (69, 667.0, "E"), (70, 611.0, "F"), (71, 778.0, "G"), (72, 722.0, "H"), (73, 278.0, "I"), (74, 500.0, "J"), (75, 667.0, "K"), (76, 556.0, "L"), (77, 833.0, "M"), (78, 722.0, "N"), (79, 778.0, "O"), (80, 667.0, "P"), (81, 778.0, "Q"), (82, 722.0, "R"), (83, 667.0, "S"), (84, 611.0, "T"), (85, 722.0, "U"), (86, 667.0, "V"), (87, 944.0, "W"), (88, 667.0, "X"), (89, 667.0, "Y"), (90, 611.0, "Z"), (91, 278.0, "bracketleft"), (92, 278.0, "backslash"), (93, 278.0, "bracketright"), (94, 469.0, "asciicircum"), (95, 556.0, "underscore"), (96, 222.0, "quoteleft"), (97, 556.0, "a"), (98, 556.0, "b"), (99, 500.0, "c"), (100, 556.0, "d"), (101, 556.0, "e"), (102, 278.0, "f"), (103, 556.0, "g"), (104, 556.0, "h"), (105, 222.0, "i"), (106, 222.0, "j"), (107, 500.0, "k"), (108, 222.0, "l"), (109, 833.0, "m"), (110, 556.0, "n"), (111, 556.0, "o"), (112, 556.0, "p"), (113, 556.0, "q"), (114, 333.0, "r"), (115, 500.0, "s"), (116, 278.0, "t"), (117, 556.0, "u"), (118, 500.0, "v"), (119, 722.0, "w"), (120, 500.0, "x"), (121, 500.0, "y"), (122, 500.0, "z"), (123, 334.0, "braceleft"), (124, 260.0, "bar"), (125, 334.0, "braceright"), (126, 584.0, "asciitilde"), (161, 333.0, "exclamdown"), (162, 556.0, "cent"), (163, 556.0, "sterling"), (164, 167.0, "fraction"), (165, 556.0, "yen"), (166, 556.0, "florin"), (167, 556.0, "section"), (168, 556.0, "currency"), (169, 191.0, "quotesingle"), (170, 333.0, "quotedblleft"), (171, 556.0, "guillemotleft"), (172, 333.0, "guilsinglleft"), (173, 333.0, "guilsinglright"), (174, 500.0, "fi"), (175, 500.0, "fl"), (177, 556.0, "endash"), (178, 556.0, "dagger"), (179, 556.0, "daggerdbl"), (180, 278.0, "periodcentered"), (182, 537.0, "paragraph"), (183, 350.0, "bullet"), (184, 222.0, "quotesinglbase"), (185, 333.0, "quotedblbase"), (186, 333.0, "quotedblright"), (187, 556.0, "guillemotright"), (188, 1000.0, "ellipsis"), (189, 1000.0, "perthousand"), (191, 611.0, "questiondown"), (193, 333.0, "grave"), (194, 333.0, "acute"), (195, 333.0, "circumflex"), (196, 333.0, "tilde"), (197, 333.0, "macron"), (198, 333.0, "breve"), (199, 333.0, "dotaccent"), (200, 333.0, "dieresis"), (202, 333.0, "ring"), (203, 333.0, "cedilla"), (205, 333.0, "hungarumlaut"), (206, 333.0, "ogonek"), (207, 333.0, "caron"), (208, 1000.0, "emdash"), (225, 1000.0, "AE"), (227, 370.0, "ordfeminine"), (232, 556.0, "Lslash"), (233, 778.0, "Oslash"), (234, 1000.0, "OE"), (235, 365.0, "ordmasculine"), (241, 889.0, "ae"), (245, 278.0, "dotlessi"), (248, 222.0, "lslash"), (249, 611.0, "oslash"), (250, 944.0, "oe"), (251, 611.0, "germandbls"), (-1, 278.0, "Idieresis"), (-1, 556.0, "eacute"), (-1, 556.0, "abreve"), (-1, 556.0, "uhungarumlaut"), (-1, 556.0, "ecaron"), (-1, 667.0, "Ydieresis"), (-1, 584.0, "divide"), (-1, 667.0, "Yacute"), (-1, 667.0, "Acircumflex"), (-1, 556.0, "aacute"), (-1, 722.0, "Ucircumflex"), (-1, 500.0, "yacute"), (-1, 500.0, "scommaaccent"), (-1, 556.0, "ecircumflex"), (-1, 722.0, "Uring"), (-1, 722.0, "Udieresis"), (-1, 556.0, "aogonek"), (-1, 722.0, "Uacute"), (-1, 556.0, "uogonek"), (-1, 667.0, "Edieresis"), (-1, 722.0, "Dcroat"), (-1, 250.0, "commaaccent"), (-1, 737.0, "copyright"), (-1, 667.0, "Emacron"), (-1, 500.0, "ccaron"), (-1, 556.0, "aring"), (-1, 722.0, "Ncommaaccent"), (-1, 222.0, "lacute"), (-1, 556.0, "agrave"), (-1, 611.0, "Tcommaaccent"), (-1, 722.0, "Cacute"), (-1, 556.0, "atilde"), (-1, 667.0, "Edotaccent"), (-1, 500.0, "scaron"), (-1, 500.0, "scedilla"), (-1, 278.0, "iacute"), (-1, 471.0, "lozenge"), (-1, 722.0, "Rcaron"), (-1, 778.0, "Gcommaaccent"), (-1, 556.0, "ucircumflex"), (-1, 556.0, "acircumflex"), (-1, 667.0, "Amacron"), (-1, 333.0, "rcaron"), (-1, 500.0, "ccedilla"), (-1, 611.0, "Zdotaccent"), (-1, 667.0, "Thorn"), (-1, 778.0, "Omacron"), (-1, 722.0, "Racute"), (-1, 667.0, "Sacute"), (-1, 643.0, "dcaron"), (-1, 722.0, "Umacron"), (-1, 556.0, "uring"), (-1, 333.0, "threesuperior"), (-1, 778.0, "Ograve"), (-1, 667.0, "Agrave"), (-1, 667.0, "Abreve"), (-1, 584.0, "multiply"), (-1, 556.0, "uacute"), (-1, 611.0, "Tcaron"), (-1, 476.0, "partialdiff"), (-1, 500.0, "ydieresis"), (-1, 722.0, "Nacute"), (-1, 278.0, "icircumflex"), (-1, 667.0, "Ecircumflex"), (-1, 556.0, "adieresis"), (-1, 556.0, "edieresis"), (-1, 500.0, "cacute"), (-1, 556.0, "nacute"), (-1, 556.0, "umacron"), (-1, 722.0, "Ncaron"), (-1, 278.0, "Iacute"), (-1, 584.0, "plusminus"), (-1, 260.0, "brokenbar"), (-1, 737.0, "registered"), (-1, 778.0, "Gbreve"), (-1, 278.0, "Idotaccent"), (-1, 600.0, "summation"), (-1, 667.0, "Egrave"), (-1, 333.0, "racute"), (-1, 556.0, "omacron"), (-1, 611.0, "Zacute"), (-1, 611.0, "Zcaron"), (-1, 549.0, "greaterequal"), (-1, 722.0, "Eth"), (-1, 722.0, "Ccedilla"), (-1, 222.0, "lcommaaccent"), (-1, 317.0, "tcaron"), (-1, 556.0, "eogonek"), (-1, 722.0, "Uogonek"), (-1, 667.0, "Aacute"), (-1, 667.0, "Adieresis"), (-1, 556.0, "egrave"), (-1, 500.0, "zacute"), (-1, 222.0, "iogonek"), (-1, 778.0, "Oacute"), (-1, 556.0, "oacute"), (-1, 556.0, "amacron"), (-1, 500.0, "sacute"), (-1, 278.0, "idieresis"), (-1, 778.0, "Ocircumflex"), (-1, 722.0, "Ugrave"), (-1, 612.0, "Delta"), (-1, 556.0, "thorn"), (-1, 333.0, "twosuperior"), (-1, 778.0, "Odieresis"), (-1, 556.0, "mu"), (-1, 278.0, "igrave"), (-1, 556.0, "ohungarumlaut"), (-1, 667.0, "Eogonek"), (-1, 556.0, "dcroat"), (-1, 834.0, "threequarters"), (-1, 667.0, "Scedilla"), (-1, 299.0, "lcaron"), (-1, 667.0, "Kcommaaccent"), (-1, 556.0, "Lacute"), (-1, 1000.0, "trademark"), (-1, 556.0, "edotaccent"), (-1, 278.0, "Igrave"), (-1, 278.0, "Imacron"), (-1, 556.0, "Lcaron"), (-1, 834.0, "onehalf"), (-1, 549.0, "lessequal"), (-1, 556.0, "ocircumflex"), (-1, 556.0, "ntilde"), (-1, 722.0, "Uhungarumlaut"), (-1, 667.0, "Eacute"), (-1, 556.0, "emacron"), (-1, 556.0, "gbreve"), (-1, 834.0, "onequarter"), (-1, 667.0, "Scaron"), (-1, 667.0, "Scommaaccent"), (-1, 778.0, "Ohungarumlaut"), (-1, 400.0, "degree"), (-1, 556.0, "ograve"), (-1, 722.0, "Ccaron"), (-1, 556.0, "ugrave"), (-1, 453.0, "radical"), (-1, 722.0, "Dcaron"), (-1, 333.0, "rcommaaccent"), (-1, 722.0, "Ntilde"), (-1, 556.0, "otilde"), (-1, 722.0, "Rcommaaccent"), (-1, 556.0, "Lcommaaccent"), (-1, 667.0, "Atilde"), (-1, 667.0, "Aogonek"), (-1, 667.0, "Aring"), (-1, 778.0, "Otilde"), (-1, 500.0, "zdotaccent"), (-1, 667.0, "Ecaron"), (-1, 278.0, "Iogonek"), (-1, 500.0, "kcommaaccent"), (-1, 584.0, "minus"), (-1, 278.0, "Icircumflex"), (-1, 556.0, "ncaron"), (-1, 278.0, "tcommaaccent"), (-1, 584.0, "logicalnot"), (-1, 556.0, "odieresis"), (-1, 556.0, "udieresis"), (-1, 549.0, "notequal"), (-1, 556.0, "gcommaaccent"), (-1, 556.0, "eth"), (-1, 500.0, "zcaron"), (-1, 556.0, "ncommaaccent"), (-1, 333.0, "onesuperior"), (-1, 278.0, "imacron"), (-1, 556.0, "Euro")][..]), +("Symbol", "FontSpecific", &[(32, 250.0, "space"), (33, 333.0, "exclam"), (34, 713.0, "universal"), (35, 500.0, "numbersign"), (36, 549.0, "existential"), (37, 833.0, "percent"), (38, 778.0, "ampersand"), (39, 439.0, "suchthat"), (40, 333.0, "parenleft"), (41, 333.0, "parenright"), (42, 500.0, "asteriskmath"), (43, 549.0, "plus"), (44, 250.0, "comma"), (45, 549.0, "minus"), (46, 250.0, "period"), (47, 278.0, "slash"), (48, 500.0, "zero"), (49, 500.0, "one"), (50, 500.0, "two"), (51, 500.0, "three"), (52, 500.0, "four"), (53, 500.0, "five"), (54, 500.0, "six"), (55, 500.0, "seven"), (56, 500.0, "eight"), (57, 500.0, "nine"), (58, 278.0, "colon"), (59, 278.0, "semicolon"), (60, 549.0, "less"), (61, 549.0, "equal"), (62, 549.0, "greater"), (63, 444.0, "question"), (64, 549.0, "congruent"), (65, 722.0, "Alpha"), (66, 667.0, "Beta"), (67, 722.0, "Chi"), (68, 612.0, "Delta"), (69, 611.0, "Epsilon"), (70, 763.0, "Phi"), (71, 603.0, "Gamma"), (72, 722.0, "Eta"), (73, 333.0, "Iota"), (74, 631.0, "theta1"), (75, 722.0, "Kappa"), (76, 686.0, "Lambda"), (77, 889.0, "Mu"), (78, 722.0, "Nu"), (79, 722.0, "Omicron"), (80, 768.0, "Pi"), (81, 741.0, "Theta"), (82, 556.0, "Rho"), (83, 592.0, "Sigma"), (84, 611.0, "Tau"), (85, 690.0, "Upsilon"), (86, 439.0, "sigma1"), (87, 768.0, "Omega"), (88, 645.0, "Xi"), (89, 795.0, "Psi"), (90, 611.0, "Zeta"), (91, 333.0, "bracketleft"), (92, 863.0, "therefore"), (93, 333.0, "bracketright"), (94, 658.0, "perpendicular"), (95, 500.0, "underscore"), (96, 500.0, "radicalex"), (97, 631.0, "alpha"), (98, 549.0, "beta"), (99, 549.0, "chi"), (100, 494.0, "delta"), (101, 439.0, "epsilon"), (102, 521.0, "phi"), (103, 411.0, "gamma"), (104, 603.0, "eta"), (105, 329.0, "iota"), (106, 603.0, "phi1"), (107, 549.0, "kappa"), (108, 549.0, "lambda"), (109, 576.0, "mu"), (110, 521.0, "nu"), (111, 549.0, "omicron"), (112, 549.0, "pi"), (113, 521.0, "theta"), (114, 549.0, "rho"), (115, 603.0, "sigma"), (116, 439.0, "tau"), (117, 576.0, "upsilon"), (118, 713.0, "omega1"), (119, 686.0, "omega"), (120, 493.0, "xi"), (121, 686.0, "psi"), (122, 494.0, "zeta"), (123, 480.0, "braceleft"), (124, 200.0, "bar"), (125, 480.0, "braceright"), (126, 549.0, "similar"), (160, 750.0, "Euro"), (161, 620.0, "Upsilon1"), (162, 247.0, "minute"), (163, 549.0, "lessequal"), (164, 167.0, "fraction"), (165, 713.0, "infinity"), (166, 500.0, "florin"), (167, 753.0, "club"), (168, 753.0, "diamond"), (169, 753.0, "heart"), (170, 753.0, "spade"), (171, 1042.0, "arrowboth"), (172, 987.0, "arrowleft"), (173, 603.0, "arrowup"), (174, 987.0, "arrowright"), (175, 603.0, "arrowdown"), (176, 400.0, "degree"), (177, 549.0, "plusminus"), (178, 411.0, "second"), (179, 549.0, "greaterequal"), (180, 549.0, "multiply"), (181, 713.0, "proportional"), (182, 494.0, "partialdiff"), (183, 460.0, "bullet"), (184, 549.0, "divide"), (185, 549.0, "notequal"), (186, 549.0, "equivalence"), (187, 549.0, "approxequal"), (188, 1000.0, "ellipsis"), (189, 603.0, "arrowvertex"), (190, 1000.0, "arrowhorizex"), (191, 658.0, "carriagereturn"), (192, 823.0, "aleph"), (193, 686.0, "Ifraktur"), (194, 795.0, "Rfraktur"), (195, 987.0, "weierstrass"), (196, 768.0, "circlemultiply"), (197, 768.0, "circleplus"), (198, 823.0, "emptyset"), (199, 768.0, "intersection"), (200, 768.0, "union"), (201, 713.0, "propersuperset"), (202, 713.0, "reflexsuperset"), (203, 713.0, "notsubset"), (204, 713.0, "propersubset"), (205, 713.0, "reflexsubset"), (206, 713.0, "element"), (207, 713.0, "notelement"), (208, 768.0, "angle"), (209, 713.0, "gradient"), (210, 790.0, "registerserif"), (211, 790.0, "copyrightserif"), (212, 890.0, "trademarkserif"), (213, 823.0, "product"), (214, 549.0, "radical"), (215, 250.0, "dotmath"), (216, 713.0, "logicalnot"), (217, 603.0, "logicaland"), (218, 603.0, "logicalor"), (219, 1042.0, "arrowdblboth"), (220, 987.0, "arrowdblleft"), (221, 603.0, "arrowdblup"), (222, 987.0, "arrowdblright"), (223, 603.0, "arrowdbldown"), (224, 494.0, "lozenge"), (225, 329.0, "angleleft"), (226, 790.0, "registersans"), (227, 790.0, "copyrightsans"), (228, 786.0, "trademarksans"), (229, 713.0, "summation"), (230, 384.0, "parenlefttp"), (231, 384.0, "parenleftex"), (232, 384.0, "parenleftbt"), (233, 384.0, "bracketlefttp"), (234, 384.0, "bracketleftex"), (235, 384.0, "bracketleftbt"), (236, 494.0, "bracelefttp"), (237, 494.0, "braceleftmid"), (238, 494.0, "braceleftbt"), (239, 494.0, "braceex"), (241, 329.0, "angleright"), (242, 274.0, "integral"), (243, 686.0, "integraltp"), (244, 686.0, "integralex"), (245, 686.0, "integralbt"), (246, 384.0, "parenrighttp"), (247, 384.0, "parenrightex"), (248, 384.0, "parenrightbt"), (249, 384.0, "bracketrighttp"), (250, 384.0, "bracketrightex"), (251, 384.0, "bracketrightbt"), (252, 494.0, "bracerighttp"), (253, 494.0, "bracerightmid"), (254, 494.0, "bracerightbt"), (-1, 790.0, "apple")][..]), +("Times-Bold", "AdobeStandardEncoding", &[(32, 250.0, "space"), (33, 333.0, "exclam"), (34, 555.0, "quotedbl"), (35, 500.0, "numbersign"), (36, 500.0, "dollar"), (37, 1000.0, "percent"), (38, 833.0, "ampersand"), (39, 333.0, "quoteright"), (40, 333.0, "parenleft"), (41, 333.0, "parenright"), (42, 500.0, "asterisk"), (43, 570.0, "plus"), (44, 250.0, "comma"), (45, 333.0, "hyphen"), (46, 250.0, "period"), (47, 278.0, "slash"), (48, 500.0, "zero"), (49, 500.0, "one"), (50, 500.0, "two"), (51, 500.0, "three"), (52, 500.0, "four"), (53, 500.0, "five"), (54, 500.0, "six"), (55, 500.0, "seven"), (56, 500.0, "eight"), (57, 500.0, "nine"), (58, 333.0, "colon"), (59, 333.0, "semicolon"), (60, 570.0, "less"), (61, 570.0, "equal"), (62, 570.0, "greater"), (63, 500.0, "question"), (64, 930.0, "at"), (65, 722.0, "A"), (66, 667.0, "B"), (67, 722.0, "C"), (68, 722.0, "D"), (69, 667.0, "E"), (70, 611.0, "F"), (71, 778.0, "G"), (72, 778.0, "H"), (73, 389.0, "I"), (74, 500.0, "J"), (75, 778.0, "K"), (76, 667.0, "L"), (77, 944.0, "M"), (78, 722.0, "N"), (79, 778.0, "O"), (80, 611.0, "P"), (81, 778.0, "Q"), (82, 722.0, "R"), (83, 556.0, "S"), (84, 667.0, "T"), (85, 722.0, "U"), (86, 722.0, "V"), (87, 1000.0, "W"), (88, 722.0, "X"), (89, 722.0, "Y"), (90, 667.0, "Z"), (91, 333.0, "bracketleft"), (92, 278.0, "backslash"), (93, 333.0, "bracketright"), (94, 581.0, "asciicircum"), (95, 500.0, "underscore"), (96, 333.0, "quoteleft"), (97, 500.0, "a"), (98, 556.0, "b"), (99, 444.0, "c"), (100, 556.0, "d"), (101, 444.0, "e"), (102, 333.0, "f"), (103, 500.0, "g"), (104, 556.0, "h"), (105, 278.0, "i"), (106, 333.0, "j"), (107, 556.0, "k"), (108, 278.0, "l"), (109, 833.0, "m"), (110, 556.0, "n"), (111, 500.0, "o"), (112, 556.0, "p"), (113, 556.0, "q"), (114, 444.0, "r"), (115, 389.0, "s"), (116, 333.0, "t"), (117, 556.0, "u"), (118, 500.0, "v"), (119, 722.0, "w"), (120, 500.0, "x"), (121, 500.0, "y"), (122, 444.0, "z"), (123, 394.0, "braceleft"), (124, 220.0, "bar"), (125, 394.0, "braceright"), (126, 520.0, "asciitilde"), (161, 333.0, "exclamdown"), (162, 500.0, "cent"), (163, 500.0, "sterling"), (164, 167.0, "fraction"), (165, 500.0, "yen"), (166, 500.0, "florin"), (167, 500.0, "section"), (168, 500.0, "currency"), (169, 278.0, "quotesingle"), (170, 500.0, "quotedblleft"), (171, 500.0, "guillemotleft"), (172, 333.0, "guilsinglleft"), (173, 333.0, "guilsinglright"), (174, 556.0, "fi"), (175, 556.0, "fl"), (177, 500.0, "endash"), (178, 500.0, "dagger"), (179, 500.0, "daggerdbl"), (180, 250.0, "periodcentered"), (182, 540.0, "paragraph"), (183, 350.0, "bullet"), (184, 333.0, "quotesinglbase"), (185, 500.0, "quotedblbase"), (186, 500.0, "quotedblright"), (187, 500.0, "guillemotright"), (188, 1000.0, "ellipsis"), (189, 1000.0, "perthousand"), (191, 500.0, "questiondown"), (193, 333.0, "grave"), (194, 333.0, "acute"), (195, 333.0, "circumflex"), (196, 333.0, "tilde"), (197, 333.0, "macron"), (198, 333.0, "breve"), (199, 333.0, "dotaccent"), (200, 333.0, "dieresis"), (202, 333.0, "ring"), (203, 333.0, "cedilla"), (205, 333.0, "hungarumlaut"), (206, 333.0, "ogonek"), (207, 333.0, "caron"), (208, 1000.0, "emdash"), (225, 1000.0, "AE"), (227, 300.0, "ordfeminine"), (232, 667.0, "Lslash"), (233, 778.0, "Oslash"), (234, 1000.0, "OE"), (235, 330.0, "ordmasculine"), (241, 722.0, "ae"), (245, 278.0, "dotlessi"), (248, 278.0, "lslash"), (249, 500.0, "oslash"), (250, 722.0, "oe"), (251, 556.0, "germandbls"), (-1, 389.0, "Idieresis"), (-1, 444.0, "eacute"), (-1, 500.0, "abreve"), (-1, 556.0, "uhungarumlaut"), (-1, 444.0, "ecaron"), (-1, 722.0, "Ydieresis"), (-1, 570.0, "divide"), (-1, 722.0, "Yacute"), (-1, 722.0, "Acircumflex"), (-1, 500.0, "aacute"), (-1, 722.0, "Ucircumflex"), (-1, 500.0, "yacute"), (-1, 389.0, "scommaaccent"), (-1, 444.0, "ecircumflex"), (-1, 722.0, "Uring"), (-1, 722.0, "Udieresis"), (-1, 500.0, "aogonek"), (-1, 722.0, "Uacute"), (-1, 556.0, "uogonek"), (-1, 667.0, "Edieresis"), (-1, 722.0, "Dcroat"), (-1, 250.0, "commaaccent"), (-1, 747.0, "copyright"), (-1, 667.0, "Emacron"), (-1, 444.0, "ccaron"), (-1, 500.0, "aring"), (-1, 722.0, "Ncommaaccent"), (-1, 278.0, "lacute"), (-1, 500.0, "agrave"), (-1, 667.0, "Tcommaaccent"), (-1, 722.0, "Cacute"), (-1, 500.0, "atilde"), (-1, 667.0, "Edotaccent"), (-1, 389.0, "scaron"), (-1, 389.0, "scedilla"), (-1, 278.0, "iacute"), (-1, 494.0, "lozenge"), (-1, 722.0, "Rcaron"), (-1, 778.0, "Gcommaaccent"), (-1, 556.0, "ucircumflex"), (-1, 500.0, "acircumflex"), (-1, 722.0, "Amacron"), (-1, 444.0, "rcaron"), (-1, 444.0, "ccedilla"), (-1, 667.0, "Zdotaccent"), (-1, 611.0, "Thorn"), (-1, 778.0, "Omacron"), (-1, 722.0, "Racute"), (-1, 556.0, "Sacute"), (-1, 672.0, "dcaron"), (-1, 722.0, "Umacron"), (-1, 556.0, "uring"), (-1, 300.0, "threesuperior"), (-1, 778.0, "Ograve"), (-1, 722.0, "Agrave"), (-1, 722.0, "Abreve"), (-1, 570.0, "multiply"), (-1, 556.0, "uacute"), (-1, 667.0, "Tcaron"), (-1, 494.0, "partialdiff"), (-1, 500.0, "ydieresis"), (-1, 722.0, "Nacute"), (-1, 278.0, "icircumflex"), (-1, 667.0, "Ecircumflex"), (-1, 500.0, "adieresis"), (-1, 444.0, "edieresis"), (-1, 444.0, "cacute"), (-1, 556.0, "nacute"), (-1, 556.0, "umacron"), (-1, 722.0, "Ncaron"), (-1, 389.0, "Iacute"), (-1, 570.0, "plusminus"), (-1, 220.0, "brokenbar"), (-1, 747.0, "registered"), (-1, 778.0, "Gbreve"), (-1, 389.0, "Idotaccent"), (-1, 600.0, "summation"), (-1, 667.0, "Egrave"), (-1, 444.0, "racute"), (-1, 500.0, "omacron"), (-1, 667.0, "Zacute"), (-1, 667.0, "Zcaron"), (-1, 549.0, "greaterequal"), (-1, 722.0, "Eth"), (-1, 722.0, "Ccedilla"), (-1, 278.0, "lcommaaccent"), (-1, 416.0, "tcaron"), (-1, 444.0, "eogonek"), (-1, 722.0, "Uogonek"), (-1, 722.0, "Aacute"), (-1, 722.0, "Adieresis"), (-1, 444.0, "egrave"), (-1, 444.0, "zacute"), (-1, 278.0, "iogonek"), (-1, 778.0, "Oacute"), (-1, 500.0, "oacute"), (-1, 500.0, "amacron"), (-1, 389.0, "sacute"), (-1, 278.0, "idieresis"), (-1, 778.0, "Ocircumflex"), (-1, 722.0, "Ugrave"), (-1, 612.0, "Delta"), (-1, 556.0, "thorn"), (-1, 300.0, "twosuperior"), (-1, 778.0, "Odieresis"), (-1, 556.0, "mu"), (-1, 278.0, "igrave"), (-1, 500.0, "ohungarumlaut"), (-1, 667.0, "Eogonek"), (-1, 556.0, "dcroat"), (-1, 750.0, "threequarters"), (-1, 556.0, "Scedilla"), (-1, 394.0, "lcaron"), (-1, 778.0, "Kcommaaccent"), (-1, 667.0, "Lacute"), (-1, 1000.0, "trademark"), (-1, 444.0, "edotaccent"), (-1, 389.0, "Igrave"), (-1, 389.0, "Imacron"), (-1, 667.0, "Lcaron"), (-1, 750.0, "onehalf"), (-1, 549.0, "lessequal"), (-1, 500.0, "ocircumflex"), (-1, 556.0, "ntilde"), (-1, 722.0, "Uhungarumlaut"), (-1, 667.0, "Eacute"), (-1, 444.0, "emacron"), (-1, 500.0, "gbreve"), (-1, 750.0, "onequarter"), (-1, 556.0, "Scaron"), (-1, 556.0, "Scommaaccent"), (-1, 778.0, "Ohungarumlaut"), (-1, 400.0, "degree"), (-1, 500.0, "ograve"), (-1, 722.0, "Ccaron"), (-1, 556.0, "ugrave"), (-1, 549.0, "radical"), (-1, 722.0, "Dcaron"), (-1, 444.0, "rcommaaccent"), (-1, 722.0, "Ntilde"), (-1, 500.0, "otilde"), (-1, 722.0, "Rcommaaccent"), (-1, 667.0, "Lcommaaccent"), (-1, 722.0, "Atilde"), (-1, 722.0, "Aogonek"), (-1, 722.0, "Aring"), (-1, 778.0, "Otilde"), (-1, 444.0, "zdotaccent"), (-1, 667.0, "Ecaron"), (-1, 389.0, "Iogonek"), (-1, 556.0, "kcommaaccent"), (-1, 570.0, "minus"), (-1, 389.0, "Icircumflex"), (-1, 556.0, "ncaron"), (-1, 333.0, "tcommaaccent"), (-1, 570.0, "logicalnot"), (-1, 500.0, "odieresis"), (-1, 556.0, "udieresis"), (-1, 549.0, "notequal"), (-1, 500.0, "gcommaaccent"), (-1, 500.0, "eth"), (-1, 444.0, "zcaron"), (-1, 556.0, "ncommaaccent"), (-1, 300.0, "onesuperior"), (-1, 278.0, "imacron"), (-1, 500.0, "Euro")][..]), +("Times-BoldItalic", "AdobeStandardEncoding", &[(32, 250.0, "space"), (33, 389.0, "exclam"), (34, 555.0, "quotedbl"), (35, 500.0, "numbersign"), (36, 500.0, "dollar"), (37, 833.0, "percent"), (38, 778.0, "ampersand"), (39, 333.0, "quoteright"), (40, 333.0, "parenleft"), (41, 333.0, "parenright"), (42, 500.0, "asterisk"), (43, 570.0, "plus"), (44, 250.0, "comma"), (45, 333.0, "hyphen"), (46, 250.0, "period"), (47, 278.0, "slash"), (48, 500.0, "zero"), (49, 500.0, "one"), (50, 500.0, "two"), (51, 500.0, "three"), (52, 500.0, "four"), (53, 500.0, "five"), (54, 500.0, "six"), (55, 500.0, "seven"), (56, 500.0, "eight"), (57, 500.0, "nine"), (58, 333.0, "colon"), (59, 333.0, "semicolon"), (60, 570.0, "less"), (61, 570.0, "equal"), (62, 570.0, "greater"), (63, 500.0, "question"), (64, 832.0, "at"), (65, 667.0, "A"), (66, 667.0, "B"), (67, 667.0, "C"), (68, 722.0, "D"), (69, 667.0, "E"), (70, 667.0, "F"), (71, 722.0, "G"), (72, 778.0, "H"), (73, 389.0, "I"), (74, 500.0, "J"), (75, 667.0, "K"), (76, 611.0, "L"), (77, 889.0, "M"), (78, 722.0, "N"), (79, 722.0, "O"), (80, 611.0, "P"), (81, 722.0, "Q"), (82, 667.0, "R"), (83, 556.0, "S"), (84, 611.0, "T"), (85, 722.0, "U"), (86, 667.0, "V"), (87, 889.0, "W"), (88, 667.0, "X"), (89, 611.0, "Y"), (90, 611.0, "Z"), (91, 333.0, "bracketleft"), (92, 278.0, "backslash"), (93, 333.0, "bracketright"), (94, 570.0, "asciicircum"), (95, 500.0, "underscore"), (96, 333.0, "quoteleft"), (97, 500.0, "a"), (98, 500.0, "b"), (99, 444.0, "c"), (100, 500.0, "d"), (101, 444.0, "e"), (102, 333.0, "f"), (103, 500.0, "g"), (104, 556.0, "h"), (105, 278.0, "i"), (106, 278.0, "j"), (107, 500.0, "k"), (108, 278.0, "l"), (109, 778.0, "m"), (110, 556.0, "n"), (111, 500.0, "o"), (112, 500.0, "p"), (113, 500.0, "q"), (114, 389.0, "r"), (115, 389.0, "s"), (116, 278.0, "t"), (117, 556.0, "u"), (118, 444.0, "v"), (119, 667.0, "w"), (120, 500.0, "x"), (121, 444.0, "y"), (122, 389.0, "z"), (123, 348.0, "braceleft"), (124, 220.0, "bar"), (125, 348.0, "braceright"), (126, 570.0, "asciitilde"), (161, 389.0, "exclamdown"), (162, 500.0, "cent"), (163, 500.0, "sterling"), (164, 167.0, "fraction"), (165, 500.0, "yen"), (166, 500.0, "florin"), (167, 500.0, "section"), (168, 500.0, "currency"), (169, 278.0, "quotesingle"), (170, 500.0, "quotedblleft"), (171, 500.0, "guillemotleft"), (172, 333.0, "guilsinglleft"), (173, 333.0, "guilsinglright"), (174, 556.0, "fi"), (175, 556.0, "fl"), (177, 500.0, "endash"), (178, 500.0, "dagger"), (179, 500.0, "daggerdbl"), (180, 250.0, "periodcentered"), (182, 500.0, "paragraph"), (183, 350.0, "bullet"), (184, 333.0, "quotesinglbase"), (185, 500.0, "quotedblbase"), (186, 500.0, "quotedblright"), (187, 500.0, "guillemotright"), (188, 1000.0, "ellipsis"), (189, 1000.0, "perthousand"), (191, 500.0, "questiondown"), (193, 333.0, "grave"), (194, 333.0, "acute"), (195, 333.0, "circumflex"), (196, 333.0, "tilde"), (197, 333.0, "macron"), (198, 333.0, "breve"), (199, 333.0, "dotaccent"), (200, 333.0, "dieresis"), (202, 333.0, "ring"), (203, 333.0, "cedilla"), (205, 333.0, "hungarumlaut"), (206, 333.0, "ogonek"), (207, 333.0, "caron"), (208, 1000.0, "emdash"), (225, 944.0, "AE"), (227, 266.0, "ordfeminine"), (232, 611.0, "Lslash"), (233, 722.0, "Oslash"), (234, 944.0, "OE"), (235, 300.0, "ordmasculine"), (241, 722.0, "ae"), (245, 278.0, "dotlessi"), (248, 278.0, "lslash"), (249, 500.0, "oslash"), (250, 722.0, "oe"), (251, 500.0, "germandbls"), (-1, 389.0, "Idieresis"), (-1, 444.0, "eacute"), (-1, 500.0, "abreve"), (-1, 556.0, "uhungarumlaut"), (-1, 444.0, "ecaron"), (-1, 611.0, "Ydieresis"), (-1, 570.0, "divide"), (-1, 611.0, "Yacute"), (-1, 667.0, "Acircumflex"), (-1, 500.0, "aacute"), (-1, 722.0, "Ucircumflex"), (-1, 444.0, "yacute"), (-1, 389.0, "scommaaccent"), (-1, 444.0, "ecircumflex"), (-1, 722.0, "Uring"), (-1, 722.0, "Udieresis"), (-1, 500.0, "aogonek"), (-1, 722.0, "Uacute"), (-1, 556.0, "uogonek"), (-1, 667.0, "Edieresis"), (-1, 722.0, "Dcroat"), (-1, 250.0, "commaaccent"), (-1, 747.0, "copyright"), (-1, 667.0, "Emacron"), (-1, 444.0, "ccaron"), (-1, 500.0, "aring"), (-1, 722.0, "Ncommaaccent"), (-1, 278.0, "lacute"), (-1, 500.0, "agrave"), (-1, 611.0, "Tcommaaccent"), (-1, 667.0, "Cacute"), (-1, 500.0, "atilde"), (-1, 667.0, "Edotaccent"), (-1, 389.0, "scaron"), (-1, 389.0, "scedilla"), (-1, 278.0, "iacute"), (-1, 494.0, "lozenge"), (-1, 667.0, "Rcaron"), (-1, 722.0, "Gcommaaccent"), (-1, 556.0, "ucircumflex"), (-1, 500.0, "acircumflex"), (-1, 667.0, "Amacron"), (-1, 389.0, "rcaron"), (-1, 444.0, "ccedilla"), (-1, 611.0, "Zdotaccent"), (-1, 611.0, "Thorn"), (-1, 722.0, "Omacron"), (-1, 667.0, "Racute"), (-1, 556.0, "Sacute"), (-1, 608.0, "dcaron"), (-1, 722.0, "Umacron"), (-1, 556.0, "uring"), (-1, 300.0, "threesuperior"), (-1, 722.0, "Ograve"), (-1, 667.0, "Agrave"), (-1, 667.0, "Abreve"), (-1, 570.0, "multiply"), (-1, 556.0, "uacute"), (-1, 611.0, "Tcaron"), (-1, 494.0, "partialdiff"), (-1, 444.0, "ydieresis"), (-1, 722.0, "Nacute"), (-1, 278.0, "icircumflex"), (-1, 667.0, "Ecircumflex"), (-1, 500.0, "adieresis"), (-1, 444.0, "edieresis"), (-1, 444.0, "cacute"), (-1, 556.0, "nacute"), (-1, 556.0, "umacron"), (-1, 722.0, "Ncaron"), (-1, 389.0, "Iacute"), (-1, 570.0, "plusminus"), (-1, 220.0, "brokenbar"), (-1, 747.0, "registered"), (-1, 722.0, "Gbreve"), (-1, 389.0, "Idotaccent"), (-1, 600.0, "summation"), (-1, 667.0, "Egrave"), (-1, 389.0, "racute"), (-1, 500.0, "omacron"), (-1, 611.0, "Zacute"), (-1, 611.0, "Zcaron"), (-1, 549.0, "greaterequal"), (-1, 722.0, "Eth"), (-1, 667.0, "Ccedilla"), (-1, 278.0, "lcommaaccent"), (-1, 366.0, "tcaron"), (-1, 444.0, "eogonek"), (-1, 722.0, "Uogonek"), (-1, 667.0, "Aacute"), (-1, 667.0, "Adieresis"), (-1, 444.0, "egrave"), (-1, 389.0, "zacute"), (-1, 278.0, "iogonek"), (-1, 722.0, "Oacute"), (-1, 500.0, "oacute"), (-1, 500.0, "amacron"), (-1, 389.0, "sacute"), (-1, 278.0, "idieresis"), (-1, 722.0, "Ocircumflex"), (-1, 722.0, "Ugrave"), (-1, 612.0, "Delta"), (-1, 500.0, "thorn"), (-1, 300.0, "twosuperior"), (-1, 722.0, "Odieresis"), (-1, 576.0, "mu"), (-1, 278.0, "igrave"), (-1, 500.0, "ohungarumlaut"), (-1, 667.0, "Eogonek"), (-1, 500.0, "dcroat"), (-1, 750.0, "threequarters"), (-1, 556.0, "Scedilla"), (-1, 382.0, "lcaron"), (-1, 667.0, "Kcommaaccent"), (-1, 611.0, "Lacute"), (-1, 1000.0, "trademark"), (-1, 444.0, "edotaccent"), (-1, 389.0, "Igrave"), (-1, 389.0, "Imacron"), (-1, 611.0, "Lcaron"), (-1, 750.0, "onehalf"), (-1, 549.0, "lessequal"), (-1, 500.0, "ocircumflex"), (-1, 556.0, "ntilde"), (-1, 722.0, "Uhungarumlaut"), (-1, 667.0, "Eacute"), (-1, 444.0, "emacron"), (-1, 500.0, "gbreve"), (-1, 750.0, "onequarter"), (-1, 556.0, "Scaron"), (-1, 556.0, "Scommaaccent"), (-1, 722.0, "Ohungarumlaut"), (-1, 400.0, "degree"), (-1, 500.0, "ograve"), (-1, 667.0, "Ccaron"), (-1, 556.0, "ugrave"), (-1, 549.0, "radical"), (-1, 722.0, "Dcaron"), (-1, 389.0, "rcommaaccent"), (-1, 722.0, "Ntilde"), (-1, 500.0, "otilde"), (-1, 667.0, "Rcommaaccent"), (-1, 611.0, "Lcommaaccent"), (-1, 667.0, "Atilde"), (-1, 667.0, "Aogonek"), (-1, 667.0, "Aring"), (-1, 722.0, "Otilde"), (-1, 389.0, "zdotaccent"), (-1, 667.0, "Ecaron"), (-1, 389.0, "Iogonek"), (-1, 500.0, "kcommaaccent"), (-1, 606.0, "minus"), (-1, 389.0, "Icircumflex"), (-1, 556.0, "ncaron"), (-1, 278.0, "tcommaaccent"), (-1, 606.0, "logicalnot"), (-1, 500.0, "odieresis"), (-1, 556.0, "udieresis"), (-1, 549.0, "notequal"), (-1, 500.0, "gcommaaccent"), (-1, 500.0, "eth"), (-1, 389.0, "zcaron"), (-1, 556.0, "ncommaaccent"), (-1, 300.0, "onesuperior"), (-1, 278.0, "imacron"), (-1, 500.0, "Euro")][..]), +("Times-Italic", "AdobeStandardEncoding", &[(32, 250.0, "space"), (33, 333.0, "exclam"), (34, 420.0, "quotedbl"), (35, 500.0, "numbersign"), (36, 500.0, "dollar"), (37, 833.0, "percent"), (38, 778.0, "ampersand"), (39, 333.0, "quoteright"), (40, 333.0, "parenleft"), (41, 333.0, "parenright"), (42, 500.0, "asterisk"), (43, 675.0, "plus"), (44, 250.0, "comma"), (45, 333.0, "hyphen"), (46, 250.0, "period"), (47, 278.0, "slash"), (48, 500.0, "zero"), (49, 500.0, "one"), (50, 500.0, "two"), (51, 500.0, "three"), (52, 500.0, "four"), (53, 500.0, "five"), (54, 500.0, "six"), (55, 500.0, "seven"), (56, 500.0, "eight"), (57, 500.0, "nine"), (58, 333.0, "colon"), (59, 333.0, "semicolon"), (60, 675.0, "less"), (61, 675.0, "equal"), (62, 675.0, "greater"), (63, 500.0, "question"), (64, 920.0, "at"), (65, 611.0, "A"), (66, 611.0, "B"), (67, 667.0, "C"), (68, 722.0, "D"), (69, 611.0, "E"), (70, 611.0, "F"), (71, 722.0, "G"), (72, 722.0, "H"), (73, 333.0, "I"), (74, 444.0, "J"), (75, 667.0, "K"), (76, 556.0, "L"), (77, 833.0, "M"), (78, 667.0, "N"), (79, 722.0, "O"), (80, 611.0, "P"), (81, 722.0, "Q"), (82, 611.0, "R"), (83, 500.0, "S"), (84, 556.0, "T"), (85, 722.0, "U"), (86, 611.0, "V"), (87, 833.0, "W"), (88, 611.0, "X"), (89, 556.0, "Y"), (90, 556.0, "Z"), (91, 389.0, "bracketleft"), (92, 278.0, "backslash"), (93, 389.0, "bracketright"), (94, 422.0, "asciicircum"), (95, 500.0, "underscore"), (96, 333.0, "quoteleft"), (97, 500.0, "a"), (98, 500.0, "b"), (99, 444.0, "c"), (100, 500.0, "d"), (101, 444.0, "e"), (102, 278.0, "f"), (103, 500.0, "g"), (104, 500.0, "h"), (105, 278.0, "i"), (106, 278.0, "j"), (107, 444.0, "k"), (108, 278.0, "l"), (109, 722.0, "m"), (110, 500.0, "n"), (111, 500.0, "o"), (112, 500.0, "p"), (113, 500.0, "q"), (114, 389.0, "r"), (115, 389.0, "s"), (116, 278.0, "t"), (117, 500.0, "u"), (118, 444.0, "v"), (119, 667.0, "w"), (120, 444.0, "x"), (121, 444.0, "y"), (122, 389.0, "z"), (123, 400.0, "braceleft"), (124, 275.0, "bar"), (125, 400.0, "braceright"), (126, 541.0, "asciitilde"), (161, 389.0, "exclamdown"), (162, 500.0, "cent"), (163, 500.0, "sterling"), (164, 167.0, "fraction"), (165, 500.0, "yen"), (166, 500.0, "florin"), (167, 500.0, "section"), (168, 500.0, "currency"), (169, 214.0, "quotesingle"), (170, 556.0, "quotedblleft"), (171, 500.0, "guillemotleft"), (172, 333.0, "guilsinglleft"), (173, 333.0, "guilsinglright"), (174, 500.0, "fi"), (175, 500.0, "fl"), (177, 500.0, "endash"), (178, 500.0, "dagger"), (179, 500.0, "daggerdbl"), (180, 250.0, "periodcentered"), (182, 523.0, "paragraph"), (183, 350.0, "bullet"), (184, 333.0, "quotesinglbase"), (185, 556.0, "quotedblbase"), (186, 556.0, "quotedblright"), (187, 500.0, "guillemotright"), (188, 889.0, "ellipsis"), (189, 1000.0, "perthousand"), (191, 500.0, "questiondown"), (193, 333.0, "grave"), (194, 333.0, "acute"), (195, 333.0, "circumflex"), (196, 333.0, "tilde"), (197, 333.0, "macron"), (198, 333.0, "breve"), (199, 333.0, "dotaccent"), (200, 333.0, "dieresis"), (202, 333.0, "ring"), (203, 333.0, "cedilla"), (205, 333.0, "hungarumlaut"), (206, 333.0, "ogonek"), (207, 333.0, "caron"), (208, 889.0, "emdash"), (225, 889.0, "AE"), (227, 276.0, "ordfeminine"), (232, 556.0, "Lslash"), (233, 722.0, "Oslash"), (234, 944.0, "OE"), (235, 310.0, "ordmasculine"), (241, 667.0, "ae"), (245, 278.0, "dotlessi"), (248, 278.0, "lslash"), (249, 500.0, "oslash"), (250, 667.0, "oe"), (251, 500.0, "germandbls"), (-1, 333.0, "Idieresis"), (-1, 444.0, "eacute"), (-1, 500.0, "abreve"), (-1, 500.0, "uhungarumlaut"), (-1, 444.0, "ecaron"), (-1, 556.0, "Ydieresis"), (-1, 675.0, "divide"), (-1, 556.0, "Yacute"), (-1, 611.0, "Acircumflex"), (-1, 500.0, "aacute"), (-1, 722.0, "Ucircumflex"), (-1, 444.0, "yacute"), (-1, 389.0, "scommaaccent"), (-1, 444.0, "ecircumflex"), (-1, 722.0, "Uring"), (-1, 722.0, "Udieresis"), (-1, 500.0, "aogonek"), (-1, 722.0, "Uacute"), (-1, 500.0, "uogonek"), (-1, 611.0, "Edieresis"), (-1, 722.0, "Dcroat"), (-1, 250.0, "commaaccent"), (-1, 760.0, "copyright"), (-1, 611.0, "Emacron"), (-1, 444.0, "ccaron"), (-1, 500.0, "aring"), (-1, 667.0, "Ncommaaccent"), (-1, 278.0, "lacute"), (-1, 500.0, "agrave"), (-1, 556.0, "Tcommaaccent"), (-1, 667.0, "Cacute"), (-1, 500.0, "atilde"), (-1, 611.0, "Edotaccent"), (-1, 389.0, "scaron"), (-1, 389.0, "scedilla"), (-1, 278.0, "iacute"), (-1, 471.0, "lozenge"), (-1, 611.0, "Rcaron"), (-1, 722.0, "Gcommaaccent"), (-1, 500.0, "ucircumflex"), (-1, 500.0, "acircumflex"), (-1, 611.0, "Amacron"), (-1, 389.0, "rcaron"), (-1, 444.0, "ccedilla"), (-1, 556.0, "Zdotaccent"), (-1, 611.0, "Thorn"), (-1, 722.0, "Omacron"), (-1, 611.0, "Racute"), (-1, 500.0, "Sacute"), (-1, 544.0, "dcaron"), (-1, 722.0, "Umacron"), (-1, 500.0, "uring"), (-1, 300.0, "threesuperior"), (-1, 722.0, "Ograve"), (-1, 611.0, "Agrave"), (-1, 611.0, "Abreve"), (-1, 675.0, "multiply"), (-1, 500.0, "uacute"), (-1, 556.0, "Tcaron"), (-1, 476.0, "partialdiff"), (-1, 444.0, "ydieresis"), (-1, 667.0, "Nacute"), (-1, 278.0, "icircumflex"), (-1, 611.0, "Ecircumflex"), (-1, 500.0, "adieresis"), (-1, 444.0, "edieresis"), (-1, 444.0, "cacute"), (-1, 500.0, "nacute"), (-1, 500.0, "umacron"), (-1, 667.0, "Ncaron"), (-1, 333.0, "Iacute"), (-1, 675.0, "plusminus"), (-1, 275.0, "brokenbar"), (-1, 760.0, "registered"), (-1, 722.0, "Gbreve"), (-1, 333.0, "Idotaccent"), (-1, 600.0, "summation"), (-1, 611.0, "Egrave"), (-1, 389.0, "racute"), (-1, 500.0, "omacron"), (-1, 556.0, "Zacute"), (-1, 556.0, "Zcaron"), (-1, 549.0, "greaterequal"), (-1, 722.0, "Eth"), (-1, 667.0, "Ccedilla"), (-1, 278.0, "lcommaaccent"), (-1, 300.0, "tcaron"), (-1, 444.0, "eogonek"), (-1, 722.0, "Uogonek"), (-1, 611.0, "Aacute"), (-1, 611.0, "Adieresis"), (-1, 444.0, "egrave"), (-1, 389.0, "zacute"), (-1, 278.0, "iogonek"), (-1, 722.0, "Oacute"), (-1, 500.0, "oacute"), (-1, 500.0, "amacron"), (-1, 389.0, "sacute"), (-1, 278.0, "idieresis"), (-1, 722.0, "Ocircumflex"), (-1, 722.0, "Ugrave"), (-1, 612.0, "Delta"), (-1, 500.0, "thorn"), (-1, 300.0, "twosuperior"), (-1, 722.0, "Odieresis"), (-1, 500.0, "mu"), (-1, 278.0, "igrave"), (-1, 500.0, "ohungarumlaut"), (-1, 611.0, "Eogonek"), (-1, 500.0, "dcroat"), (-1, 750.0, "threequarters"), (-1, 500.0, "Scedilla"), (-1, 300.0, "lcaron"), (-1, 667.0, "Kcommaaccent"), (-1, 556.0, "Lacute"), (-1, 980.0, "trademark"), (-1, 444.0, "edotaccent"), (-1, 333.0, "Igrave"), (-1, 333.0, "Imacron"), (-1, 611.0, "Lcaron"), (-1, 750.0, "onehalf"), (-1, 549.0, "lessequal"), (-1, 500.0, "ocircumflex"), (-1, 500.0, "ntilde"), (-1, 722.0, "Uhungarumlaut"), (-1, 611.0, "Eacute"), (-1, 444.0, "emacron"), (-1, 500.0, "gbreve"), (-1, 750.0, "onequarter"), (-1, 500.0, "Scaron"), (-1, 500.0, "Scommaaccent"), (-1, 722.0, "Ohungarumlaut"), (-1, 400.0, "degree"), (-1, 500.0, "ograve"), (-1, 667.0, "Ccaron"), (-1, 500.0, "ugrave"), (-1, 453.0, "radical"), (-1, 722.0, "Dcaron"), (-1, 389.0, "rcommaaccent"), (-1, 667.0, "Ntilde"), (-1, 500.0, "otilde"), (-1, 611.0, "Rcommaaccent"), (-1, 556.0, "Lcommaaccent"), (-1, 611.0, "Atilde"), (-1, 611.0, "Aogonek"), (-1, 611.0, "Aring"), (-1, 722.0, "Otilde"), (-1, 389.0, "zdotaccent"), (-1, 611.0, "Ecaron"), (-1, 333.0, "Iogonek"), (-1, 444.0, "kcommaaccent"), (-1, 675.0, "minus"), (-1, 333.0, "Icircumflex"), (-1, 500.0, "ncaron"), (-1, 278.0, "tcommaaccent"), (-1, 675.0, "logicalnot"), (-1, 500.0, "odieresis"), (-1, 500.0, "udieresis"), (-1, 549.0, "notequal"), (-1, 500.0, "gcommaaccent"), (-1, 500.0, "eth"), (-1, 389.0, "zcaron"), (-1, 500.0, "ncommaaccent"), (-1, 300.0, "onesuperior"), (-1, 278.0, "imacron"), (-1, 500.0, "Euro")][..]), +("Times-Roman", "AdobeStandardEncoding", &[(32, 250.0, "space"), (33, 333.0, "exclam"), (34, 408.0, "quotedbl"), (35, 500.0, "numbersign"), (36, 500.0, "dollar"), (37, 833.0, "percent"), (38, 778.0, "ampersand"), (39, 333.0, "quoteright"), (40, 333.0, "parenleft"), (41, 333.0, "parenright"), (42, 500.0, "asterisk"), (43, 564.0, "plus"), (44, 250.0, "comma"), (45, 333.0, "hyphen"), (46, 250.0, "period"), (47, 278.0, "slash"), (48, 500.0, "zero"), (49, 500.0, "one"), (50, 500.0, "two"), (51, 500.0, "three"), (52, 500.0, "four"), (53, 500.0, "five"), (54, 500.0, "six"), (55, 500.0, "seven"), (56, 500.0, "eight"), (57, 500.0, "nine"), (58, 278.0, "colon"), (59, 278.0, "semicolon"), (60, 564.0, "less"), (61, 564.0, "equal"), (62, 564.0, "greater"), (63, 444.0, "question"), (64, 921.0, "at"), (65, 722.0, "A"), (66, 667.0, "B"), (67, 667.0, "C"), (68, 722.0, "D"), (69, 611.0, "E"), (70, 556.0, "F"), (71, 722.0, "G"), (72, 722.0, "H"), (73, 333.0, "I"), (74, 389.0, "J"), (75, 722.0, "K"), (76, 611.0, "L"), (77, 889.0, "M"), (78, 722.0, "N"), (79, 722.0, "O"), (80, 556.0, "P"), (81, 722.0, "Q"), (82, 667.0, "R"), (83, 556.0, "S"), (84, 611.0, "T"), (85, 722.0, "U"), (86, 722.0, "V"), (87, 944.0, "W"), (88, 722.0, "X"), (89, 722.0, "Y"), (90, 611.0, "Z"), (91, 333.0, "bracketleft"), (92, 278.0, "backslash"), (93, 333.0, "bracketright"), (94, 469.0, "asciicircum"), (95, 500.0, "underscore"), (96, 333.0, "quoteleft"), (97, 444.0, "a"), (98, 500.0, "b"), (99, 444.0, "c"), (100, 500.0, "d"), (101, 444.0, "e"), (102, 333.0, "f"), (103, 500.0, "g"), (104, 500.0, "h"), (105, 278.0, "i"), (106, 278.0, "j"), (107, 500.0, "k"), (108, 278.0, "l"), (109, 778.0, "m"), (110, 500.0, "n"), (111, 500.0, "o"), (112, 500.0, "p"), (113, 500.0, "q"), (114, 333.0, "r"), (115, 389.0, "s"), (116, 278.0, "t"), (117, 500.0, "u"), (118, 500.0, "v"), (119, 722.0, "w"), (120, 500.0, "x"), (121, 500.0, "y"), (122, 444.0, "z"), (123, 480.0, "braceleft"), (124, 200.0, "bar"), (125, 480.0, "braceright"), (126, 541.0, "asciitilde"), (161, 333.0, "exclamdown"), (162, 500.0, "cent"), (163, 500.0, "sterling"), (164, 167.0, "fraction"), (165, 500.0, "yen"), (166, 500.0, "florin"), (167, 500.0, "section"), (168, 500.0, "currency"), (169, 180.0, "quotesingle"), (170, 444.0, "quotedblleft"), (171, 500.0, "guillemotleft"), (172, 333.0, "guilsinglleft"), (173, 333.0, "guilsinglright"), (174, 556.0, "fi"), (175, 556.0, "fl"), (177, 500.0, "endash"), (178, 500.0, "dagger"), (179, 500.0, "daggerdbl"), (180, 250.0, "periodcentered"), (182, 453.0, "paragraph"), (183, 350.0, "bullet"), (184, 333.0, "quotesinglbase"), (185, 444.0, "quotedblbase"), (186, 444.0, "quotedblright"), (187, 500.0, "guillemotright"), (188, 1000.0, "ellipsis"), (189, 1000.0, "perthousand"), (191, 444.0, "questiondown"), (193, 333.0, "grave"), (194, 333.0, "acute"), (195, 333.0, "circumflex"), (196, 333.0, "tilde"), (197, 333.0, "macron"), (198, 333.0, "breve"), (199, 333.0, "dotaccent"), (200, 333.0, "dieresis"), (202, 333.0, "ring"), (203, 333.0, "cedilla"), (205, 333.0, "hungarumlaut"), (206, 333.0, "ogonek"), (207, 333.0, "caron"), (208, 1000.0, "emdash"), (225, 889.0, "AE"), (227, 276.0, "ordfeminine"), (232, 611.0, "Lslash"), (233, 722.0, "Oslash"), (234, 889.0, "OE"), (235, 310.0, "ordmasculine"), (241, 667.0, "ae"), (245, 278.0, "dotlessi"), (248, 278.0, "lslash"), (249, 500.0, "oslash"), (250, 722.0, "oe"), (251, 500.0, "germandbls"), (-1, 333.0, "Idieresis"), (-1, 444.0, "eacute"), (-1, 444.0, "abreve"), (-1, 500.0, "uhungarumlaut"), (-1, 444.0, "ecaron"), (-1, 722.0, "Ydieresis"), (-1, 564.0, "divide"), (-1, 722.0, "Yacute"), (-1, 722.0, "Acircumflex"), (-1, 444.0, "aacute"), (-1, 722.0, "Ucircumflex"), (-1, 500.0, "yacute"), (-1, 389.0, "scommaaccent"), (-1, 444.0, "ecircumflex"), (-1, 722.0, "Uring"), (-1, 722.0, "Udieresis"), (-1, 444.0, "aogonek"), (-1, 722.0, "Uacute"), (-1, 500.0, "uogonek"), (-1, 611.0, "Edieresis"), (-1, 722.0, "Dcroat"), (-1, 250.0, "commaaccent"), (-1, 760.0, "copyright"), (-1, 611.0, "Emacron"), (-1, 444.0, "ccaron"), (-1, 444.0, "aring"), (-1, 722.0, "Ncommaaccent"), (-1, 278.0, "lacute"), (-1, 444.0, "agrave"), (-1, 611.0, "Tcommaaccent"), (-1, 667.0, "Cacute"), (-1, 444.0, "atilde"), (-1, 611.0, "Edotaccent"), (-1, 389.0, "scaron"), (-1, 389.0, "scedilla"), (-1, 278.0, "iacute"), (-1, 471.0, "lozenge"), (-1, 667.0, "Rcaron"), (-1, 722.0, "Gcommaaccent"), (-1, 500.0, "ucircumflex"), (-1, 444.0, "acircumflex"), (-1, 722.0, "Amacron"), (-1, 333.0, "rcaron"), (-1, 444.0, "ccedilla"), (-1, 611.0, "Zdotaccent"), (-1, 556.0, "Thorn"), (-1, 722.0, "Omacron"), (-1, 667.0, "Racute"), (-1, 556.0, "Sacute"), (-1, 588.0, "dcaron"), (-1, 722.0, "Umacron"), (-1, 500.0, "uring"), (-1, 300.0, "threesuperior"), (-1, 722.0, "Ograve"), (-1, 722.0, "Agrave"), (-1, 722.0, "Abreve"), (-1, 564.0, "multiply"), (-1, 500.0, "uacute"), (-1, 611.0, "Tcaron"), (-1, 476.0, "partialdiff"), (-1, 500.0, "ydieresis"), (-1, 722.0, "Nacute"), (-1, 278.0, "icircumflex"), (-1, 611.0, "Ecircumflex"), (-1, 444.0, "adieresis"), (-1, 444.0, "edieresis"), (-1, 444.0, "cacute"), (-1, 500.0, "nacute"), (-1, 500.0, "umacron"), (-1, 722.0, "Ncaron"), (-1, 333.0, "Iacute"), (-1, 564.0, "plusminus"), (-1, 200.0, "brokenbar"), (-1, 760.0, "registered"), (-1, 722.0, "Gbreve"), (-1, 333.0, "Idotaccent"), (-1, 600.0, "summation"), (-1, 611.0, "Egrave"), (-1, 333.0, "racute"), (-1, 500.0, "omacron"), (-1, 611.0, "Zacute"), (-1, 611.0, "Zcaron"), (-1, 549.0, "greaterequal"), (-1, 722.0, "Eth"), (-1, 667.0, "Ccedilla"), (-1, 278.0, "lcommaaccent"), (-1, 326.0, "tcaron"), (-1, 444.0, "eogonek"), (-1, 722.0, "Uogonek"), (-1, 722.0, "Aacute"), (-1, 722.0, "Adieresis"), (-1, 444.0, "egrave"), (-1, 444.0, "zacute"), (-1, 278.0, "iogonek"), (-1, 722.0, "Oacute"), (-1, 500.0, "oacute"), (-1, 444.0, "amacron"), (-1, 389.0, "sacute"), (-1, 278.0, "idieresis"), (-1, 722.0, "Ocircumflex"), (-1, 722.0, "Ugrave"), (-1, 612.0, "Delta"), (-1, 500.0, "thorn"), (-1, 300.0, "twosuperior"), (-1, 722.0, "Odieresis"), (-1, 500.0, "mu"), (-1, 278.0, "igrave"), (-1, 500.0, "ohungarumlaut"), (-1, 611.0, "Eogonek"), (-1, 500.0, "dcroat"), (-1, 750.0, "threequarters"), (-1, 556.0, "Scedilla"), (-1, 344.0, "lcaron"), (-1, 722.0, "Kcommaaccent"), (-1, 611.0, "Lacute"), (-1, 980.0, "trademark"), (-1, 444.0, "edotaccent"), (-1, 333.0, "Igrave"), (-1, 333.0, "Imacron"), (-1, 611.0, "Lcaron"), (-1, 750.0, "onehalf"), (-1, 549.0, "lessequal"), (-1, 500.0, "ocircumflex"), (-1, 500.0, "ntilde"), (-1, 722.0, "Uhungarumlaut"), (-1, 611.0, "Eacute"), (-1, 444.0, "emacron"), (-1, 500.0, "gbreve"), (-1, 750.0, "onequarter"), (-1, 556.0, "Scaron"), (-1, 556.0, "Scommaaccent"), (-1, 722.0, "Ohungarumlaut"), (-1, 400.0, "degree"), (-1, 500.0, "ograve"), (-1, 667.0, "Ccaron"), (-1, 500.0, "ugrave"), (-1, 453.0, "radical"), (-1, 722.0, "Dcaron"), (-1, 333.0, "rcommaaccent"), (-1, 722.0, "Ntilde"), (-1, 500.0, "otilde"), (-1, 667.0, "Rcommaaccent"), (-1, 611.0, "Lcommaaccent"), (-1, 722.0, "Atilde"), (-1, 722.0, "Aogonek"), (-1, 722.0, "Aring"), (-1, 722.0, "Otilde"), (-1, 444.0, "zdotaccent"), (-1, 611.0, "Ecaron"), (-1, 333.0, "Iogonek"), (-1, 500.0, "kcommaaccent"), (-1, 564.0, "minus"), (-1, 333.0, "Icircumflex"), (-1, 500.0, "ncaron"), (-1, 278.0, "tcommaaccent"), (-1, 564.0, "logicalnot"), (-1, 500.0, "odieresis"), (-1, 500.0, "udieresis"), (-1, 549.0, "notequal"), (-1, 500.0, "gcommaaccent"), (-1, 500.0, "eth"), (-1, 444.0, "zcaron"), (-1, 500.0, "ncommaaccent"), (-1, 300.0, "onesuperior"), (-1, 278.0, "imacron"), (-1, 500.0, "Euro")][..]), +("ZapfDingbats", "FontSpecific", &[(32, 278.0, "space"), (33, 974.0, "a1"), (34, 961.0, "a2"), (35, 974.0, "a202"), (36, 980.0, "a3"), (37, 719.0, "a4"), (38, 789.0, "a5"), (39, 790.0, "a119"), (40, 791.0, "a118"), (41, 690.0, "a117"), (42, 960.0, "a11"), (43, 939.0, "a12"), (44, 549.0, "a13"), (45, 855.0, "a14"), (46, 911.0, "a15"), (47, 933.0, "a16"), (48, 911.0, "a105"), (49, 945.0, "a17"), (50, 974.0, "a18"), (51, 755.0, "a19"), (52, 846.0, "a20"), (53, 762.0, "a21"), (54, 761.0, "a22"), (55, 571.0, "a23"), (56, 677.0, "a24"), (57, 763.0, "a25"), (58, 760.0, "a26"), (59, 759.0, "a27"), (60, 754.0, "a28"), (61, 494.0, "a6"), (62, 552.0, "a7"), (63, 537.0, "a8"), (64, 577.0, "a9"), (65, 692.0, "a10"), (66, 786.0, "a29"), (67, 788.0, "a30"), (68, 788.0, "a31"), (69, 790.0, "a32"), (70, 793.0, "a33"), (71, 794.0, "a34"), (72, 816.0, "a35"), (73, 823.0, "a36"), (74, 789.0, "a37"), (75, 841.0, "a38"), (76, 823.0, "a39"), (77, 833.0, "a40"), (78, 816.0, "a41"), (79, 831.0, "a42"), (80, 923.0, "a43"), (81, 744.0, "a44"), (82, 723.0, "a45"), (83, 749.0, "a46"), (84, 790.0, "a47"), (85, 792.0, "a48"), (86, 695.0, "a49"), (87, 776.0, "a50"), (88, 768.0, "a51"), (89, 792.0, "a52"), (90, 759.0, "a53"), (91, 707.0, "a54"), (92, 708.0, "a55"), (93, 682.0, "a56"), (94, 701.0, "a57"), (95, 826.0, "a58"), (96, 815.0, "a59"), (97, 789.0, "a60"), (98, 789.0, "a61"), (99, 707.0, "a62"), (100, 687.0, "a63"), (101, 696.0, "a64"), (102, 689.0, "a65"), (103, 786.0, "a66"), (104, 787.0, "a67"), (105, 713.0, "a68"), (106, 791.0, "a69"), (107, 785.0, "a70"), (108, 791.0, "a71"), (109, 873.0, "a72"), (110, 761.0, "a73"), (111, 762.0, "a74"), (112, 762.0, "a203"), (113, 759.0, "a75"), (114, 759.0, "a204"), (115, 892.0, "a76"), (116, 892.0, "a77"), (117, 788.0, "a78"), (118, 784.0, "a79"), (119, 438.0, "a81"), (120, 138.0, "a82"), (121, 277.0, "a83"), (122, 415.0, "a84"), (123, 392.0, "a97"), (124, 392.0, "a98"), (125, 668.0, "a99"), (126, 668.0, "a100"), (128, 390.0, "a89"), (129, 390.0, "a90"), (130, 317.0, "a93"), (131, 317.0, "a94"), (132, 276.0, "a91"), (133, 276.0, "a92"), (134, 509.0, "a205"), (135, 509.0, "a85"), (136, 410.0, "a206"), (137, 410.0, "a86"), (138, 234.0, "a87"), (139, 234.0, "a88"), (140, 334.0, "a95"), (141, 334.0, "a96"), (161, 732.0, "a101"), (162, 544.0, "a102"), (163, 544.0, "a103"), (164, 910.0, "a104"), (165, 667.0, "a106"), (166, 760.0, "a107"), (167, 760.0, "a108"), (168, 776.0, "a112"), (169, 595.0, "a111"), (170, 694.0, "a110"), (171, 626.0, "a109"), (172, 788.0, "a120"), (173, 788.0, "a121"), (174, 788.0, "a122"), (175, 788.0, "a123"), (176, 788.0, "a124"), (177, 788.0, "a125"), (178, 788.0, "a126"), (179, 788.0, "a127"), (180, 788.0, "a128"), (181, 788.0, "a129"), (182, 788.0, "a130"), (183, 788.0, "a131"), (184, 788.0, "a132"), (185, 788.0, "a133"), (186, 788.0, "a134"), (187, 788.0, "a135"), (188, 788.0, "a136"), (189, 788.0, "a137"), (190, 788.0, "a138"), (191, 788.0, "a139"), (192, 788.0, "a140"), (193, 788.0, "a141"), (194, 788.0, "a142"), (195, 788.0, "a143"), (196, 788.0, "a144"), (197, 788.0, "a145"), (198, 788.0, "a146"), (199, 788.0, "a147"), (200, 788.0, "a148"), (201, 788.0, "a149"), (202, 788.0, "a150"), (203, 788.0, "a151"), (204, 788.0, "a152"), (205, 788.0, "a153"), (206, 788.0, "a154"), (207, 788.0, "a155"), (208, 788.0, "a156"), (209, 788.0, "a157"), (210, 788.0, "a158"), (211, 788.0, "a159"), (212, 894.0, "a160"), (213, 838.0, "a161"), (214, 1016.0, "a163"), (215, 458.0, "a164"), (216, 748.0, "a196"), (217, 924.0, "a165"), (218, 748.0, "a192"), (219, 918.0, "a166"), (220, 927.0, "a167"), (221, 928.0, "a168"), (222, 928.0, "a169"), (223, 834.0, "a170"), (224, 873.0, "a171"), (225, 828.0, "a172"), (226, 924.0, "a173"), (227, 924.0, "a162"), (228, 917.0, "a174"), (229, 930.0, "a175"), (230, 931.0, "a176"), (231, 463.0, "a177"), (232, 883.0, "a178"), (233, 836.0, "a179"), (234, 836.0, "a193"), (235, 867.0, "a180"), (236, 867.0, "a199"), (237, 696.0, "a181"), (238, 696.0, "a200"), (239, 874.0, "a182"), (241, 874.0, "a201"), (242, 760.0, "a183"), (243, 946.0, "a184"), (244, 771.0, "a197"), (245, 865.0, "a185"), (246, 771.0, "a194"), (247, 888.0, "a198"), (248, 967.0, "a186"), (249, 888.0, "a195"), (250, 831.0, "a187"), (251, 873.0, "a188"), (252, 927.0, "a189"), (253, 970.0, "a190"), (254, 918.0, "a191")][..]), +]) } diff --git a/frontend/src-tauri/patches/pdf-extract-0.12.0/src/encodings.rs b/frontend/src-tauri/patches/pdf-extract-0.12.0/src/encodings.rs new file mode 100644 index 00000000..9988870f --- /dev/null +++ b/frontend/src-tauri/patches/pdf-extract-0.12.0/src/encodings.rs @@ -0,0 +1,1810 @@ +pub const MAC_ROMAN_ENCODING: [Option<&str>; 256] = [ + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + Some("space"), + Some("exclam"), + Some("quotedbl"), + Some("numbersign"), + Some("dollar"), + Some("percent"), + Some("ampersand"), + Some("quotesingle"), + Some("parenleft"), + Some("parenright"), + Some("asterisk"), + Some("plus"), + Some("comma"), + Some("hyphen"), + Some("period"), + Some("slash"), + Some("zero"), + Some("one"), + Some("two"), + Some("three"), + Some("four"), + Some("five"), + Some("six"), + Some("seven"), + Some("eight"), + Some("nine"), + Some("colon"), + Some("semicolon"), + Some("less"), + Some("equal"), + Some("greater"), + Some("question"), + Some("at"), + Some("A"), + Some("B"), + Some("C"), + Some("D"), + Some("E"), + Some("F"), + Some("G"), + Some("H"), + Some("I"), + Some("J"), + Some("K"), + Some("L"), + Some("M"), + Some("N"), + Some("O"), + Some("P"), + Some("Q"), + Some("R"), + Some("S"), + Some("T"), + Some("U"), + Some("V"), + Some("W"), + Some("X"), + Some("Y"), + Some("Z"), + Some("bracketleft"), + Some("backslash"), + Some("bracketright"), + Some("asciicircum"), + Some("underscore"), + Some("grave"), + Some("a"), + Some("b"), + Some("c"), + Some("d"), + Some("e"), + Some("f"), + Some("g"), + Some("h"), + Some("i"), + Some("j"), + Some("k"), + Some("l"), + Some("m"), + Some("n"), + Some("o"), + Some("p"), + Some("q"), + Some("r"), + Some("s"), + Some("t"), + Some("u"), + Some("v"), + Some("w"), + Some("x"), + Some("y"), + Some("z"), + Some("braceleft"), + Some("bar"), + Some("braceright"), + Some("asciitilde"), + None, + Some("Adieresis"), + Some("Aring"), + Some("Ccedilla"), + Some("Eacute"), + Some("Ntilde"), + Some("Odieresis"), + Some("Udieresis"), + Some("aacute"), + Some("agrave"), + Some("acircumflex"), + Some("adieresis"), + Some("atilde"), + Some("aring"), + Some("ccedilla"), + Some("eacute"), + Some("egrave"), + Some("ecircumflex"), + Some("edieresis"), + Some("iacute"), + Some("igrave"), + Some("icircumflex"), + Some("idieresis"), + Some("ntilde"), + Some("oacute"), + Some("ograve"), + Some("ocircumflex"), + Some("odieresis"), + Some("otilde"), + Some("uacute"), + Some("ugrave"), + Some("ucircumflex"), + Some("udieresis"), + Some("dagger"), + Some("degree"), + Some("cent"), + Some("sterling"), + Some("section"), + Some("bullet"), + Some("paragraph"), + Some("germandbls"), + Some("registered"), + Some("copyright"), + Some("trademark"), + Some("acute"), + Some("dieresis"), + Some("notequal"), + Some("AE"), + Some("Oslash"), + Some("infinity"), + Some("plusminus"), + Some("lessequal"), + Some("greaterequal"), + Some("yen"), + Some("mu"), + Some("partialdiff"), + Some("summation"), + Some("product"), + Some("pi"), + Some("integral"), + Some("ordfeminine"), + Some("ordmasculine"), + Some("Omega"), + Some("ae"), + Some("oslash"), + Some("questiondown"), + Some("exclamdown"), + Some("logicalnot"), + Some("radical"), + Some("florin"), + Some("approxequal"), + Some("Delta"), + Some("guillemotleft"), + Some("guillemotright"), + Some("ellipsis"), + Some("space"), + Some("Agrave"), + Some("Atilde"), + Some("Otilde"), + Some("OE"), + Some("oe"), + Some("endash"), + Some("emdash"), + Some("quotedblleft"), + Some("quotedblright"), + Some("quoteleft"), + Some("quoteright"), + Some("divide"), + Some("lozenge"), + Some("ydieresis"), + Some("Ydieresis"), + Some("fraction"), + Some("currency"), + Some("guilsinglleft"), + Some("guilsinglright"), + Some("fi"), + Some("fl"), + Some("daggerdbl"), + Some("periodcentered"), + Some("quotesinglbase"), + Some("quotedblbase"), + Some("perthousand"), + Some("Acircumflex"), + Some("Ecircumflex"), + Some("Aacute"), + Some("Edieresis"), + Some("Egrave"), + Some("Iacute"), + Some("Icircumflex"), + Some("Idieresis"), + Some("Igrave"), + Some("Oacute"), + Some("Ocircumflex"), + Some("apple"), + Some("Ograve"), + Some("Uacute"), + Some("Ucircumflex"), + Some("Ugrave"), + Some("dotlessi"), + Some("circumflex"), + Some("tilde"), + Some("macron"), + Some("breve"), + Some("dotaccent"), + Some("ring"), + Some("cedilla"), + Some("hungarumlaut"), + Some("ogonek"), + Some("caron") ]; + +pub const MAC_EXPERT_ENCODING: [Option<&str>; 256] = [ + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + Some("space"), + Some("exclamsmall"), + Some("Hungarumlautsmall"), + Some("centoldstyle"), + Some("dollaroldstyle"), + Some("dollarsuperior"), + Some("ampersandsmall"), + Some("Acutesmall"), + Some("parenleftsuperior"), + Some("parenrightsuperior"), + Some("twodotenleader"), + Some("onedotenleader"), + Some("comma"), + Some("hyphen"), + Some("period"), + Some("fraction"), + Some("zerooldstyle"), + Some("oneoldstyle"), + Some("twooldstyle"), + Some("threeoldstyle"), + Some("fouroldstyle"), + Some("fiveoldstyle"), + Some("sixoldstyle"), + Some("sevenoldstyle"), + Some("eightoldstyle"), + Some("nineoldstyle"), + Some("colon"), + Some("semicolon"), + None, + Some("threequartersemdash"), + None, + Some("questionsmall"), + None, + None, + None, + None, + Some("Ethsmall"), + None, + None, + Some("onequarter"), + Some("onehalf"), + Some("threequarters"), + Some("oneeighth"), + Some("threeeighths"), + Some("fiveeighths"), + Some("seveneighths"), + Some("onethird"), + Some("twothirds"), + None, + None, + None, + None, + None, + None, + Some("ff"), + Some("fi"), + Some("fl"), + Some("ffi"), + Some("ffl"), + Some("parenleftinferior"), + None, + Some("parenrightinferior"), + Some("Circumflexsmall"), + Some("hypheninferior"), + Some("Gravesmall"), + Some("Asmall"), + Some("Bsmall"), + Some("Csmall"), + Some("Dsmall"), + Some("Esmall"), + Some("Fsmall"), + Some("Gsmall"), + Some("Hsmall"), + Some("Ismall"), + Some("Jsmall"), + Some("Ksmall"), + Some("Lsmall"), + Some("Msmall"), + Some("Nsmall"), + Some("Osmall"), + Some("Psmall"), + Some("Qsmall"), + Some("Rsmall"), + Some("Ssmall"), + Some("Tsmall"), + Some("Usmall"), + Some("Vsmall"), + Some("Wsmall"), + Some("Xsmall"), + Some("Ysmall"), + Some("Zsmall"), + Some("colonmonetary"), + Some("onefitted"), + Some("rupiah"), + Some("Tildesmall"), + None, + None, + Some("asuperior"), + Some("centsuperior"), + None, + None, + None, + None, + Some("Aacutesmall"), + Some("Agravesmall"), + Some("Acircumflexsmall"), + Some("Adieresissmall"), + Some("Atildesmall"), + Some("Aringsmall"), + Some("Ccedillasmall"), + Some("Eacutesmall"), + Some("Egravesmall"), + Some("Ecircumflexsmall"), + Some("Edieresissmall"), + Some("Iacutesmall"), + Some("Igravesmall"), + Some("Icircumflexsmall"), + Some("Idieresissmall"), + Some("Ntildesmall"), + Some("Oacutesmall"), + Some("Ogravesmall"), + Some("Ocircumflexsmall"), + Some("Odieresissmall"), + Some("Otildesmall"), + Some("Uacutesmall"), + Some("Ugravesmall"), + Some("Ucircumflexsmall"), + Some("Udieresissmall"), + None, + Some("eightsuperior"), + Some("fourinferior"), + Some("threeinferior"), + Some("sixinferior"), + Some("eightinferior"), + Some("seveninferior"), + Some("Scaronsmall"), + None, + Some("centinferior"), + Some("twoinferior"), + None, + Some("Dieresissmall"), + None, + Some("Caronsmall"), + Some("osuperior"), + Some("fiveinferior"), + None, + Some("commainferior"), + Some("periodinferior"), + Some("Yacutesmall"), + None, + Some("dollarinferior"), + None, + None, + Some("Thornsmall"), + None, + Some("nineinferior"), + Some("zeroinferior"), + Some("Zcaronsmall"), + Some("AEsmall"), + Some("Oslashsmall"), + Some("questiondownsmall"), + Some("oneinferior"), + Some("Lslashsmall"), + None, + None, + None, + None, + None, + None, + Some("Cedillasmall"), + None, + None, + None, + None, + None, + Some("OEsmall"), + Some("figuredash"), + Some("hyphensuperior"), + None, + None, + None, + None, + Some("exclamdownsmall"), + None, + Some("Ydieresissmall"), + None, + Some("onesuperior"), + Some("twosuperior"), + Some("threesuperior"), + Some("foursuperior"), + Some("fivesuperior"), + Some("sixsuperior"), + Some("sevensuperior"), + Some("ninesuperior"), + Some("zerosuperior"), + None, + Some("esuperior"), + Some("rsuperior"), + Some("tsuperior"), + None, + None, + Some("isuperior"), + Some("ssuperior"), + Some("dsuperior"), + None, + None, + None, + None, + None, + Some("lsuperior"), + Some("Ogoneksmall"), + Some("Brevesmall"), + Some("Macronsmall"), + Some("bsuperior"), + Some("nsuperior"), + Some("msuperior"), + Some("commasuperior"), + Some("periodsuperior"), + Some("Dotaccentsmall"), + Some("Ringsmall"), + None, + None, + None, + None]; + +pub const WIN_ANSI_ENCODING: [Option<&str>; 256] = [ + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + Some("space"), + Some("exclam"), + Some("quotedbl"), + Some("numbersign"), + Some("dollar"), + Some("percent"), + Some("ampersand"), + Some("quotesingle"), + Some("parenleft"), + Some("parenright"), + Some("asterisk"), + Some("plus"), + Some("comma"), + Some("hyphen"), + Some("period"), + Some("slash"), + Some("zero"), + Some("one"), + Some("two"), + Some("three"), + Some("four"), + Some("five"), + Some("six"), + Some("seven"), + Some("eight"), + Some("nine"), + Some("colon"), + Some("semicolon"), + Some("less"), + Some("equal"), + Some("greater"), + Some("question"), + Some("at"), + Some("A"), + Some("B"), + Some("C"), + Some("D"), + Some("E"), + Some("F"), + Some("G"), + Some("H"), + Some("I"), + Some("J"), + Some("K"), + Some("L"), + Some("M"), + Some("N"), + Some("O"), + Some("P"), + Some("Q"), + Some("R"), + Some("S"), + Some("T"), + Some("U"), + Some("V"), + Some("W"), + Some("X"), + Some("Y"), + Some("Z"), + Some("bracketleft"), + Some("backslash"), + Some("bracketright"), + Some("asciicircum"), + Some("underscore"), + Some("grave"), + Some("a"), + Some("b"), + Some("c"), + Some("d"), + Some("e"), + Some("f"), + Some("g"), + Some("h"), + Some("i"), + Some("j"), + Some("k"), + Some("l"), + Some("m"), + Some("n"), + Some("o"), + Some("p"), + Some("q"), + Some("r"), + Some("s"), + Some("t"), + Some("u"), + Some("v"), + Some("w"), + Some("x"), + Some("y"), + Some("z"), + Some("braceleft"), + Some("bar"), + Some("braceright"), + Some("asciitilde"), + Some("bullet"), + Some("Euro"), + Some("bullet"), + Some("quotesinglbase"), + Some("florin"), + Some("quotedblbase"), + Some("ellipsis"), + Some("dagger"), + Some("daggerdbl"), + Some("circumflex"), + Some("perthousand"), + Some("Scaron"), + Some("guilsinglleft"), + Some("OE"), + Some("bullet"), + Some("Zcaron"), + Some("bullet"), + Some("bullet"), + Some("quoteleft"), + Some("quoteright"), + Some("quotedblleft"), + Some("quotedblright"), + Some("bullet"), + Some("endash"), + Some("emdash"), + Some("tilde"), + Some("trademark"), + Some("scaron"), + Some("guilsinglright"), + Some("oe"), + Some("bullet"), + Some("zcaron"), + Some("Ydieresis"), + Some("space"), + Some("exclamdown"), + Some("cent"), + Some("sterling"), + Some("currency"), + Some("yen"), + Some("brokenbar"), + Some("section"), + Some("dieresis"), + Some("copyright"), + Some("ordfeminine"), + Some("guillemotleft"), + Some("logicalnot"), + Some("hyphen"), + Some("registered"), + Some("macron"), + Some("degree"), + Some("plusminus"), + Some("twosuperior"), + Some("threesuperior"), + Some("acute"), + Some("mu"), + Some("paragraph"), + Some("periodcentered"), + Some("cedilla"), + Some("onesuperior"), + Some("ordmasculine"), + Some("guillemotright"), + Some("onequarter"), + Some("onehalf"), + Some("threequarters"), + Some("questiondown"), + Some("Agrave"), + Some("Aacute"), + Some("Acircumflex"), + Some("Atilde"), + Some("Adieresis"), + Some("Aring"), + Some("AE"), + Some("Ccedilla"), + Some("Egrave"), + Some("Eacute"), + Some("Ecircumflex"), + Some("Edieresis"), + Some("Igrave"), + Some("Iacute"), + Some("Icircumflex"), + Some("Idieresis"), + Some("Eth"), + Some("Ntilde"), + Some("Ograve"), + Some("Oacute"), + Some("Ocircumflex"), + Some("Otilde"), + Some("Odieresis"), + Some("multiply"), + Some("Oslash"), + Some("Ugrave"), + Some("Uacute"), + Some("Ucircumflex"), + Some("Udieresis"), + Some("Yacute"), + Some("Thorn"), + Some("germandbls"), + Some("agrave"), + Some("aacute"), + Some("acircumflex"), + Some("atilde"), + Some("adieresis"), + Some("aring"), + Some("ae"), + Some("ccedilla"), + Some("egrave"), + Some("eacute"), + Some("ecircumflex"), + Some("edieresis"), + Some("igrave"), + Some("iacute"), + Some("icircumflex"), + Some("idieresis"), + Some("eth"), + Some("ntilde"), + Some("ograve"), + Some("oacute"), + Some("ocircumflex"), + Some("otilde"), + Some("odieresis"), + Some("divide"), + Some("oslash"), + Some("ugrave"), + Some("uacute"), + Some("ucircumflex"), + Some("udieresis"), + Some("yacute"), + Some("thorn"), + Some("ydieresis")]; + +#[allow(dead_code)] +pub const STANDARD_ENCODING: [Option<&str>; 256] = [ + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + Some("space"), + Some("exclam"), + Some("quotedbl"), + Some("numbersign"), + Some("dollar"), + Some("percent"), + Some("ampersand"), + Some("quoteright"), + Some("parenleft"), + Some("parenright"), + Some("asterisk"), + Some("plus"), + Some("comma"), + Some("hyphen"), + Some("period"), + Some("slash"), + Some("zero"), + Some("one"), + Some("two"), + Some("three"), + Some("four"), + Some("five"), + Some("six"), + Some("seven"), + Some("eight"), + Some("nine"), + Some("colon"), + Some("semicolon"), + Some("less"), + Some("equal"), + Some("greater"), + Some("question"), + Some("at"), + Some("A"), + Some("B"), + Some("C"), + Some("D"), + Some("E"), + Some("F"), + Some("G"), + Some("H"), + Some("I"), + Some("J"), + Some("K"), + Some("L"), + Some("M"), + Some("N"), + Some("O"), + Some("P"), + Some("Q"), + Some("R"), + Some("S"), + Some("T"), + Some("U"), + Some("V"), + Some("W"), + Some("X"), + Some("Y"), + Some("Z"), + Some("bracketleft"), + Some("backslash"), + Some("bracketright"), + Some("asciicircum"), + Some("underscore"), + Some("quoteleft"), + Some("a"), + Some("b"), + Some("c"), + Some("d"), + Some("e"), + Some("f"), + Some("g"), + Some("h"), + Some("i"), + Some("j"), + Some("k"), + Some("l"), + Some("m"), + Some("n"), + Some("o"), + Some("p"), + Some("q"), + Some("r"), + Some("s"), + Some("t"), + Some("u"), + Some("v"), + Some("w"), + Some("x"), + Some("y"), + Some("z"), + Some("braceleft"), + Some("bar"), + Some("braceright"), + Some("asciitilde"), + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + Some("exclamdown"), + Some("cent"), + Some("sterling"), + Some("fraction"), + Some("yen"), + Some("florin"), + Some("section"), + Some("currency"), + Some("quotesingle"), + Some("quotedblleft"), + Some("guillemotleft"), + Some("guilsinglleft"), + Some("guilsinglright"), + Some("fi"), + Some("fl"), + None, + Some("endash"), + Some("dagger"), + Some("daggerdbl"), + Some("periodcentered"), + None, + Some("paragraph"), + Some("bullet"), + Some("quotesinglbase"), + Some("quotedblbase"), + Some("quotedblright"), + Some("guillemotright"), + Some("ellipsis"), + Some("perthousand"), + None, + Some("questiondown"), + None, + Some("grave"), + Some("acute"), + Some("circumflex"), + Some("tilde"), + Some("macron"), + Some("breve"), + Some("dotaccent"), + Some("dieresis"), + None, + Some("ring"), + Some("cedilla"), + None, + Some("hungarumlaut"), + Some("ogonek"), + Some("caron"), + Some("emdash"), + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + Some("AE"), + None, + Some("ordfeminine"), + None, + None, + None, + None, + Some("Lslash"), + Some("Oslash"), + Some("OE"), + Some("ordmasculine"), + None, + None, + None, + None, + None, + Some("ae"), + None, + None, + None, + Some("dotlessi"), + None, + None, + Some("lslash"), + Some("oslash"), + Some("oe"), + Some("germandbls"), + None, + None, + None, + None +]; + +#[allow(dead_code)] +pub const EXPERT_ENCODING: [Option<&str>; 256] = [ + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + Some("space"), + Some("exclamsmall"), + Some("Hungarumlautsmall"), + None, + Some("dollaroldstyle"), + Some("dollarsuperior"), + Some("ampersandsmall"), + Some("Acutesmall"), + Some("parenleftsuperior"), + Some("parenrightsuperior"), + Some("twodotenleader"), + Some("onedotenleader"), + Some("comma"), + Some("hyphen"), + Some("period"), + Some("fraction"), + Some("zerooldstyle"), + Some("oneoldstyle"), + Some("twooldstyle"), + Some("threeoldstyle"), + Some("fouroldstyle"), + Some("fiveoldstyle"), + Some("sixoldstyle"), + Some("sevenoldstyle"), + Some("eightoldstyle"), + Some("nineoldstyle"), + Some("colon"), + Some("semicolon"), + Some("commasuperior"), + Some("threequartersemdash"), + Some("periodsuperior"), + Some("questionsmall"), + None, + Some("asuperior"), + Some("bsuperior"), + Some("centsuperior"), + Some("dsuperior"), + Some("esuperior"), + None, + None, + None, + Some("isuperior"), + None, + None, + Some("lsuperior"), + Some("msuperior"), + Some("nsuperior"), + Some("osuperior"), + None, + None, + Some("rsuperior"), + Some("ssuperior"), + Some("tsuperior"), + None, + Some("ff"), + Some("fi"), + Some("fl"), + Some("ffi"), + Some("ffl"), + Some("parenleftinferior"), + None, + Some("parenrightinferior"), + Some("Circumflexsmall"), + Some("hyphensuperior"), + Some("Gravesmall"), + Some("Asmall"), + Some("Bsmall"), + Some("Csmall"), + Some("Dsmall"), + Some("Esmall"), + Some("Fsmall"), + Some("Gsmall"), + Some("Hsmall"), + Some("Ismall"), + Some("Jsmall"), + Some("Ksmall"), + Some("Lsmall"), + Some("Msmall"), + Some("Nsmall"), + Some("Osmall"), + Some("Psmall"), + Some("Qsmall"), + Some("Rsmall"), + Some("Ssmall"), + Some("Tsmall"), + Some("Usmall"), + Some("Vsmall"), + Some("Wsmall"), + Some("Xsmall"), + Some("Ysmall"), + Some("Zsmall"), + Some("colonmonetary"), + Some("onefitted"), + Some("rupiah"), + Some("Tildesmall"), + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + Some("exclamdownsmall"), + Some("centoldstyle"), + Some("Lslashsmall"), + None, + None, + Some("Scaronsmall"), + Some("Zcaronsmall"), + Some("Dieresissmall"), + Some("Brevesmall"), + Some("Caronsmall"), + None, + Some("Dotaccentsmall"), + None, + None, + Some("Macronsmall"), + None, + None, + Some("figuredash"), + Some("hypheninferior"), + None, + None, + Some("Ogoneksmall"), + Some("Ringsmall"), + Some("Cedillasmall"), + None, + None, + None, + Some("onequarter"), + Some("onehalf"), + Some("threequarters"), + Some("questiondownsmall"), + Some("oneeighth"), + Some("threeeighths"), + Some("fiveeighths"), + Some("seveneighths"), + Some("onethird"), + Some("twothirds"), + None, + None, + Some("zerosuperior"), + Some("onesuperior"), + Some("twosuperior"), + Some("threesuperior"), + Some("foursuperior"), + Some("fivesuperior"), + Some("sixsuperior"), + Some("sevensuperior"), + Some("eightsuperior"), + Some("ninesuperior"), + Some("zeroinferior"), + Some("oneinferior"), + Some("twoinferior"), + Some("threeinferior"), + Some("fourinferior"), + Some("fiveinferior"), + Some("sixinferior"), + Some("seveninferior"), + Some("eightinferior"), + Some("nineinferior"), + Some("centinferior"), + Some("dollarinferior"), + Some("periodinferior"), + Some("commainferior"), + Some("Agravesmall"), + Some("Aacutesmall"), + Some("Acircumflexsmall"), + Some("Atildesmall"), + Some("Adieresissmall"), + Some("Aringsmall"), + Some("AEsmall"), + Some("Ccedillasmall"), + Some("Egravesmall"), + Some("Eacutesmall"), + Some("Ecircumflexsmall"), + Some("Edieresissmall"), + Some("Igravesmall"), + Some("Iacutesmall"), + Some("Icircumflexsmall"), + Some("Idieresissmall"), + Some("Ethsmall"), + Some("Ntildesmall"), + Some("Ogravesmall"), + Some("Oacutesmall"), + Some("Ocircumflexsmall"), + Some("Otildesmall"), + Some("Odieresissmall"), + Some("OEsmall"), + Some("Oslashsmall"), + Some("Ugravesmall"), + Some("Uacutesmall"), + Some("Ucircumflexsmall"), + Some("Udieresissmall"), + Some("Yacutesmall"), + Some("Thornsmall"), + Some("Ydieresissmall")]; + +#[allow(dead_code)] +pub const SYMBOL_ENCODING: [Option<&str>; 256] = [ + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + Some("space"), + Some("exclam"), + Some("universal"), + Some("numbersign"), + Some("existential"), + Some("percent"), + Some("ampersand"), + Some("suchthat"), + Some("parenleft"), + Some("parenright"), + Some("asteriskmath"), + Some("plus"), + Some("comma"), + Some("minus"), + Some("period"), + Some("slash"), + Some("zero"), + Some("one"), + Some("two"), + Some("three"), + Some("four"), + Some("five"), + Some("six"), + Some("seven"), + Some("eight"), + Some("nine"), + Some("colon"), + Some("semicolon"), + Some("less"), + Some("equal"), + Some("greater"), + Some("question"), + Some("congruent"), + Some("Alpha"), + Some("Beta"), + Some("Chi"), + Some("Delta"), + Some("Epsilon"), + Some("Phi"), + Some("Gamma"), + Some("Eta"), + Some("Iota"), + Some("theta1"), + Some("Kappa"), + Some("Lambda"), + Some("Mu"), + Some("Nu"), + Some("Omicron"), + Some("Pi"), + Some("Theta"), + Some("Rho"), + Some("Sigma"), + Some("Tau"), + Some("Upsilon"), + Some("sigma1"), + Some("Omega"), + Some("Xi"), + Some("Psi"), + Some("Zeta"), + Some("bracketleft"), + Some("therefore"), + Some("bracketright"), + Some("perpendicular"), + Some("underscore"), + Some("radicalex"), + Some("alpha"), + Some("beta"), + Some("chi"), + Some("delta"), + Some("epsilon"), + Some("phi"), + Some("gamma"), + Some("eta"), + Some("iota"), + Some("phi1"), + Some("kappa"), + Some("lambda"), + Some("mu"), + Some("nu"), + Some("omicron"), + Some("pi"), + Some("theta"), + Some("rho"), + Some("sigma"), + Some("tau"), + Some("upsilon"), + Some("omega1"), + Some("omega"), + Some("xi"), + Some("psi"), + Some("zeta"), + Some("braceleft"), + Some("bar"), + Some("braceright"), + Some("similar"), + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + Some("Upsilon1"), + Some("minute"), + Some("lessequal"), + Some("fraction"), + Some("infinity"), + Some("florin"), + Some("club"), + Some("diamond"), + Some("heart"), + Some("spade"), + Some("arrowboth"), + Some("arrowleft"), + Some("arrowup"), + Some("arrowright"), + Some("arrowdown"), + Some("degree"), + Some("plusminus"), + Some("second"), + Some("greaterequal"), + Some("multiply"), + Some("proportional"), + Some("partialdiff"), + Some("bullet"), + Some("divide"), + Some("notequal"), + Some("equivalence"), + Some("approxequal"), + Some("ellipsis"), + Some("arrowvertex"), + Some("arrowhorizex"), + Some("carriagereturn"), + Some("aleph"), + Some("Ifraktur"), + Some("Rfraktur"), + Some("weierstrass"), + Some("circlemultiply"), + Some("circleplus"), + Some("emptyset"), + Some("intersection"), + Some("union"), + Some("propersuperset"), + Some("reflexsuperset"), + Some("notsubset"), + Some("propersubset"), + Some("reflexsubset"), + Some("element"), + Some("notelement"), + Some("angle"), + Some("gradient"), + Some("registerserif"), + Some("copyrightserif"), + Some("trademarkserif"), + Some("product"), + Some("radical"), + Some("dotmath"), + Some("logicalnot"), + Some("logicaland"), + Some("logicalor"), + Some("arrowdblboth"), + Some("arrowdblleft"), + Some("arrowdblup"), + Some("arrowdblright"), + Some("arrowdbldown"), + Some("lozenge"), + Some("angleleft"), + Some("registersans"), + Some("copyrightsans"), + Some("trademarksans"), + Some("summation"), + Some("parenlefttp"), + Some("parenleftex"), + Some("parenleftbt"), + Some("bracketlefttp"), + Some("bracketleftex"), + Some("bracketleftbt"), + Some("bracelefttp"), + Some("braceleftmid"), + Some("braceleftbt"), + Some("braceex"), + None, + Some("angleright"), + Some("integral"), + Some("integraltp"), + Some("integralex"), + Some("integralbt"), + Some("parenrighttp"), + Some("parenrightex"), + Some("parenrightbt"), + Some("bracketrighttp"), + Some("bracketrightex"), + Some("bracketrightbt"), + Some("bracerighttp"), + Some("bracerightmid"), + Some("bracerightbt"), + None]; + +#[allow(dead_code)] +pub const ZAPFDINGBATS_ENCODING: [Option<&str>; 256] = [ + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + Some("space"), + Some("a1"), + Some("a2"), + Some("a202"), + Some("a3"), + Some("a4"), + Some("a5"), + Some("a119"), + Some("a118"), + Some("a117"), + Some("a11"), + Some("a12"), + Some("a13"), + Some("a14"), + Some("a15"), + Some("a16"), + Some("a105"), + Some("a17"), + Some("a18"), + Some("a19"), + Some("a20"), + Some("a21"), + Some("a22"), + Some("a23"), + Some("a24"), + Some("a25"), + Some("a26"), + Some("a27"), + Some("a28"), + Some("a6"), + Some("a7"), + Some("a8"), + Some("a9"), + Some("a10"), + Some("a29"), + Some("a30"), + Some("a31"), + Some("a32"), + Some("a33"), + Some("a34"), + Some("a35"), + Some("a36"), + Some("a37"), + Some("a38"), + Some("a39"), + Some("a40"), + Some("a41"), + Some("a42"), + Some("a43"), + Some("a44"), + Some("a45"), + Some("a46"), + Some("a47"), + Some("a48"), + Some("a49"), + Some("a50"), + Some("a51"), + Some("a52"), + Some("a53"), + Some("a54"), + Some("a55"), + Some("a56"), + Some("a57"), + Some("a58"), + Some("a59"), + Some("a60"), + Some("a61"), + Some("a62"), + Some("a63"), + Some("a64"), + Some("a65"), + Some("a66"), + Some("a67"), + Some("a68"), + Some("a69"), + Some("a70"), + Some("a71"), + Some("a72"), + Some("a73"), + Some("a74"), + Some("a203"), + Some("a75"), + Some("a204"), + Some("a76"), + Some("a77"), + Some("a78"), + Some("a79"), + Some("a81"), + Some("a82"), + Some("a83"), + Some("a84"), + Some("a97"), + Some("a98"), + Some("a99"), + Some("a100"), + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + Some("a101"), + Some("a102"), + Some("a103"), + Some("a104"), + Some("a106"), + Some("a107"), + Some("a108"), + Some("a112"), + Some("a111"), + Some("a110"), + Some("a109"), + Some("a120"), + Some("a121"), + Some("a122"), + Some("a123"), + Some("a124"), + Some("a125"), + Some("a126"), + Some("a127"), + Some("a128"), + Some("a129"), + Some("a130"), + Some("a131"), + Some("a132"), + Some("a133"), + Some("a134"), + Some("a135"), + Some("a136"), + Some("a137"), + Some("a138"), + Some("a139"), + Some("a140"), + Some("a141"), + Some("a142"), + Some("a143"), + Some("a144"), + Some("a145"), + Some("a146"), + Some("a147"), + Some("a148"), + Some("a149"), + Some("a150"), + Some("a151"), + Some("a152"), + Some("a153"), + Some("a154"), + Some("a155"), + Some("a156"), + Some("a157"), + Some("a158"), + Some("a159"), + Some("a160"), + Some("a161"), + Some("a163"), + Some("a164"), + Some("a196"), + Some("a165"), + Some("a192"), + Some("a166"), + Some("a167"), + Some("a168"), + Some("a169"), + Some("a170"), + Some("a171"), + Some("a172"), + Some("a173"), + Some("a162"), + Some("a174"), + Some("a175"), + Some("a176"), + Some("a177"), + Some("a178"), + Some("a179"), + Some("a193"), + Some("a180"), + Some("a199"), + Some("a181"), + Some("a200"), + Some("a182"), + None, + Some("a201"), + Some("a183"), + Some("a184"), + Some("a197"), + Some("a185"), + Some("a194"), + Some("a198"), + Some("a186"), + Some("a195"), + Some("a187"), + Some("a188"), + Some("a189"), + Some("a190"), + Some("a191"), + None]; diff --git a/frontend/src-tauri/patches/pdf-extract-0.12.0/src/glyphlist-export.py b/frontend/src-tauri/patches/pdf-extract-0.12.0/src/glyphlist-export.py new file mode 100644 index 00000000..de50c0a9 --- /dev/null +++ b/frontend/src-tauri/patches/pdf-extract-0.12.0/src/glyphlist-export.py @@ -0,0 +1,41 @@ +glyphlist = [] +glyphs_seen = {} +def read_glyphs(name): + f = open(name) + lines = f.readlines() + import re + for l in lines: + if l[0] == '#' or l[0] == '\n': + continue + split = re.split('[; ,]+', l) + name = split[0] + val = int(split[1], 16) + if val > 0xffff: + val = int(split[-1], 16) + if val == 0xf766 and name != "Fsmall": + continue + if name in glyphs_seen: + continue + glyphs_seen[name] = True + glyphlist.append((name,val)) +read_glyphs("glyphlist-extended.txt") +read_glyphs("texglyphlist.txt") +read_glyphs("additional.txt") +# there are some conflicts between these files +# e.g. tildewide=0x02dc, vs tildewide=0x0303 +# for now we just ignore the subsequent ones +glyphlist.append(('mapsto', 0x21A6)) +glyphlist = list(set(glyphlist)) +glyphlist.sort() +print "/* Autogenerated from:" +print " https://github.com/michal-h21/htfgen/commits/master/glyphlist-extended.txt" +print " https://github.com/kohler/lcdf-typetools/blob/master/texglyphlist.txt" +print " https://github.com/apache/pdfbox/blob/trunk/pdfbox/src/main/resources/org/apache/pdfbox/resources/glyphlist/additional.txt" +print " */" +print "pub fn name_to_unicode(name: &str) -> Option {" +print " const names: [(&'static str, u16); %d] = [" % len(glyphlist) +print ",\n".join('(\"%s\", 0x%04x)' % (g[0], g[1]) for g in glyphlist) +print " ];" +print " let result = names.binary_search_by_key(&name, |&(name,_code)| &name);" +print " result.ok().map(|indx| names[indx].1)" +print "}" diff --git a/frontend/src-tauri/patches/pdf-extract-0.12.0/src/glyphlist-extended.txt b/frontend/src-tauri/patches/pdf-extract-0.12.0/src/glyphlist-extended.txt new file mode 100644 index 00000000..ca21f43f --- /dev/null +++ b/frontend/src-tauri/patches/pdf-extract-0.12.0/src/glyphlist-extended.txt @@ -0,0 +1,4553 @@ +# lcdf-typetools glyphlist.txt, Version 2.33 +# Contents: The Adobe Glyph List, followed by extensions for TeX fonts and +# encodings. We also extend the second field so that it can contain +# multiple Unicode scalar values, separated by semicolons, analogous to +# otftotfm's "% UNICODING" comments. +############################################################################### +# Name: Adobe Glyph List +# Table version: 2.0 +# Date: September 20, 2002 +# +# See http://partners.adobe.com/asn/developer/typeforum/unicodegn.html +# +# Format: Semicolon-delimited fields: +# (1) glyph name +# (2) Unicode scalar value +A;0041 +AE;00C6 +AEacute;01FC +AEmacron;01E2 +AEsmall;F7E6 +Aacute;00C1 +Aacutesmall;F7E1 +Abreve;0102 +Abreveacute;1EAE +Abrevecyrillic;04D0 +Abrevedotbelow;1EB6 +Abrevegrave;1EB0 +Abrevehookabove;1EB2 +Abrevetilde;1EB4 +Acaron;01CD +Acircle;24B6 +Acircumflex;00C2 +Acircumflexacute;1EA4 +Acircumflexdotbelow;1EAC +Acircumflexgrave;1EA6 +Acircumflexhookabove;1EA8 +Acircumflexsmall;F7E2 +Acircumflextilde;1EAA +Acute;F6C9 +Acutesmall;F7B4 +Acyrillic;0410 +Adblgrave;0200 +Adieresis;00C4 +Adieresiscyrillic;04D2 +Adieresismacron;01DE +Adieresissmall;F7E4 +Adotbelow;1EA0 +Adotmacron;01E0 +Agrave;00C0 +Agravesmall;F7E0 +Ahookabove;1EA2 +Aiecyrillic;04D4 +Ainvertedbreve;0202 +Alpha;0391 +Alphatonos;0386 +Amacron;0100 +Amonospace;FF21 +Aogonek;0104 +Aring;00C5 +Aringacute;01FA +Aringbelow;1E00 +Aringsmall;F7E5 +Asmall;F761 +Atilde;00C3 +Atildesmall;F7E3 +Aybarmenian;0531 +B;0042 +Bcircle;24B7 +Bdotaccent;1E02 +Bdotbelow;1E04 +Becyrillic;0411 +Benarmenian;0532 +Beta;0392 +Bhook;0181 +Blinebelow;1E06 +Bmonospace;FF22 +Brevesmall;F6F4 +Bsmall;F762 +Btopbar;0182 +C;0043 +Caarmenian;053E +Cacute;0106 +Caron;F6CA +Caronsmall;F6F5 +Ccaron;010C +Ccedilla;00C7 +Ccedillaacute;1E08 +Ccedillasmall;F7E7 +Ccircle;24B8 +Ccircumflex;0108 +Cdot;010A +Cdotaccent;010A +Cedillasmall;F7B8 +Chaarmenian;0549 +Cheabkhasiancyrillic;04BC +Checyrillic;0427 +Chedescenderabkhasiancyrillic;04BE +Chedescendercyrillic;04B6 +Chedieresiscyrillic;04F4 +Cheharmenian;0543 +Chekhakassiancyrillic;04CB +Cheverticalstrokecyrillic;04B8 +Chi;03A7 +Chook;0187 +Circumflexsmall;F6F6 +Cmonospace;FF23 +Coarmenian;0551 +Csmall;F763 +D;0044 +DZ;01F1 +DZcaron;01C4 +Daarmenian;0534 +Dafrican;0189 +Dcaron;010E +Dcedilla;1E10 +Dcircle;24B9 +Dcircumflexbelow;1E12 +Dcroat;0110 +Ddotaccent;1E0A +Ddotbelow;1E0C +Decyrillic;0414 +Deicoptic;03EE +Delta;2206 +Deltagreek;0394 +Dhook;018A +Dieresis;F6CB +DieresisAcute;F6CC +DieresisGrave;F6CD +Dieresissmall;F7A8 +Digammagreek;03DC +Djecyrillic;0402 +Dlinebelow;1E0E +Dmonospace;FF24 +Dotaccentsmall;F6F7 +Dslash;0110 +Dsmall;F764 +Dtopbar;018B +Dz;01F2 +Dzcaron;01C5 +Dzeabkhasiancyrillic;04E0 +Dzecyrillic;0405 +Dzhecyrillic;040F +E;0045 +Eacute;00C9 +Eacutesmall;F7E9 +Ebreve;0114 +Ecaron;011A +Ecedillabreve;1E1C +Echarmenian;0535 +Ecircle;24BA +Ecircumflex;00CA +Ecircumflexacute;1EBE +Ecircumflexbelow;1E18 +Ecircumflexdotbelow;1EC6 +Ecircumflexgrave;1EC0 +Ecircumflexhookabove;1EC2 +Ecircumflexsmall;F7EA +Ecircumflextilde;1EC4 +Ecyrillic;0404 +Edblgrave;0204 +Edieresis;00CB +Edieresissmall;F7EB +Edot;0116 +Edotaccent;0116 +Edotbelow;1EB8 +Efcyrillic;0424 +Egrave;00C8 +Egravesmall;F7E8 +Eharmenian;0537 +Ehookabove;1EBA +Eightroman;2167 +Einvertedbreve;0206 +Eiotifiedcyrillic;0464 +Elcyrillic;041B +Elevenroman;216A +Emacron;0112 +Emacronacute;1E16 +Emacrongrave;1E14 +Emcyrillic;041C +Emonospace;FF25 +Encyrillic;041D +Endescendercyrillic;04A2 +Eng;014A +Enghecyrillic;04A4 +Enhookcyrillic;04C7 +Eogonek;0118 +Eopen;0190 +Epsilon;0395 +Epsilontonos;0388 +Ercyrillic;0420 +Ereversed;018E +Ereversedcyrillic;042D +Escyrillic;0421 +Esdescendercyrillic;04AA +Esh;01A9 +Esmall;F765 +Eta;0397 +Etarmenian;0538 +Etatonos;0389 +Eth;00D0 +Ethsmall;F7F0 +Etilde;1EBC +Etildebelow;1E1A +Euro;20AC +Ezh;01B7 +Ezhcaron;01EE +Ezhreversed;01B8 +F;0046 +Fcircle;24BB +Fdotaccent;1E1E +Feharmenian;0556 +Feicoptic;03E4 +Fhook;0191 +Fitacyrillic;0472 +Fiveroman;2164 +Fmonospace;FF26 +Fourroman;2163 +Fsmall;F766 +G;0047 +GBsquare;3387 +Gacute;01F4 +Gamma;0393 +Gammaafrican;0194 +Gangiacoptic;03EA +Gbreve;011E +Gcaron;01E6 +Gcedilla;0122 +Gcircle;24BC +Gcircumflex;011C +Gcommaaccent;0122 +Gdot;0120 +Gdotaccent;0120 +Gecyrillic;0413 +Ghadarmenian;0542 +Ghemiddlehookcyrillic;0494 +Ghestrokecyrillic;0492 +Gheupturncyrillic;0490 +Ghook;0193 +Gimarmenian;0533 +Gjecyrillic;0403 +Gmacron;1E20 +Gmonospace;FF27 +Grave;F6CE +Gravesmall;F760 +Gsmall;F767 +Gsmallhook;029B +Gstroke;01E4 +H;0048 +H18533;25CF +H18543;25AA +H18551;25AB +H22073;25A1 +HPsquare;33CB +Haabkhasiancyrillic;04A8 +Hadescendercyrillic;04B2 +Hardsigncyrillic;042A +Hbar;0126 +Hbrevebelow;1E2A +Hcedilla;1E28 +Hcircle;24BD +Hcircumflex;0124 +Hdieresis;1E26 +Hdotaccent;1E22 +Hdotbelow;1E24 +Hmonospace;FF28 +Hoarmenian;0540 +Horicoptic;03E8 +Hsmall;F768 +Hungarumlaut;F6CF +Hungarumlautsmall;F6F8 +Hzsquare;3390 +I;0049 +IAcyrillic;042F +IJ;0132 +IUcyrillic;042E +Iacute;00CD +Iacutesmall;F7ED +Ibreve;012C +Icaron;01CF +Icircle;24BE +Icircumflex;00CE +Icircumflexsmall;F7EE +Icyrillic;0406 +Idblgrave;0208 +Idieresis;00CF +Idieresisacute;1E2E +Idieresiscyrillic;04E4 +Idieresissmall;F7EF +Idot;0130 +Idotaccent;0130 +Idotbelow;1ECA +Iebrevecyrillic;04D6 +Iecyrillic;0415 +Ifraktur;2111 +Igrave;00CC +Igravesmall;F7EC +Ihookabove;1EC8 +Iicyrillic;0418 +Iinvertedbreve;020A +Iishortcyrillic;0419 +Imacron;012A +Imacroncyrillic;04E2 +Imonospace;FF29 +Iniarmenian;053B +Iocyrillic;0401 +Iogonek;012E +Iota;0399 +Iotaafrican;0196 +Iotadieresis;03AA +Iotatonos;038A +Ismall;F769 +Istroke;0197 +Itilde;0128 +Itildebelow;1E2C +Izhitsacyrillic;0474 +Izhitsadblgravecyrillic;0476 +J;004A +Jaarmenian;0541 +Jcircle;24BF +Jcircumflex;0134 +Jecyrillic;0408 +Jheharmenian;054B +Jmonospace;FF2A +Jsmall;F76A +K;004B +KBsquare;3385 +KKsquare;33CD +Kabashkircyrillic;04A0 +Kacute;1E30 +Kacyrillic;041A +Kadescendercyrillic;049A +Kahookcyrillic;04C3 +Kappa;039A +Kastrokecyrillic;049E +Kaverticalstrokecyrillic;049C +Kcaron;01E8 +Kcedilla;0136 +Kcircle;24C0 +Kcommaaccent;0136 +Kdotbelow;1E32 +Keharmenian;0554 +Kenarmenian;053F +Khacyrillic;0425 +Kheicoptic;03E6 +Khook;0198 +Kjecyrillic;040C +Klinebelow;1E34 +Kmonospace;FF2B +Koppacyrillic;0480 +Koppagreek;03DE +Ksicyrillic;046E +Ksmall;F76B +L;004C +LJ;01C7 +LL;F6BF +Lacute;0139 +Lambda;039B +Lcaron;013D +Lcedilla;013B +Lcircle;24C1 +Lcircumflexbelow;1E3C +Lcommaaccent;013B +Ldot;013F +Ldotaccent;013F +Ldotbelow;1E36 +Ldotbelowmacron;1E38 +Liwnarmenian;053C +Lj;01C8 +Ljecyrillic;0409 +Llinebelow;1E3A +Lmonospace;FF2C +Lslash;0141 +Lslashsmall;F6F9 +Lsmall;F76C +M;004D +MBsquare;3386 +Macron;F6D0 +Macronsmall;F7AF +Macute;1E3E +Mcircle;24C2 +Mdotaccent;1E40 +Mdotbelow;1E42 +Menarmenian;0544 +Mmonospace;FF2D +Msmall;F76D +Mturned;019C +Mu;039C +N;004E +NJ;01CA +Nacute;0143 +Ncaron;0147 +Ncedilla;0145 +Ncircle;24C3 +Ncircumflexbelow;1E4A +Ncommaaccent;0145 +Ndotaccent;1E44 +Ndotbelow;1E46 +Nhookleft;019D +Nineroman;2168 +Nj;01CB +Njecyrillic;040A +Nlinebelow;1E48 +Nmonospace;FF2E +Nowarmenian;0546 +Nsmall;F76E +Ntilde;00D1 +Ntildesmall;F7F1 +Nu;039D +O;004F +OE;0152 +OEsmall;F6FA +Oacute;00D3 +Oacutesmall;F7F3 +Obarredcyrillic;04E8 +Obarreddieresiscyrillic;04EA +Obreve;014E +Ocaron;01D1 +Ocenteredtilde;019F +Ocircle;24C4 +Ocircumflex;00D4 +Ocircumflexacute;1ED0 +Ocircumflexdotbelow;1ED8 +Ocircumflexgrave;1ED2 +Ocircumflexhookabove;1ED4 +Ocircumflexsmall;F7F4 +Ocircumflextilde;1ED6 +Ocyrillic;041E +Odblacute;0150 +Odblgrave;020C +Odieresis;00D6 +Odieresiscyrillic;04E6 +Odieresissmall;F7F6 +Odotbelow;1ECC +Ogoneksmall;F6FB +Ograve;00D2 +Ogravesmall;F7F2 +Oharmenian;0555 +Ohm;2126 +Ohookabove;1ECE +Ohorn;01A0 +Ohornacute;1EDA +Ohorndotbelow;1EE2 +Ohorngrave;1EDC +Ohornhookabove;1EDE +Ohorntilde;1EE0 +Ohungarumlaut;0150 +Oi;01A2 +Oinvertedbreve;020E +Omacron;014C +Omacronacute;1E52 +Omacrongrave;1E50 +Omega;2126 +Omegacyrillic;0460 +Omegagreek;03A9 +Omegaroundcyrillic;047A +Omegatitlocyrillic;047C +Omegatonos;038F +Omicron;039F +Omicrontonos;038C +Omonospace;FF2F +Oneroman;2160 +Oogonek;01EA +Oogonekmacron;01EC +Oopen;0186 +Oslash;00D8 +Oslashacute;01FE +Oslashsmall;F7F8 +Osmall;F76F +Ostrokeacute;01FE +Otcyrillic;047E +Otilde;00D5 +Otildeacute;1E4C +Otildedieresis;1E4E +Otildesmall;F7F5 +P;0050 +Pacute;1E54 +Pcircle;24C5 +Pdotaccent;1E56 +Pecyrillic;041F +Peharmenian;054A +Pemiddlehookcyrillic;04A6 +Phi;03A6 +Phook;01A4 +Pi;03A0 +Piwrarmenian;0553 +Pmonospace;FF30 +Psi;03A8 +Psicyrillic;0470 +Psmall;F770 +Q;0051 +Qcircle;24C6 +Qmonospace;FF31 +Qsmall;F771 +R;0052 +Raarmenian;054C +Racute;0154 +Rcaron;0158 +Rcedilla;0156 +Rcircle;24C7 +Rcommaaccent;0156 +Rdblgrave;0210 +Rdotaccent;1E58 +Rdotbelow;1E5A +Rdotbelowmacron;1E5C +Reharmenian;0550 +Rfraktur;211C +Rho;03A1 +Ringsmall;F6FC +Rinvertedbreve;0212 +Rlinebelow;1E5E +Rmonospace;FF32 +Rsmall;F772 +Rsmallinverted;0281 +Rsmallinvertedsuperior;02B6 +S;0053 +SF010000;250C +SF020000;2514 +SF030000;2510 +SF040000;2518 +SF050000;253C +SF060000;252C +SF070000;2534 +SF080000;251C +SF090000;2524 +SF100000;2500 +SF110000;2502 +SF190000;2561 +SF200000;2562 +SF210000;2556 +SF220000;2555 +SF230000;2563 +SF240000;2551 +SF250000;2557 +SF260000;255D +SF270000;255C +SF280000;255B +SF360000;255E +SF370000;255F +SF380000;255A +SF390000;2554 +SF400000;2569 +SF410000;2566 +SF420000;2560 +SF430000;2550 +SF440000;256C +SF450000;2567 +SF460000;2568 +SF470000;2564 +SF480000;2565 +SF490000;2559 +SF500000;2558 +SF510000;2552 +SF520000;2553 +SF530000;256B +SF540000;256A +Sacute;015A +Sacutedotaccent;1E64 +Sampigreek;03E0 +Scaron;0160 +Scarondotaccent;1E66 +Scaronsmall;F6FD +Scedilla;015E +Schwa;018F +Schwacyrillic;04D8 +Schwadieresiscyrillic;04DA +Scircle;24C8 +Scircumflex;015C +Scommaaccent;0218 +Sdotaccent;1E60 +Sdotbelow;1E62 +Sdotbelowdotaccent;1E68 +Seharmenian;054D +Sevenroman;2166 +Shaarmenian;0547 +Shacyrillic;0428 +Shchacyrillic;0429 +Sheicoptic;03E2 +Shhacyrillic;04BA +Shimacoptic;03EC +Sigma;03A3 +Sixroman;2165 +Smonospace;FF33 +Softsigncyrillic;042C +Ssmall;F773 +Stigmagreek;03DA +T;0054 +Tau;03A4 +Tbar;0166 +Tcaron;0164 +Tcedilla;0162 +Tcircle;24C9 +Tcircumflexbelow;1E70 +Tcommaaccent;0162 +Tdotaccent;1E6A +Tdotbelow;1E6C +Tecyrillic;0422 +Tedescendercyrillic;04AC +Tenroman;2169 +Tetsecyrillic;04B4 +Theta;0398 +Thook;01AC +Thorn;00DE +Thornsmall;F7FE +Threeroman;2162 +Tildesmall;F6FE +Tiwnarmenian;054F +Tlinebelow;1E6E +Tmonospace;FF34 +Toarmenian;0539 +Tonefive;01BC +Tonesix;0184 +Tonetwo;01A7 +Tretroflexhook;01AE +Tsecyrillic;0426 +Tshecyrillic;040B +Tsmall;F774 +Twelveroman;216B +Tworoman;2161 +U;0055 +Uacute;00DA +Uacutesmall;F7FA +Ubreve;016C +Ucaron;01D3 +Ucircle;24CA +Ucircumflex;00DB +Ucircumflexbelow;1E76 +Ucircumflexsmall;F7FB +Ucyrillic;0423 +Udblacute;0170 +Udblgrave;0214 +Udieresis;00DC +Udieresisacute;01D7 +Udieresisbelow;1E72 +Udieresiscaron;01D9 +Udieresiscyrillic;04F0 +Udieresisgrave;01DB +Udieresismacron;01D5 +Udieresissmall;F7FC +Udotbelow;1EE4 +Ugrave;00D9 +Ugravesmall;F7F9 +Uhookabove;1EE6 +Uhorn;01AF +Uhornacute;1EE8 +Uhorndotbelow;1EF0 +Uhorngrave;1EEA +Uhornhookabove;1EEC +Uhorntilde;1EEE +Uhungarumlaut;0170 +Uhungarumlautcyrillic;04F2 +Uinvertedbreve;0216 +Ukcyrillic;0478 +Umacron;016A +Umacroncyrillic;04EE +Umacrondieresis;1E7A +Umonospace;FF35 +Uogonek;0172 +Upsilon;03A5 +Upsilon1;03D2 +Upsilonacutehooksymbolgreek;03D3 +Upsilonafrican;01B1 +Upsilondieresis;03AB +Upsilondieresishooksymbolgreek;03D4 +Upsilonhooksymbol;03D2 +Upsilontonos;038E +Uring;016E +Ushortcyrillic;040E +Usmall;F775 +Ustraightcyrillic;04AE +Ustraightstrokecyrillic;04B0 +Utilde;0168 +Utildeacute;1E78 +Utildebelow;1E74 +V;0056 +Vcircle;24CB +Vdotbelow;1E7E +Vecyrillic;0412 +Vewarmenian;054E +Vhook;01B2 +Vmonospace;FF36 +Voarmenian;0548 +Vsmall;F776 +Vtilde;1E7C +W;0057 +Wacute;1E82 +Wcircle;24CC +Wcircumflex;0174 +Wdieresis;1E84 +Wdotaccent;1E86 +Wdotbelow;1E88 +Wgrave;1E80 +Wmonospace;FF37 +Wsmall;F777 +X;0058 +Xcircle;24CD +Xdieresis;1E8C +Xdotaccent;1E8A +Xeharmenian;053D +Xi;039E +Xmonospace;FF38 +Xsmall;F778 +Y;0059 +Yacute;00DD +Yacutesmall;F7FD +Yatcyrillic;0462 +Ycircle;24CE +Ycircumflex;0176 +Ydieresis;0178 +Ydieresissmall;F7FF +Ydotaccent;1E8E +Ydotbelow;1EF4 +Yericyrillic;042B +Yerudieresiscyrillic;04F8 +Ygrave;1EF2 +Yhook;01B3 +Yhookabove;1EF6 +Yiarmenian;0545 +Yicyrillic;0407 +Yiwnarmenian;0552 +Ymonospace;FF39 +Ysmall;F779 +Ytilde;1EF8 +Yusbigcyrillic;046A +Yusbigiotifiedcyrillic;046C +Yuslittlecyrillic;0466 +Yuslittleiotifiedcyrillic;0468 +Z;005A +Zaarmenian;0536 +Zacute;0179 +Zcaron;017D +Zcaronsmall;F6FF +Zcircle;24CF +Zcircumflex;1E90 +Zdot;017B +Zdotaccent;017B +Zdotbelow;1E92 +Zecyrillic;0417 +Zedescendercyrillic;0498 +Zedieresiscyrillic;04DE +Zeta;0396 +Zhearmenian;053A +Zhebrevecyrillic;04C1 +Zhecyrillic;0416 +Zhedescendercyrillic;0496 +Zhedieresiscyrillic;04DC +Zlinebelow;1E94 +Zmonospace;FF3A +Zsmall;F77A +Zstroke;01B5 +a;0061 +aabengali;0986 +aacute;00E1 +aadeva;0906 +aagujarati;0A86 +aagurmukhi;0A06 +aamatragurmukhi;0A3E +aarusquare;3303 +aavowelsignbengali;09BE +aavowelsigndeva;093E +aavowelsigngujarati;0ABE +abbreviationmarkarmenian;055F +abbreviationsigndeva;0970 +abengali;0985 +abopomofo;311A +abreve;0103 +abreveacute;1EAF +abrevecyrillic;04D1 +abrevedotbelow;1EB7 +abrevegrave;1EB1 +abrevehookabove;1EB3 +abrevetilde;1EB5 +acaron;01CE +acircle;24D0 +acircumflex;00E2 +acircumflexacute;1EA5 +acircumflexdotbelow;1EAD +acircumflexgrave;1EA7 +acircumflexhookabove;1EA9 +acircumflextilde;1EAB +acute;00B4 +acutebelowcmb;0317 +acutecmb;0301 +acutecomb;0301 +acutedeva;0954 +acutelowmod;02CF +acutetonecmb;0341 +acyrillic;0430 +adblgrave;0201 +addakgurmukhi;0A71 +adeva;0905 +adieresis;00E4 +adieresiscyrillic;04D3 +adieresismacron;01DF +adotbelow;1EA1 +adotmacron;01E1 +ae;00E6 +aeacute;01FD +aekorean;3150 +aemacron;01E3 +afii00208;2015 +afii08941;20A4 +afii10017;0410 +afii10018;0411 +afii10019;0412 +afii10020;0413 +afii10021;0414 +afii10022;0415 +afii10023;0401 +afii10024;0416 +afii10025;0417 +afii10026;0418 +afii10027;0419 +afii10028;041A +afii10029;041B +afii10030;041C +afii10031;041D +afii10032;041E +afii10033;041F +afii10034;0420 +afii10035;0421 +afii10036;0422 +afii10037;0423 +afii10038;0424 +afii10039;0425 +afii10040;0426 +afii10041;0427 +afii10042;0428 +afii10043;0429 +afii10044;042A +afii10045;042B +afii10046;042C +afii10047;042D +afii10048;042E +afii10049;042F +afii10050;0490 +afii10051;0402 +afii10052;0403 +afii10053;0404 +afii10054;0405 +afii10055;0406 +afii10056;0407 +afii10057;0408 +afii10058;0409 +afii10059;040A +afii10060;040B +afii10061;040C +afii10062;040E +afii10063;F6C4 +afii10064;F6C5 +afii10065;0430 +afii10066;0431 +afii10067;0432 +afii10068;0433 +afii10069;0434 +afii10070;0435 +afii10071;0451 +afii10072;0436 +afii10073;0437 +afii10074;0438 +afii10075;0439 +afii10076;043A +afii10077;043B +afii10078;043C +afii10079;043D +afii10080;043E +afii10081;043F +afii10082;0440 +afii10083;0441 +afii10084;0442 +afii10085;0443 +afii10086;0444 +afii10087;0445 +afii10088;0446 +afii10089;0447 +afii10090;0448 +afii10091;0449 +afii10092;044A +afii10093;044B +afii10094;044C +afii10095;044D +afii10096;044E +afii10097;044F +afii10098;0491 +afii10099;0452 +afii10100;0453 +afii10101;0454 +afii10102;0455 +afii10103;0456 +afii10104;0457 +afii10105;0458 +afii10106;0459 +afii10107;045A +afii10108;045B +afii10109;045C +afii10110;045E +afii10145;040F +afii10146;0462 +afii10147;0472 +afii10148;0474 +afii10192;F6C6 +afii10193;045F +afii10194;0463 +afii10195;0473 +afii10196;0475 +afii10831;F6C7 +afii10832;F6C8 +afii10846;04D9 +afii299;200E +afii300;200F +afii301;200D +afii57381;066A +afii57388;060C +afii57392;0660 +afii57393;0661 +afii57394;0662 +afii57395;0663 +afii57396;0664 +afii57397;0665 +afii57398;0666 +afii57399;0667 +afii57400;0668 +afii57401;0669 +afii57403;061B +afii57407;061F +afii57409;0621 +afii57410;0622 +afii57411;0623 +afii57412;0624 +afii57413;0625 +afii57414;0626 +afii57415;0627 +afii57416;0628 +afii57417;0629 +afii57418;062A +afii57419;062B +afii57420;062C +afii57421;062D +afii57422;062E +afii57423;062F +afii57424;0630 +afii57425;0631 +afii57426;0632 +afii57427;0633 +afii57428;0634 +afii57429;0635 +afii57430;0636 +afii57431;0637 +afii57432;0638 +afii57433;0639 +afii57434;063A +afii57440;0640 +afii57441;0641 +afii57442;0642 +afii57443;0643 +afii57444;0644 +afii57445;0645 +afii57446;0646 +afii57448;0648 +afii57449;0649 +afii57450;064A +afii57451;064B +afii57452;064C +afii57453;064D +afii57454;064E +afii57455;064F +afii57456;0650 +afii57457;0651 +afii57458;0652 +afii57470;0647 +afii57505;06A4 +afii57506;067E +afii57507;0686 +afii57508;0698 +afii57509;06AF +afii57511;0679 +afii57512;0688 +afii57513;0691 +afii57514;06BA +afii57519;06D2 +afii57534;06D5 +afii57636;20AA +afii57645;05BE +afii57658;05C3 +afii57664;05D0 +afii57665;05D1 +afii57666;05D2 +afii57667;05D3 +afii57668;05D4 +afii57669;05D5 +afii57670;05D6 +afii57671;05D7 +afii57672;05D8 +afii57673;05D9 +afii57674;05DA +afii57675;05DB +afii57676;05DC +afii57677;05DD +afii57678;05DE +afii57679;05DF +afii57680;05E0 +afii57681;05E1 +afii57682;05E2 +afii57683;05E3 +afii57684;05E4 +afii57685;05E5 +afii57686;05E6 +afii57687;05E7 +afii57688;05E8 +afii57689;05E9 +afii57690;05EA +afii57694;FB2A +afii57695;FB2B +afii57700;FB4B +afii57705;FB1F +afii57716;05F0 +afii57717;05F1 +afii57718;05F2 +afii57723;FB35 +afii57793;05B4 +afii57794;05B5 +afii57795;05B6 +afii57796;05BB +afii57797;05B8 +afii57798;05B7 +afii57799;05B0 +afii57800;05B2 +afii57801;05B1 +afii57802;05B3 +afii57803;05C2 +afii57804;05C1 +afii57806;05B9 +afii57807;05BC +afii57839;05BD +afii57841;05BF +afii57842;05C0 +afii57929;02BC +afii61248;2105 +afii61289;2113 +afii61352;2116 +afii61573;202C +afii61574;202D +afii61575;202E +afii61664;200C +afii63167;066D +afii64937;02BD +agrave;00E0 +agujarati;0A85 +agurmukhi;0A05 +ahiragana;3042 +ahookabove;1EA3 +aibengali;0990 +aibopomofo;311E +aideva;0910 +aiecyrillic;04D5 +aigujarati;0A90 +aigurmukhi;0A10 +aimatragurmukhi;0A48 +ainarabic;0639 +ainfinalarabic;FECA +aininitialarabic;FECB +ainmedialarabic;FECC +ainvertedbreve;0203 +aivowelsignbengali;09C8 +aivowelsigndeva;0948 +aivowelsigngujarati;0AC8 +akatakana;30A2 +akatakanahalfwidth;FF71 +akorean;314F +alef;05D0 +alefarabic;0627 +alefdageshhebrew;FB30 +aleffinalarabic;FE8E +alefhamzaabovearabic;0623 +alefhamzaabovefinalarabic;FE84 +alefhamzabelowarabic;0625 +alefhamzabelowfinalarabic;FE88 +alefhebrew;05D0 +aleflamedhebrew;FB4F +alefmaddaabovearabic;0622 +alefmaddaabovefinalarabic;FE82 +alefmaksuraarabic;0649 +alefmaksurafinalarabic;FEF0 +alefmaksurainitialarabic;FEF3 +alefmaksuramedialarabic;FEF4 +alefpatahhebrew;FB2E +alefqamatshebrew;FB2F +aleph;2135 +allequal;224C +alpha;03B1 +alphatonos;03AC +amacron;0101 +amonospace;FF41 +ampersand;0026 +ampersandmonospace;FF06 +ampersandsmall;F726 +amsquare;33C2 +anbopomofo;3122 +angbopomofo;3124 +angkhankhuthai;0E5A +angle;2220 +anglebracketleft;3008 +anglebracketleftvertical;FE3F +anglebracketright;3009 +anglebracketrightvertical;FE40 +angleleft;2329 +angleright;232A +angstrom;212B +anoteleia;0387 +anudattadeva;0952 +anusvarabengali;0982 +anusvaradeva;0902 +anusvaragujarati;0A82 +aogonek;0105 +apaatosquare;3300 +aparen;249C +apostrophearmenian;055A +apostrophemod;02BC +apple;F8FF +approaches;2250 +approxequal;2248 +approxequalorimage;2252 +approximatelyequal;2245 +araeaekorean;318E +araeakorean;318D +arc;2312 +arighthalfring;1E9A +aring;00E5 +aringacute;01FB +aringbelow;1E01 +arrowboth;2194 +arrowdashdown;21E3 +arrowdashleft;21E0 +arrowdashright;21E2 +arrowdashup;21E1 +arrowdblboth;21D4 +arrowdbldown;21D3 +arrowdblleft;21D0 +arrowdblright;21D2 +arrowdblup;21D1 +arrowdown;2193 +arrowdownleft;2199 +arrowdownright;2198 +arrowdownwhite;21E9 +arrowheaddownmod;02C5 +arrowheadleftmod;02C2 +arrowheadrightmod;02C3 +arrowheadupmod;02C4 +arrowhorizex;F8E7 +arrowleft;2190 +arrowleftdbl;21D0 +arrowleftdblstroke;21CD +arrowleftoverright;21C6 +arrowleftwhite;21E6 +arrowright;2192 +arrowrightdblstroke;21CF +arrowrightheavy;279E +arrowrightoverleft;21C4 +arrowrightwhite;21E8 +arrowtableft;21E4 +arrowtabright;21E5 +arrowup;2191 +arrowupdn;2195 +arrowupdnbse;21A8 +arrowupdownbase;21A8 +arrowupleft;2196 +arrowupleftofdown;21C5 +arrowupright;2197 +arrowupwhite;21E7 +arrowvertex;F8E6 +asciicircum;005E +asciicircummonospace;FF3E +asciitilde;007E +asciitildemonospace;FF5E +ascript;0251 +ascriptturned;0252 +asmallhiragana;3041 +asmallkatakana;30A1 +asmallkatakanahalfwidth;FF67 +asterisk;002A +asteriskaltonearabic;066D +asteriskarabic;066D +asteriskmath;2217 +asteriskmonospace;FF0A +asterisksmall;FE61 +asterism;2042 +asuperior;F6E9 +asymptoticallyequal;2243 +at;0040 +atilde;00E3 +atmonospace;FF20 +atsmall;FE6B +aturned;0250 +aubengali;0994 +aubopomofo;3120 +audeva;0914 +augujarati;0A94 +augurmukhi;0A14 +aulengthmarkbengali;09D7 +aumatragurmukhi;0A4C +auvowelsignbengali;09CC +auvowelsigndeva;094C +auvowelsigngujarati;0ACC +avagrahadeva;093D +aybarmenian;0561 +ayin;05E2 +ayinaltonehebrew;FB20 +ayinhebrew;05E2 +b;0062 +babengali;09AC +backslash;005C +backslashmonospace;FF3C +badeva;092C +bagujarati;0AAC +bagurmukhi;0A2C +bahiragana;3070 +bahtthai;0E3F +bakatakana;30D0 +bar;007C +barmonospace;FF5C +bbopomofo;3105 +bcircle;24D1 +bdotaccent;1E03 +bdotbelow;1E05 +beamedsixteenthnotes;266C +because;2235 +becyrillic;0431 +beharabic;0628 +behfinalarabic;FE90 +behinitialarabic;FE91 +behiragana;3079 +behmedialarabic;FE92 +behmeeminitialarabic;FC9F +behmeemisolatedarabic;FC08 +behnoonfinalarabic;FC6D +bekatakana;30D9 +benarmenian;0562 +bet;05D1 +beta;03B2 +betasymbolgreek;03D0 +betdagesh;FB31 +betdageshhebrew;FB31 +bethebrew;05D1 +betrafehebrew;FB4C +bhabengali;09AD +bhadeva;092D +bhagujarati;0AAD +bhagurmukhi;0A2D +bhook;0253 +bihiragana;3073 +bikatakana;30D3 +bilabialclick;0298 +bindigurmukhi;0A02 +birusquare;3331 +blackcircle;25CF +blackdiamond;25C6 +blackdownpointingtriangle;25BC +blackleftpointingpointer;25C4 +blackleftpointingtriangle;25C0 +blacklenticularbracketleft;3010 +blacklenticularbracketleftvertical;FE3B +blacklenticularbracketright;3011 +blacklenticularbracketrightvertical;FE3C +blacklowerlefttriangle;25E3 +blacklowerrighttriangle;25E2 +blackrectangle;25AC +blackrightpointingpointer;25BA +blackrightpointingtriangle;25B6 +blacksmallsquare;25AA +blacksmilingface;263B +blacksquare;25A0 +blackstar;2605 +blackupperlefttriangle;25E4 +blackupperrighttriangle;25E5 +blackuppointingsmalltriangle;25B4 +blackuppointingtriangle;25B2 +blank;2423 +blinebelow;1E07 +block;2588 +bmonospace;FF42 +bobaimaithai;0E1A +bohiragana;307C +bokatakana;30DC +bparen;249D +bqsquare;33C3 +braceex;F8F4 +braceleft;007B +braceleftbt;F8F3 +braceleftmid;F8F2 +braceleftmonospace;FF5B +braceleftsmall;FE5B +bracelefttp;F8F1 +braceleftvertical;FE37 +braceright;007D +bracerightbt;F8FE +bracerightmid;F8FD +bracerightmonospace;FF5D +bracerightsmall;FE5C +bracerighttp;F8FC +bracerightvertical;FE38 +bracketleft;005B +bracketleftbt;F8F0 +bracketleftex;F8EF +bracketleftmonospace;FF3B +bracketlefttp;F8EE +bracketright;005D +bracketrightbt;F8FB +bracketrightex;F8FA +bracketrightmonospace;FF3D +bracketrighttp;F8F9 +breve;02D8 +brevebelowcmb;032E +brevecmb;0306 +breveinvertedbelowcmb;032F +breveinvertedcmb;0311 +breveinverteddoublecmb;0361 +bridgebelowcmb;032A +bridgeinvertedbelowcmb;033A +brokenbar;00A6 +bstroke;0180 +bsuperior;F6EA +btopbar;0183 +buhiragana;3076 +bukatakana;30D6 +bullet;2022 +bulletinverse;25D8 +bulletoperator;2219 +bullseye;25CE +c;0063 +caarmenian;056E +cabengali;099A +cacute;0107 +cadeva;091A +cagujarati;0A9A +cagurmukhi;0A1A +calsquare;3388 +candrabindubengali;0981 +candrabinducmb;0310 +candrabindudeva;0901 +candrabindugujarati;0A81 +capslock;21EA +careof;2105 +caron;02C7 +caronbelowcmb;032C +caroncmb;030C +carriagereturn;21B5 +cbopomofo;3118 +ccaron;010D +ccedilla;00E7 +ccedillaacute;1E09 +ccircle;24D2 +ccircumflex;0109 +ccurl;0255 +cdot;010B +cdotaccent;010B +cdsquare;33C5 +cedilla;00B8 +cedillacmb;0327 +cent;00A2 +centigrade;2103 +centinferior;F6DF +centmonospace;FFE0 +centoldstyle;F7A2 +centsuperior;F6E0 +chaarmenian;0579 +chabengali;099B +chadeva;091B +chagujarati;0A9B +chagurmukhi;0A1B +chbopomofo;3114 +cheabkhasiancyrillic;04BD +checkmark;2713 +checyrillic;0447 +chedescenderabkhasiancyrillic;04BF +chedescendercyrillic;04B7 +chedieresiscyrillic;04F5 +cheharmenian;0573 +chekhakassiancyrillic;04CC +cheverticalstrokecyrillic;04B9 +chi;03C7 +chieuchacirclekorean;3277 +chieuchaparenkorean;3217 +chieuchcirclekorean;3269 +chieuchkorean;314A +chieuchparenkorean;3209 +chochangthai;0E0A +chochanthai;0E08 +chochingthai;0E09 +chochoethai;0E0C +chook;0188 +cieucacirclekorean;3276 +cieucaparenkorean;3216 +cieuccirclekorean;3268 +cieuckorean;3148 +cieucparenkorean;3208 +cieucuparenkorean;321C +circle;25CB +circlemultiply;2297 +circleot;2299 +circleplus;2295 +circlepostalmark;3036 +circlewithlefthalfblack;25D0 +circlewithrighthalfblack;25D1 +circumflex;02C6 +circumflexbelowcmb;032D +circumflexcmb;0302 +clear;2327 +clickalveolar;01C2 +clickdental;01C0 +clicklateral;01C1 +clickretroflex;01C3 +club;2663 +clubsuitblack;2663 +clubsuitwhite;2667 +cmcubedsquare;33A4 +cmonospace;FF43 +cmsquaredsquare;33A0 +coarmenian;0581 +colon;003A +colonmonetary;20A1 +colonmonospace;FF1A +colonsign;20A1 +colonsmall;FE55 +colontriangularhalfmod;02D1 +colontriangularmod;02D0 +comma;002C +commaabovecmb;0313 +commaaboverightcmb;0315 +commaaccent;F6C3 +commaarabic;060C +commaarmenian;055D +commainferior;F6E1 +commamonospace;FF0C +commareversedabovecmb;0314 +commareversedmod;02BD +commasmall;FE50 +commasuperior;F6E2 +commaturnedabovecmb;0312 +commaturnedmod;02BB +compass;263C +congruent;2245 +contourintegral;222E +control;2303 +controlACK;0006 +controlBEL;0007 +controlBS;0008 +controlCAN;0018 +controlCR;000D +controlDC1;0011 +controlDC2;0012 +controlDC3;0013 +controlDC4;0014 +controlDEL;007F +controlDLE;0010 +controlEM;0019 +controlENQ;0005 +controlEOT;0004 +controlESC;001B +controlETB;0017 +controlETX;0003 +controlFF;000C +controlFS;001C +controlGS;001D +controlHT;0009 +controlLF;000A +controlNAK;0015 +controlRS;001E +controlSI;000F +controlSO;000E +controlSOT;0002 +controlSTX;0001 +controlSUB;001A +controlSYN;0016 +controlUS;001F +controlVT;000B +copyright;00A9 +copyrightsans;F8E9 +copyrightserif;F6D9 +cornerbracketleft;300C +cornerbracketlefthalfwidth;FF62 +cornerbracketleftvertical;FE41 +cornerbracketright;300D +cornerbracketrighthalfwidth;FF63 +cornerbracketrightvertical;FE42 +corporationsquare;337F +cosquare;33C7 +coverkgsquare;33C6 +cparen;249E +cruzeiro;20A2 +cstretched;0297 +curlyand;22CF +curlyor;22CE +currency;00A4 +cyrBreve;F6D1 +cyrFlex;F6D2 +cyrbreve;F6D4 +cyrflex;F6D5 +d;0064 +daarmenian;0564 +dabengali;09A6 +dadarabic;0636 +dadeva;0926 +dadfinalarabic;FEBE +dadinitialarabic;FEBF +dadmedialarabic;FEC0 +dagesh;05BC +dageshhebrew;05BC +dagger;2020 +daggerdbl;2021 +dagujarati;0AA6 +dagurmukhi;0A26 +dahiragana;3060 +dakatakana;30C0 +dalarabic;062F +dalet;05D3 +daletdagesh;FB33 +daletdageshhebrew;FB33 +dalethatafpatah;05D3 05B2 +dalethatafpatahhebrew;05D3 05B2 +dalethatafsegol;05D3 05B1 +dalethatafsegolhebrew;05D3 05B1 +dalethebrew;05D3 +dalethiriq;05D3 05B4 +dalethiriqhebrew;05D3 05B4 +daletholam;05D3 05B9 +daletholamhebrew;05D3 05B9 +daletpatah;05D3 05B7 +daletpatahhebrew;05D3 05B7 +daletqamats;05D3 05B8 +daletqamatshebrew;05D3 05B8 +daletqubuts;05D3 05BB +daletqubutshebrew;05D3 05BB +daletsegol;05D3 05B6 +daletsegolhebrew;05D3 05B6 +daletsheva;05D3 05B0 +daletshevahebrew;05D3 05B0 +dalettsere;05D3 05B5 +dalettserehebrew;05D3 05B5 +dalfinalarabic;FEAA +dammaarabic;064F +dammalowarabic;064F +dammatanaltonearabic;064C +dammatanarabic;064C +danda;0964 +dargahebrew;05A7 +dargalefthebrew;05A7 +dasiapneumatacyrilliccmb;0485 +dblGrave;F6D3 +dblanglebracketleft;300A +dblanglebracketleftvertical;FE3D +dblanglebracketright;300B +dblanglebracketrightvertical;FE3E +dblarchinvertedbelowcmb;032B +dblarrowleft;21D4 +dblarrowright;21D2 +dbldanda;0965 +dblgrave;F6D6 +dblgravecmb;030F +dblintegral;222C +dbllowline;2017 +dbllowlinecmb;0333 +dbloverlinecmb;033F +dblprimemod;02BA +dblverticalbar;2016 +dblverticallineabovecmb;030E +dbopomofo;3109 +dbsquare;33C8 +dcaron;010F +dcedilla;1E11 +dcircle;24D3 +dcircumflexbelow;1E13 +dcroat;0111 +ddabengali;09A1 +ddadeva;0921 +ddagujarati;0AA1 +ddagurmukhi;0A21 +ddalarabic;0688 +ddalfinalarabic;FB89 +dddhadeva;095C +ddhabengali;09A2 +ddhadeva;0922 +ddhagujarati;0AA2 +ddhagurmukhi;0A22 +ddotaccent;1E0B +ddotbelow;1E0D +decimalseparatorarabic;066B +decimalseparatorpersian;066B +decyrillic;0434 +degree;00B0 +dehihebrew;05AD +dehiragana;3067 +deicoptic;03EF +dekatakana;30C7 +deleteleft;232B +deleteright;2326 +delta;03B4 +deltaturned;018D +denominatorminusonenumeratorbengali;09F8 +dezh;02A4 +dhabengali;09A7 +dhadeva;0927 +dhagujarati;0AA7 +dhagurmukhi;0A27 +dhook;0257 +dialytikatonos;0385 +dialytikatonoscmb;0344 +diamond;2666 +diamondsuitwhite;2662 +dieresis;00A8 +dieresisacute;F6D7 +dieresisbelowcmb;0324 +dieresiscmb;0308 +dieresisgrave;F6D8 +dieresistonos;0385 +dihiragana;3062 +dikatakana;30C2 +dittomark;3003 +divide;00F7 +divides;2223 +divisionslash;2215 +djecyrillic;0452 +dkshade;2593 +dlinebelow;1E0F +dlsquare;3397 +dmacron;0111 +dmonospace;FF44 +dnblock;2584 +dochadathai;0E0E +dodekthai;0E14 +dohiragana;3069 +dokatakana;30C9 +dollar;0024 +dollarinferior;F6E3 +dollarmonospace;FF04 +dollaroldstyle;F724 +dollarsmall;FE69 +dollarsuperior;F6E4 +dong;20AB +dorusquare;3326 +dotaccent;02D9 +dotaccentcmb;0307 +dotbelowcmb;0323 +dotbelowcomb;0323 +dotkatakana;30FB +dotlessi;0131 +dotlessj;F6BE +dotlessjstrokehook;0284 +dotmath;22C5 +dottedcircle;25CC +doubleyodpatah;FB1F +doubleyodpatahhebrew;FB1F +downtackbelowcmb;031E +downtackmod;02D5 +dparen;249F +dsuperior;F6EB +dtail;0256 +dtopbar;018C +duhiragana;3065 +dukatakana;30C5 +dz;01F3 +dzaltone;02A3 +dzcaron;01C6 +dzcurl;02A5 +dzeabkhasiancyrillic;04E1 +dzecyrillic;0455 +dzhecyrillic;045F +e;0065 +eacute;00E9 +earth;2641 +ebengali;098F +ebopomofo;311C +ebreve;0115 +ecandradeva;090D +ecandragujarati;0A8D +ecandravowelsigndeva;0945 +ecandravowelsigngujarati;0AC5 +ecaron;011B +ecedillabreve;1E1D +echarmenian;0565 +echyiwnarmenian;0587 +ecircle;24D4 +ecircumflex;00EA +ecircumflexacute;1EBF +ecircumflexbelow;1E19 +ecircumflexdotbelow;1EC7 +ecircumflexgrave;1EC1 +ecircumflexhookabove;1EC3 +ecircumflextilde;1EC5 +ecyrillic;0454 +edblgrave;0205 +edeva;090F +edieresis;00EB +edot;0117 +edotaccent;0117 +edotbelow;1EB9 +eegurmukhi;0A0F +eematragurmukhi;0A47 +efcyrillic;0444 +egrave;00E8 +egujarati;0A8F +eharmenian;0567 +ehbopomofo;311D +ehiragana;3048 +ehookabove;1EBB +eibopomofo;311F +eight;0038 +eightarabic;0668 +eightbengali;09EE +eightcircle;2467 +eightcircleinversesansserif;2791 +eightdeva;096E +eighteencircle;2471 +eighteenparen;2485 +eighteenperiod;2499 +eightgujarati;0AEE +eightgurmukhi;0A6E +eighthackarabic;0668 +eighthangzhou;3028 +eighthnotebeamed;266B +eightideographicparen;3227 +eightinferior;2088 +eightmonospace;FF18 +eightoldstyle;F738 +eightparen;247B +eightperiod;248F +eightpersian;06F8 +eightroman;2177 +eightsuperior;2078 +eightthai;0E58 +einvertedbreve;0207 +eiotifiedcyrillic;0465 +ekatakana;30A8 +ekatakanahalfwidth;FF74 +ekonkargurmukhi;0A74 +ekorean;3154 +elcyrillic;043B +element;2208 +elevencircle;246A +elevenparen;247E +elevenperiod;2492 +elevenroman;217A +ellipsis;2026 +ellipsisvertical;22EE +emacron;0113 +emacronacute;1E17 +emacrongrave;1E15 +emcyrillic;043C +emdash;2014 +emdashvertical;FE31 +emonospace;FF45 +emphasismarkarmenian;055B +emptyset;2205 +enbopomofo;3123 +encyrillic;043D +endash;2013 +endashvertical;FE32 +endescendercyrillic;04A3 +eng;014B +engbopomofo;3125 +enghecyrillic;04A5 +enhookcyrillic;04C8 +enspace;2002 +eogonek;0119 +eokorean;3153 +eopen;025B +eopenclosed;029A +eopenreversed;025C +eopenreversedclosed;025E +eopenreversedhook;025D +eparen;24A0 +epsilon;03B5 +epsilontonos;03AD +equal;003D +equalmonospace;FF1D +equalsmall;FE66 +equalsuperior;207C +equivalence;2261 +erbopomofo;3126 +ercyrillic;0440 +ereversed;0258 +ereversedcyrillic;044D +escyrillic;0441 +esdescendercyrillic;04AB +esh;0283 +eshcurl;0286 +eshortdeva;090E +eshortvowelsigndeva;0946 +eshreversedloop;01AA +eshsquatreversed;0285 +esmallhiragana;3047 +esmallkatakana;30A7 +esmallkatakanahalfwidth;FF6A +estimated;212E +esuperior;F6EC +eta;03B7 +etarmenian;0568 +etatonos;03AE +eth;00F0 +etilde;1EBD +etildebelow;1E1B +etnahtafoukhhebrew;0591 +etnahtafoukhlefthebrew;0591 +etnahtahebrew;0591 +etnahtalefthebrew;0591 +eturned;01DD +eukorean;3161 +euro;20AC +evowelsignbengali;09C7 +evowelsigndeva;0947 +evowelsigngujarati;0AC7 +exclam;0021 +exclamarmenian;055C +exclamdbl;203C +exclamdown;00A1 +exclamdownsmall;F7A1 +exclammonospace;FF01 +exclamsmall;F721 +existential;2203 +ezh;0292 +ezhcaron;01EF +ezhcurl;0293 +ezhreversed;01B9 +ezhtail;01BA +f;0066 +fadeva;095E +fagurmukhi;0A5E +fahrenheit;2109 +fathaarabic;064E +fathalowarabic;064E +fathatanarabic;064B +fbopomofo;3108 +fcircle;24D5 +fdotaccent;1E1F +feharabic;0641 +feharmenian;0586 +fehfinalarabic;FED2 +fehinitialarabic;FED3 +fehmedialarabic;FED4 +feicoptic;03E5 +female;2640 +ff;FB00 +f_f;FB00 +ffi;FB03 +f_f_i;FB03 +ffl;FB04 +f_f_l;FB04 +fi;FB01 +f_i;FB01 +fifteencircle;246E +fifteenparen;2482 +fifteenperiod;2496 +figuredash;2012 +filledbox;25A0 +filledrect;25AC +finalkaf;05DA +finalkafdagesh;FB3A +finalkafdageshhebrew;FB3A +finalkafhebrew;05DA +finalkafqamats;05DA 05B8 +finalkafqamatshebrew;05DA 05B8 +finalkafsheva;05DA 05B0 +finalkafshevahebrew;05DA 05B0 +finalmem;05DD +finalmemhebrew;05DD +finalnun;05DF +finalnunhebrew;05DF +finalpe;05E3 +finalpehebrew;05E3 +finaltsadi;05E5 +finaltsadihebrew;05E5 +firsttonechinese;02C9 +fisheye;25C9 +fitacyrillic;0473 +five;0035 +fivearabic;0665 +fivebengali;09EB +fivecircle;2464 +fivecircleinversesansserif;278E +fivedeva;096B +fiveeighths;215D +fivegujarati;0AEB +fivegurmukhi;0A6B +fivehackarabic;0665 +fivehangzhou;3025 +fiveideographicparen;3224 +fiveinferior;2085 +fivemonospace;FF15 +fiveoldstyle;F735 +fiveparen;2478 +fiveperiod;248C +fivepersian;06F5 +fiveroman;2174 +fivesuperior;2075 +fivethai;0E55 +fl;FB02 +f_l;FB02 +florin;0192 +fmonospace;FF46 +fmsquare;3399 +fofanthai;0E1F +fofathai;0E1D +fongmanthai;0E4F +forall;2200 +four;0034 +fourarabic;0664 +fourbengali;09EA +fourcircle;2463 +fourcircleinversesansserif;278D +fourdeva;096A +fourgujarati;0AEA +fourgurmukhi;0A6A +fourhackarabic;0664 +fourhangzhou;3024 +fourideographicparen;3223 +fourinferior;2084 +fourmonospace;FF14 +fournumeratorbengali;09F7 +fouroldstyle;F734 +fourparen;2477 +fourperiod;248B +fourpersian;06F4 +fourroman;2173 +foursuperior;2074 +fourteencircle;246D +fourteenparen;2481 +fourteenperiod;2495 +fourthai;0E54 +fourthtonechinese;02CB +fparen;24A1 +fraction;2044 +franc;20A3 +g;0067 +gabengali;0997 +gacute;01F5 +gadeva;0917 +gafarabic;06AF +gaffinalarabic;FB93 +gafinitialarabic;FB94 +gafmedialarabic;FB95 +gagujarati;0A97 +gagurmukhi;0A17 +gahiragana;304C +gakatakana;30AC +gamma;03B3 +gammalatinsmall;0263 +gammasuperior;02E0 +gangiacoptic;03EB +gbopomofo;310D +gbreve;011F +gcaron;01E7 +gcedilla;0123 +gcircle;24D6 +gcircumflex;011D +gcommaaccent;0123 +gdot;0121 +gdotaccent;0121 +gecyrillic;0433 +gehiragana;3052 +gekatakana;30B2 +geometricallyequal;2251 +gereshaccenthebrew;059C +gereshhebrew;05F3 +gereshmuqdamhebrew;059D +germandbls;00DF +gershayimaccenthebrew;059E +gershayimhebrew;05F4 +getamark;3013 +ghabengali;0998 +ghadarmenian;0572 +ghadeva;0918 +ghagujarati;0A98 +ghagurmukhi;0A18 +ghainarabic;063A +ghainfinalarabic;FECE +ghaininitialarabic;FECF +ghainmedialarabic;FED0 +ghemiddlehookcyrillic;0495 +ghestrokecyrillic;0493 +gheupturncyrillic;0491 +ghhadeva;095A +ghhagurmukhi;0A5A +ghook;0260 +ghzsquare;3393 +gihiragana;304E +gikatakana;30AE +gimarmenian;0563 +gimel;05D2 +gimeldagesh;FB32 +gimeldageshhebrew;FB32 +gimelhebrew;05D2 +gjecyrillic;0453 +glottalinvertedstroke;01BE +glottalstop;0294 +glottalstopinverted;0296 +glottalstopmod;02C0 +glottalstopreversed;0295 +glottalstopreversedmod;02C1 +glottalstopreversedsuperior;02E4 +glottalstopstroke;02A1 +glottalstopstrokereversed;02A2 +gmacron;1E21 +gmonospace;FF47 +gohiragana;3054 +gokatakana;30B4 +gparen;24A2 +gpasquare;33AC +gradient;2207 +grave;0060 +gravebelowcmb;0316 +gravecmb;0300 +gravecomb;0300 +gravedeva;0953 +gravelowmod;02CE +gravemonospace;FF40 +gravetonecmb;0340 +greater;003E +greaterequal;2265 +greaterequalorless;22DB +greatermonospace;FF1E +greaterorequivalent;2273 +greaterorless;2277 +greateroverequal;2267 +greatersmall;FE65 +gscript;0261 +gstroke;01E5 +guhiragana;3050 +guillemotleft;00AB +guillemotright;00BB +guilsinglleft;2039 +guilsinglright;203A +gukatakana;30B0 +guramusquare;3318 +gysquare;33C9 +h;0068 +haabkhasiancyrillic;04A9 +haaltonearabic;06C1 +habengali;09B9 +hadescendercyrillic;04B3 +hadeva;0939 +hagujarati;0AB9 +hagurmukhi;0A39 +haharabic;062D +hahfinalarabic;FEA2 +hahinitialarabic;FEA3 +hahiragana;306F +hahmedialarabic;FEA4 +haitusquare;332A +hakatakana;30CF +hakatakanahalfwidth;FF8A +halantgurmukhi;0A4D +hamzaarabic;0621 +hamzadammaarabic;0621 064F +hamzadammatanarabic;0621 064C +hamzafathaarabic;0621 064E +hamzafathatanarabic;0621 064B +hamzalowarabic;0621 +hamzalowkasraarabic;0621 0650 +hamzalowkasratanarabic;0621 064D +hamzasukunarabic;0621 0652 +hangulfiller;3164 +hardsigncyrillic;044A +harpoonleftbarbup;21BC +harpoonrightbarbup;21C0 +hasquare;33CA +hatafpatah;05B2 +hatafpatah16;05B2 +hatafpatah23;05B2 +hatafpatah2f;05B2 +hatafpatahhebrew;05B2 +hatafpatahnarrowhebrew;05B2 +hatafpatahquarterhebrew;05B2 +hatafpatahwidehebrew;05B2 +hatafqamats;05B3 +hatafqamats1b;05B3 +hatafqamats28;05B3 +hatafqamats34;05B3 +hatafqamatshebrew;05B3 +hatafqamatsnarrowhebrew;05B3 +hatafqamatsquarterhebrew;05B3 +hatafqamatswidehebrew;05B3 +hatafsegol;05B1 +hatafsegol17;05B1 +hatafsegol24;05B1 +hatafsegol30;05B1 +hatafsegolhebrew;05B1 +hatafsegolnarrowhebrew;05B1 +hatafsegolquarterhebrew;05B1 +hatafsegolwidehebrew;05B1 +hbar;0127 +hbopomofo;310F +hbrevebelow;1E2B +hcedilla;1E29 +hcircle;24D7 +hcircumflex;0125 +hdieresis;1E27 +hdotaccent;1E23 +hdotbelow;1E25 +he;05D4 +heart;2665 +heartsuitblack;2665 +heartsuitwhite;2661 +hedagesh;FB34 +hedageshhebrew;FB34 +hehaltonearabic;06C1 +heharabic;0647 +hehebrew;05D4 +hehfinalaltonearabic;FBA7 +hehfinalalttwoarabic;FEEA +hehfinalarabic;FEEA +hehhamzaabovefinalarabic;FBA5 +hehhamzaaboveisolatedarabic;FBA4 +hehinitialaltonearabic;FBA8 +hehinitialarabic;FEEB +hehiragana;3078 +hehmedialaltonearabic;FBA9 +hehmedialarabic;FEEC +heiseierasquare;337B +hekatakana;30D8 +hekatakanahalfwidth;FF8D +hekutaarusquare;3336 +henghook;0267 +herutusquare;3339 +het;05D7 +hethebrew;05D7 +hhook;0266 +hhooksuperior;02B1 +hieuhacirclekorean;327B +hieuhaparenkorean;321B +hieuhcirclekorean;326D +hieuhkorean;314E +hieuhparenkorean;320D +hihiragana;3072 +hikatakana;30D2 +hikatakanahalfwidth;FF8B +hiriq;05B4 +hiriq14;05B4 +hiriq21;05B4 +hiriq2d;05B4 +hiriqhebrew;05B4 +hiriqnarrowhebrew;05B4 +hiriqquarterhebrew;05B4 +hiriqwidehebrew;05B4 +hlinebelow;1E96 +hmonospace;FF48 +hoarmenian;0570 +hohipthai;0E2B +hohiragana;307B +hokatakana;30DB +hokatakanahalfwidth;FF8E +holam;05B9 +holam19;05B9 +holam26;05B9 +holam32;05B9 +holamhebrew;05B9 +holamnarrowhebrew;05B9 +holamquarterhebrew;05B9 +holamwidehebrew;05B9 +honokhukthai;0E2E +hookabovecomb;0309 +hookcmb;0309 +hookpalatalizedbelowcmb;0321 +hookretroflexbelowcmb;0322 +hoonsquare;3342 +horicoptic;03E9 +horizontalbar;2015 +horncmb;031B +hotsprings;2668 +house;2302 +hparen;24A3 +hsuperior;02B0 +hturned;0265 +huhiragana;3075 +huiitosquare;3333 +hukatakana;30D5 +hukatakanahalfwidth;FF8C +hungarumlaut;02DD +hungarumlautcmb;030B +hv;0195 +hyphen;002D +hypheninferior;F6E5 +hyphenmonospace;FF0D +hyphensmall;FE63 +hyphensuperior;F6E6 +hyphentwo;2010 +i;0069 +iacute;00ED +iacyrillic;044F +ibengali;0987 +ibopomofo;3127 +ibreve;012D +icaron;01D0 +icircle;24D8 +icircumflex;00EE +icyrillic;0456 +idblgrave;0209 +ideographearthcircle;328F +ideographfirecircle;328B +ideographicallianceparen;323F +ideographiccallparen;323A +ideographiccentrecircle;32A5 +ideographicclose;3006 +ideographiccomma;3001 +ideographiccommaleft;FF64 +ideographiccongratulationparen;3237 +ideographiccorrectcircle;32A3 +ideographicearthparen;322F +ideographicenterpriseparen;323D +ideographicexcellentcircle;329D +ideographicfestivalparen;3240 +ideographicfinancialcircle;3296 +ideographicfinancialparen;3236 +ideographicfireparen;322B +ideographichaveparen;3232 +ideographichighcircle;32A4 +ideographiciterationmark;3005 +ideographiclaborcircle;3298 +ideographiclaborparen;3238 +ideographicleftcircle;32A7 +ideographiclowcircle;32A6 +ideographicmedicinecircle;32A9 +ideographicmetalparen;322E +ideographicmoonparen;322A +ideographicnameparen;3234 +ideographicperiod;3002 +ideographicprintcircle;329E +ideographicreachparen;3243 +ideographicrepresentparen;3239 +ideographicresourceparen;323E +ideographicrightcircle;32A8 +ideographicsecretcircle;3299 +ideographicselfparen;3242 +ideographicsocietyparen;3233 +ideographicspace;3000 +ideographicspecialparen;3235 +ideographicstockparen;3231 +ideographicstudyparen;323B +ideographicsunparen;3230 +ideographicsuperviseparen;323C +ideographicwaterparen;322C +ideographicwoodparen;322D +ideographiczero;3007 +ideographmetalcircle;328E +ideographmooncircle;328A +ideographnamecircle;3294 +ideographsuncircle;3290 +ideographwatercircle;328C +ideographwoodcircle;328D +ideva;0907 +idieresis;00EF +idieresisacute;1E2F +idieresiscyrillic;04E5 +idotbelow;1ECB +iebrevecyrillic;04D7 +iecyrillic;0435 +ieungacirclekorean;3275 +ieungaparenkorean;3215 +ieungcirclekorean;3267 +ieungkorean;3147 +ieungparenkorean;3207 +igrave;00EC +igujarati;0A87 +igurmukhi;0A07 +ihiragana;3044 +ihookabove;1EC9 +iibengali;0988 +iicyrillic;0438 +iideva;0908 +iigujarati;0A88 +iigurmukhi;0A08 +iimatragurmukhi;0A40 +iinvertedbreve;020B +iishortcyrillic;0439 +iivowelsignbengali;09C0 +iivowelsigndeva;0940 +iivowelsigngujarati;0AC0 +ij;0133 +ikatakana;30A4 +ikatakanahalfwidth;FF72 +ikorean;3163 +ilde;02DC +iluyhebrew;05AC +imacron;012B +imacroncyrillic;04E3 +imageorapproximatelyequal;2253 +imatragurmukhi;0A3F +imonospace;FF49 +increment;2206 +infinity;221E +iniarmenian;056B +integral;222B +integralbottom;2321 +integralbt;2321 +integralex;F8F5 +integraltop;2320 +integraltp;2320 +intersection;2229 +intisquare;3305 +invbullet;25D8 +invcircle;25D9 +invsmileface;263B +iocyrillic;0451 +iogonek;012F +iota;03B9 +iotadieresis;03CA +iotadieresistonos;0390 +iotalatin;0269 +iotatonos;03AF +iparen;24A4 +irigurmukhi;0A72 +ismallhiragana;3043 +ismallkatakana;30A3 +ismallkatakanahalfwidth;FF68 +issharbengali;09FA +istroke;0268 +isuperior;F6ED +iterationhiragana;309D +iterationkatakana;30FD +itilde;0129 +itildebelow;1E2D +iubopomofo;3129 +iucyrillic;044E +ivowelsignbengali;09BF +ivowelsigndeva;093F +ivowelsigngujarati;0ABF +izhitsacyrillic;0475 +izhitsadblgravecyrillic;0477 +j;006A +jaarmenian;0571 +jabengali;099C +jadeva;091C +jagujarati;0A9C +jagurmukhi;0A1C +jbopomofo;3110 +jcaron;01F0 +jcircle;24D9 +jcircumflex;0135 +jcrossedtail;029D +jdotlessstroke;025F +jecyrillic;0458 +jeemarabic;062C +jeemfinalarabic;FE9E +jeeminitialarabic;FE9F +jeemmedialarabic;FEA0 +jeharabic;0698 +jehfinalarabic;FB8B +jhabengali;099D +jhadeva;091D +jhagujarati;0A9D +jhagurmukhi;0A1D +jheharmenian;057B +jis;3004 +jmonospace;FF4A +jparen;24A5 +jsuperior;02B2 +k;006B +kabashkircyrillic;04A1 +kabengali;0995 +kacute;1E31 +kacyrillic;043A +kadescendercyrillic;049B +kadeva;0915 +kaf;05DB +kafarabic;0643 +kafdagesh;FB3B +kafdageshhebrew;FB3B +kaffinalarabic;FEDA +kafhebrew;05DB +kafinitialarabic;FEDB +kafmedialarabic;FEDC +kafrafehebrew;FB4D +kagujarati;0A95 +kagurmukhi;0A15 +kahiragana;304B +kahookcyrillic;04C4 +kakatakana;30AB +kakatakanahalfwidth;FF76 +kappa;03BA +kappasymbolgreek;03F0 +kapyeounmieumkorean;3171 +kapyeounphieuphkorean;3184 +kapyeounpieupkorean;3178 +kapyeounssangpieupkorean;3179 +karoriisquare;330D +kashidaautoarabic;0640 +kashidaautonosidebearingarabic;0640 +kasmallkatakana;30F5 +kasquare;3384 +kasraarabic;0650 +kasratanarabic;064D +kastrokecyrillic;049F +katahiraprolongmarkhalfwidth;FF70 +kaverticalstrokecyrillic;049D +kbopomofo;310E +kcalsquare;3389 +kcaron;01E9 +kcedilla;0137 +kcircle;24DA +kcommaaccent;0137 +kdotbelow;1E33 +keharmenian;0584 +kehiragana;3051 +kekatakana;30B1 +kekatakanahalfwidth;FF79 +kenarmenian;056F +kesmallkatakana;30F6 +kgreenlandic;0138 +khabengali;0996 +khacyrillic;0445 +khadeva;0916 +khagujarati;0A96 +khagurmukhi;0A16 +khaharabic;062E +khahfinalarabic;FEA6 +khahinitialarabic;FEA7 +khahmedialarabic;FEA8 +kheicoptic;03E7 +khhadeva;0959 +khhagurmukhi;0A59 +khieukhacirclekorean;3278 +khieukhaparenkorean;3218 +khieukhcirclekorean;326A +khieukhkorean;314B +khieukhparenkorean;320A +khokhaithai;0E02 +khokhonthai;0E05 +khokhuatthai;0E03 +khokhwaithai;0E04 +khomutthai;0E5B +khook;0199 +khorakhangthai;0E06 +khzsquare;3391 +kihiragana;304D +kikatakana;30AD +kikatakanahalfwidth;FF77 +kiroguramusquare;3315 +kiromeetorusquare;3316 +kirosquare;3314 +kiyeokacirclekorean;326E +kiyeokaparenkorean;320E +kiyeokcirclekorean;3260 +kiyeokkorean;3131 +kiyeokparenkorean;3200 +kiyeoksioskorean;3133 +kjecyrillic;045C +klinebelow;1E35 +klsquare;3398 +kmcubedsquare;33A6 +kmonospace;FF4B +kmsquaredsquare;33A2 +kohiragana;3053 +kohmsquare;33C0 +kokaithai;0E01 +kokatakana;30B3 +kokatakanahalfwidth;FF7A +kooposquare;331E +koppacyrillic;0481 +koreanstandardsymbol;327F +koroniscmb;0343 +kparen;24A6 +kpasquare;33AA +ksicyrillic;046F +ktsquare;33CF +kturned;029E +kuhiragana;304F +kukatakana;30AF +kukatakanahalfwidth;FF78 +kvsquare;33B8 +kwsquare;33BE +l;006C +labengali;09B2 +lacute;013A +ladeva;0932 +lagujarati;0AB2 +lagurmukhi;0A32 +lakkhangyaothai;0E45 +lamaleffinalarabic;FEFC +lamalefhamzaabovefinalarabic;FEF8 +lamalefhamzaaboveisolatedarabic;FEF7 +lamalefhamzabelowfinalarabic;FEFA +lamalefhamzabelowisolatedarabic;FEF9 +lamalefisolatedarabic;FEFB +lamalefmaddaabovefinalarabic;FEF6 +lamalefmaddaaboveisolatedarabic;FEF5 +lamarabic;0644 +lambda;03BB +lambdastroke;019B +lamed;05DC +lameddagesh;FB3C +lameddageshhebrew;FB3C +lamedhebrew;05DC +lamedholam;05DC 05B9 +lamedholamdagesh;05DC 05B9 05BC +lamedholamdageshhebrew;05DC 05B9 05BC +lamedholamhebrew;05DC 05B9 +lamfinalarabic;FEDE +lamhahinitialarabic;FCCA +laminitialarabic;FEDF +lamjeeminitialarabic;FCC9 +lamkhahinitialarabic;FCCB +lamlamhehisolatedarabic;FDF2 +lammedialarabic;FEE0 +lammeemhahinitialarabic;FD88 +lammeeminitialarabic;FCCC +lammeemjeeminitialarabic;FEDF FEE4 FEA0 +lammeemkhahinitialarabic;FEDF FEE4 FEA8 +largecircle;25EF +lbar;019A +lbelt;026C +lbopomofo;310C +lcaron;013E +lcedilla;013C +lcircle;24DB +lcircumflexbelow;1E3D +lcommaaccent;013C +ldot;0140 +ldotaccent;0140 +ldotbelow;1E37 +ldotbelowmacron;1E39 +leftangleabovecmb;031A +lefttackbelowcmb;0318 +less;003C +lessequal;2264 +lessequalorgreater;22DA +lessmonospace;FF1C +lessorequivalent;2272 +lessorgreater;2276 +lessoverequal;2266 +lesssmall;FE64 +lezh;026E +lfblock;258C +lhookretroflex;026D +lira;20A4 +liwnarmenian;056C +lj;01C9 +ljecyrillic;0459 +ll;F6C0 +lladeva;0933 +llagujarati;0AB3 +llinebelow;1E3B +llladeva;0934 +llvocalicbengali;09E1 +llvocalicdeva;0961 +llvocalicvowelsignbengali;09E3 +llvocalicvowelsigndeva;0963 +lmiddletilde;026B +lmonospace;FF4C +lmsquare;33D0 +lochulathai;0E2C +logicaland;2227 +logicalnot;00AC +logicalnotreversed;2310 +logicalor;2228 +lolingthai;0E25 +longs;017F +lowlinecenterline;FE4E +lowlinecmb;0332 +lowlinedashed;FE4D +lozenge;25CA +lparen;24A7 +lslash;0142 +lsquare;2113 +lsuperior;F6EE +ltshade;2591 +luthai;0E26 +lvocalicbengali;098C +lvocalicdeva;090C +lvocalicvowelsignbengali;09E2 +lvocalicvowelsigndeva;0962 +lxsquare;33D3 +m;006D +mabengali;09AE +macron;00AF +macronbelowcmb;0331 +macroncmb;0304 +macronlowmod;02CD +macronmonospace;FFE3 +macute;1E3F +madeva;092E +magujarati;0AAE +magurmukhi;0A2E +mahapakhhebrew;05A4 +mahapakhlefthebrew;05A4 +mahiragana;307E +maichattawalowleftthai;F895 +maichattawalowrightthai;F894 +maichattawathai;0E4B +maichattawaupperleftthai;F893 +maieklowleftthai;F88C +maieklowrightthai;F88B +maiekthai;0E48 +maiekupperleftthai;F88A +maihanakatleftthai;F884 +maihanakatthai;0E31 +maitaikhuleftthai;F889 +maitaikhuthai;0E47 +maitholowleftthai;F88F +maitholowrightthai;F88E +maithothai;0E49 +maithoupperleftthai;F88D +maitrilowleftthai;F892 +maitrilowrightthai;F891 +maitrithai;0E4A +maitriupperleftthai;F890 +maiyamokthai;0E46 +makatakana;30DE +makatakanahalfwidth;FF8F +male;2642 +mansyonsquare;3347 +maqafhebrew;05BE +mars;2642 +masoracirclehebrew;05AF +masquare;3383 +mbopomofo;3107 +mbsquare;33D4 +mcircle;24DC +mcubedsquare;33A5 +mdotaccent;1E41 +mdotbelow;1E43 +meemarabic;0645 +meemfinalarabic;FEE2 +meeminitialarabic;FEE3 +meemmedialarabic;FEE4 +meemmeeminitialarabic;FCD1 +meemmeemisolatedarabic;FC48 +meetorusquare;334D +mehiragana;3081 +meizierasquare;337E +mekatakana;30E1 +mekatakanahalfwidth;FF92 +mem;05DE +memdagesh;FB3E +memdageshhebrew;FB3E +memhebrew;05DE +menarmenian;0574 +merkhahebrew;05A5 +merkhakefulahebrew;05A6 +merkhakefulalefthebrew;05A6 +merkhalefthebrew;05A5 +mhook;0271 +mhzsquare;3392 +middledotkatakanahalfwidth;FF65 +middot;00B7 +mieumacirclekorean;3272 +mieumaparenkorean;3212 +mieumcirclekorean;3264 +mieumkorean;3141 +mieumpansioskorean;3170 +mieumparenkorean;3204 +mieumpieupkorean;316E +mieumsioskorean;316F +mihiragana;307F +mikatakana;30DF +mikatakanahalfwidth;FF90 +minus;2212 +minusbelowcmb;0320 +minuscircle;2296 +minusmod;02D7 +minusplus;2213 +minute;2032 +miribaarusquare;334A +mirisquare;3349 +mlonglegturned;0270 +mlsquare;3396 +mmcubedsquare;33A3 +mmonospace;FF4D +mmsquaredsquare;339F +mohiragana;3082 +mohmsquare;33C1 +mokatakana;30E2 +mokatakanahalfwidth;FF93 +molsquare;33D6 +momathai;0E21 +moverssquare;33A7 +moverssquaredsquare;33A8 +mparen;24A8 +mpasquare;33AB +mssquare;33B3 +msuperior;F6EF +mturned;026F +mu;00B5 +mu1;00B5 +muasquare;3382 +muchgreater;226B +muchless;226A +mufsquare;338C +mugreek;03BC +mugsquare;338D +muhiragana;3080 +mukatakana;30E0 +mukatakanahalfwidth;FF91 +mulsquare;3395 +multiply;00D7 +mumsquare;339B +munahhebrew;05A3 +munahlefthebrew;05A3 +musicalnote;266A +musicalnotedbl;266B +musicflatsign;266D +musicsharpsign;266F +mussquare;33B2 +muvsquare;33B6 +muwsquare;33BC +mvmegasquare;33B9 +mvsquare;33B7 +mwmegasquare;33BF +mwsquare;33BD +n;006E +nabengali;09A8 +nabla;2207 +nacute;0144 +nadeva;0928 +nagujarati;0AA8 +nagurmukhi;0A28 +nahiragana;306A +nakatakana;30CA +nakatakanahalfwidth;FF85 +napostrophe;0149 +nasquare;3381 +nbopomofo;310B +nbspace;00A0 +ncaron;0148 +ncedilla;0146 +ncircle;24DD +ncircumflexbelow;1E4B +ncommaaccent;0146 +ndotaccent;1E45 +ndotbelow;1E47 +nehiragana;306D +nekatakana;30CD +nekatakanahalfwidth;FF88 +newsheqelsign;20AA +nfsquare;338B +ngabengali;0999 +ngadeva;0919 +ngagujarati;0A99 +ngagurmukhi;0A19 +ngonguthai;0E07 +nhiragana;3093 +nhookleft;0272 +nhookretroflex;0273 +nieunacirclekorean;326F +nieunaparenkorean;320F +nieuncieuckorean;3135 +nieuncirclekorean;3261 +nieunhieuhkorean;3136 +nieunkorean;3134 +nieunpansioskorean;3168 +nieunparenkorean;3201 +nieunsioskorean;3167 +nieuntikeutkorean;3166 +nihiragana;306B +nikatakana;30CB +nikatakanahalfwidth;FF86 +nikhahitleftthai;F899 +nikhahitthai;0E4D +nine;0039 +ninearabic;0669 +ninebengali;09EF +ninecircle;2468 +ninecircleinversesansserif;2792 +ninedeva;096F +ninegujarati;0AEF +ninegurmukhi;0A6F +ninehackarabic;0669 +ninehangzhou;3029 +nineideographicparen;3228 +nineinferior;2089 +ninemonospace;FF19 +nineoldstyle;F739 +nineparen;247C +nineperiod;2490 +ninepersian;06F9 +nineroman;2178 +ninesuperior;2079 +nineteencircle;2472 +nineteenparen;2486 +nineteenperiod;249A +ninethai;0E59 +nj;01CC +njecyrillic;045A +nkatakana;30F3 +nkatakanahalfwidth;FF9D +nlegrightlong;019E +nlinebelow;1E49 +nmonospace;FF4E +nmsquare;339A +nnabengali;09A3 +nnadeva;0923 +nnagujarati;0AA3 +nnagurmukhi;0A23 +nnnadeva;0929 +nohiragana;306E +nokatakana;30CE +nokatakanahalfwidth;FF89 +nonbreakingspace;00A0 +nonenthai;0E13 +nonuthai;0E19 +noonarabic;0646 +noonfinalarabic;FEE6 +noonghunnaarabic;06BA +noonghunnafinalarabic;FB9F +noonhehinitialarabic;FEE7 FEEC +nooninitialarabic;FEE7 +noonjeeminitialarabic;FCD2 +noonjeemisolatedarabic;FC4B +noonmedialarabic;FEE8 +noonmeeminitialarabic;FCD5 +noonmeemisolatedarabic;FC4E +noonnoonfinalarabic;FC8D +notcontains;220C +notelement;2209 +notelementof;2209 +notequal;2260 +notgreater;226F +notgreaternorequal;2271 +notgreaternorless;2279 +notidentical;2262 +notless;226E +notlessnorequal;2270 +notparallel;2226 +notprecedes;2280 +notsubset;2284 +notsucceeds;2281 +notsuperset;2285 +nowarmenian;0576 +nparen;24A9 +nssquare;33B1 +nsuperior;207F +ntilde;00F1 +nu;03BD +nuhiragana;306C +nukatakana;30CC +nukatakanahalfwidth;FF87 +nuktabengali;09BC +nuktadeva;093C +nuktagujarati;0ABC +nuktagurmukhi;0A3C +numbersign;0023 +numbersignmonospace;FF03 +numbersignsmall;FE5F +numeralsigngreek;0374 +numeralsignlowergreek;0375 +numero;2116 +nun;05E0 +nundagesh;FB40 +nundageshhebrew;FB40 +nunhebrew;05E0 +nvsquare;33B5 +nwsquare;33BB +nyabengali;099E +nyadeva;091E +nyagujarati;0A9E +nyagurmukhi;0A1E +o;006F +oacute;00F3 +oangthai;0E2D +obarred;0275 +obarredcyrillic;04E9 +obarreddieresiscyrillic;04EB +obengali;0993 +obopomofo;311B +obreve;014F +ocandradeva;0911 +ocandragujarati;0A91 +ocandravowelsigndeva;0949 +ocandravowelsigngujarati;0AC9 +ocaron;01D2 +ocircle;24DE +ocircumflex;00F4 +ocircumflexacute;1ED1 +ocircumflexdotbelow;1ED9 +ocircumflexgrave;1ED3 +ocircumflexhookabove;1ED5 +ocircumflextilde;1ED7 +ocyrillic;043E +odblacute;0151 +odblgrave;020D +odeva;0913 +odieresis;00F6 +odieresiscyrillic;04E7 +odotbelow;1ECD +oe;0153 +oekorean;315A +ogonek;02DB +ogonekcmb;0328 +ograve;00F2 +ogujarati;0A93 +oharmenian;0585 +ohiragana;304A +ohookabove;1ECF +ohorn;01A1 +ohornacute;1EDB +ohorndotbelow;1EE3 +ohorngrave;1EDD +ohornhookabove;1EDF +ohorntilde;1EE1 +ohungarumlaut;0151 +oi;01A3 +oinvertedbreve;020F +okatakana;30AA +okatakanahalfwidth;FF75 +okorean;3157 +olehebrew;05AB +omacron;014D +omacronacute;1E53 +omacrongrave;1E51 +omdeva;0950 +omega;03C9 +omega1;03D6 +omegacyrillic;0461 +omegalatinclosed;0277 +omegaroundcyrillic;047B +omegatitlocyrillic;047D +omegatonos;03CE +omgujarati;0AD0 +omicron;03BF +omicrontonos;03CC +omonospace;FF4F +one;0031 +onearabic;0661 +onebengali;09E7 +onecircle;2460 +onecircleinversesansserif;278A +onedeva;0967 +onedotenleader;2024 +oneeighth;215B +onefitted;F6DC +onegujarati;0AE7 +onegurmukhi;0A67 +onehackarabic;0661 +onehalf;00BD +onehangzhou;3021 +oneideographicparen;3220 +oneinferior;2081 +onemonospace;FF11 +onenumeratorbengali;09F4 +oneoldstyle;F731 +oneparen;2474 +oneperiod;2488 +onepersian;06F1 +onequarter;00BC +oneroman;2170 +onesuperior;00B9 +onethai;0E51 +onethird;2153 +oogonek;01EB +oogonekmacron;01ED +oogurmukhi;0A13 +oomatragurmukhi;0A4B +oopen;0254 +oparen;24AA +openbullet;25E6 +option;2325 +ordfeminine;00AA +ordmasculine;00BA +orthogonal;221F +oshortdeva;0912 +oshortvowelsigndeva;094A +oslash;00F8 +oslashacute;01FF +osmallhiragana;3049 +osmallkatakana;30A9 +osmallkatakanahalfwidth;FF6B +ostrokeacute;01FF +osuperior;F6F0 +otcyrillic;047F +otilde;00F5 +otildeacute;1E4D +otildedieresis;1E4F +oubopomofo;3121 +overline;203E +overlinecenterline;FE4A +overlinecmb;0305 +overlinedashed;FE49 +overlinedblwavy;FE4C +overlinewavy;FE4B +overscore;00AF +ovowelsignbengali;09CB +ovowelsigndeva;094B +ovowelsigngujarati;0ACB +p;0070 +paampssquare;3380 +paasentosquare;332B +pabengali;09AA +pacute;1E55 +padeva;092A +pagedown;21DF +pageup;21DE +pagujarati;0AAA +pagurmukhi;0A2A +pahiragana;3071 +paiyannoithai;0E2F +pakatakana;30D1 +palatalizationcyrilliccmb;0484 +palochkacyrillic;04C0 +pansioskorean;317F +paragraph;00B6 +parallel;2225 +parenleft;0028 +parenleftaltonearabic;FD3E +parenleftbt;F8ED +parenleftex;F8EC +parenleftinferior;208D +parenleftmonospace;FF08 +parenleftsmall;FE59 +parenleftsuperior;207D +parenlefttp;F8EB +parenleftvertical;FE35 +parenright;0029 +parenrightaltonearabic;FD3F +parenrightbt;F8F8 +parenrightex;F8F7 +parenrightinferior;208E +parenrightmonospace;FF09 +parenrightsmall;FE5A +parenrightsuperior;207E +parenrighttp;F8F6 +parenrightvertical;FE36 +partialdiff;2202 +paseqhebrew;05C0 +pashtahebrew;0599 +pasquare;33A9 +patah;05B7 +patah11;05B7 +patah1d;05B7 +patah2a;05B7 +patahhebrew;05B7 +patahnarrowhebrew;05B7 +patahquarterhebrew;05B7 +patahwidehebrew;05B7 +pazerhebrew;05A1 +pbopomofo;3106 +pcircle;24DF +pdotaccent;1E57 +pe;05E4 +pecyrillic;043F +pedagesh;FB44 +pedageshhebrew;FB44 +peezisquare;333B +pefinaldageshhebrew;FB43 +peharabic;067E +peharmenian;057A +pehebrew;05E4 +pehfinalarabic;FB57 +pehinitialarabic;FB58 +pehiragana;307A +pehmedialarabic;FB59 +pekatakana;30DA +pemiddlehookcyrillic;04A7 +perafehebrew;FB4E +percent;0025 +percentarabic;066A +percentmonospace;FF05 +percentsmall;FE6A +period;002E +periodarmenian;0589 +periodcentered;00B7 +periodhalfwidth;FF61 +periodinferior;F6E7 +periodmonospace;FF0E +periodsmall;FE52 +periodsuperior;F6E8 +perispomenigreekcmb;0342 +perpendicular;22A5 +perthousand;2030 +peseta;20A7 +pfsquare;338A +phabengali;09AB +phadeva;092B +phagujarati;0AAB +phagurmukhi;0A2B +phi;03C6 +phi1;03D5 +phieuphacirclekorean;327A +phieuphaparenkorean;321A +phieuphcirclekorean;326C +phieuphkorean;314D +phieuphparenkorean;320C +philatin;0278 +phinthuthai;0E3A +phisymbolgreek;03D5 +phook;01A5 +phophanthai;0E1E +phophungthai;0E1C +phosamphaothai;0E20 +pi;03C0 +pieupacirclekorean;3273 +pieupaparenkorean;3213 +pieupcieuckorean;3176 +pieupcirclekorean;3265 +pieupkiyeokkorean;3172 +pieupkorean;3142 +pieupparenkorean;3205 +pieupsioskiyeokkorean;3174 +pieupsioskorean;3144 +pieupsiostikeutkorean;3175 +pieupthieuthkorean;3177 +pieuptikeutkorean;3173 +pihiragana;3074 +pikatakana;30D4 +pisymbolgreek;03D6 +piwrarmenian;0583 +plus;002B +plusbelowcmb;031F +pluscircle;2295 +plusminus;00B1 +plusmod;02D6 +plusmonospace;FF0B +plussmall;FE62 +plussuperior;207A +pmonospace;FF50 +pmsquare;33D8 +pohiragana;307D +pointingindexdownwhite;261F +pointingindexleftwhite;261C +pointingindexrightwhite;261E +pointingindexupwhite;261D +pokatakana;30DD +poplathai;0E1B +postalmark;3012 +postalmarkface;3020 +pparen;24AB +precedes;227A +prescription;211E +primemod;02B9 +primereversed;2035 +product;220F +projective;2305 +prolongedkana;30FC +propellor;2318 +propersubset;2282 +propersuperset;2283 +proportion;2237 +proportional;221D +psi;03C8 +psicyrillic;0471 +psilipneumatacyrilliccmb;0486 +pssquare;33B0 +puhiragana;3077 +pukatakana;30D7 +pvsquare;33B4 +pwsquare;33BA +q;0071 +qadeva;0958 +qadmahebrew;05A8 +qafarabic;0642 +qaffinalarabic;FED6 +qafinitialarabic;FED7 +qafmedialarabic;FED8 +qamats;05B8 +qamats10;05B8 +qamats1a;05B8 +qamats1c;05B8 +qamats27;05B8 +qamats29;05B8 +qamats33;05B8 +qamatsde;05B8 +qamatshebrew;05B8 +qamatsnarrowhebrew;05B8 +qamatsqatanhebrew;05B8 +qamatsqatannarrowhebrew;05B8 +qamatsqatanquarterhebrew;05B8 +qamatsqatanwidehebrew;05B8 +qamatsquarterhebrew;05B8 +qamatswidehebrew;05B8 +qarneyparahebrew;059F +qbopomofo;3111 +qcircle;24E0 +qhook;02A0 +qmonospace;FF51 +qof;05E7 +qofdagesh;FB47 +qofdageshhebrew;FB47 +qofhatafpatah;05E7 05B2 +qofhatafpatahhebrew;05E7 05B2 +qofhatafsegol;05E7 05B1 +qofhatafsegolhebrew;05E7 05B1 +qofhebrew;05E7 +qofhiriq;05E7 05B4 +qofhiriqhebrew;05E7 05B4 +qofholam;05E7 05B9 +qofholamhebrew;05E7 05B9 +qofpatah;05E7 05B7 +qofpatahhebrew;05E7 05B7 +qofqamats;05E7 05B8 +qofqamatshebrew;05E7 05B8 +qofqubuts;05E7 05BB +qofqubutshebrew;05E7 05BB +qofsegol;05E7 05B6 +qofsegolhebrew;05E7 05B6 +qofsheva;05E7 05B0 +qofshevahebrew;05E7 05B0 +qoftsere;05E7 05B5 +qoftserehebrew;05E7 05B5 +qparen;24AC +quarternote;2669 +qubuts;05BB +qubuts18;05BB +qubuts25;05BB +qubuts31;05BB +qubutshebrew;05BB +qubutsnarrowhebrew;05BB +qubutsquarterhebrew;05BB +qubutswidehebrew;05BB +question;003F +questionarabic;061F +questionarmenian;055E +questiondown;00BF +questiondownsmall;F7BF +questiongreek;037E +questionmonospace;FF1F +questionsmall;F73F +quotedbl;0022 +quotedblbase;201E +quotedblleft;201C +quotedblmonospace;FF02 +quotedblprime;301E +quotedblprimereversed;301D +quotedblright;201D +quoteleft;2018 +quoteleftreversed;201B +quotereversed;201B +quoteright;2019 +quoterightn;0149 +quotesinglbase;201A +quotesingle;0027 +quotesinglemonospace;FF07 +r;0072 +raarmenian;057C +rabengali;09B0 +racute;0155 +radeva;0930 +radical;221A +radicalex;F8E5 +radoverssquare;33AE +radoverssquaredsquare;33AF +radsquare;33AD +rafe;05BF +rafehebrew;05BF +ragujarati;0AB0 +ragurmukhi;0A30 +rahiragana;3089 +rakatakana;30E9 +rakatakanahalfwidth;FF97 +ralowerdiagonalbengali;09F1 +ramiddlediagonalbengali;09F0 +ramshorn;0264 +ratio;2236 +rbopomofo;3116 +rcaron;0159 +rcedilla;0157 +rcircle;24E1 +rcommaaccent;0157 +rdblgrave;0211 +rdotaccent;1E59 +rdotbelow;1E5B +rdotbelowmacron;1E5D +referencemark;203B +reflexsubset;2286 +reflexsuperset;2287 +registered;00AE +registersans;F8E8 +registerserif;F6DA +reharabic;0631 +reharmenian;0580 +rehfinalarabic;FEAE +rehiragana;308C +rehyehaleflamarabic;0631 FEF3 FE8E 0644 +rekatakana;30EC +rekatakanahalfwidth;FF9A +resh;05E8 +reshdageshhebrew;FB48 +reshhatafpatah;05E8 05B2 +reshhatafpatahhebrew;05E8 05B2 +reshhatafsegol;05E8 05B1 +reshhatafsegolhebrew;05E8 05B1 +reshhebrew;05E8 +reshhiriq;05E8 05B4 +reshhiriqhebrew;05E8 05B4 +reshholam;05E8 05B9 +reshholamhebrew;05E8 05B9 +reshpatah;05E8 05B7 +reshpatahhebrew;05E8 05B7 +reshqamats;05E8 05B8 +reshqamatshebrew;05E8 05B8 +reshqubuts;05E8 05BB +reshqubutshebrew;05E8 05BB +reshsegol;05E8 05B6 +reshsegolhebrew;05E8 05B6 +reshsheva;05E8 05B0 +reshshevahebrew;05E8 05B0 +reshtsere;05E8 05B5 +reshtserehebrew;05E8 05B5 +reversedtilde;223D +reviahebrew;0597 +reviamugrashhebrew;0597 +revlogicalnot;2310 +rfishhook;027E +rfishhookreversed;027F +rhabengali;09DD +rhadeva;095D +rho;03C1 +rhook;027D +rhookturned;027B +rhookturnedsuperior;02B5 +rhosymbolgreek;03F1 +rhotichookmod;02DE +rieulacirclekorean;3271 +rieulaparenkorean;3211 +rieulcirclekorean;3263 +rieulhieuhkorean;3140 +rieulkiyeokkorean;313A +rieulkiyeoksioskorean;3169 +rieulkorean;3139 +rieulmieumkorean;313B +rieulpansioskorean;316C +rieulparenkorean;3203 +rieulphieuphkorean;313F +rieulpieupkorean;313C +rieulpieupsioskorean;316B +rieulsioskorean;313D +rieulthieuthkorean;313E +rieultikeutkorean;316A +rieulyeorinhieuhkorean;316D +rightangle;221F +righttackbelowcmb;0319 +righttriangle;22BF +rihiragana;308A +rikatakana;30EA +rikatakanahalfwidth;FF98 +ring;02DA +ringbelowcmb;0325 +ringcmb;030A +ringhalfleft;02BF +ringhalfleftarmenian;0559 +ringhalfleftbelowcmb;031C +ringhalfleftcentered;02D3 +ringhalfright;02BE +ringhalfrightbelowcmb;0339 +ringhalfrightcentered;02D2 +rinvertedbreve;0213 +rittorusquare;3351 +rlinebelow;1E5F +rlongleg;027C +rlonglegturned;027A +rmonospace;FF52 +rohiragana;308D +rokatakana;30ED +rokatakanahalfwidth;FF9B +roruathai;0E23 +rparen;24AD +rrabengali;09DC +rradeva;0931 +rragurmukhi;0A5C +rreharabic;0691 +rrehfinalarabic;FB8D +rrvocalicbengali;09E0 +rrvocalicdeva;0960 +rrvocalicgujarati;0AE0 +rrvocalicvowelsignbengali;09C4 +rrvocalicvowelsigndeva;0944 +rrvocalicvowelsigngujarati;0AC4 +rsuperior;F6F1 +rtblock;2590 +rturned;0279 +rturnedsuperior;02B4 +ruhiragana;308B +rukatakana;30EB +rukatakanahalfwidth;FF99 +rupeemarkbengali;09F2 +rupeesignbengali;09F3 +rupiah;F6DD +ruthai;0E24 +rvocalicbengali;098B +rvocalicdeva;090B +rvocalicgujarati;0A8B +rvocalicvowelsignbengali;09C3 +rvocalicvowelsigndeva;0943 +rvocalicvowelsigngujarati;0AC3 +s;0073 +sabengali;09B8 +sacute;015B +sacutedotaccent;1E65 +sadarabic;0635 +sadeva;0938 +sadfinalarabic;FEBA +sadinitialarabic;FEBB +sadmedialarabic;FEBC +sagujarati;0AB8 +sagurmukhi;0A38 +sahiragana;3055 +sakatakana;30B5 +sakatakanahalfwidth;FF7B +sallallahoualayhewasallamarabic;FDFA +samekh;05E1 +samekhdagesh;FB41 +samekhdageshhebrew;FB41 +samekhhebrew;05E1 +saraaathai;0E32 +saraaethai;0E41 +saraaimaimalaithai;0E44 +saraaimaimuanthai;0E43 +saraamthai;0E33 +saraathai;0E30 +saraethai;0E40 +saraiileftthai;F886 +saraiithai;0E35 +saraileftthai;F885 +saraithai;0E34 +saraothai;0E42 +saraueeleftthai;F888 +saraueethai;0E37 +saraueleftthai;F887 +sarauethai;0E36 +sarauthai;0E38 +sarauuthai;0E39 +sbopomofo;3119 +scaron;0161 +scarondotaccent;1E67 +scedilla;015F +schwa;0259 +schwacyrillic;04D9 +schwadieresiscyrillic;04DB +schwahook;025A +scircle;24E2 +scircumflex;015D +scommaaccent;0219 +sdotaccent;1E61 +sdotbelow;1E63 +sdotbelowdotaccent;1E69 +seagullbelowcmb;033C +second;2033 +secondtonechinese;02CA +section;00A7 +seenarabic;0633 +seenfinalarabic;FEB2 +seeninitialarabic;FEB3 +seenmedialarabic;FEB4 +segol;05B6 +segol13;05B6 +segol1f;05B6 +segol2c;05B6 +segolhebrew;05B6 +segolnarrowhebrew;05B6 +segolquarterhebrew;05B6 +segoltahebrew;0592 +segolwidehebrew;05B6 +seharmenian;057D +sehiragana;305B +sekatakana;30BB +sekatakanahalfwidth;FF7E +semicolon;003B +semicolonarabic;061B +semicolonmonospace;FF1B +semicolonsmall;FE54 +semivoicedmarkkana;309C +semivoicedmarkkanahalfwidth;FF9F +sentisquare;3322 +sentosquare;3323 +seven;0037 +sevenarabic;0667 +sevenbengali;09ED +sevencircle;2466 +sevencircleinversesansserif;2790 +sevendeva;096D +seveneighths;215E +sevengujarati;0AED +sevengurmukhi;0A6D +sevenhackarabic;0667 +sevenhangzhou;3027 +sevenideographicparen;3226 +seveninferior;2087 +sevenmonospace;FF17 +sevenoldstyle;F737 +sevenparen;247A +sevenperiod;248E +sevenpersian;06F7 +sevenroman;2176 +sevensuperior;2077 +seventeencircle;2470 +seventeenparen;2484 +seventeenperiod;2498 +seventhai;0E57 +sfthyphen;00AD +shaarmenian;0577 +shabengali;09B6 +shacyrillic;0448 +shaddaarabic;0651 +shaddadammaarabic;FC61 +shaddadammatanarabic;FC5E +shaddafathaarabic;FC60 +shaddafathatanarabic;0651 064B +shaddakasraarabic;FC62 +shaddakasratanarabic;FC5F +shade;2592 +shadedark;2593 +shadelight;2591 +shademedium;2592 +shadeva;0936 +shagujarati;0AB6 +shagurmukhi;0A36 +shalshelethebrew;0593 +shbopomofo;3115 +shchacyrillic;0449 +sheenarabic;0634 +sheenfinalarabic;FEB6 +sheeninitialarabic;FEB7 +sheenmedialarabic;FEB8 +sheicoptic;03E3 +sheqel;20AA +sheqelhebrew;20AA +sheva;05B0 +sheva115;05B0 +sheva15;05B0 +sheva22;05B0 +sheva2e;05B0 +shevahebrew;05B0 +shevanarrowhebrew;05B0 +shevaquarterhebrew;05B0 +shevawidehebrew;05B0 +shhacyrillic;04BB +shimacoptic;03ED +shin;05E9 +shindagesh;FB49 +shindageshhebrew;FB49 +shindageshshindot;FB2C +shindageshshindothebrew;FB2C +shindageshsindot;FB2D +shindageshsindothebrew;FB2D +shindothebrew;05C1 +shinhebrew;05E9 +shinshindot;FB2A +shinshindothebrew;FB2A +shinsindot;FB2B +shinsindothebrew;FB2B +shook;0282 +sigma;03C3 +sigma1;03C2 +sigmafinal;03C2 +sigmalunatesymbolgreek;03F2 +sihiragana;3057 +sikatakana;30B7 +sikatakanahalfwidth;FF7C +siluqhebrew;05BD +siluqlefthebrew;05BD +similar;223C +sindothebrew;05C2 +siosacirclekorean;3274 +siosaparenkorean;3214 +sioscieuckorean;317E +sioscirclekorean;3266 +sioskiyeokkorean;317A +sioskorean;3145 +siosnieunkorean;317B +siosparenkorean;3206 +siospieupkorean;317D +siostikeutkorean;317C +six;0036 +sixarabic;0666 +sixbengali;09EC +sixcircle;2465 +sixcircleinversesansserif;278F +sixdeva;096C +sixgujarati;0AEC +sixgurmukhi;0A6C +sixhackarabic;0666 +sixhangzhou;3026 +sixideographicparen;3225 +sixinferior;2086 +sixmonospace;FF16 +sixoldstyle;F736 +sixparen;2479 +sixperiod;248D +sixpersian;06F6 +sixroman;2175 +sixsuperior;2076 +sixteencircle;246F +sixteencurrencydenominatorbengali;09F9 +sixteenparen;2483 +sixteenperiod;2497 +sixthai;0E56 +slash;002F +slashmonospace;FF0F +slong;017F +slongdotaccent;1E9B +smileface;263A +smonospace;FF53 +sofpasuqhebrew;05C3 +softhyphen;00AD +softsigncyrillic;044C +sohiragana;305D +sokatakana;30BD +sokatakanahalfwidth;FF7F +soliduslongoverlaycmb;0338 +solidusshortoverlaycmb;0337 +sorusithai;0E29 +sosalathai;0E28 +sosothai;0E0B +sosuathai;0E2A +space;0020 +spacehackarabic;0020 +spade;2660 +spadesuitblack;2660 +spadesuitwhite;2664 +sparen;24AE +squarebelowcmb;033B +squarecc;33C4 +squarecm;339D +squarediagonalcrosshatchfill;25A9 +squarehorizontalfill;25A4 +squarekg;338F +squarekm;339E +squarekmcapital;33CE +squareln;33D1 +squarelog;33D2 +squaremg;338E +squaremil;33D5 +squaremm;339C +squaremsquared;33A1 +squareorthogonalcrosshatchfill;25A6 +squareupperlefttolowerrightfill;25A7 +squareupperrighttolowerleftfill;25A8 +squareverticalfill;25A5 +squarewhitewithsmallblack;25A3 +srsquare;33DB +ssabengali;09B7 +ssadeva;0937 +ssagujarati;0AB7 +ssangcieuckorean;3149 +ssanghieuhkorean;3185 +ssangieungkorean;3180 +ssangkiyeokkorean;3132 +ssangnieunkorean;3165 +ssangpieupkorean;3143 +ssangsioskorean;3146 +ssangtikeutkorean;3138 +ssuperior;F6F2 +sterling;00A3 +sterlingmonospace;FFE1 +strokelongoverlaycmb;0336 +strokeshortoverlaycmb;0335 +subset;2282 +subsetnotequal;228A +subsetorequal;2286 +succeeds;227B +suchthat;220B +suhiragana;3059 +sukatakana;30B9 +sukatakanahalfwidth;FF7D +sukunarabic;0652 +summation;2211 +sun;263C +superset;2283 +supersetnotequal;228B +supersetorequal;2287 +svsquare;33DC +syouwaerasquare;337C +t;0074 +tabengali;09A4 +tackdown;22A4 +tackleft;22A3 +tadeva;0924 +tagujarati;0AA4 +tagurmukhi;0A24 +taharabic;0637 +tahfinalarabic;FEC2 +tahinitialarabic;FEC3 +tahiragana;305F +tahmedialarabic;FEC4 +taisyouerasquare;337D +takatakana;30BF +takatakanahalfwidth;FF80 +tatweelarabic;0640 +tau;03C4 +tav;05EA +tavdages;FB4A +tavdagesh;FB4A +tavdageshhebrew;FB4A +tavhebrew;05EA +tbar;0167 +tbopomofo;310A +tcaron;0165 +tccurl;02A8 +tcedilla;0163 +tcheharabic;0686 +tchehfinalarabic;FB7B +tchehinitialarabic;FB7C +tchehmedialarabic;FB7D +tchehmeeminitialarabic;FB7C FEE4 +tcircle;24E3 +tcircumflexbelow;1E71 +tcommaaccent;0163 +tdieresis;1E97 +tdotaccent;1E6B +tdotbelow;1E6D +tecyrillic;0442 +tedescendercyrillic;04AD +teharabic;062A +tehfinalarabic;FE96 +tehhahinitialarabic;FCA2 +tehhahisolatedarabic;FC0C +tehinitialarabic;FE97 +tehiragana;3066 +tehjeeminitialarabic;FCA1 +tehjeemisolatedarabic;FC0B +tehmarbutaarabic;0629 +tehmarbutafinalarabic;FE94 +tehmedialarabic;FE98 +tehmeeminitialarabic;FCA4 +tehmeemisolatedarabic;FC0E +tehnoonfinalarabic;FC73 +tekatakana;30C6 +tekatakanahalfwidth;FF83 +telephone;2121 +telephoneblack;260E +telishagedolahebrew;05A0 +telishaqetanahebrew;05A9 +tencircle;2469 +tenideographicparen;3229 +tenparen;247D +tenperiod;2491 +tenroman;2179 +tesh;02A7 +tet;05D8 +tetdagesh;FB38 +tetdageshhebrew;FB38 +tethebrew;05D8 +tetsecyrillic;04B5 +tevirhebrew;059B +tevirlefthebrew;059B +thabengali;09A5 +thadeva;0925 +thagujarati;0AA5 +thagurmukhi;0A25 +thalarabic;0630 +thalfinalarabic;FEAC +thanthakhatlowleftthai;F898 +thanthakhatlowrightthai;F897 +thanthakhatthai;0E4C +thanthakhatupperleftthai;F896 +theharabic;062B +thehfinalarabic;FE9A +thehinitialarabic;FE9B +thehmedialarabic;FE9C +thereexists;2203 +therefore;2234 +theta;03B8 +theta1;03D1 +thetasymbolgreek;03D1 +thieuthacirclekorean;3279 +thieuthaparenkorean;3219 +thieuthcirclekorean;326B +thieuthkorean;314C +thieuthparenkorean;320B +thirteencircle;246C +thirteenparen;2480 +thirteenperiod;2494 +thonangmonthothai;0E11 +thook;01AD +thophuthaothai;0E12 +thorn;00FE +thothahanthai;0E17 +thothanthai;0E10 +thothongthai;0E18 +thothungthai;0E16 +thousandcyrillic;0482 +thousandsseparatorarabic;066C +thousandsseparatorpersian;066C +three;0033 +threearabic;0663 +threebengali;09E9 +threecircle;2462 +threecircleinversesansserif;278C +threedeva;0969 +threeeighths;215C +threegujarati;0AE9 +threegurmukhi;0A69 +threehackarabic;0663 +threehangzhou;3023 +threeideographicparen;3222 +threeinferior;2083 +threemonospace;FF13 +threenumeratorbengali;09F6 +threeoldstyle;F733 +threeparen;2476 +threeperiod;248A +threepersian;06F3 +threequarters;00BE +threequartersemdash;F6DE +threeroman;2172 +threesuperior;00B3 +threethai;0E53 +thzsquare;3394 +tihiragana;3061 +tikatakana;30C1 +tikatakanahalfwidth;FF81 +tikeutacirclekorean;3270 +tikeutaparenkorean;3210 +tikeutcirclekorean;3262 +tikeutkorean;3137 +tikeutparenkorean;3202 +tilde;02DC +tildebelowcmb;0330 +tildecmb;0303 +tildecomb;0303 +tildedoublecmb;0360 +tildeoperator;223C +tildeoverlaycmb;0334 +tildeverticalcmb;033E +timescircle;2297 +tipehahebrew;0596 +tipehalefthebrew;0596 +tippigurmukhi;0A70 +titlocyrilliccmb;0483 +tiwnarmenian;057F +tlinebelow;1E6F +tmonospace;FF54 +toarmenian;0569 +tohiragana;3068 +tokatakana;30C8 +tokatakanahalfwidth;FF84 +tonebarextrahighmod;02E5 +tonebarextralowmod;02E9 +tonebarhighmod;02E6 +tonebarlowmod;02E8 +tonebarmidmod;02E7 +tonefive;01BD +tonesix;0185 +tonetwo;01A8 +tonos;0384 +tonsquare;3327 +topatakthai;0E0F +tortoiseshellbracketleft;3014 +tortoiseshellbracketleftsmall;FE5D +tortoiseshellbracketleftvertical;FE39 +tortoiseshellbracketright;3015 +tortoiseshellbracketrightsmall;FE5E +tortoiseshellbracketrightvertical;FE3A +totaothai;0E15 +tpalatalhook;01AB +tparen;24AF +trademark;2122 +trademarksans;F8EA +trademarkserif;F6DB +tretroflexhook;0288 +triagdn;25BC +triaglf;25C4 +triagrt;25BA +triagup;25B2 +ts;02A6 +tsadi;05E6 +tsadidagesh;FB46 +tsadidageshhebrew;FB46 +tsadihebrew;05E6 +tsecyrillic;0446 +tsere;05B5 +tsere12;05B5 +tsere1e;05B5 +tsere2b;05B5 +tserehebrew;05B5 +tserenarrowhebrew;05B5 +tserequarterhebrew;05B5 +tserewidehebrew;05B5 +tshecyrillic;045B +tsuperior;F6F3 +ttabengali;099F +ttadeva;091F +ttagujarati;0A9F +ttagurmukhi;0A1F +tteharabic;0679 +ttehfinalarabic;FB67 +ttehinitialarabic;FB68 +ttehmedialarabic;FB69 +tthabengali;09A0 +tthadeva;0920 +tthagujarati;0AA0 +tthagurmukhi;0A20 +tturned;0287 +tuhiragana;3064 +tukatakana;30C4 +tukatakanahalfwidth;FF82 +tusmallhiragana;3063 +tusmallkatakana;30C3 +tusmallkatakanahalfwidth;FF6F +twelvecircle;246B +twelveparen;247F +twelveperiod;2493 +twelveroman;217B +twentycircle;2473 +twentyhangzhou;5344 +twentyparen;2487 +twentyperiod;249B +two;0032 +twoarabic;0662 +twobengali;09E8 +twocircle;2461 +twocircleinversesansserif;278B +twodeva;0968 +twodotenleader;2025 +twodotleader;2025 +twodotleadervertical;FE30 +twogujarati;0AE8 +twogurmukhi;0A68 +twohackarabic;0662 +twohangzhou;3022 +twoideographicparen;3221 +twoinferior;2082 +twomonospace;FF12 +twonumeratorbengali;09F5 +twooldstyle;F732 +twoparen;2475 +twoperiod;2489 +twopersian;06F2 +tworoman;2171 +twostroke;01BB +twosuperior;00B2 +twothai;0E52 +twothirds;2154 +u;0075 +uacute;00FA +ubar;0289 +ubengali;0989 +ubopomofo;3128 +ubreve;016D +ucaron;01D4 +ucircle;24E4 +ucircumflex;00FB +ucircumflexbelow;1E77 +ucyrillic;0443 +udattadeva;0951 +udblacute;0171 +udblgrave;0215 +udeva;0909 +udieresis;00FC +udieresisacute;01D8 +udieresisbelow;1E73 +udieresiscaron;01DA +udieresiscyrillic;04F1 +udieresisgrave;01DC +udieresismacron;01D6 +udotbelow;1EE5 +ugrave;00F9 +ugujarati;0A89 +ugurmukhi;0A09 +uhiragana;3046 +uhookabove;1EE7 +uhorn;01B0 +uhornacute;1EE9 +uhorndotbelow;1EF1 +uhorngrave;1EEB +uhornhookabove;1EED +uhorntilde;1EEF +uhungarumlaut;0171 +uhungarumlautcyrillic;04F3 +uinvertedbreve;0217 +ukatakana;30A6 +ukatakanahalfwidth;FF73 +ukcyrillic;0479 +ukorean;315C +umacron;016B +umacroncyrillic;04EF +umacrondieresis;1E7B +umatragurmukhi;0A41 +umonospace;FF55 +underscore;005F +underscoredbl;2017 +underscoremonospace;FF3F +underscorevertical;FE33 +underscorewavy;FE4F +union;222A +universal;2200 +uogonek;0173 +uparen;24B0 +upblock;2580 +upperdothebrew;05C4 +upsilon;03C5 +upsilondieresis;03CB +upsilondieresistonos;03B0 +upsilonlatin;028A +upsilontonos;03CD +uptackbelowcmb;031D +uptackmod;02D4 +uragurmukhi;0A73 +uring;016F +ushortcyrillic;045E +usmallhiragana;3045 +usmallkatakana;30A5 +usmallkatakanahalfwidth;FF69 +ustraightcyrillic;04AF +ustraightstrokecyrillic;04B1 +utilde;0169 +utildeacute;1E79 +utildebelow;1E75 +uubengali;098A +uudeva;090A +uugujarati;0A8A +uugurmukhi;0A0A +uumatragurmukhi;0A42 +uuvowelsignbengali;09C2 +uuvowelsigndeva;0942 +uuvowelsigngujarati;0AC2 +uvowelsignbengali;09C1 +uvowelsigndeva;0941 +uvowelsigngujarati;0AC1 +v;0076 +vadeva;0935 +vagujarati;0AB5 +vagurmukhi;0A35 +vakatakana;30F7 +vav;05D5 +vavdagesh;FB35 +vavdagesh65;FB35 +vavdageshhebrew;FB35 +vavhebrew;05D5 +vavholam;FB4B +vavholamhebrew;FB4B +vavvavhebrew;05F0 +vavyodhebrew;05F1 +vcircle;24E5 +vdotbelow;1E7F +vecyrillic;0432 +veharabic;06A4 +vehfinalarabic;FB6B +vehinitialarabic;FB6C +vehmedialarabic;FB6D +vekatakana;30F9 +venus;2640 +verticalbar;007C +verticallineabovecmb;030D +verticallinebelowcmb;0329 +verticallinelowmod;02CC +verticallinemod;02C8 +vewarmenian;057E +vhook;028B +vikatakana;30F8 +viramabengali;09CD +viramadeva;094D +viramagujarati;0ACD +visargabengali;0983 +visargadeva;0903 +visargagujarati;0A83 +vmonospace;FF56 +voarmenian;0578 +voicediterationhiragana;309E +voicediterationkatakana;30FE +voicedmarkkana;309B +voicedmarkkanahalfwidth;FF9E +vokatakana;30FA +vparen;24B1 +vtilde;1E7D +vturned;028C +vuhiragana;3094 +vukatakana;30F4 +w;0077 +wacute;1E83 +waekorean;3159 +wahiragana;308F +wakatakana;30EF +wakatakanahalfwidth;FF9C +wakorean;3158 +wasmallhiragana;308E +wasmallkatakana;30EE +wattosquare;3357 +wavedash;301C +wavyunderscorevertical;FE34 +wawarabic;0648 +wawfinalarabic;FEEE +wawhamzaabovearabic;0624 +wawhamzaabovefinalarabic;FE86 +wbsquare;33DD +wcircle;24E6 +wcircumflex;0175 +wdieresis;1E85 +wdotaccent;1E87 +wdotbelow;1E89 +wehiragana;3091 +weierstrass;2118 +wekatakana;30F1 +wekorean;315E +weokorean;315D +wgrave;1E81 +whitebullet;25E6 +whitecircle;25CB +whitecircleinverse;25D9 +whitecornerbracketleft;300E +whitecornerbracketleftvertical;FE43 +whitecornerbracketright;300F +whitecornerbracketrightvertical;FE44 +whitediamond;25C7 +whitediamondcontainingblacksmalldiamond;25C8 +whitedownpointingsmalltriangle;25BF +whitedownpointingtriangle;25BD +whiteleftpointingsmalltriangle;25C3 +whiteleftpointingtriangle;25C1 +whitelenticularbracketleft;3016 +whitelenticularbracketright;3017 +whiterightpointingsmalltriangle;25B9 +whiterightpointingtriangle;25B7 +whitesmallsquare;25AB +whitesmilingface;263A +whitesquare;25A1 +whitestar;2606 +whitetelephone;260F +whitetortoiseshellbracketleft;3018 +whitetortoiseshellbracketright;3019 +whiteuppointingsmalltriangle;25B5 +whiteuppointingtriangle;25B3 +wihiragana;3090 +wikatakana;30F0 +wikorean;315F +wmonospace;FF57 +wohiragana;3092 +wokatakana;30F2 +wokatakanahalfwidth;FF66 +won;20A9 +wonmonospace;FFE6 +wowaenthai;0E27 +wparen;24B2 +wring;1E98 +wsuperior;02B7 +wturned;028D +wynn;01BF +x;0078 +xabovecmb;033D +xbopomofo;3112 +xcircle;24E7 +xdieresis;1E8D +xdotaccent;1E8B +xeharmenian;056D +xi;03BE +xmonospace;FF58 +xparen;24B3 +xsuperior;02E3 +y;0079 +yaadosquare;334E +yabengali;09AF +yacute;00FD +yadeva;092F +yaekorean;3152 +yagujarati;0AAF +yagurmukhi;0A2F +yahiragana;3084 +yakatakana;30E4 +yakatakanahalfwidth;FF94 +yakorean;3151 +yamakkanthai;0E4E +yasmallhiragana;3083 +yasmallkatakana;30E3 +yasmallkatakanahalfwidth;FF6C +yatcyrillic;0463 +ycircle;24E8 +ycircumflex;0177 +ydieresis;00FF +ydotaccent;1E8F +ydotbelow;1EF5 +yeharabic;064A +yehbarreearabic;06D2 +yehbarreefinalarabic;FBAF +yehfinalarabic;FEF2 +yehhamzaabovearabic;0626 +yehhamzaabovefinalarabic;FE8A +yehhamzaaboveinitialarabic;FE8B +yehhamzaabovemedialarabic;FE8C +yehinitialarabic;FEF3 +yehmedialarabic;FEF4 +yehmeeminitialarabic;FCDD +yehmeemisolatedarabic;FC58 +yehnoonfinalarabic;FC94 +yehthreedotsbelowarabic;06D1 +yekorean;3156 +yen;00A5 +yenmonospace;FFE5 +yeokorean;3155 +yeorinhieuhkorean;3186 +yerahbenyomohebrew;05AA +yerahbenyomolefthebrew;05AA +yericyrillic;044B +yerudieresiscyrillic;04F9 +yesieungkorean;3181 +yesieungpansioskorean;3183 +yesieungsioskorean;3182 +yetivhebrew;059A +ygrave;1EF3 +yhook;01B4 +yhookabove;1EF7 +yiarmenian;0575 +yicyrillic;0457 +yikorean;3162 +yinyang;262F +yiwnarmenian;0582 +ymonospace;FF59 +yod;05D9 +yoddagesh;FB39 +yoddageshhebrew;FB39 +yodhebrew;05D9 +yodyodhebrew;05F2 +yodyodpatahhebrew;FB1F +yohiragana;3088 +yoikorean;3189 +yokatakana;30E8 +yokatakanahalfwidth;FF96 +yokorean;315B +yosmallhiragana;3087 +yosmallkatakana;30E7 +yosmallkatakanahalfwidth;FF6E +yotgreek;03F3 +yoyaekorean;3188 +yoyakorean;3187 +yoyakthai;0E22 +yoyingthai;0E0D +yparen;24B4 +ypogegrammeni;037A +ypogegrammenigreekcmb;0345 +yr;01A6 +yring;1E99 +ysuperior;02B8 +ytilde;1EF9 +yturned;028E +yuhiragana;3086 +yuikorean;318C +yukatakana;30E6 +yukatakanahalfwidth;FF95 +yukorean;3160 +yusbigcyrillic;046B +yusbigiotifiedcyrillic;046D +yuslittlecyrillic;0467 +yuslittleiotifiedcyrillic;0469 +yusmallhiragana;3085 +yusmallkatakana;30E5 +yusmallkatakanahalfwidth;FF6D +yuyekorean;318B +yuyeokorean;318A +yyabengali;09DF +yyadeva;095F +z;007A +zaarmenian;0566 +zacute;017A +zadeva;095B +zagurmukhi;0A5B +zaharabic;0638 +zahfinalarabic;FEC6 +zahinitialarabic;FEC7 +zahiragana;3056 +zahmedialarabic;FEC8 +zainarabic;0632 +zainfinalarabic;FEB0 +zakatakana;30B6 +zaqefgadolhebrew;0595 +zaqefqatanhebrew;0594 +zarqahebrew;0598 +zayin;05D6 +zayindagesh;FB36 +zayindageshhebrew;FB36 +zayinhebrew;05D6 +zbopomofo;3117 +zcaron;017E +zcircle;24E9 +zcircumflex;1E91 +zcurl;0291 +zdot;017C +zdotaccent;017C +zdotbelow;1E93 +zecyrillic;0437 +zedescendercyrillic;0499 +zedieresiscyrillic;04DF +zehiragana;305C +zekatakana;30BC +zero;0030 +zeroarabic;0660 +zerobengali;09E6 +zerodeva;0966 +zerogujarati;0AE6 +zerogurmukhi;0A66 +zerohackarabic;0660 +zeroinferior;2080 +zeromonospace;FF10 +zerooldstyle;F730 +zeropersian;06F0 +zerosuperior;2070 +zerothai;0E50 +zerowidthjoiner;FEFF +zerowidthnonjoiner;200C +zerowidthspace;200B +zeta;03B6 +zhbopomofo;3113 +zhearmenian;056A +zhebrevecyrillic;04C2 +zhecyrillic;0436 +zhedescendercyrillic;0497 +zhedieresiscyrillic;04DD +zihiragana;3058 +zikatakana;30B8 +zinorhebrew;05AE +zlinebelow;1E95 +zmonospace;FF5A +zohiragana;305E +zokatakana;30BE +zparen;24B5 +zretroflexhook;0290 +zstroke;01B6 +zuhiragana;305A +zukatakana;30BA +#--end +############################################################################### +# TeX extensions +Delta;2206;0394 +Ifractur;2111 +# FFsmall, FFIsmall, FFLsmall, FIsmall, FLsmall: invalid Unicode +FFsmall;D804 +FFIsmall;D807 +FFLsmall;D808 +FIsmall;D805 +FLsmall;D806 +# Germandbls: invalid Unicode, used for secondary replacement from EC.enc +Germandbls;1E9E +# Germandblssmall: invalid Unicode +Germandblssmall;D803 +Ng;014A +Omega;2126;03A9 +Rfractur;211C +# SS: invalid Unicode, used for secondary replacement from EC.enc +SS;0053 0053 +# SSsmall: invalid Unicode +SSsmall;D803 +# altselector: invalid Unicode +altselector;D802 +angbracketleft;27E8;2329 +angbracketright;27E9;232A +arrowbothv;2195 +arrowdblbothv;21D5 +arrowleftbothalf;21BD +arrowlefttophalf;21BC +arrownortheast;2197 +arrownorthwest;2196 +arrowrightbothalf;21C1 +arrowrighttophalf;21C0 +arrowsoutheast;2198 +arrowsouthwest;2199 +# ascendercompwordmark: taller cwm, invalid Unicode +ascendercompwordmark;D80A +asteriskcentered;2217 +bardbl;2225 +# capitalcompwordmark: taller cwm, invalid Unicode +capitalcompwordmark;D809 +ceilingleft;2308 +ceilingright;2309 +circlecopyrt;20DD;25CB +circledivide;2298 +circledot;2299 +circleminus;2296 +coproduct;2A3F +# cwm: Unicode for ZWNJ, used for secondary replacement from EC.enc +cwm;200C +dblbracketleft;27E6 +dblbracketright;27E7 +diamond;2662;2666 +diamondmath;22C4 +# 0237 is the proposed allocation for dotless j as of Unicode 4.0 +dotlessj;0237;F6BE +emptyset;2205;F638 +# emptyslot: invalid Unicode; the user explicitly wants this slot empty +emptyslot;D801 +epsilon1;03F5 +equivasymptotic;224D +flat;266D +floorleft;230A +floorright;230B +follows;227B +followsequal;227D +greatermuch;226B +heart;2661;2665 +interrobang;203D +# interrobangdown: inverted interrobang, invalid Unicode +interrobangdown;D80B +intersectionsq;2293 +latticetop;22A4 +lessmuch;226A +lscript;2113 +natural;266E +negationslash;0338 +ng;014B +owner;220B +pertenthousand;2031 +# TeX encodings such as 'texmital.enc' disagree with Unicode and the Adobe +# glyph list; in TeX, the "straight" form of phi takes the name "phi", +# whereas the more-common "loopy" form of phi, \varphi, takes the name "phi1". +phi;03D5;03C6 +phi1;03C6 +pi1;03D6 +precedesequal;227C +prime;2032;02B9 +rho1;03F1 +sharp;266F +similarequal;2243 +slurabove;2322 +slurbelow;2323 +star;22C6 +subsetsqequal;2291 +supersetsqequal;2292 +triangle;25B3 +triangleinv;25BD +triangleleft;25B9 +triangleright;25C3 +turnstileleft;22A2 +turnstileright;22A3 +# twelveudash: 2/3-em dash; invalid Unicode +twelveudash;F6DE +unionmulti;228E +unionsq;2294 +vector;20D7 +# visualspace: Unicode for OPEN BOX, used for secondary replacement from EC.enc +visualspace;2423 +wreathproduct;2240 +# -- Marco Kuhlmann reported annoying glyph neologisms in fontinst encodings +# Dbar = Dcroat +Dbar;0110 +# compwordmark = cwm +compwordmark;200C +# dbar = dcroat +dbar;0111 +# rangedash = endash +rangedash;2013 +# hyphenchar = hyphen +hyphenchar;002D +# punctdash = emdash +punctdash;2014 +# visiblespace = visualspace +visiblespace;2423 +# -- end TeX extensions +# additions by Michal Hoftich +tie;2040 +harpoonleftup;21BC +harpoonleftdown;21BD +harpoonrightup;21C0 +harpoonrightdown;21C1 +hookrightchar;21AA +hookleftchar;21A9 + +parenleftbig;0028 +parenrightbig;0029 +bracketleftbig;005B +bracketrightbig;005D +floorleftbig;230A +floorrightbig;230B +ceilingleftbig;2308 +ceilingrightbig;2309 +braceleftbig;007B +bracerightbig;007D +angleleftbig;2329 +anglerightbig;232A +barex;007C +bardblex;2016 +slashbig;2215 +backslashbig;005C +braceex;007C +parenleftex;007C +parenrightex;007C +unionsqtext;2294 +contintegraltext;222E +circledottext;2299 +circleplustext;2295 +circlemultiplytext;2297 +summationtext;2211 +producttext;220F +integraltext;222B +uniontext;22C3 +intersectiontext;22C2 +unionmultitext;228E +logicalandtext;22C0 +logicalortext;22C1 +coproducttext;2210 +hatwide;0302 +tildewide;0303 +radicalbig;221A +arrowtp;2191 +arrowbt;2193 +arrowdbltp;21D1 +braceleftmid;007C +bracerightmid;2016 +arrowvertex;2195 +arrowdblvertex;21D5 +parenleftBig;0028 +parenrightBig;0029 +slashBig;2215 +backslashBig;005C +angleleftBig;2329 +anglerightBig;232A +bracketleftBig;005B +bracketrightBig;005D +floorleftBig;230A +floorrightBig;230B +ceilingleftBig;2308 +ceilingrightBig;2309 +braceleftBig;007B +bracerightBig;007D +parenleftbigg;0028 +parenrightbigg;0029 +bracketleftbigg;005B +bracketrightbigg;005D +floorleftbigg;230A +floorrightbigg;230B +ceilingleftbigg;2308 +ceilingrightbigg;2309 +braceleftbigg;007B +bracerightbigg;007D +angleleftbigg;2329 +anglerightbigg;232A +slashbigg;2215 +backslashbigg;005C +parenleftBigg;0028 +parenrightBigg;0029 +bracketleftBigg;005B +bracketrightBigg;005D +floorleftBigg;230A +floorrightBigg;230B +ceilingleftBigg;2308 +ceilingrightBigg;2309 +braceleftBigg;007B +bracerightBigg;007D +angleleftBigg;2329 +anglerightBigg;232A +slashBigg;2215 +backslashBigg;005C +unionsqdisplay;2294 +contintegraldisplay;222E +circledotdisplay;2299 +circleplusdisplay;2295 +circlemultiplydisplay;2297 +summationdisplay;2211 +productdisplay;220F +integraldisplay;222B +uniondisplay;22C3 +intersectiondisplay;22C2 +unionmultidisplay;228E +logicalanddisplay;22C0 +logicalordisplay;22C1 +coproductdisplay;2210 +hatwider;0302 +hatwiderr;0302 +tildewider;0303 +tildewiderr;0303 +radicalBig;221A +radicalbigg;221A +radicalBigg;221A +radicalbt;221A +# fixes +a;0061 +b;0062 +c;0063 +d;0064 +e;0065 +f;0066 +Germandbls;0053 0053 +hyphen.alt;2010 diff --git a/frontend/src-tauri/patches/pdf-extract-0.12.0/src/glyphnames.rs b/frontend/src-tauri/patches/pdf-extract-0.12.0/src/glyphnames.rs new file mode 100644 index 00000000..986d97e3 --- /dev/null +++ b/frontend/src-tauri/patches/pdf-extract-0.12.0/src/glyphnames.rs @@ -0,0 +1,4711 @@ +/* Autogenerated from: + https://github.com/michal-h21/htfgen/commits/master/glyphlist-extended.txt + https://github.com/kohler/lcdf-typetools/blob/master/texglyphlist.txt + https://github.com/apache/pdfbox/blob/trunk/pdfbox/src/main/resources/org/apache/pdfbox/resources/glyphlist/additional.txt + */ +pub fn name_to_unicode(name: &str) -> Option { + const names: [(&'static str, u16); 4700] = [ +("A", 0x0041), +("AE", 0x00c6), +("AEacute", 0x01fc), +("AEmacron", 0x01e2), +("AEsmall", 0xf7e6), +("Aacute", 0x00c1), +("Aacutesmall", 0xf7e1), +("Abreve", 0x0102), +("Abreveacute", 0x1eae), +("Abrevecyrillic", 0x04d0), +("Abrevedotbelow", 0x1eb6), +("Abrevegrave", 0x1eb0), +("Abrevehookabove", 0x1eb2), +("Abrevetilde", 0x1eb4), +("Acaron", 0x01cd), +("Acircle", 0x24b6), +("Acircumflex", 0x00c2), +("Acircumflexacute", 0x1ea4), +("Acircumflexdotbelow", 0x1eac), +("Acircumflexgrave", 0x1ea6), +("Acircumflexhookabove", 0x1ea8), +("Acircumflexsmall", 0xf7e2), +("Acircumflextilde", 0x1eaa), +("Acute", 0xf6c9), +("Acutesmall", 0xf7b4), +("Acyrillic", 0x0410), +("Adblgrave", 0x0200), +("Adieresis", 0x00c4), +("Adieresiscyrillic", 0x04d2), +("Adieresismacron", 0x01de), +("Adieresissmall", 0xf7e4), +("Adotbelow", 0x1ea0), +("Adotmacron", 0x01e0), +("Agrave", 0x00c0), +("Agravesmall", 0xf7e0), +("Ahookabove", 0x1ea2), +("Aiecyrillic", 0x04d4), +("Ainvertedbreve", 0x0202), +("Alpha", 0x0391), +("Alphatonos", 0x0386), +("Amacron", 0x0100), +("Amonospace", 0xff21), +("Aogonek", 0x0104), +("Aring", 0x00c5), +("Aringacute", 0x01fa), +("Aringbelow", 0x1e00), +("Aringsmall", 0xf7e5), +("Asmall", 0xf761), +("Atilde", 0x00c3), +("Atildesmall", 0xf7e3), +("Aybarmenian", 0x0531), +("B", 0x0042), +("Bcircle", 0x24b7), +("Bdotaccent", 0x1e02), +("Bdotbelow", 0x1e04), +("Becyrillic", 0x0411), +("Benarmenian", 0x0532), +("Beta", 0x0392), +("Bhook", 0x0181), +("Blinebelow", 0x1e06), +("Bmonospace", 0xff22), +("Brevesmall", 0xf6f4), +("Bsmall", 0xf762), +("Btopbar", 0x0182), +("C", 0x0043), +("Caarmenian", 0x053e), +("Cacute", 0x0106), +("Caron", 0xf6ca), +("Caronsmall", 0xf6f5), +("Ccaron", 0x010c), +("Ccedilla", 0x00c7), +("Ccedillaacute", 0x1e08), +("Ccedillasmall", 0xf7e7), +("Ccircle", 0x24b8), +("Ccircumflex", 0x0108), +("Cdot", 0x010a), +("Cdotaccent", 0x010a), +("Cedillasmall", 0xf7b8), +("Chaarmenian", 0x0549), +("Cheabkhasiancyrillic", 0x04bc), +("Checyrillic", 0x0427), +("Chedescenderabkhasiancyrillic", 0x04be), +("Chedescendercyrillic", 0x04b6), +("Chedieresiscyrillic", 0x04f4), +("Cheharmenian", 0x0543), +("Chekhakassiancyrillic", 0x04cb), +("Cheverticalstrokecyrillic", 0x04b8), +("Chi", 0x03a7), +("Chook", 0x0187), +("Circumflexsmall", 0xf6f6), +("Cmonospace", 0xff23), +("Coarmenian", 0x0551), +("Csmall", 0xf763), +("D", 0x0044), +("DZ", 0x01f1), +("DZcaron", 0x01c4), +("Daarmenian", 0x0534), +("Dafrican", 0x0189), +("Dbar", 0x0110), +("Dcaron", 0x010e), +("Dcedilla", 0x1e10), +("Dcircle", 0x24b9), +("Dcircumflexbelow", 0x1e12), +("Dcroat", 0x0110), +("Ddotaccent", 0x1e0a), +("Ddotbelow", 0x1e0c), +("Decyrillic", 0x0414), +("Deicoptic", 0x03ee), +("Delta", 0x2206), +("Deltagreek", 0x0394), +("Dhook", 0x018a), +("Dieresis", 0xf6cb), +("DieresisAcute", 0xf6cc), +("DieresisGrave", 0xf6cd), +("Dieresissmall", 0xf7a8), +("Digamma", 0x03dd), +("Digammagreek", 0x03dc), +("Djecyrillic", 0x0402), +("Dlinebelow", 0x1e0e), +("Dmonospace", 0xff24), +("Dotaccentsmall", 0xf6f7), +("Dslash", 0x0110), +("Dsmall", 0xf764), +("Dtopbar", 0x018b), +("Dz", 0x01f2), +("Dzcaron", 0x01c5), +("Dzeabkhasiancyrillic", 0x04e0), +("Dzecyrillic", 0x0405), +("Dzhecyrillic", 0x040f), +("E", 0x0045), +("Eacute", 0x00c9), +("Eacutesmall", 0xf7e9), +("Ebreve", 0x0114), +("Ecaron", 0x011a), +("Ecedillabreve", 0x1e1c), +("Echarmenian", 0x0535), +("Ecircle", 0x24ba), +("Ecircumflex", 0x00ca), +("Ecircumflexacute", 0x1ebe), +("Ecircumflexbelow", 0x1e18), +("Ecircumflexdotbelow", 0x1ec6), +("Ecircumflexgrave", 0x1ec0), +("Ecircumflexhookabove", 0x1ec2), +("Ecircumflexsmall", 0xf7ea), +("Ecircumflextilde", 0x1ec4), +("Ecyrillic", 0x0404), +("Edblgrave", 0x0204), +("Edieresis", 0x00cb), +("Edieresissmall", 0xf7eb), +("Edot", 0x0116), +("Edotaccent", 0x0116), +("Edotbelow", 0x1eb8), +("Efcyrillic", 0x0424), +("Egrave", 0x00c8), +("Egravesmall", 0xf7e8), +("Eharmenian", 0x0537), +("Ehookabove", 0x1eba), +("Eightroman", 0x2167), +("Einvertedbreve", 0x0206), +("Eiotifiedcyrillic", 0x0464), +("Elcyrillic", 0x041b), +("Elevenroman", 0x216a), +("Emacron", 0x0112), +("Emacronacute", 0x1e16), +("Emacrongrave", 0x1e14), +("Emcyrillic", 0x041c), +("Emonospace", 0xff25), +("Encyrillic", 0x041d), +("Endescendercyrillic", 0x04a2), +("Eng", 0x014a), +("Enghecyrillic", 0x04a4), +("Enhookcyrillic", 0x04c7), +("Eogonek", 0x0118), +("Eopen", 0x0190), +("Epsilon", 0x0395), +("Epsilontonos", 0x0388), +("Ercyrillic", 0x0420), +("Ereversed", 0x018e), +("Ereversedcyrillic", 0x042d), +("Escyrillic", 0x0421), +("Esdescendercyrillic", 0x04aa), +("Esh", 0x01a9), +("Esmall", 0xf765), +("Eta", 0x0397), +("Etarmenian", 0x0538), +("Etatonos", 0x0389), +("Eth", 0x00d0), +("Ethsmall", 0xf7f0), +("Etilde", 0x1ebc), +("Etildebelow", 0x1e1a), +("Euro", 0x20ac), +("Ezh", 0x01b7), +("Ezhcaron", 0x01ee), +("Ezhreversed", 0x01b8), +("F", 0x0046), +("FFIsmall", 0xd807), +("FFLsmall", 0xd808), +("FFsmall", 0xd804), +("FIsmall", 0xd805), +("FLsmall", 0xd806), +("Fcircle", 0x24bb), +("Fdotaccent", 0x1e1e), +("Feharmenian", 0x0556), +("Feicoptic", 0x03e4), +("Fhook", 0x0191), +("Finv", 0x2132), +("Fitacyrillic", 0x0472), +("Fiveroman", 0x2164), +("Fmonospace", 0xff26), +("Fourroman", 0x2163), +("Fsmall", 0xf766), +("G", 0x0047), +("GBsquare", 0x3387), +("Gacute", 0x01f4), +("Gamma", 0x0393), +("Gammaafrican", 0x0194), +("Gangiacoptic", 0x03ea), +("Gbreve", 0x011e), +("Gcaron", 0x01e6), +("Gcedilla", 0x0122), +("Gcircle", 0x24bc), +("Gcircumflex", 0x011c), +("Gcommaaccent", 0x0122), +("Gdot", 0x0120), +("Gdotaccent", 0x0120), +("Gecyrillic", 0x0413), +("Germandbls", 0x1e9e), +("Germandblssmall", 0xd803), +("Ghadarmenian", 0x0542), +("Ghemiddlehookcyrillic", 0x0494), +("Ghestrokecyrillic", 0x0492), +("Gheupturncyrillic", 0x0490), +("Ghook", 0x0193), +("Gimarmenian", 0x0533), +("Gjecyrillic", 0x0403), +("Gmacron", 0x1e20), +("Gmir", 0x2141), +("Gmonospace", 0xff27), +("Grave", 0xf6ce), +("Gravesmall", 0xf760), +("Gsmall", 0xf767), +("Gsmallhook", 0x029b), +("Gstroke", 0x01e4), +("H", 0x0048), +("H18533", 0x25cf), +("H18543", 0x25aa), +("H18551", 0x25ab), +("H22073", 0x25a1), +("HPsquare", 0x33cb), +("Haabkhasiancyrillic", 0x04a8), +("Hadescendercyrillic", 0x04b2), +("Hardsigncyrillic", 0x042a), +("Hbar", 0x0126), +("Hbrevebelow", 0x1e2a), +("Hcedilla", 0x1e28), +("Hcircle", 0x24bd), +("Hcircumflex", 0x0124), +("Hdieresis", 0x1e26), +("Hdotaccent", 0x1e22), +("Hdotbelow", 0x1e24), +("Hmonospace", 0xff28), +("Hoarmenian", 0x0540), +("Horicoptic", 0x03e8), +("Hsmall", 0xf768), +("Hungarumlaut", 0xf6cf), +("Hungarumlautsmall", 0xf6f8), +("Hzsquare", 0x3390), +("I", 0x0049), +("IAcyrillic", 0x042f), +("IJ", 0x0132), +("IUcyrillic", 0x042e), +("Iacute", 0x00cd), +("Iacutesmall", 0xf7ed), +("Ibreve", 0x012c), +("Icaron", 0x01cf), +("Icircle", 0x24be), +("Icircumflex", 0x00ce), +("Icircumflexsmall", 0xf7ee), +("Icyrillic", 0x0406), +("Idblgrave", 0x0208), +("Idieresis", 0x00cf), +("Idieresisacute", 0x1e2e), +("Idieresiscyrillic", 0x04e4), +("Idieresissmall", 0xf7ef), +("Idot", 0x0130), +("Idotaccent", 0x0130), +("Idotbelow", 0x1eca), +("Iebrevecyrillic", 0x04d6), +("Iecyrillic", 0x0415), +("Ifractur", 0x2111), +("Ifraktur", 0x2111), +("Igrave", 0x00cc), +("Igravesmall", 0xf7ec), +("Ihookabove", 0x1ec8), +("Iicyrillic", 0x0418), +("Iinvertedbreve", 0x020a), +("Iishortcyrillic", 0x0419), +("Imacron", 0x012a), +("Imacroncyrillic", 0x04e2), +("Imonospace", 0xff29), +("Iniarmenian", 0x053b), +("Iocyrillic", 0x0401), +("Iogonek", 0x012e), +("Iota", 0x0399), +("Iotaafrican", 0x0196), +("Iotadieresis", 0x03aa), +("Iotatonos", 0x038a), +("Ismall", 0xf769), +("Istroke", 0x0197), +("Itilde", 0x0128), +("Itildebelow", 0x1e2c), +("Izhitsacyrillic", 0x0474), +("Izhitsadblgravecyrillic", 0x0476), +("J", 0x004a), +("Jaarmenian", 0x0541), +("Jcircle", 0x24bf), +("Jcircumflex", 0x0134), +("Jecyrillic", 0x0408), +("Jheharmenian", 0x054b), +("Jmonospace", 0xff2a), +("Jsmall", 0xf76a), +("K", 0x004b), +("KBsquare", 0x3385), +("KKsquare", 0x33cd), +("Kabashkircyrillic", 0x04a0), +("Kacute", 0x1e30), +("Kacyrillic", 0x041a), +("Kadescendercyrillic", 0x049a), +("Kahookcyrillic", 0x04c3), +("Kappa", 0x039a), +("Kastrokecyrillic", 0x049e), +("Kaverticalstrokecyrillic", 0x049c), +("Kcaron", 0x01e8), +("Kcedilla", 0x0136), +("Kcircle", 0x24c0), +("Kcommaaccent", 0x0136), +("Kdotbelow", 0x1e32), +("Keharmenian", 0x0554), +("Kenarmenian", 0x053f), +("Khacyrillic", 0x0425), +("Kheicoptic", 0x03e6), +("Khook", 0x0198), +("Kjecyrillic", 0x040c), +("Klinebelow", 0x1e34), +("Kmonospace", 0xff2b), +("Koppacyrillic", 0x0480), +("Koppagreek", 0x03de), +("Ksicyrillic", 0x046e), +("Ksmall", 0xf76b), +("L", 0x004c), +("LJ", 0x01c7), +("LL", 0xf6bf), +("Lacute", 0x0139), +("Lambda", 0x039b), +("Lcaron", 0x013d), +("Lcedilla", 0x013b), +("Lcircle", 0x24c1), +("Lcircumflexbelow", 0x1e3c), +("Lcommaaccent", 0x013b), +("Ldot", 0x013f), +("Ldotaccent", 0x013f), +("Ldotbelow", 0x1e36), +("Ldotbelowmacron", 0x1e38), +("Liwnarmenian", 0x053c), +("Lj", 0x01c8), +("Ljecyrillic", 0x0409), +("Llinebelow", 0x1e3a), +("Lmonospace", 0xff2c), +("Lslash", 0x0141), +("Lslashsmall", 0xf6f9), +("Lsmall", 0xf76c), +("M", 0x004d), +("MBsquare", 0x3386), +("Macron", 0xf6d0), +("Macronsmall", 0xf7af), +("Macute", 0x1e3e), +("Mcircle", 0x24c2), +("Mdotaccent", 0x1e40), +("Mdotbelow", 0x1e42), +("Menarmenian", 0x0544), +("Mmonospace", 0xff2d), +("Msmall", 0xf76d), +("Mturned", 0x019c), +("Mu", 0x039c), +("N", 0x004e), +("NJ", 0x01ca), +("Nacute", 0x0143), +("Ncaron", 0x0147), +("Ncedilla", 0x0145), +("Ncircle", 0x24c3), +("Ncircumflexbelow", 0x1e4a), +("Ncommaaccent", 0x0145), +("Ndotaccent", 0x1e44), +("Ndotbelow", 0x1e46), +("Ng", 0x014a), +("Nhookleft", 0x019d), +("Nineroman", 0x2168), +("Nj", 0x01cb), +("Njecyrillic", 0x040a), +("Nlinebelow", 0x1e48), +("Nmonospace", 0xff2e), +("Nowarmenian", 0x0546), +("Nsmall", 0xf76e), +("Ntilde", 0x00d1), +("Ntildesmall", 0xf7f1), +("Nu", 0x039d), +("O", 0x004f), +("OE", 0x0152), +("OEsmall", 0xf6fa), +("Oacute", 0x00d3), +("Oacutesmall", 0xf7f3), +("Obarredcyrillic", 0x04e8), +("Obarreddieresiscyrillic", 0x04ea), +("Obreve", 0x014e), +("Ocaron", 0x01d1), +("Ocenteredtilde", 0x019f), +("Ocircle", 0x24c4), +("Ocircumflex", 0x00d4), +("Ocircumflexacute", 0x1ed0), +("Ocircumflexdotbelow", 0x1ed8), +("Ocircumflexgrave", 0x1ed2), +("Ocircumflexhookabove", 0x1ed4), +("Ocircumflexsmall", 0xf7f4), +("Ocircumflextilde", 0x1ed6), +("Ocyrillic", 0x041e), +("Odblacute", 0x0150), +("Odblgrave", 0x020c), +("Odieresis", 0x00d6), +("Odieresiscyrillic", 0x04e6), +("Odieresissmall", 0xf7f6), +("Odotbelow", 0x1ecc), +("Ogoneksmall", 0xf6fb), +("Ograve", 0x00d2), +("Ogravesmall", 0xf7f2), +("Oharmenian", 0x0555), +("Ohm", 0x2126), +("Ohookabove", 0x1ece), +("Ohorn", 0x01a0), +("Ohornacute", 0x1eda), +("Ohorndotbelow", 0x1ee2), +("Ohorngrave", 0x1edc), +("Ohornhookabove", 0x1ede), +("Ohorntilde", 0x1ee0), +("Ohungarumlaut", 0x0150), +("Oi", 0x01a2), +("Oinvertedbreve", 0x020e), +("Omacron", 0x014c), +("Omacronacute", 0x1e52), +("Omacrongrave", 0x1e50), +("Omega", 0x2126), +("Omegacyrillic", 0x0460), +("Omegagreek", 0x03a9), +("Omegainv", 0x2127), +("Omegaroundcyrillic", 0x047a), +("Omegatitlocyrillic", 0x047c), +("Omegatonos", 0x038f), +("Omicron", 0x039f), +("Omicrontonos", 0x038c), +("Omonospace", 0xff2f), +("Oneroman", 0x2160), +("Oogonek", 0x01ea), +("Oogonekmacron", 0x01ec), +("Oopen", 0x0186), +("Oslash", 0x00d8), +("Oslashacute", 0x01fe), +("Oslashsmall", 0xf7f8), +("Osmall", 0xf76f), +("Ostrokeacute", 0x01fe), +("Otcyrillic", 0x047e), +("Otilde", 0x00d5), +("Otildeacute", 0x1e4c), +("Otildedieresis", 0x1e4e), +("Otildesmall", 0xf7f5), +("P", 0x0050), +("Pacute", 0x1e54), +("Pcircle", 0x24c5), +("Pdotaccent", 0x1e56), +("Pecyrillic", 0x041f), +("Peharmenian", 0x054a), +("Pemiddlehookcyrillic", 0x04a6), +("Phi", 0x03a6), +("Phook", 0x01a4), +("Pi", 0x03a0), +("Piwrarmenian", 0x0553), +("Pmonospace", 0xff30), +("Psi", 0x03a8), +("Psicyrillic", 0x0470), +("Psmall", 0xf770), +("Q", 0x0051), +("Qcircle", 0x24c6), +("Qmonospace", 0xff31), +("Qsmall", 0xf771), +("R", 0x0052), +("Raarmenian", 0x054c), +("Racute", 0x0154), +("Rcaron", 0x0158), +("Rcedilla", 0x0156), +("Rcircle", 0x24c7), +("Rcommaaccent", 0x0156), +("Rdblgrave", 0x0210), +("Rdotaccent", 0x1e58), +("Rdotbelow", 0x1e5a), +("Rdotbelowmacron", 0x1e5c), +("Reharmenian", 0x0550), +("Rfractur", 0x211c), +("Rfraktur", 0x211c), +("Rho", 0x03a1), +("Ringsmall", 0xf6fc), +("Rinvertedbreve", 0x0212), +("Rlinebelow", 0x1e5e), +("Rmonospace", 0xff32), +("Rsmall", 0xf772), +("Rsmallinverted", 0x0281), +("Rsmallinvertedsuperior", 0x02b6), +("S", 0x0053), +("SF010000", 0x250c), +("SF020000", 0x2514), +("SF030000", 0x2510), +("SF040000", 0x2518), +("SF050000", 0x253c), +("SF060000", 0x252c), +("SF070000", 0x2534), +("SF080000", 0x251c), +("SF090000", 0x2524), +("SF100000", 0x2500), +("SF110000", 0x2502), +("SF190000", 0x2561), +("SF200000", 0x2562), +("SF210000", 0x2556), +("SF220000", 0x2555), +("SF230000", 0x2563), +("SF240000", 0x2551), +("SF250000", 0x2557), +("SF260000", 0x255d), +("SF270000", 0x255c), +("SF280000", 0x255b), +("SF360000", 0x255e), +("SF370000", 0x255f), +("SF380000", 0x255a), +("SF390000", 0x2554), +("SF400000", 0x2569), +("SF410000", 0x2566), +("SF420000", 0x2560), +("SF430000", 0x2550), +("SF440000", 0x256c), +("SF450000", 0x2567), +("SF460000", 0x2568), +("SF470000", 0x2564), +("SF480000", 0x2565), +("SF490000", 0x2559), +("SF500000", 0x2558), +("SF510000", 0x2552), +("SF520000", 0x2553), +("SF530000", 0x256b), +("SF540000", 0x256a), +("SS", 0x0053), +("SSsmall", 0xd803), +("Sacute", 0x015a), +("Sacutedotaccent", 0x1e64), +("Sampigreek", 0x03e0), +("Scaron", 0x0160), +("Scarondotaccent", 0x1e66), +("Scaronsmall", 0xf6fd), +("Scedilla", 0x015e), +("Schwa", 0x018f), +("Schwacyrillic", 0x04d8), +("Schwadieresiscyrillic", 0x04da), +("Scircle", 0x24c8), +("Scircumflex", 0x015c), +("Scommaaccent", 0x0218), +("Sdotaccent", 0x1e60), +("Sdotbelow", 0x1e62), +("Sdotbelowdotaccent", 0x1e68), +("Seharmenian", 0x054d), +("Sevenroman", 0x2166), +("Shaarmenian", 0x0547), +("Shacyrillic", 0x0428), +("Shchacyrillic", 0x0429), +("Sheicoptic", 0x03e2), +("Shhacyrillic", 0x04ba), +("Shimacoptic", 0x03ec), +("Sigma", 0x03a3), +("Sixroman", 0x2165), +("Smonospace", 0xff33), +("Softsigncyrillic", 0x042c), +("Ssmall", 0xf773), +("Stigmagreek", 0x03da), +("T", 0x0054), +("Tau", 0x03a4), +("Tbar", 0x0166), +("Tcaron", 0x0164), +("Tcedilla", 0x0162), +("Tcircle", 0x24c9), +("Tcircumflexbelow", 0x1e70), +("Tcommaaccent", 0x0162), +("Tdotaccent", 0x1e6a), +("Tdotbelow", 0x1e6c), +("Tecyrillic", 0x0422), +("Tedescendercyrillic", 0x04ac), +("Tenroman", 0x2169), +("Tetsecyrillic", 0x04b4), +("Theta", 0x0398), +("Thook", 0x01ac), +("Thorn", 0x00de), +("Thornsmall", 0xf7fe), +("Threeroman", 0x2162), +("Tildesmall", 0xf6fe), +("Tiwnarmenian", 0x054f), +("Tlinebelow", 0x1e6e), +("Tmonospace", 0xff34), +("Toarmenian", 0x0539), +("Tonefive", 0x01bc), +("Tonesix", 0x0184), +("Tonetwo", 0x01a7), +("Tretroflexhook", 0x01ae), +("Tsecyrillic", 0x0426), +("Tshecyrillic", 0x040b), +("Tsmall", 0xf774), +("Twelveroman", 0x216b), +("Tworoman", 0x2161), +("U", 0x0055), +("Uacute", 0x00da), +("Uacutesmall", 0xf7fa), +("Ubreve", 0x016c), +("Ucaron", 0x01d3), +("Ucircle", 0x24ca), +("Ucircumflex", 0x00db), +("Ucircumflexbelow", 0x1e76), +("Ucircumflexsmall", 0xf7fb), +("Ucyrillic", 0x0423), +("Udblacute", 0x0170), +("Udblgrave", 0x0214), +("Udieresis", 0x00dc), +("Udieresisacute", 0x01d7), +("Udieresisbelow", 0x1e72), +("Udieresiscaron", 0x01d9), +("Udieresiscyrillic", 0x04f0), +("Udieresisgrave", 0x01db), +("Udieresismacron", 0x01d5), +("Udieresissmall", 0xf7fc), +("Udotbelow", 0x1ee4), +("Ugrave", 0x00d9), +("Ugravesmall", 0xf7f9), +("Uhookabove", 0x1ee6), +("Uhorn", 0x01af), +("Uhornacute", 0x1ee8), +("Uhorndotbelow", 0x1ef0), +("Uhorngrave", 0x1eea), +("Uhornhookabove", 0x1eec), +("Uhorntilde", 0x1eee), +("Uhungarumlaut", 0x0170), +("Uhungarumlautcyrillic", 0x04f2), +("Uinvertedbreve", 0x0216), +("Ukcyrillic", 0x0478), +("Umacron", 0x016a), +("Umacroncyrillic", 0x04ee), +("Umacrondieresis", 0x1e7a), +("Umonospace", 0xff35), +("Uogonek", 0x0172), +("Upsilon", 0x03a5), +("Upsilon1", 0x03d2), +("Upsilonacutehooksymbolgreek", 0x03d3), +("Upsilonafrican", 0x01b1), +("Upsilondieresis", 0x03ab), +("Upsilondieresishooksymbolgreek", 0x03d4), +("Upsilonhooksymbol", 0x03d2), +("Upsilontonos", 0x038e), +("Uring", 0x016e), +("Ushortcyrillic", 0x040e), +("Usmall", 0xf775), +("Ustraightcyrillic", 0x04ae), +("Ustraightstrokecyrillic", 0x04b0), +("Utilde", 0x0168), +("Utildeacute", 0x1e78), +("Utildebelow", 0x1e74), +("V", 0x0056), +("Vcircle", 0x24cb), +("Vdotbelow", 0x1e7e), +("Vecyrillic", 0x0412), +("Vewarmenian", 0x054e), +("Vhook", 0x01b2), +("Vmonospace", 0xff36), +("Voarmenian", 0x0548), +("Vsmall", 0xf776), +("Vtilde", 0x1e7c), +("W", 0x0057), +("Wacute", 0x1e82), +("Wcircle", 0x24cc), +("Wcircumflex", 0x0174), +("Wdieresis", 0x1e84), +("Wdotaccent", 0x1e86), +("Wdotbelow", 0x1e88), +("Wgrave", 0x1e80), +("Wmonospace", 0xff37), +("Wsmall", 0xf777), +("X", 0x0058), +("Xcircle", 0x24cd), +("Xdieresis", 0x1e8c), +("Xdotaccent", 0x1e8a), +("Xeharmenian", 0x053d), +("Xi", 0x039e), +("Xmonospace", 0xff38), +("Xsmall", 0xf778), +("Y", 0x0059), +("Yacute", 0x00dd), +("Yacutesmall", 0xf7fd), +("Yatcyrillic", 0x0462), +("Ycircle", 0x24ce), +("Ycircumflex", 0x0176), +("Ydieresis", 0x0178), +("Ydieresissmall", 0xf7ff), +("Ydotaccent", 0x1e8e), +("Ydotbelow", 0x1ef4), +("Yen", 0x00a5), +("Yericyrillic", 0x042b), +("Yerudieresiscyrillic", 0x04f8), +("Ygrave", 0x1ef2), +("Yhook", 0x01b3), +("Yhookabove", 0x1ef6), +("Yiarmenian", 0x0545), +("Yicyrillic", 0x0407), +("Yiwnarmenian", 0x0552), +("Ymonospace", 0xff39), +("Ysmall", 0xf779), +("Ytilde", 0x1ef8), +("Yusbigcyrillic", 0x046a), +("Yusbigiotifiedcyrillic", 0x046c), +("Yuslittlecyrillic", 0x0466), +("Yuslittleiotifiedcyrillic", 0x0468), +("Z", 0x005a), +("Zaarmenian", 0x0536), +("Zacute", 0x0179), +("Zcaron", 0x017d), +("Zcaronsmall", 0xf6ff), +("Zcircle", 0x24cf), +("Zcircumflex", 0x1e90), +("Zdot", 0x017b), +("Zdotaccent", 0x017b), +("Zdotbelow", 0x1e92), +("Zecyrillic", 0x0417), +("Zedescendercyrillic", 0x0498), +("Zedieresiscyrillic", 0x04de), +("Zeta", 0x0396), +("Zhearmenian", 0x053a), +("Zhebrevecyrillic", 0x04c1), +("Zhecyrillic", 0x0416), +("Zhedescendercyrillic", 0x0496), +("Zhedieresiscyrillic", 0x04dc), +("Zlinebelow", 0x1e94), +("Zmonospace", 0xff3a), +("Zsmall", 0xf77a), +("Zstroke", 0x01b5), +("a", 0x0061), +("aabengali", 0x0986), +("aacute", 0x00e1), +("aadeva", 0x0906), +("aagujarati", 0x0a86), +("aagurmukhi", 0x0a06), +("aamatragurmukhi", 0x0a3e), +("aarusquare", 0x3303), +("aavowelsignbengali", 0x09be), +("aavowelsigndeva", 0x093e), +("aavowelsigngujarati", 0x0abe), +("abbreviationmarkarmenian", 0x055f), +("abbreviationsigndeva", 0x0970), +("abengali", 0x0985), +("abopomofo", 0x311a), +("abreve", 0x0103), +("abreveacute", 0x1eaf), +("abrevecyrillic", 0x04d1), +("abrevedotbelow", 0x1eb7), +("abrevegrave", 0x1eb1), +("abrevehookabove", 0x1eb3), +("abrevetilde", 0x1eb5), +("acaron", 0x01ce), +("acircle", 0x24d0), +("acircumflex", 0x00e2), +("acircumflexacute", 0x1ea5), +("acircumflexdotbelow", 0x1ead), +("acircumflexgrave", 0x1ea7), +("acircumflexhookabove", 0x1ea9), +("acircumflextilde", 0x1eab), +("acute", 0x00b4), +("acutebelowcmb", 0x0317), +("acutecmb", 0x0301), +("acutecomb", 0x0301), +("acutedeva", 0x0954), +("acutelowmod", 0x02cf), +("acutetonecmb", 0x0341), +("acyrillic", 0x0430), +("adblgrave", 0x0201), +("addakgurmukhi", 0x0a71), +("adeva", 0x0905), +("adieresis", 0x00e4), +("adieresiscyrillic", 0x04d3), +("adieresismacron", 0x01df), +("adotbelow", 0x1ea1), +("adotmacron", 0x01e1), +("ae", 0x00e6), +("aeacute", 0x01fd), +("aekorean", 0x3150), +("aemacron", 0x01e3), +("afii00208", 0x2015), +("afii08941", 0x20a4), +("afii10017", 0x0410), +("afii10018", 0x0411), +("afii10019", 0x0412), +("afii10020", 0x0413), +("afii10021", 0x0414), +("afii10022", 0x0415), +("afii10023", 0x0401), +("afii10024", 0x0416), +("afii10025", 0x0417), +("afii10026", 0x0418), +("afii10027", 0x0419), +("afii10028", 0x041a), +("afii10029", 0x041b), +("afii10030", 0x041c), +("afii10031", 0x041d), +("afii10032", 0x041e), +("afii10033", 0x041f), +("afii10034", 0x0420), +("afii10035", 0x0421), +("afii10036", 0x0422), +("afii10037", 0x0423), +("afii10038", 0x0424), +("afii10039", 0x0425), +("afii10040", 0x0426), +("afii10041", 0x0427), +("afii10042", 0x0428), +("afii10043", 0x0429), +("afii10044", 0x042a), +("afii10045", 0x042b), +("afii10046", 0x042c), +("afii10047", 0x042d), +("afii10048", 0x042e), +("afii10049", 0x042f), +("afii10050", 0x0490), +("afii10051", 0x0402), +("afii10052", 0x0403), +("afii10053", 0x0404), +("afii10054", 0x0405), +("afii10055", 0x0406), +("afii10056", 0x0407), +("afii10057", 0x0408), +("afii10058", 0x0409), +("afii10059", 0x040a), +("afii10060", 0x040b), +("afii10061", 0x040c), +("afii10062", 0x040e), +("afii10063", 0xf6c4), +("afii10064", 0xf6c5), +("afii10065", 0x0430), +("afii10066", 0x0431), +("afii10067", 0x0432), +("afii10068", 0x0433), +("afii10069", 0x0434), +("afii10070", 0x0435), +("afii10071", 0x0451), +("afii10072", 0x0436), +("afii10073", 0x0437), +("afii10074", 0x0438), +("afii10075", 0x0439), +("afii10076", 0x043a), +("afii10077", 0x043b), +("afii10078", 0x043c), +("afii10079", 0x043d), +("afii10080", 0x043e), +("afii10081", 0x043f), +("afii10082", 0x0440), +("afii10083", 0x0441), +("afii10084", 0x0442), +("afii10085", 0x0443), +("afii10086", 0x0444), +("afii10087", 0x0445), +("afii10088", 0x0446), +("afii10089", 0x0447), +("afii10090", 0x0448), +("afii10091", 0x0449), +("afii10092", 0x044a), +("afii10093", 0x044b), +("afii10094", 0x044c), +("afii10095", 0x044d), +("afii10096", 0x044e), +("afii10097", 0x044f), +("afii10098", 0x0491), +("afii10099", 0x0452), +("afii10100", 0x0453), +("afii10101", 0x0454), +("afii10102", 0x0455), +("afii10103", 0x0456), +("afii10104", 0x0457), +("afii10105", 0x0458), +("afii10106", 0x0459), +("afii10107", 0x045a), +("afii10108", 0x045b), +("afii10109", 0x045c), +("afii10110", 0x045e), +("afii10145", 0x040f), +("afii10146", 0x0462), +("afii10147", 0x0472), +("afii10148", 0x0474), +("afii10192", 0xf6c6), +("afii10193", 0x045f), +("afii10194", 0x0463), +("afii10195", 0x0473), +("afii10196", 0x0475), +("afii10831", 0xf6c7), +("afii10832", 0xf6c8), +("afii10846", 0x04d9), +("afii299", 0x200e), +("afii300", 0x200f), +("afii301", 0x200d), +("afii57381", 0x066a), +("afii57388", 0x060c), +("afii57392", 0x0660), +("afii57393", 0x0661), +("afii57394", 0x0662), +("afii57395", 0x0663), +("afii57396", 0x0664), +("afii57397", 0x0665), +("afii57398", 0x0666), +("afii57399", 0x0667), +("afii57400", 0x0668), +("afii57401", 0x0669), +("afii57403", 0x061b), +("afii57407", 0x061f), +("afii57409", 0x0621), +("afii57410", 0x0622), +("afii57411", 0x0623), +("afii57412", 0x0624), +("afii57413", 0x0625), +("afii57414", 0x0626), +("afii57415", 0x0627), +("afii57416", 0x0628), +("afii57417", 0x0629), +("afii57418", 0x062a), +("afii57419", 0x062b), +("afii57420", 0x062c), +("afii57421", 0x062d), +("afii57422", 0x062e), +("afii57423", 0x062f), +("afii57424", 0x0630), +("afii57425", 0x0631), +("afii57426", 0x0632), +("afii57427", 0x0633), +("afii57428", 0x0634), +("afii57429", 0x0635), +("afii57430", 0x0636), +("afii57431", 0x0637), +("afii57432", 0x0638), +("afii57433", 0x0639), +("afii57434", 0x063a), +("afii57440", 0x0640), +("afii57441", 0x0641), +("afii57442", 0x0642), +("afii57443", 0x0643), +("afii57444", 0x0644), +("afii57445", 0x0645), +("afii57446", 0x0646), +("afii57448", 0x0648), +("afii57449", 0x0649), +("afii57450", 0x064a), +("afii57451", 0x064b), +("afii57452", 0x064c), +("afii57453", 0x064d), +("afii57454", 0x064e), +("afii57455", 0x064f), +("afii57456", 0x0650), +("afii57457", 0x0651), +("afii57458", 0x0652), +("afii57470", 0x0647), +("afii57505", 0x06a4), +("afii57506", 0x067e), +("afii57507", 0x0686), +("afii57508", 0x0698), +("afii57509", 0x06af), +("afii57511", 0x0679), +("afii57512", 0x0688), +("afii57513", 0x0691), +("afii57514", 0x06ba), +("afii57519", 0x06d2), +("afii57534", 0x06d5), +("afii57636", 0x20aa), +("afii57645", 0x05be), +("afii57658", 0x05c3), +("afii57664", 0x05d0), +("afii57665", 0x05d1), +("afii57666", 0x05d2), +("afii57667", 0x05d3), +("afii57668", 0x05d4), +("afii57669", 0x05d5), +("afii57670", 0x05d6), +("afii57671", 0x05d7), +("afii57672", 0x05d8), +("afii57673", 0x05d9), +("afii57674", 0x05da), +("afii57675", 0x05db), +("afii57676", 0x05dc), +("afii57677", 0x05dd), +("afii57678", 0x05de), +("afii57679", 0x05df), +("afii57680", 0x05e0), +("afii57681", 0x05e1), +("afii57682", 0x05e2), +("afii57683", 0x05e3), +("afii57684", 0x05e4), +("afii57685", 0x05e5), +("afii57686", 0x05e6), +("afii57687", 0x05e7), +("afii57688", 0x05e8), +("afii57689", 0x05e9), +("afii57690", 0x05ea), +("afii57694", 0xfb2a), +("afii57695", 0xfb2b), +("afii57700", 0xfb4b), +("afii57705", 0xfb1f), +("afii57716", 0x05f0), +("afii57717", 0x05f1), +("afii57718", 0x05f2), +("afii57723", 0xfb35), +("afii57793", 0x05b4), +("afii57794", 0x05b5), +("afii57795", 0x05b6), +("afii57796", 0x05bb), +("afii57797", 0x05b8), +("afii57798", 0x05b7), +("afii57799", 0x05b0), +("afii57800", 0x05b2), +("afii57801", 0x05b1), +("afii57802", 0x05b3), +("afii57803", 0x05c2), +("afii57804", 0x05c1), +("afii57806", 0x05b9), +("afii57807", 0x05bc), +("afii57839", 0x05bd), +("afii57841", 0x05bf), +("afii57842", 0x05c0), +("afii57929", 0x02bc), +("afii61248", 0x2105), +("afii61289", 0x2113), +("afii61352", 0x2116), +("afii61573", 0x202c), +("afii61574", 0x202d), +("afii61575", 0x202e), +("afii61664", 0x200c), +("afii63167", 0x066d), +("afii64937", 0x02bd), +("agrave", 0x00e0), +("agujarati", 0x0a85), +("agurmukhi", 0x0a05), +("ahiragana", 0x3042), +("ahookabove", 0x1ea3), +("aibengali", 0x0990), +("aibopomofo", 0x311e), +("aideva", 0x0910), +("aiecyrillic", 0x04d5), +("aigujarati", 0x0a90), +("aigurmukhi", 0x0a10), +("aimatragurmukhi", 0x0a48), +("ainarabic", 0x0639), +("ainfinalarabic", 0xfeca), +("aininitialarabic", 0xfecb), +("ainmedialarabic", 0xfecc), +("ainvertedbreve", 0x0203), +("aivowelsignbengali", 0x09c8), +("aivowelsigndeva", 0x0948), +("aivowelsigngujarati", 0x0ac8), +("akatakana", 0x30a2), +("akatakanahalfwidth", 0xff71), +("akorean", 0x314f), +("alef", 0x05d0), +("alefarabic", 0x0627), +("alefdageshhebrew", 0xfb30), +("aleffinalarabic", 0xfe8e), +("alefhamzaabovearabic", 0x0623), +("alefhamzaabovefinalarabic", 0xfe84), +("alefhamzabelowarabic", 0x0625), +("alefhamzabelowfinalarabic", 0xfe88), +("alefhebrew", 0x05d0), +("aleflamedhebrew", 0xfb4f), +("alefmaddaabovearabic", 0x0622), +("alefmaddaabovefinalarabic", 0xfe82), +("alefmaksuraarabic", 0x0649), +("alefmaksurafinalarabic", 0xfef0), +("alefmaksurainitialarabic", 0xfef3), +("alefmaksuramedialarabic", 0xfef4), +("alefpatahhebrew", 0xfb2e), +("alefqamatshebrew", 0xfb2f), +("aleph", 0x2135), +("allequal", 0x224c), +("alpha", 0x03b1), +("alphatonos", 0x03ac), +("altselector", 0xd802), +("amacron", 0x0101), +("amonospace", 0xff41), +("ampersand", 0x0026), +("ampersandmonospace", 0xff06), +("ampersandsmall", 0xf726), +("amsquare", 0x33c2), +("anbopomofo", 0x3122), +("angbopomofo", 0x3124), +("angbracketleft", 0x27e8), +("angbracketleftBig", 0x2329), +("angbracketleftBigg", 0x2329), +("angbracketleftbig", 0x2329), +("angbracketleftbigg", 0x2329), +("angbracketright", 0x27e9), +("angbracketrightBig", 0x232a), +("angbracketrightBigg", 0x232a), +("angbracketrightbig", 0x232a), +("angbracketrightbigg", 0x232a), +("angkhankhuthai", 0x0e5a), +("angle", 0x2220), +("anglebracketleft", 0x3008), +("anglebracketleftvertical", 0xfe3f), +("anglebracketright", 0x3009), +("anglebracketrightvertical", 0xfe40), +("angleleft", 0x2329), +("angleleftBig", 0x2329), +("angleleftBigg", 0x2329), +("angleleftbig", 0x2329), +("angleleftbigg", 0x2329), +("angleright", 0x232a), +("anglerightBig", 0x232a), +("anglerightBigg", 0x232a), +("anglerightbig", 0x232a), +("anglerightbigg", 0x232a), +("angstrom", 0x212b), +("anoteleia", 0x0387), +("anticlockwise", 0x27f2), +("anudattadeva", 0x0952), +("anusvarabengali", 0x0982), +("anusvaradeva", 0x0902), +("anusvaragujarati", 0x0a82), +("aogonek", 0x0105), +("apaatosquare", 0x3300), +("aparen", 0x249c), +("apostrophearmenian", 0x055a), +("apostrophemod", 0x02bc), +("apple", 0xf8ff), +("approaches", 0x2250), +("approxequal", 0x2248), +("approxequalorimage", 0x2252), +("approximatelyequal", 0x2245), +("approxorequal", 0x224a), +("araeaekorean", 0x318e), +("araeakorean", 0x318d), +("arc", 0x2312), +("archleftdown", 0x21b6), +("archrightdown", 0x21b7), +("arighthalfring", 0x1e9a), +("aring", 0x00e5), +("aringacute", 0x01fb), +("aringbelow", 0x1e01), +("arrowboth", 0x2194), +("arrowbothv", 0x2195), +("arrowbt", 0x2193), +("arrowdashdown", 0x21e3), +("arrowdashleft", 0x21e0), +("arrowdashright", 0x21e2), +("arrowdashup", 0x21e1), +("arrowdblboth", 0x21d4), +("arrowdblbothv", 0x21d5), +("arrowdbldown", 0x21d3), +("arrowdblleft", 0x21d0), +("arrowdblright", 0x21d2), +("arrowdbltp", 0x21d1), +("arrowdblup", 0x21d1), +("arrowdblvertex", 0x21d5), +("arrowdown", 0x2193), +("arrowdownleft", 0x2199), +("arrowdownright", 0x2198), +("arrowdownwhite", 0x21e9), +("arrowheaddownmod", 0x02c5), +("arrowheadleftmod", 0x02c2), +("arrowheadrightmod", 0x02c3), +("arrowheadupmod", 0x02c4), +("arrowhookleft", 0x21aa), +("arrowhookright", 0x21a9), +("arrowhorizex", 0xf8e7), +("arrowleft", 0x2190), +("arrowleftbothalf", 0x21bd), +("arrowleftdbl", 0x21d0), +("arrowleftdblstroke", 0x21cd), +("arrowleftoverright", 0x21c6), +("arrowlefttophalf", 0x21bc), +("arrowleftwhite", 0x21e6), +("arrownortheast", 0x2197), +("arrownorthwest", 0x2196), +("arrowparrleftright", 0x21c6), +("arrowparrrightleft", 0x21c4), +("arrowright", 0x2192), +("arrowrightbothalf", 0x21c1), +("arrowrightdblstroke", 0x21cf), +("arrowrightheavy", 0x279e), +("arrowrightoverleft", 0x21c4), +("arrowrighttophalf", 0x21c0), +("arrowrightwhite", 0x21e8), +("arrowsoutheast", 0x2198), +("arrowsouthwest", 0x2199), +("arrowtableft", 0x21e4), +("arrowtabright", 0x21e5), +("arrowtailleft", 0x21a2), +("arrowtailright", 0x21a3), +("arrowtp", 0x2191), +("arrowtripleleft", 0x21da), +("arrowtripleright", 0x21db), +("arrowup", 0x2191), +("arrowupdn", 0x2195), +("arrowupdnbse", 0x21a8), +("arrowupdownbase", 0x21a8), +("arrowupleft", 0x2196), +("arrowupleftofdown", 0x21c5), +("arrowupright", 0x2197), +("arrowupwhite", 0x21e7), +("arrowvertex", 0xf8e6), +("ascendercompwordmark", 0xd80a), +("asciicircum", 0x005e), +("asciicircummonospace", 0xff3e), +("asciitilde", 0x007e), +("asciitildemonospace", 0xff5e), +("ascript", 0x0251), +("ascriptturned", 0x0252), +("asmallhiragana", 0x3041), +("asmallkatakana", 0x30a1), +("asmallkatakanahalfwidth", 0xff67), +("asterisk", 0x002a), +("asteriskaltonearabic", 0x066d), +("asteriskarabic", 0x066d), +("asteriskcentered", 0x2217), +("asteriskmath", 0x2217), +("asteriskmonospace", 0xff0a), +("asterisksmall", 0xfe61), +("asterism", 0x2042), +("asuperior", 0xf6e9), +("asymptoticallyequal", 0x2243), +("at", 0x0040), +("atilde", 0x00e3), +("atmonospace", 0xff20), +("atsmall", 0xfe6b), +("aturned", 0x0250), +("aubengali", 0x0994), +("aubopomofo", 0x3120), +("audeva", 0x0914), +("augujarati", 0x0a94), +("augurmukhi", 0x0a14), +("aulengthmarkbengali", 0x09d7), +("aumatragurmukhi", 0x0a4c), +("auvowelsignbengali", 0x09cc), +("auvowelsigndeva", 0x094c), +("auvowelsigngujarati", 0x0acc), +("avagrahadeva", 0x093d), +("aybarmenian", 0x0561), +("ayin", 0x05e2), +("ayinaltonehebrew", 0xfb20), +("ayinhebrew", 0x05e2), +("b", 0x0062), +("babengali", 0x09ac), +("backslash", 0x005c), +("backslashBig", 0x005c), +("backslashBigg", 0x005c), +("backslashbig", 0x005c), +("backslashbigg", 0x005c), +("backslashmonospace", 0xff3c), +("badeva", 0x092c), +("bagujarati", 0x0aac), +("bagurmukhi", 0x0a2c), +("bahiragana", 0x3070), +("bahtthai", 0x0e3f), +("bakatakana", 0x30d0), +("bar", 0x007c), +("bardbl", 0x2225), +("bardblex", 0x2016), +("barex", 0x007c), +("barmonospace", 0xff5c), +("bbopomofo", 0x3105), +("bcircle", 0x24d1), +("bdotaccent", 0x1e03), +("bdotbelow", 0x1e05), +("beamedsixteenthnotes", 0x266c), +("because", 0x2235), +("becyrillic", 0x0431), +("beharabic", 0x0628), +("behfinalarabic", 0xfe90), +("behinitialarabic", 0xfe91), +("behiragana", 0x3079), +("behmedialarabic", 0xfe92), +("behmeeminitialarabic", 0xfc9f), +("behmeemisolatedarabic", 0xfc08), +("behnoonfinalarabic", 0xfc6d), +("bekatakana", 0x30d9), +("benarmenian", 0x0562), +("bet", 0x05d1), +("beta", 0x03b2), +("betasymbolgreek", 0x03d0), +("betdagesh", 0xfb31), +("betdageshhebrew", 0xfb31), +("beth", 0x2136), +("bethebrew", 0x05d1), +("betrafehebrew", 0xfb4c), +("between", 0x226c), +("bhabengali", 0x09ad), +("bhadeva", 0x092d), +("bhagujarati", 0x0aad), +("bhagurmukhi", 0x0a2d), +("bhook", 0x0253), +("bihiragana", 0x3073), +("bikatakana", 0x30d3), +("bilabialclick", 0x0298), +("bindigurmukhi", 0x0a02), +("birusquare", 0x3331), +("blackcircle", 0x25cf), +("blackdiamond", 0x25c6), +("blackdownpointingtriangle", 0x25bc), +("blackleftpointingpointer", 0x25c4), +("blackleftpointingtriangle", 0x25c0), +("blacklenticularbracketleft", 0x3010), +("blacklenticularbracketleftvertical", 0xfe3b), +("blacklenticularbracketright", 0x3011), +("blacklenticularbracketrightvertical", 0xfe3c), +("blacklowerlefttriangle", 0x25e3), +("blacklowerrighttriangle", 0x25e2), +("blackrectangle", 0x25ac), +("blackrightpointingpointer", 0x25ba), +("blackrightpointingtriangle", 0x25b6), +("blacksmallsquare", 0x25aa), +("blacksmilingface", 0x263b), +("blacksquare", 0x25a0), +("blackstar", 0x2605), +("blackupperlefttriangle", 0x25e4), +("blackupperrighttriangle", 0x25e5), +("blackuppointingsmalltriangle", 0x25b4), +("blackuppointingtriangle", 0x25b2), +("blank", 0x2423), +("blinebelow", 0x1e07), +("block", 0x2588), +("bmonospace", 0xff42), +("bobaimaithai", 0x0e1a), +("bohiragana", 0x307c), +("bokatakana", 0x30dc), +("bparen", 0x249d), +("bqsquare", 0x33c3), +("braceex", 0xf8f4), +("bracehtipdownleft", 0xfe37), +("bracehtipdownright", 0xfe37), +("bracehtipupleft", 0xfe38), +("bracehtipupright", 0xfe38), +("braceleft", 0x007b), +("braceleftBig", 0x007b), +("braceleftBigg", 0x007b), +("braceleftbig", 0x007b), +("braceleftbigg", 0x007b), +("braceleftbt", 0xf8f3), +("braceleftmid", 0xf8f2), +("braceleftmonospace", 0xff5b), +("braceleftsmall", 0xfe5b), +("bracelefttp", 0xf8f1), +("braceleftvertical", 0xfe37), +("braceright", 0x007d), +("bracerightBig", 0x007d), +("bracerightBigg", 0x007d), +("bracerightbig", 0x007d), +("bracerightbigg", 0x007d), +("bracerightbt", 0xf8fe), +("bracerightmid", 0xf8fd), +("bracerightmonospace", 0xff5d), +("bracerightsmall", 0xfe5c), +("bracerighttp", 0xf8fc), +("bracerightvertical", 0xfe38), +("bracketleft", 0x005b), +("bracketleftBig", 0x005b), +("bracketleftBigg", 0x005b), +("bracketleftbig", 0x005b), +("bracketleftbigg", 0x005b), +("bracketleftbt", 0xf8f0), +("bracketleftex", 0xf8ef), +("bracketleftmath", 0x005b), +("bracketleftmonospace", 0xff3b), +("bracketlefttp", 0xf8ee), +("bracketright", 0x005d), +("bracketrightBig", 0x005d), +("bracketrightBigg", 0x005d), +("bracketrightbig", 0x005d), +("bracketrightbigg", 0x005d), +("bracketrightbt", 0xf8fb), +("bracketrightex", 0xf8fa), +("bracketrightmath", 0x005d), +("bracketrightmonospace", 0xff3d), +("bracketrighttp", 0xf8f9), +("breve", 0x02d8), +("brevebelowcmb", 0x032e), +("brevecmb", 0x0306), +("breveinvertedbelowcmb", 0x032f), +("breveinvertedcmb", 0x0311), +("breveinverteddoublecmb", 0x0361), +("bridgebelowcmb", 0x032a), +("bridgeinvertedbelowcmb", 0x033a), +("brokenbar", 0x00a6), +("bstroke", 0x0180), +("bsuperior", 0xf6ea), +("btopbar", 0x0183), +("buhiragana", 0x3076), +("bukatakana", 0x30d6), +("bullet", 0x2022), +("bulletinverse", 0x25d8), +("bulletoperator", 0x2219), +("bullseye", 0x25ce), +("c", 0x0063), +("caarmenian", 0x056e), +("cabengali", 0x099a), +("cacute", 0x0107), +("cadeva", 0x091a), +("cagujarati", 0x0a9a), +("cagurmukhi", 0x0a1a), +("calsquare", 0x3388), +("candrabindubengali", 0x0981), +("candrabinducmb", 0x0310), +("candrabindudeva", 0x0901), +("candrabindugujarati", 0x0a81), +("capitalcompwordmark", 0xd809), +("capslock", 0x21ea), +("careof", 0x2105), +("caron", 0x02c7), +("caronbelowcmb", 0x032c), +("caroncmb", 0x030c), +("carriagereturn", 0x21b5), +("cbopomofo", 0x3118), +("ccaron", 0x010d), +("ccedilla", 0x00e7), +("ccedillaacute", 0x1e09), +("ccircle", 0x24d2), +("ccircumflex", 0x0109), +("ccurl", 0x0255), +("cdot", 0x010b), +("cdotaccent", 0x010b), +("cdsquare", 0x33c5), +("cedilla", 0x00b8), +("cedillacmb", 0x0327), +("ceilingleft", 0x2308), +("ceilingleftBig", 0x2308), +("ceilingleftBigg", 0x2308), +("ceilingleftbig", 0x2308), +("ceilingleftbigg", 0x2308), +("ceilingright", 0x2309), +("ceilingrightBig", 0x2309), +("ceilingrightBigg", 0x2309), +("ceilingrightbig", 0x2309), +("ceilingrightbigg", 0x2309), +("cent", 0x00a2), +("centigrade", 0x2103), +("centinferior", 0xf6df), +("centmonospace", 0xffe0), +("centoldstyle", 0xf7a2), +("centsuperior", 0xf6e0), +("chaarmenian", 0x0579), +("chabengali", 0x099b), +("chadeva", 0x091b), +("chagujarati", 0x0a9b), +("chagurmukhi", 0x0a1b), +("chbopomofo", 0x3114), +("cheabkhasiancyrillic", 0x04bd), +("check", 0x2713), +("checkmark", 0x2713), +("checyrillic", 0x0447), +("chedescenderabkhasiancyrillic", 0x04bf), +("chedescendercyrillic", 0x04b7), +("chedieresiscyrillic", 0x04f5), +("cheharmenian", 0x0573), +("chekhakassiancyrillic", 0x04cc), +("cheverticalstrokecyrillic", 0x04b9), +("chi", 0x03c7), +("chieuchacirclekorean", 0x3277), +("chieuchaparenkorean", 0x3217), +("chieuchcirclekorean", 0x3269), +("chieuchkorean", 0x314a), +("chieuchparenkorean", 0x3209), +("chochangthai", 0x0e0a), +("chochanthai", 0x0e08), +("chochingthai", 0x0e09), +("chochoethai", 0x0e0c), +("chook", 0x0188), +("cieucacirclekorean", 0x3276), +("cieucaparenkorean", 0x3216), +("cieuccirclekorean", 0x3268), +("cieuckorean", 0x3148), +("cieucparenkorean", 0x3208), +("cieucuparenkorean", 0x321c), +("circle", 0x25cb), +("circleR", 0x00ae), +("circleS", 0x24c8), +("circleasterisk", 0x229b), +("circlecopyrt", 0x20dd), +("circledivide", 0x2298), +("circledot", 0x2299), +("circledotdisplay", 0x2299), +("circledottext", 0x2299), +("circleequal", 0x229c), +("circleminus", 0x2296), +("circlemultiply", 0x2297), +("circlemultiplydisplay", 0x2297), +("circlemultiplytext", 0x2297), +("circleot", 0x2299), +("circleplus", 0x2295), +("circleplusdisplay", 0x2295), +("circleplustext", 0x2295), +("circlepostalmark", 0x3036), +("circlering", 0x229a), +("circlewithlefthalfblack", 0x25d0), +("circlewithrighthalfblack", 0x25d1), +("circumflex", 0x02c6), +("circumflexbelowcmb", 0x032d), +("circumflexcmb", 0x0302), +("clear", 0x2327), +("clickalveolar", 0x01c2), +("clickdental", 0x01c0), +("clicklateral", 0x01c1), +("clickretroflex", 0x01c3), +("clockwise", 0x27f3), +("club", 0x2663), +("clubsuitblack", 0x2663), +("clubsuitwhite", 0x2667), +("cmcubedsquare", 0x33a4), +("cmonospace", 0xff43), +("cmsquaredsquare", 0x33a0), +("coarmenian", 0x0581), +("colon", 0x003a), +("colonmonetary", 0x20a1), +("colonmonospace", 0xff1a), +("colonsign", 0x20a1), +("colonsmall", 0xfe55), +("colontriangularhalfmod", 0x02d1), +("colontriangularmod", 0x02d0), +("comma", 0x002c), +("commaabovecmb", 0x0313), +("commaaboverightcmb", 0x0315), +("commaaccent", 0xf6c3), +("commaarabic", 0x060c), +("commaarmenian", 0x055d), +("commainferior", 0xf6e1), +("commamonospace", 0xff0c), +("commareversedabovecmb", 0x0314), +("commareversedmod", 0x02bd), +("commasmall", 0xfe50), +("commasuperior", 0xf6e2), +("commaturnedabovecmb", 0x0312), +("commaturnedmod", 0x02bb), +("compass", 0x263c), +("complement", 0x2201), +("compwordmark", 0x200c), +("congruent", 0x2245), +("contintegraldisplay", 0x222e), +("contintegraltext", 0x222e), +("contourintegral", 0x222e), +("control", 0x2303), +("controlACK", 0x0006), +("controlBEL", 0x0007), +("controlBS", 0x0008), +("controlCAN", 0x0018), +("controlCR", 0x000d), +("controlDC1", 0x0011), +("controlDC2", 0x0012), +("controlDC3", 0x0013), +("controlDC4", 0x0014), +("controlDEL", 0x007f), +("controlDLE", 0x0010), +("controlEM", 0x0019), +("controlENQ", 0x0005), +("controlEOT", 0x0004), +("controlESC", 0x001b), +("controlETB", 0x0017), +("controlETX", 0x0003), +("controlFF", 0x000c), +("controlFS", 0x001c), +("controlGS", 0x001d), +("controlHT", 0x0009), +("controlLF", 0x000a), +("controlNAK", 0x0015), +("controlNULL", 0x0000), +("controlRS", 0x001e), +("controlSI", 0x000f), +("controlSO", 0x000e), +("controlSOT", 0x0002), +("controlSTX", 0x0001), +("controlSUB", 0x001a), +("controlSYN", 0x0016), +("controlUS", 0x001f), +("controlVT", 0x000b), +("coproduct", 0x2a3f), +("coproductdisplay", 0x2210), +("coproducttext", 0x2210), +("copyright", 0x00a9), +("copyrightsans", 0xf8e9), +("copyrightserif", 0xf6d9), +("cornerbracketleft", 0x300c), +("cornerbracketlefthalfwidth", 0xff62), +("cornerbracketleftvertical", 0xfe41), +("cornerbracketright", 0x300d), +("cornerbracketrighthalfwidth", 0xff63), +("cornerbracketrightvertical", 0xfe42), +("corporationsquare", 0x337f), +("cosquare", 0x33c7), +("coverkgsquare", 0x33c6), +("cparen", 0x249e), +("cruzeiro", 0x20a2), +("cstretched", 0x0297), +("ct", 0x0063), +("curlyand", 0x22cf), +("curlyleft", 0x21ab), +("curlyor", 0x22ce), +("curlyright", 0x21ac), +("currency", 0x00a4), +("cwm", 0x200c), +("cyrBreve", 0xf6d1), +("cyrFlex", 0xf6d2), +("cyrbreve", 0xf6d4), +("cyrflex", 0xf6d5), +("d", 0x0064), +("daarmenian", 0x0564), +("dabengali", 0x09a6), +("dadarabic", 0x0636), +("dadeva", 0x0926), +("dadfinalarabic", 0xfebe), +("dadinitialarabic", 0xfebf), +("dadmedialarabic", 0xfec0), +("dagesh", 0x05bc), +("dageshhebrew", 0x05bc), +("dagger", 0x2020), +("daggerdbl", 0x2021), +("dagujarati", 0x0aa6), +("dagurmukhi", 0x0a26), +("dahiragana", 0x3060), +("dakatakana", 0x30c0), +("dalarabic", 0x062f), +("dalet", 0x05d3), +("daletdagesh", 0xfb33), +("daletdageshhebrew", 0xfb33), +("daleth", 0x2138), +("dalethatafpatah", 0x05d3), +("dalethatafpatahhebrew", 0x05d3), +("dalethatafsegol", 0x05d3), +("dalethatafsegolhebrew", 0x05d3), +("dalethebrew", 0x05d3), +("dalethiriq", 0x05d3), +("dalethiriqhebrew", 0x05d3), +("daletholam", 0x05d3), +("daletholamhebrew", 0x05d3), +("daletpatah", 0x05d3), +("daletpatahhebrew", 0x05d3), +("daletqamats", 0x05d3), +("daletqamatshebrew", 0x05d3), +("daletqubuts", 0x05d3), +("daletqubutshebrew", 0x05d3), +("daletsegol", 0x05d3), +("daletsegolhebrew", 0x05d3), +("daletsheva", 0x05d3), +("daletshevahebrew", 0x05d3), +("dalettsere", 0x05d3), +("dalettserehebrew", 0x05d3), +("dalfinalarabic", 0xfeaa), +("dammaarabic", 0x064f), +("dammalowarabic", 0x064f), +("dammatanaltonearabic", 0x064c), +("dammatanarabic", 0x064c), +("danda", 0x0964), +("dargahebrew", 0x05a7), +("dargalefthebrew", 0x05a7), +("dasiapneumatacyrilliccmb", 0x0485), +("dbar", 0x0111), +("dblGrave", 0xf6d3), +("dblanglebracketleft", 0x300a), +("dblanglebracketleftvertical", 0xfe3d), +("dblanglebracketright", 0x300b), +("dblanglebracketrightvertical", 0xfe3e), +("dblarchinvertedbelowcmb", 0x032b), +("dblarrowdwn", 0x21ca), +("dblarrowheadleft", 0x219e), +("dblarrowheadright", 0x21a0), +("dblarrowleft", 0x21d4), +("dblarrowright", 0x21d2), +("dblarrowup", 0x21c8), +("dblbracketleft", 0x27e6), +("dblbracketright", 0x27e7), +("dbldanda", 0x0965), +("dblgrave", 0xf6d6), +("dblgravecmb", 0x030f), +("dblintegral", 0x222c), +("dbllowline", 0x2017), +("dbllowlinecmb", 0x0333), +("dbloverlinecmb", 0x033f), +("dblprimemod", 0x02ba), +("dblverticalbar", 0x2016), +("dblverticallineabovecmb", 0x030e), +("dbopomofo", 0x3109), +("dbsquare", 0x33c8), +("dcaron", 0x010f), +("dcedilla", 0x1e11), +("dcircle", 0x24d3), +("dcircumflexbelow", 0x1e13), +("dcroat", 0x0111), +("ddabengali", 0x09a1), +("ddadeva", 0x0921), +("ddagujarati", 0x0aa1), +("ddagurmukhi", 0x0a21), +("ddalarabic", 0x0688), +("ddalfinalarabic", 0xfb89), +("dddhadeva", 0x095c), +("ddhabengali", 0x09a2), +("ddhadeva", 0x0922), +("ddhagujarati", 0x0aa2), +("ddhagurmukhi", 0x0a22), +("ddotaccent", 0x1e0b), +("ddotbelow", 0x1e0d), +("decimalseparatorarabic", 0x066b), +("decimalseparatorpersian", 0x066b), +("decyrillic", 0x0434), +("defines", 0x225c), +("degree", 0x00b0), +("dehihebrew", 0x05ad), +("dehiragana", 0x3067), +("deicoptic", 0x03ef), +("dekatakana", 0x30c7), +("deleteleft", 0x232b), +("deleteright", 0x2326), +("delta", 0x03b4), +("deltaturned", 0x018d), +("denominatorminusonenumeratorbengali", 0x09f8), +("dezh", 0x02a4), +("dhabengali", 0x09a7), +("dhadeva", 0x0927), +("dhagujarati", 0x0aa7), +("dhagurmukhi", 0x0a27), +("dhook", 0x0257), +("dialytikatonos", 0x0385), +("dialytikatonoscmb", 0x0344), +("diamond", 0x2666), +("diamondmath", 0x22c4), +("diamondsolid", 0x2666), +("diamondsuitwhite", 0x2662), +("dieresis", 0x00a8), +("dieresisacute", 0xf6d7), +("dieresisbelowcmb", 0x0324), +("dieresiscmb", 0x0308), +("dieresisgrave", 0xf6d8), +("dieresistonos", 0x0385), +("difference", 0x224f), +("dihiragana", 0x3062), +("dikatakana", 0x30c2), +("dittomark", 0x3003), +("divide", 0x00f7), +("dividemultiply", 0x22c7), +("divides", 0x2223), +("divisionslash", 0x2215), +("djecyrillic", 0x0452), +("dkshade", 0x2593), +("dlinebelow", 0x1e0f), +("dlsquare", 0x3397), +("dmacron", 0x0111), +("dmonospace", 0xff44), +("dnblock", 0x2584), +("dochadathai", 0x0e0e), +("dodekthai", 0x0e14), +("dohiragana", 0x3069), +("dokatakana", 0x30c9), +("dollar", 0x0024), +("dollarinferior", 0xf6e3), +("dollarmonospace", 0xff04), +("dollaroldstyle", 0xf724), +("dollarsmall", 0xfe69), +("dollarsuperior", 0xf6e4), +("dong", 0x20ab), +("dorusquare", 0x3326), +("dotaccent", 0x02d9), +("dotaccentcmb", 0x0307), +("dotbelowcmb", 0x0323), +("dotbelowcomb", 0x0323), +("dotkatakana", 0x30fb), +("dotlessi", 0x0131), +("dotlessj", 0xf6be), +("dotlessjstrokehook", 0x0284), +("dotmath", 0x22c5), +("dotplus", 0x2214), +("dottedcircle", 0x25cc), +("doubleyodpatah", 0xfb1f), +("doubleyodpatahhebrew", 0xfb1f), +("downfall", 0x22ce), +("downslope", 0x29f9), +("downtackbelowcmb", 0x031e), +("downtackmod", 0x02d5), +("dparen", 0x249f), +("dsuperior", 0xf6eb), +("dtail", 0x0256), +("dtopbar", 0x018c), +("duhiragana", 0x3065), +("dukatakana", 0x30c5), +("dz", 0x01f3), +("dzaltone", 0x02a3), +("dzcaron", 0x01c6), +("dzcurl", 0x02a5), +("dzeabkhasiancyrillic", 0x04e1), +("dzecyrillic", 0x0455), +("dzhecyrillic", 0x045f), +("e", 0x0065), +("eacute", 0x00e9), +("earth", 0x2641), +("ebengali", 0x098f), +("ebopomofo", 0x311c), +("ebreve", 0x0115), +("ecandradeva", 0x090d), +("ecandragujarati", 0x0a8d), +("ecandravowelsigndeva", 0x0945), +("ecandravowelsigngujarati", 0x0ac5), +("ecaron", 0x011b), +("ecedillabreve", 0x1e1d), +("echarmenian", 0x0565), +("echyiwnarmenian", 0x0587), +("ecircle", 0x24d4), +("ecircumflex", 0x00ea), +("ecircumflexacute", 0x1ebf), +("ecircumflexbelow", 0x1e19), +("ecircumflexdotbelow", 0x1ec7), +("ecircumflexgrave", 0x1ec1), +("ecircumflexhookabove", 0x1ec3), +("ecircumflextilde", 0x1ec5), +("ecyrillic", 0x0454), +("edblgrave", 0x0205), +("edeva", 0x090f), +("edieresis", 0x00eb), +("edot", 0x0117), +("edotaccent", 0x0117), +("edotbelow", 0x1eb9), +("eegurmukhi", 0x0a0f), +("eematragurmukhi", 0x0a47), +("efcyrillic", 0x0444), +("egrave", 0x00e8), +("egujarati", 0x0a8f), +("eharmenian", 0x0567), +("ehbopomofo", 0x311d), +("ehiragana", 0x3048), +("ehookabove", 0x1ebb), +("eibopomofo", 0x311f), +("eight", 0x0038), +("eightarabic", 0x0668), +("eightbengali", 0x09ee), +("eightcircle", 0x2467), +("eightcircleinversesansserif", 0x2791), +("eightdeva", 0x096e), +("eighteencircle", 0x2471), +("eighteenparen", 0x2485), +("eighteenperiod", 0x2499), +("eightgujarati", 0x0aee), +("eightgurmukhi", 0x0a6e), +("eighthackarabic", 0x0668), +("eighthangzhou", 0x3028), +("eighthnotebeamed", 0x266b), +("eightideographicparen", 0x3227), +("eightinferior", 0x2088), +("eightmonospace", 0xff18), +("eightoldstyle", 0xf738), +("eightparen", 0x247b), +("eightperiod", 0x248f), +("eightpersian", 0x06f8), +("eightroman", 0x2177), +("eightsuperior", 0x2078), +("eightthai", 0x0e58), +("einvertedbreve", 0x0207), +("eiotifiedcyrillic", 0x0465), +("ekatakana", 0x30a8), +("ekatakanahalfwidth", 0xff74), +("ekonkargurmukhi", 0x0a74), +("ekorean", 0x3154), +("elcyrillic", 0x043b), +("element", 0x2208), +("elevencircle", 0x246a), +("elevenparen", 0x247e), +("elevenperiod", 0x2492), +("elevenroman", 0x217a), +("ellipsis", 0x2026), +("ellipsisvertical", 0x22ee), +("emacron", 0x0113), +("emacronacute", 0x1e17), +("emacrongrave", 0x1e15), +("emcyrillic", 0x043c), +("emdash", 0x2014), +("emdashvertical", 0xfe31), +("emonospace", 0xff45), +("emphasismarkarmenian", 0x055b), +("emptyset", 0x2205), +("emptyslot", 0xd801), +("enbopomofo", 0x3123), +("encyrillic", 0x043d), +("endash", 0x2013), +("endashvertical", 0xfe32), +("endescendercyrillic", 0x04a3), +("eng", 0x014b), +("engbopomofo", 0x3125), +("enghecyrillic", 0x04a5), +("enhookcyrillic", 0x04c8), +("enspace", 0x2002), +("eogonek", 0x0119), +("eokorean", 0x3153), +("eopen", 0x025b), +("eopenclosed", 0x029a), +("eopenreversed", 0x025c), +("eopenreversedclosed", 0x025e), +("eopenreversedhook", 0x025d), +("eparen", 0x24a0), +("epsilon", 0x03b5), +("epsilon1", 0x03f5), +("epsiloninv", 0x03f6), +("epsilontonos", 0x03ad), +("equal", 0x003d), +("equaldotleftright", 0x2252), +("equaldotrightleft", 0x2253), +("equalmath", 0x003d), +("equalmonospace", 0xff1d), +("equalorfollows", 0x22df), +("equalorgreater", 0x2a96), +("equalorless", 0x2a95), +("equalorprecedes", 0x22de), +("equalorsimilar", 0x2242), +("equalsdots", 0x2251), +("equalsmall", 0xfe66), +("equalsuperior", 0x207c), +("equivalence", 0x2261), +("equivasymptotic", 0x224d), +("erbopomofo", 0x3126), +("ercyrillic", 0x0440), +("ereversed", 0x0258), +("ereversedcyrillic", 0x044d), +("escyrillic", 0x0441), +("esdescendercyrillic", 0x04ab), +("esh", 0x0283), +("eshcurl", 0x0286), +("eshortdeva", 0x090e), +("eshortvowelsigndeva", 0x0946), +("eshreversedloop", 0x01aa), +("eshsquatreversed", 0x0285), +("esmallhiragana", 0x3047), +("esmallkatakana", 0x30a7), +("esmallkatakanahalfwidth", 0xff6a), +("estimated", 0x212e), +("esuperior", 0xf6ec), +("eta", 0x03b7), +("etarmenian", 0x0568), +("etatonos", 0x03ae), +("eth", 0x00f0), +("etilde", 0x1ebd), +("etildebelow", 0x1e1b), +("etnahtafoukhhebrew", 0x0591), +("etnahtafoukhlefthebrew", 0x0591), +("etnahtahebrew", 0x0591), +("etnahtalefthebrew", 0x0591), +("eturned", 0x01dd), +("eukorean", 0x3161), +("euro", 0x20ac), +("evowelsignbengali", 0x09c7), +("evowelsigndeva", 0x0947), +("evowelsigngujarati", 0x0ac7), +("exclam", 0x0021), +("exclamarmenian", 0x055c), +("exclamdbl", 0x203c), +("exclamdown", 0x00a1), +("exclamdownsmall", 0xf7a1), +("exclammonospace", 0xff01), +("exclamsmall", 0xf721), +("existential", 0x2203), +("ezh", 0x0292), +("ezhcaron", 0x01ef), +("ezhcurl", 0x0293), +("ezhreversed", 0x01b9), +("ezhtail", 0x01ba), +("f", 0x0066), +("f_f", 0xfb00), +("f_f_i", 0xfb03), +("f_f_l", 0xfb04), +("f_i", 0xfb01), +("f_l", 0xfb02), +("fadeva", 0x095e), +("fagurmukhi", 0x0a5e), +("fahrenheit", 0x2109), +("fathaarabic", 0x064e), +("fathalowarabic", 0x064e), +("fathatanarabic", 0x064b), +("fbopomofo", 0x3108), +("fcircle", 0x24d5), +("fdotaccent", 0x1e1f), +("feharabic", 0x0641), +("feharmenian", 0x0586), +("fehfinalarabic", 0xfed2), +("fehinitialarabic", 0xfed3), +("fehmedialarabic", 0xfed4), +("feicoptic", 0x03e5), +("female", 0x2640), +("ff", 0xfb00), +("ffi", 0xfb03), +("ffl", 0xfb04), +("fi", 0xfb01), +("fifteencircle", 0x246e), +("fifteenparen", 0x2482), +("fifteenperiod", 0x2496), +("figuredash", 0x2012), +("filledbox", 0x25a0), +("filledrect", 0x25ac), +("finalkaf", 0x05da), +("finalkafdagesh", 0xfb3a), +("finalkafdageshhebrew", 0xfb3a), +("finalkafhebrew", 0x05da), +("finalkafqamats", 0x05da), +("finalkafqamatshebrew", 0x05da), +("finalkafsheva", 0x05da), +("finalkafshevahebrew", 0x05da), +("finalmem", 0x05dd), +("finalmemhebrew", 0x05dd), +("finalnun", 0x05df), +("finalnunhebrew", 0x05df), +("finalpe", 0x05e3), +("finalpehebrew", 0x05e3), +("finaltsadi", 0x05e5), +("finaltsadihebrew", 0x05e5), +("firsttonechinese", 0x02c9), +("fisheye", 0x25c9), +("fitacyrillic", 0x0473), +("five", 0x0035), +("fivearabic", 0x0665), +("fivebengali", 0x09eb), +("fivecircle", 0x2464), +("fivecircleinversesansserif", 0x278e), +("fivedeva", 0x096b), +("fiveeighths", 0x215d), +("fivegujarati", 0x0aeb), +("fivegurmukhi", 0x0a6b), +("fivehackarabic", 0x0665), +("fivehangzhou", 0x3025), +("fiveideographicparen", 0x3224), +("fiveinferior", 0x2085), +("fivemonospace", 0xff15), +("fiveoldstyle", 0xf735), +("fiveparen", 0x2478), +("fiveperiod", 0x248c), +("fivepersian", 0x06f5), +("fiveroman", 0x2174), +("fivesuperior", 0x2075), +("fivethai", 0x0e55), +("fl", 0xfb02), +("flat", 0x266d), +("floorleft", 0x230a), +("floorleftBig", 0x230a), +("floorleftBigg", 0x230a), +("floorleftbig", 0x230a), +("floorleftbigg", 0x230a), +("floorright", 0x230b), +("floorrightBig", 0x230b), +("floorrightBigg", 0x230b), +("floorrightbig", 0x230b), +("floorrightbigg", 0x230b), +("florin", 0x0192), +("fmonospace", 0xff46), +("fmsquare", 0x3399), +("fofanthai", 0x0e1f), +("fofathai", 0x0e1d), +("follownotdbleqv", 0x2aba), +("follownotslnteql", 0x2ab6), +("followornoteqvlnt", 0x22e9), +("follows", 0x227b), +("followsequal", 0x227d), +("followsorcurly", 0x227d), +("followsorequal", 0x227f), +("fongmanthai", 0x0e4f), +("forall", 0x2200), +("forces", 0x22a9), +("forcesbar", 0x22aa), +("fork", 0x22d4), +("four", 0x0034), +("fourarabic", 0x0664), +("fourbengali", 0x09ea), +("fourcircle", 0x2463), +("fourcircleinversesansserif", 0x278d), +("fourdeva", 0x096a), +("fourgujarati", 0x0aea), +("fourgurmukhi", 0x0a6a), +("fourhackarabic", 0x0664), +("fourhangzhou", 0x3024), +("fourideographicparen", 0x3223), +("fourinferior", 0x2084), +("fourmonospace", 0xff14), +("fournumeratorbengali", 0x09f7), +("fouroldstyle", 0xf734), +("fourparen", 0x2477), +("fourperiod", 0x248b), +("fourpersian", 0x06f4), +("fourroman", 0x2173), +("foursuperior", 0x2074), +("fourteencircle", 0x246d), +("fourteenparen", 0x2481), +("fourteenperiod", 0x2495), +("fourthai", 0x0e54), +("fourthtonechinese", 0x02cb), +("fparen", 0x24a1), +("fraction", 0x2044), +("franc", 0x20a3), +("frown", 0x2322), +("g", 0x0067), +("gabengali", 0x0997), +("gacute", 0x01f5), +("gadeva", 0x0917), +("gafarabic", 0x06af), +("gaffinalarabic", 0xfb93), +("gafinitialarabic", 0xfb94), +("gafmedialarabic", 0xfb95), +("gagujarati", 0x0a97), +("gagurmukhi", 0x0a17), +("gahiragana", 0x304c), +("gakatakana", 0x30ac), +("gamma", 0x03b3), +("gammalatinsmall", 0x0263), +("gammasuperior", 0x02e0), +("gangiacoptic", 0x03eb), +("gbopomofo", 0x310d), +("gbreve", 0x011f), +("gcaron", 0x01e7), +("gcedilla", 0x0123), +("gcircle", 0x24d6), +("gcircumflex", 0x011d), +("gcommaaccent", 0x0123), +("gdot", 0x0121), +("gdotaccent", 0x0121), +("gecyrillic", 0x0433), +("gehiragana", 0x3052), +("gekatakana", 0x30b2), +("geomequivalent", 0x224e), +("geometricallyequal", 0x2251), +("gereshaccenthebrew", 0x059c), +("gereshhebrew", 0x05f3), +("gereshmuqdamhebrew", 0x059d), +("germandbls", 0x00df), +("gershayimaccenthebrew", 0x059e), +("gershayimhebrew", 0x05f4), +("getamark", 0x3013), +("ghabengali", 0x0998), +("ghadarmenian", 0x0572), +("ghadeva", 0x0918), +("ghagujarati", 0x0a98), +("ghagurmukhi", 0x0a18), +("ghainarabic", 0x063a), +("ghainfinalarabic", 0xfece), +("ghaininitialarabic", 0xfecf), +("ghainmedialarabic", 0xfed0), +("ghemiddlehookcyrillic", 0x0495), +("ghestrokecyrillic", 0x0493), +("gheupturncyrillic", 0x0491), +("ghhadeva", 0x095a), +("ghhagurmukhi", 0x0a5a), +("ghook", 0x0260), +("ghzsquare", 0x3393), +("gihiragana", 0x304e), +("gikatakana", 0x30ae), +("gimarmenian", 0x0563), +("gimel", 0x05d2), +("gimeldagesh", 0xfb32), +("gimeldageshhebrew", 0xfb32), +("gimelhebrew", 0x05d2), +("gjecyrillic", 0x0453), +("glottalinvertedstroke", 0x01be), +("glottalstop", 0x0294), +("glottalstopinverted", 0x0296), +("glottalstopmod", 0x02c0), +("glottalstopreversed", 0x0295), +("glottalstopreversedmod", 0x02c1), +("glottalstopreversedsuperior", 0x02e4), +("glottalstopstroke", 0x02a1), +("glottalstopstrokereversed", 0x02a2), +("gmacron", 0x1e21), +("gmonospace", 0xff47), +("gohiragana", 0x3054), +("gokatakana", 0x30b4), +("gparen", 0x24a2), +("gpasquare", 0x33ac), +("gradient", 0x2207), +("grave", 0x0060), +("gravebelowcmb", 0x0316), +("gravecmb", 0x0300), +("gravecomb", 0x0300), +("gravedeva", 0x0953), +("gravelowmod", 0x02ce), +("gravemonospace", 0xff40), +("gravetonecmb", 0x0340), +("greater", 0x003e), +("greaterdbleqlless", 0x2a8c), +("greaterdblequal", 0x2267), +("greaterdot", 0x22d7), +("greaterequal", 0x2265), +("greaterequalorless", 0x22db), +("greaterlessequal", 0x22db), +("greatermonospace", 0xff1e), +("greatermuch", 0x226b), +("greaternotdblequal", 0x2a8a), +("greaternotequal", 0x2a88), +("greaterorapproxeql", 0x2a86), +("greaterorequalslant", 0x2a7e), +("greaterorequivalent", 0x2273), +("greaterorless", 0x2277), +("greaterornotdbleql", 0x2269), +("greaterornotequal", 0x2269), +("greaterorsimilar", 0x2273), +("greateroverequal", 0x2267), +("greatersmall", 0xfe65), +("gscript", 0x0261), +("gstroke", 0x01e5), +("guhiragana", 0x3050), +("guillemotleft", 0x00ab), +("guillemotright", 0x00bb), +("guilsinglleft", 0x2039), +("guilsinglright", 0x203a), +("gukatakana", 0x30b0), +("guramusquare", 0x3318), +("gysquare", 0x33c9), +("h", 0x0068), +("haabkhasiancyrillic", 0x04a9), +("haaltonearabic", 0x06c1), +("habengali", 0x09b9), +("hadescendercyrillic", 0x04b3), +("hadeva", 0x0939), +("hagujarati", 0x0ab9), +("hagurmukhi", 0x0a39), +("haharabic", 0x062d), +("hahfinalarabic", 0xfea2), +("hahinitialarabic", 0xfea3), +("hahiragana", 0x306f), +("hahmedialarabic", 0xfea4), +("haitusquare", 0x332a), +("hakatakana", 0x30cf), +("hakatakanahalfwidth", 0xff8a), +("halantgurmukhi", 0x0a4d), +("hamzaarabic", 0x0621), +("hamzadammaarabic", 0x0621), +("hamzadammatanarabic", 0x0621), +("hamzafathaarabic", 0x0621), +("hamzafathatanarabic", 0x0621), +("hamzalowarabic", 0x0621), +("hamzalowkasraarabic", 0x0621), +("hamzalowkasratanarabic", 0x0621), +("hamzasukunarabic", 0x0621), +("hangulfiller", 0x3164), +("hardsigncyrillic", 0x044a), +("harpoondownleft", 0x21c3), +("harpoondownright", 0x21c2), +("harpoonleftbarbup", 0x21bc), +("harpoonleftdown", 0x21bd), +("harpoonleftright", 0x21cc), +("harpoonleftup", 0x21bc), +("harpoonrightbarbup", 0x21c0), +("harpoonrightdown", 0x21c1), +("harpoonrightleft", 0x21cb), +("harpoonrightup", 0x21c0), +("harpoonupleft", 0x21bf), +("harpoonupright", 0x21be), +("hasquare", 0x33ca), +("hatafpatah", 0x05b2), +("hatafpatah16", 0x05b2), +("hatafpatah23", 0x05b2), +("hatafpatah2f", 0x05b2), +("hatafpatahhebrew", 0x05b2), +("hatafpatahnarrowhebrew", 0x05b2), +("hatafpatahquarterhebrew", 0x05b2), +("hatafpatahwidehebrew", 0x05b2), +("hatafqamats", 0x05b3), +("hatafqamats1b", 0x05b3), +("hatafqamats28", 0x05b3), +("hatafqamats34", 0x05b3), +("hatafqamatshebrew", 0x05b3), +("hatafqamatsnarrowhebrew", 0x05b3), +("hatafqamatsquarterhebrew", 0x05b3), +("hatafqamatswidehebrew", 0x05b3), +("hatafsegol", 0x05b1), +("hatafsegol17", 0x05b1), +("hatafsegol24", 0x05b1), +("hatafsegol30", 0x05b1), +("hatafsegolhebrew", 0x05b1), +("hatafsegolnarrowhebrew", 0x05b1), +("hatafsegolquarterhebrew", 0x05b1), +("hatafsegolwidehebrew", 0x05b1), +("hatwide", 0x0302), +("hatwider", 0x0302), +("hatwiderr", 0x0302), +("hatwidest", 0x0302), +("hbar", 0x0127), +("hbopomofo", 0x310f), +("hbrevebelow", 0x1e2b), +("hcedilla", 0x1e29), +("hcircle", 0x24d7), +("hcircumflex", 0x0125), +("hdieresis", 0x1e27), +("hdotaccent", 0x1e23), +("hdotbelow", 0x1e25), +("he", 0x05d4), +("heart", 0x2665), +("heartsuitblack", 0x2665), +("heartsuitwhite", 0x2661), +("hedagesh", 0xfb34), +("hedageshhebrew", 0xfb34), +("hehaltonearabic", 0x06c1), +("heharabic", 0x0647), +("hehebrew", 0x05d4), +("hehfinalaltonearabic", 0xfba7), +("hehfinalalttwoarabic", 0xfeea), +("hehfinalarabic", 0xfeea), +("hehhamzaabovefinalarabic", 0xfba5), +("hehhamzaaboveisolatedarabic", 0xfba4), +("hehinitialaltonearabic", 0xfba8), +("hehinitialarabic", 0xfeeb), +("hehiragana", 0x3078), +("hehmedialaltonearabic", 0xfba9), +("hehmedialarabic", 0xfeec), +("heiseierasquare", 0x337b), +("hekatakana", 0x30d8), +("hekatakanahalfwidth", 0xff8d), +("hekutaarusquare", 0x3336), +("henghook", 0x0267), +("herutusquare", 0x3339), +("het", 0x05d7), +("hethebrew", 0x05d7), +("hhook", 0x0266), +("hhooksuperior", 0x02b1), +("hieuhacirclekorean", 0x327b), +("hieuhaparenkorean", 0x321b), +("hieuhcirclekorean", 0x326d), +("hieuhkorean", 0x314e), +("hieuhparenkorean", 0x320d), +("hihiragana", 0x3072), +("hikatakana", 0x30d2), +("hikatakanahalfwidth", 0xff8b), +("hiriq", 0x05b4), +("hiriq14", 0x05b4), +("hiriq21", 0x05b4), +("hiriq2d", 0x05b4), +("hiriqhebrew", 0x05b4), +("hiriqnarrowhebrew", 0x05b4), +("hiriqquarterhebrew", 0x05b4), +("hiriqwidehebrew", 0x05b4), +("hlinebelow", 0x1e96), +("hmonospace", 0xff48), +("hoarmenian", 0x0570), +("hohipthai", 0x0e2b), +("hohiragana", 0x307b), +("hokatakana", 0x30db), +("hokatakanahalfwidth", 0xff8e), +("holam", 0x05b9), +("holam19", 0x05b9), +("holam26", 0x05b9), +("holam32", 0x05b9), +("holamhebrew", 0x05b9), +("holamnarrowhebrew", 0x05b9), +("holamquarterhebrew", 0x05b9), +("holamwidehebrew", 0x05b9), +("honokhukthai", 0x0e2e), +("hookabovecomb", 0x0309), +("hookcmb", 0x0309), +("hookleftchar", 0x21a9), +("hookpalatalizedbelowcmb", 0x0321), +("hookretroflexbelowcmb", 0x0322), +("hookrightchar", 0x21aa), +("hoonsquare", 0x3342), +("horicoptic", 0x03e9), +("horizontalbar", 0x2015), +("horncmb", 0x031b), +("hotsprings", 0x2668), +("house", 0x2302), +("hparen", 0x24a3), +("hsuperior", 0x02b0), +("hturned", 0x0265), +("huhiragana", 0x3075), +("huiitosquare", 0x3333), +("hukatakana", 0x30d5), +("hukatakanahalfwidth", 0xff8c), +("hungarumlaut", 0x02dd), +("hungarumlautcmb", 0x030b), +("hv", 0x0195), +("hyphen", 0x002d), +("hyphen.alt", 0x2010), +("hyphenchar", 0x002d), +("hypheninferior", 0xf6e5), +("hyphenmonospace", 0xff0d), +("hyphensmall", 0xfe63), +("hyphensuperior", 0xf6e6), +("hyphentwo", 0x2010), +("i", 0x0069), +("iacute", 0x00ed), +("iacyrillic", 0x044f), +("ibengali", 0x0987), +("ibopomofo", 0x3127), +("ibreve", 0x012d), +("icaron", 0x01d0), +("icircle", 0x24d8), +("icircumflex", 0x00ee), +("icyrillic", 0x0456), +("idblgrave", 0x0209), +("ideographearthcircle", 0x328f), +("ideographfirecircle", 0x328b), +("ideographicallianceparen", 0x323f), +("ideographiccallparen", 0x323a), +("ideographiccentrecircle", 0x32a5), +("ideographicclose", 0x3006), +("ideographiccomma", 0x3001), +("ideographiccommaleft", 0xff64), +("ideographiccongratulationparen", 0x3237), +("ideographiccorrectcircle", 0x32a3), +("ideographicearthparen", 0x322f), +("ideographicenterpriseparen", 0x323d), +("ideographicexcellentcircle", 0x329d), +("ideographicfestivalparen", 0x3240), +("ideographicfinancialcircle", 0x3296), +("ideographicfinancialparen", 0x3236), +("ideographicfireparen", 0x322b), +("ideographichaveparen", 0x3232), +("ideographichighcircle", 0x32a4), +("ideographiciterationmark", 0x3005), +("ideographiclaborcircle", 0x3298), +("ideographiclaborparen", 0x3238), +("ideographicleftcircle", 0x32a7), +("ideographiclowcircle", 0x32a6), +("ideographicmedicinecircle", 0x32a9), +("ideographicmetalparen", 0x322e), +("ideographicmoonparen", 0x322a), +("ideographicnameparen", 0x3234), +("ideographicperiod", 0x3002), +("ideographicprintcircle", 0x329e), +("ideographicreachparen", 0x3243), +("ideographicrepresentparen", 0x3239), +("ideographicresourceparen", 0x323e), +("ideographicrightcircle", 0x32a8), +("ideographicsecretcircle", 0x3299), +("ideographicselfparen", 0x3242), +("ideographicsocietyparen", 0x3233), +("ideographicspace", 0x3000), +("ideographicspecialparen", 0x3235), +("ideographicstockparen", 0x3231), +("ideographicstudyparen", 0x323b), +("ideographicsunparen", 0x3230), +("ideographicsuperviseparen", 0x323c), +("ideographicwaterparen", 0x322c), +("ideographicwoodparen", 0x322d), +("ideographiczero", 0x3007), +("ideographmetalcircle", 0x328e), +("ideographmooncircle", 0x328a), +("ideographnamecircle", 0x3294), +("ideographsuncircle", 0x3290), +("ideographwatercircle", 0x328c), +("ideographwoodcircle", 0x328d), +("ideva", 0x0907), +("idieresis", 0x00ef), +("idieresisacute", 0x1e2f), +("idieresiscyrillic", 0x04e5), +("idotbelow", 0x1ecb), +("iebrevecyrillic", 0x04d7), +("iecyrillic", 0x0435), +("ieungacirclekorean", 0x3275), +("ieungaparenkorean", 0x3215), +("ieungcirclekorean", 0x3267), +("ieungkorean", 0x3147), +("ieungparenkorean", 0x3207), +("igrave", 0x00ec), +("igujarati", 0x0a87), +("igurmukhi", 0x0a07), +("ihiragana", 0x3044), +("ihookabove", 0x1ec9), +("iibengali", 0x0988), +("iicyrillic", 0x0438), +("iideva", 0x0908), +("iigujarati", 0x0a88), +("iigurmukhi", 0x0a08), +("iimatragurmukhi", 0x0a40), +("iinvertedbreve", 0x020b), +("iishortcyrillic", 0x0439), +("iivowelsignbengali", 0x09c0), +("iivowelsigndeva", 0x0940), +("iivowelsigngujarati", 0x0ac0), +("ij", 0x0133), +("ikatakana", 0x30a4), +("ikatakanahalfwidth", 0xff72), +("ikorean", 0x3163), +("ilde", 0x02dc), +("iluyhebrew", 0x05ac), +("imacron", 0x012b), +("imacroncyrillic", 0x04e3), +("imageorapproximatelyequal", 0x2253), +("imatragurmukhi", 0x0a3f), +("imonospace", 0xff49), +("increment", 0x2206), +("infinity", 0x221e), +("iniarmenian", 0x056b), +("integerdivide", 0x2216), +("integral", 0x222b), +("integralbottom", 0x2321), +("integralbt", 0x2321), +("integraldisplay", 0x222b), +("integralex", 0xf8f5), +("integraltext", 0x222b), +("integraltop", 0x2320), +("integraltp", 0x2320), +("intercal", 0x22ba), +("interrobang", 0x203d), +("interrobangdown", 0xd80b), +("intersection", 0x2229), +("intersectiondbl", 0x22d2), +("intersectiondisplay", 0x22c2), +("intersectionsq", 0x2293), +("intersectiontext", 0x22c2), +("intisquare", 0x3305), +("invbullet", 0x25d8), +("invcircle", 0x25d9), +("invsmileface", 0x263b), +("iocyrillic", 0x0451), +("iogonek", 0x012f), +("iota", 0x03b9), +("iotadieresis", 0x03ca), +("iotadieresistonos", 0x0390), +("iotalatin", 0x0269), +("iotatonos", 0x03af), +("iparen", 0x24a4), +("irigurmukhi", 0x0a72), +("ismallhiragana", 0x3043), +("ismallkatakana", 0x30a3), +("ismallkatakanahalfwidth", 0xff68), +("issharbengali", 0x09fa), +("istroke", 0x0268), +("isuperior", 0xf6ed), +("iterationhiragana", 0x309d), +("iterationkatakana", 0x30fd), +("itilde", 0x0129), +("itildebelow", 0x1e2d), +("iubopomofo", 0x3129), +("iucyrillic", 0x044e), +("ivowelsignbengali", 0x09bf), +("ivowelsigndeva", 0x093f), +("ivowelsigngujarati", 0x0abf), +("izhitsacyrillic", 0x0475), +("izhitsadblgravecyrillic", 0x0477), +("j", 0x006a), +("jaarmenian", 0x0571), +("jabengali", 0x099c), +("jadeva", 0x091c), +("jagujarati", 0x0a9c), +("jagurmukhi", 0x0a1c), +("jbopomofo", 0x3110), +("jcaron", 0x01f0), +("jcircle", 0x24d9), +("jcircumflex", 0x0135), +("jcrossedtail", 0x029d), +("jdotlessstroke", 0x025f), +("jecyrillic", 0x0458), +("jeemarabic", 0x062c), +("jeemfinalarabic", 0xfe9e), +("jeeminitialarabic", 0xfe9f), +("jeemmedialarabic", 0xfea0), +("jeharabic", 0x0698), +("jehfinalarabic", 0xfb8b), +("jhabengali", 0x099d), +("jhadeva", 0x091d), +("jhagujarati", 0x0a9d), +("jhagurmukhi", 0x0a1d), +("jheharmenian", 0x057b), +("jis", 0x3004), +("jmonospace", 0xff4a), +("jparen", 0x24a5), +("jsuperior", 0x02b2), +("k", 0x006b), +("kabashkircyrillic", 0x04a1), +("kabengali", 0x0995), +("kacute", 0x1e31), +("kacyrillic", 0x043a), +("kadescendercyrillic", 0x049b), +("kadeva", 0x0915), +("kaf", 0x05db), +("kafarabic", 0x0643), +("kafdagesh", 0xfb3b), +("kafdageshhebrew", 0xfb3b), +("kaffinalarabic", 0xfeda), +("kafhebrew", 0x05db), +("kafinitialarabic", 0xfedb), +("kafmedialarabic", 0xfedc), +("kafrafehebrew", 0xfb4d), +("kagujarati", 0x0a95), +("kagurmukhi", 0x0a15), +("kahiragana", 0x304b), +("kahookcyrillic", 0x04c4), +("kakatakana", 0x30ab), +("kakatakanahalfwidth", 0xff76), +("kappa", 0x03ba), +("kappasymbolgreek", 0x03f0), +("kapyeounmieumkorean", 0x3171), +("kapyeounphieuphkorean", 0x3184), +("kapyeounpieupkorean", 0x3178), +("kapyeounssangpieupkorean", 0x3179), +("karoriisquare", 0x330d), +("kashidaautoarabic", 0x0640), +("kashidaautonosidebearingarabic", 0x0640), +("kasmallkatakana", 0x30f5), +("kasquare", 0x3384), +("kasraarabic", 0x0650), +("kasratanarabic", 0x064d), +("kastrokecyrillic", 0x049f), +("katahiraprolongmarkhalfwidth", 0xff70), +("kaverticalstrokecyrillic", 0x049d), +("kbopomofo", 0x310e), +("kcalsquare", 0x3389), +("kcaron", 0x01e9), +("kcedilla", 0x0137), +("kcircle", 0x24da), +("kcommaaccent", 0x0137), +("kdotbelow", 0x1e33), +("keharmenian", 0x0584), +("kehiragana", 0x3051), +("kekatakana", 0x30b1), +("kekatakanahalfwidth", 0xff79), +("kenarmenian", 0x056f), +("kesmallkatakana", 0x30f6), +("kgreenlandic", 0x0138), +("khabengali", 0x0996), +("khacyrillic", 0x0445), +("khadeva", 0x0916), +("khagujarati", 0x0a96), +("khagurmukhi", 0x0a16), +("khaharabic", 0x062e), +("khahfinalarabic", 0xfea6), +("khahinitialarabic", 0xfea7), +("khahmedialarabic", 0xfea8), +("kheicoptic", 0x03e7), +("khhadeva", 0x0959), +("khhagurmukhi", 0x0a59), +("khieukhacirclekorean", 0x3278), +("khieukhaparenkorean", 0x3218), +("khieukhcirclekorean", 0x326a), +("khieukhkorean", 0x314b), +("khieukhparenkorean", 0x320a), +("khokhaithai", 0x0e02), +("khokhonthai", 0x0e05), +("khokhuatthai", 0x0e03), +("khokhwaithai", 0x0e04), +("khomutthai", 0x0e5b), +("khook", 0x0199), +("khorakhangthai", 0x0e06), +("khzsquare", 0x3391), +("kihiragana", 0x304d), +("kikatakana", 0x30ad), +("kikatakanahalfwidth", 0xff77), +("kiroguramusquare", 0x3315), +("kiromeetorusquare", 0x3316), +("kirosquare", 0x3314), +("kiyeokacirclekorean", 0x326e), +("kiyeokaparenkorean", 0x320e), +("kiyeokcirclekorean", 0x3260), +("kiyeokkorean", 0x3131), +("kiyeokparenkorean", 0x3200), +("kiyeoksioskorean", 0x3133), +("kjecyrillic", 0x045c), +("klinebelow", 0x1e35), +("klsquare", 0x3398), +("kmcubedsquare", 0x33a6), +("kmonospace", 0xff4b), +("kmsquaredsquare", 0x33a2), +("kohiragana", 0x3053), +("kohmsquare", 0x33c0), +("kokaithai", 0x0e01), +("kokatakana", 0x30b3), +("kokatakanahalfwidth", 0xff7a), +("kooposquare", 0x331e), +("koppacyrillic", 0x0481), +("koreanstandardsymbol", 0x327f), +("koroniscmb", 0x0343), +("kparen", 0x24a6), +("kpasquare", 0x33aa), +("ksicyrillic", 0x046f), +("ktsquare", 0x33cf), +("kturned", 0x029e), +("kuhiragana", 0x304f), +("kukatakana", 0x30af), +("kukatakanahalfwidth", 0xff78), +("kvsquare", 0x33b8), +("kwsquare", 0x33be), +("l", 0x006c), +("labengali", 0x09b2), +("lacute", 0x013a), +("ladeva", 0x0932), +("lagujarati", 0x0ab2), +("lagurmukhi", 0x0a32), +("lakkhangyaothai", 0x0e45), +("lamaleffinalarabic", 0xfefc), +("lamalefhamzaabovefinalarabic", 0xfef8), +("lamalefhamzaaboveisolatedarabic", 0xfef7), +("lamalefhamzabelowfinalarabic", 0xfefa), +("lamalefhamzabelowisolatedarabic", 0xfef9), +("lamalefisolatedarabic", 0xfefb), +("lamalefmaddaabovefinalarabic", 0xfef6), +("lamalefmaddaaboveisolatedarabic", 0xfef5), +("lamarabic", 0x0644), +("lambda", 0x03bb), +("lambdastroke", 0x019b), +("lamed", 0x05dc), +("lameddagesh", 0xfb3c), +("lameddageshhebrew", 0xfb3c), +("lamedhebrew", 0x05dc), +("lamedholam", 0x05dc), +("lamedholamdagesh", 0x05dc), +("lamedholamdageshhebrew", 0x05dc), +("lamedholamhebrew", 0x05dc), +("lamfinalarabic", 0xfede), +("lamhahinitialarabic", 0xfcca), +("laminitialarabic", 0xfedf), +("lamjeeminitialarabic", 0xfcc9), +("lamkhahinitialarabic", 0xfccb), +("lamlamhehisolatedarabic", 0xfdf2), +("lammedialarabic", 0xfee0), +("lammeemhahinitialarabic", 0xfd88), +("lammeeminitialarabic", 0xfccc), +("lammeemjeeminitialarabic", 0xfedf), +("lammeemkhahinitialarabic", 0xfedf), +("largecircle", 0x25ef), +("latticetop", 0x22a4), +("lbar", 0x019a), +("lbelt", 0x026c), +("lbopomofo", 0x310c), +("lcaron", 0x013e), +("lcedilla", 0x013c), +("lcircle", 0x24db), +("lcircumflexbelow", 0x1e3d), +("lcommaaccent", 0x013c), +("ldot", 0x0140), +("ldotaccent", 0x0140), +("ldotbelow", 0x1e37), +("ldotbelowmacron", 0x1e39), +("leftangleabovecmb", 0x031a), +("lefttackbelowcmb", 0x0318), +("less", 0x003c), +("lessdbleqlgreater", 0x2a8b), +("lessdblequal", 0x2266), +("lessdot", 0x22d6), +("lessequal", 0x2264), +("lessequalgreater", 0x22da), +("lessequalorgreater", 0x22da), +("lessmonospace", 0xff1c), +("lessmuch", 0x226a), +("lessnotdblequal", 0x2a89), +("lessnotequal", 0x2a87), +("lessorapproxeql", 0x2a85), +("lessorequalslant", 0x2a7d), +("lessorequivalent", 0x2272), +("lessorgreater", 0x2276), +("lessornotdbleql", 0x2268), +("lessornotequal", 0x2268), +("lessorsimilar", 0x2272), +("lessoverequal", 0x2266), +("lesssmall", 0xfe64), +("lezh", 0x026e), +("lfblock", 0x258c), +("lhookretroflex", 0x026d), +("lira", 0x20a4), +("liwnarmenian", 0x056c), +("lj", 0x01c9), +("ljecyrillic", 0x0459), +("ll", 0xf6c0), +("lladeva", 0x0933), +("llagujarati", 0x0ab3), +("llinebelow", 0x1e3b), +("llladeva", 0x0934), +("llvocalicbengali", 0x09e1), +("llvocalicdeva", 0x0961), +("llvocalicvowelsignbengali", 0x09e3), +("llvocalicvowelsigndeva", 0x0963), +("lmiddletilde", 0x026b), +("lmonospace", 0xff4c), +("lmsquare", 0x33d0), +("lochulathai", 0x0e2c), +("logicaland", 0x2227), +("logicalanddisplay", 0x22c0), +("logicalandtext", 0x22c0), +("logicalnot", 0x00ac), +("logicalnotreversed", 0x2310), +("logicalor", 0x2228), +("logicalordisplay", 0x22c1), +("logicalortext", 0x22c1), +("lolingthai", 0x0e25), +("longdbls", 0x017f), +("longs", 0x017f), +("longsh", 0x017f), +("longsi", 0x017f), +("longsl", 0x017f), +("longst", 0xfb05), +("lowlinecenterline", 0xfe4e), +("lowlinecmb", 0x0332), +("lowlinedashed", 0xfe4d), +("lozenge", 0x25ca), +("lparen", 0x24a7), +("lscript", 0x2113), +("lslash", 0x0142), +("lsquare", 0x2113), +("lsuperior", 0xf6ee), +("ltshade", 0x2591), +("luthai", 0x0e26), +("lvocalicbengali", 0x098c), +("lvocalicdeva", 0x090c), +("lvocalicvowelsignbengali", 0x09e2), +("lvocalicvowelsigndeva", 0x0962), +("lxsquare", 0x33d3), +("m", 0x006d), +("mabengali", 0x09ae), +("macron", 0x00af), +("macronbelowcmb", 0x0331), +("macroncmb", 0x0304), +("macronlowmod", 0x02cd), +("macronmonospace", 0xffe3), +("macute", 0x1e3f), +("madeva", 0x092e), +("magujarati", 0x0aae), +("magurmukhi", 0x0a2e), +("mahapakhhebrew", 0x05a4), +("mahapakhlefthebrew", 0x05a4), +("mahiragana", 0x307e), +("maichattawalowleftthai", 0xf895), +("maichattawalowrightthai", 0xf894), +("maichattawathai", 0x0e4b), +("maichattawaupperleftthai", 0xf893), +("maieklowleftthai", 0xf88c), +("maieklowrightthai", 0xf88b), +("maiekthai", 0x0e48), +("maiekupperleftthai", 0xf88a), +("maihanakatleftthai", 0xf884), +("maihanakatthai", 0x0e31), +("maitaikhuleftthai", 0xf889), +("maitaikhuthai", 0x0e47), +("maitholowleftthai", 0xf88f), +("maitholowrightthai", 0xf88e), +("maithothai", 0x0e49), +("maithoupperleftthai", 0xf88d), +("maitrilowleftthai", 0xf892), +("maitrilowrightthai", 0xf891), +("maitrithai", 0x0e4a), +("maitriupperleftthai", 0xf890), +("maiyamokthai", 0x0e46), +("makatakana", 0x30de), +("makatakanahalfwidth", 0xff8f), +("male", 0x2642), +("maltesecross", 0x2720), +("mansyonsquare", 0x3347), +("mapsto", 0x21a6), +("maqafhebrew", 0x05be), +("mars", 0x2642), +("masoracirclehebrew", 0x05af), +("masquare", 0x3383), +("mbopomofo", 0x3107), +("mbsquare", 0x33d4), +("mcircle", 0x24dc), +("mcubedsquare", 0x33a5), +("mdotaccent", 0x1e41), +("mdotbelow", 0x1e43), +("measuredangle", 0x2221), +("meemarabic", 0x0645), +("meemfinalarabic", 0xfee2), +("meeminitialarabic", 0xfee3), +("meemmedialarabic", 0xfee4), +("meemmeeminitialarabic", 0xfcd1), +("meemmeemisolatedarabic", 0xfc48), +("meetorusquare", 0x334d), +("mehiragana", 0x3081), +("meizierasquare", 0x337e), +("mekatakana", 0x30e1), +("mekatakanahalfwidth", 0xff92), +("mem", 0x05de), +("memdagesh", 0xfb3e), +("memdageshhebrew", 0xfb3e), +("memhebrew", 0x05de), +("menarmenian", 0x0574), +("merkhahebrew", 0x05a5), +("merkhakefulahebrew", 0x05a6), +("merkhakefulalefthebrew", 0x05a6), +("merkhalefthebrew", 0x05a5), +("mhook", 0x0271), +("mhzsquare", 0x3392), +("middledotkatakanahalfwidth", 0xff65), +("middot", 0x00b7), +("mieumacirclekorean", 0x3272), +("mieumaparenkorean", 0x3212), +("mieumcirclekorean", 0x3264), +("mieumkorean", 0x3141), +("mieumpansioskorean", 0x3170), +("mieumparenkorean", 0x3204), +("mieumpieupkorean", 0x316e), +("mieumsioskorean", 0x316f), +("mihiragana", 0x307f), +("mikatakana", 0x30df), +("mikatakanahalfwidth", 0xff90), +("minus", 0x2212), +("minusbelowcmb", 0x0320), +("minuscircle", 0x2296), +("minusmod", 0x02d7), +("minusplus", 0x2213), +("minute", 0x2032), +("miribaarusquare", 0x334a), +("mirisquare", 0x3349), +("mlonglegturned", 0x0270), +("mlsquare", 0x3396), +("mmcubedsquare", 0x33a3), +("mmonospace", 0xff4d), +("mmsquaredsquare", 0x339f), +("mohiragana", 0x3082), +("mohmsquare", 0x33c1), +("mokatakana", 0x30e2), +("mokatakanahalfwidth", 0xff93), +("molsquare", 0x33d6), +("momathai", 0x0e21), +("moverssquare", 0x33a7), +("moverssquaredsquare", 0x33a8), +("mparen", 0x24a8), +("mpasquare", 0x33ab), +("mssquare", 0x33b3), +("msuperior", 0xf6ef), +("mturned", 0x026f), +("mu", 0x00b5), +("mu1", 0x00b5), +("muasquare", 0x3382), +("muchgreater", 0x226b), +("muchless", 0x226a), +("mufsquare", 0x338c), +("mugreek", 0x03bc), +("mugsquare", 0x338d), +("muhiragana", 0x3080), +("mukatakana", 0x30e0), +("mukatakanahalfwidth", 0xff91), +("mulsquare", 0x3395), +("multicloseleft", 0x22c9), +("multicloseright", 0x22ca), +("multimap", 0x22b8), +("multiopenleft", 0x22cb), +("multiopenright", 0x22cc), +("multiply", 0x00d7), +("mumsquare", 0x339b), +("munahhebrew", 0x05a3), +("munahlefthebrew", 0x05a3), +("musicalnote", 0x266a), +("musicalnotedbl", 0x266b), +("musicflatsign", 0x266d), +("musicsharpsign", 0x266f), +("mussquare", 0x33b2), +("muvsquare", 0x33b6), +("muwsquare", 0x33bc), +("mvmegasquare", 0x33b9), +("mvsquare", 0x33b7), +("mwmegasquare", 0x33bf), +("mwsquare", 0x33bd), +("n", 0x006e), +("nabengali", 0x09a8), +("nabla", 0x2207), +("nacute", 0x0144), +("nadeva", 0x0928), +("nagujarati", 0x0aa8), +("nagurmukhi", 0x0a28), +("nahiragana", 0x306a), +("nakatakana", 0x30ca), +("nakatakanahalfwidth", 0xff85), +("nand", 0x22bc), +("napostrophe", 0x0149), +("nasquare", 0x3381), +("natural", 0x266e), +("nbopomofo", 0x310b), +("nbspace", 0x00a0), +("ncaron", 0x0148), +("ncedilla", 0x0146), +("ncircle", 0x24dd), +("ncircumflexbelow", 0x1e4b), +("ncommaaccent", 0x0146), +("ndotaccent", 0x1e45), +("ndotbelow", 0x1e47), +("negationslash", 0x0338), +("nehiragana", 0x306d), +("nekatakana", 0x30cd), +("nekatakanahalfwidth", 0xff88), +("newsheqelsign", 0x20aa), +("nfsquare", 0x338b), +("ng", 0x014b), +("ngabengali", 0x0999), +("ngadeva", 0x0919), +("ngagujarati", 0x0a99), +("ngagurmukhi", 0x0a19), +("ngonguthai", 0x0e07), +("nhiragana", 0x3093), +("nhookleft", 0x0272), +("nhookretroflex", 0x0273), +("nieunacirclekorean", 0x326f), +("nieunaparenkorean", 0x320f), +("nieuncieuckorean", 0x3135), +("nieuncirclekorean", 0x3261), +("nieunhieuhkorean", 0x3136), +("nieunkorean", 0x3134), +("nieunpansioskorean", 0x3168), +("nieunparenkorean", 0x3201), +("nieunsioskorean", 0x3167), +("nieuntikeutkorean", 0x3166), +("nihiragana", 0x306b), +("nikatakana", 0x30cb), +("nikatakanahalfwidth", 0xff86), +("nikhahitleftthai", 0xf899), +("nikhahitthai", 0x0e4d), +("nine", 0x0039), +("ninearabic", 0x0669), +("ninebengali", 0x09ef), +("ninecircle", 0x2468), +("ninecircleinversesansserif", 0x2792), +("ninedeva", 0x096f), +("ninegujarati", 0x0aef), +("ninegurmukhi", 0x0a6f), +("ninehackarabic", 0x0669), +("ninehangzhou", 0x3029), +("nineideographicparen", 0x3228), +("nineinferior", 0x2089), +("ninemonospace", 0xff19), +("nineoldstyle", 0xf739), +("nineparen", 0x247c), +("nineperiod", 0x2490), +("ninepersian", 0x06f9), +("nineroman", 0x2178), +("ninesuperior", 0x2079), +("nineteencircle", 0x2472), +("nineteenparen", 0x2486), +("nineteenperiod", 0x249a), +("ninethai", 0x0e59), +("nj", 0x01cc), +("njecyrillic", 0x045a), +("nkatakana", 0x30f3), +("nkatakanahalfwidth", 0xff9d), +("nlegrightlong", 0x019e), +("nlinebelow", 0x1e49), +("nmonospace", 0xff4e), +("nmsquare", 0x339a), +("nnabengali", 0x09a3), +("nnadeva", 0x0923), +("nnagujarati", 0x0aa3), +("nnagurmukhi", 0x0a23), +("nnnadeva", 0x0929), +("nohiragana", 0x306e), +("nokatakana", 0x30ce), +("nokatakanahalfwidth", 0xff89), +("nonbreakingspace", 0x00a0), +("nonenthai", 0x0e13), +("nonuthai", 0x0e19), +("noonarabic", 0x0646), +("noonfinalarabic", 0xfee6), +("noonghunnaarabic", 0x06ba), +("noonghunnafinalarabic", 0xfb9f), +("noonhehinitialarabic", 0xfee7), +("nooninitialarabic", 0xfee7), +("noonjeeminitialarabic", 0xfcd2), +("noonjeemisolatedarabic", 0xfc4b), +("noonmedialarabic", 0xfee8), +("noonmeeminitialarabic", 0xfcd5), +("noonmeemisolatedarabic", 0xfc4e), +("noonnoonfinalarabic", 0xfc8d), +("notapproxequal", 0x2247), +("notarrowboth", 0x21ae), +("notarrowleft", 0x219a), +("notarrowright", 0x219b), +("notbar", 0x2224), +("notcontains", 0x220c), +("notdblarrowboth", 0x21ce), +("notdblarrowleft", 0x21cd), +("notdblarrowright", 0x21cf), +("notelement", 0x2209), +("notelementof", 0x2209), +("notequal", 0x2260), +("notexistential", 0x2204), +("notfollows", 0x2281), +("notfollowsoreql", 0x2ab0), +("notforces", 0x22ae), +("notforcesextra", 0x22af), +("notgreater", 0x226f), +("notgreaterdblequal", 0x2267), +("notgreaterequal", 0x2271), +("notgreaternorequal", 0x2271), +("notgreaternorless", 0x2279), +("notgreaterorslnteql", 0x2a7e), +("notidentical", 0x2262), +("notless", 0x226e), +("notlessdblequal", 0x2266), +("notlessequal", 0x2270), +("notlessnorequal", 0x2270), +("notlessorslnteql", 0x2a7d), +("notparallel", 0x2226), +("notprecedes", 0x2280), +("notprecedesoreql", 0x2aaf), +("notsatisfies", 0x22ad), +("notsimilar", 0x2241), +("notsubset", 0x2284), +("notsubseteql", 0x2288), +("notsubsetordbleql", 0x2ac5), +("notsubsetoreql", 0x228a), +("notsucceeds", 0x2281), +("notsuperset", 0x2285), +("notsuperseteql", 0x2289), +("notsupersetordbleql", 0x2ac6), +("notsupersetoreql", 0x228b), +("nottriangeqlleft", 0x22ec), +("nottriangeqlright", 0x22ed), +("nottriangleleft", 0x22ea), +("nottriangleright", 0x22eb), +("notturnstile", 0x22ac), +("nowarmenian", 0x0576), +("nparen", 0x24a9), +("nssquare", 0x33b1), +("nsuperior", 0x207f), +("ntilde", 0x00f1), +("nu", 0x03bd), +("nuhiragana", 0x306c), +("nukatakana", 0x30cc), +("nukatakanahalfwidth", 0xff87), +("nuktabengali", 0x09bc), +("nuktadeva", 0x093c), +("nuktagujarati", 0x0abc), +("nuktagurmukhi", 0x0a3c), +("numbersign", 0x0023), +("numbersignmonospace", 0xff03), +("numbersignsmall", 0xfe5f), +("numeralsigngreek", 0x0374), +("numeralsignlowergreek", 0x0375), +("numero", 0x2116), +("nun", 0x05e0), +("nundagesh", 0xfb40), +("nundageshhebrew", 0xfb40), +("nunhebrew", 0x05e0), +("nvsquare", 0x33b5), +("nwsquare", 0x33bb), +("nyabengali", 0x099e), +("nyadeva", 0x091e), +("nyagujarati", 0x0a9e), +("nyagurmukhi", 0x0a1e), +("o", 0x006f), +("oacute", 0x00f3), +("oangthai", 0x0e2d), +("obarred", 0x0275), +("obarredcyrillic", 0x04e9), +("obarreddieresiscyrillic", 0x04eb), +("obengali", 0x0993), +("obopomofo", 0x311b), +("obreve", 0x014f), +("ocandradeva", 0x0911), +("ocandragujarati", 0x0a91), +("ocandravowelsigndeva", 0x0949), +("ocandravowelsigngujarati", 0x0ac9), +("ocaron", 0x01d2), +("ocircle", 0x24de), +("ocircumflex", 0x00f4), +("ocircumflexacute", 0x1ed1), +("ocircumflexdotbelow", 0x1ed9), +("ocircumflexgrave", 0x1ed3), +("ocircumflexhookabove", 0x1ed5), +("ocircumflextilde", 0x1ed7), +("ocyrillic", 0x043e), +("odblacute", 0x0151), +("odblgrave", 0x020d), +("odeva", 0x0913), +("odieresis", 0x00f6), +("odieresiscyrillic", 0x04e7), +("odotbelow", 0x1ecd), +("oe", 0x0153), +("oekorean", 0x315a), +("ogonek", 0x02db), +("ogonekcmb", 0x0328), +("ograve", 0x00f2), +("ogujarati", 0x0a93), +("oharmenian", 0x0585), +("ohiragana", 0x304a), +("ohookabove", 0x1ecf), +("ohorn", 0x01a1), +("ohornacute", 0x1edb), +("ohorndotbelow", 0x1ee3), +("ohorngrave", 0x1edd), +("ohornhookabove", 0x1edf), +("ohorntilde", 0x1ee1), +("ohungarumlaut", 0x0151), +("oi", 0x01a3), +("oinvertedbreve", 0x020f), +("okatakana", 0x30aa), +("okatakanahalfwidth", 0xff75), +("okorean", 0x3157), +("olehebrew", 0x05ab), +("omacron", 0x014d), +("omacronacute", 0x1e53), +("omacrongrave", 0x1e51), +("omdeva", 0x0950), +("omega", 0x03c9), +("omega1", 0x03d6), +("omegacyrillic", 0x0461), +("omegalatinclosed", 0x0277), +("omegaroundcyrillic", 0x047b), +("omegatitlocyrillic", 0x047d), +("omegatonos", 0x03ce), +("omgujarati", 0x0ad0), +("omicron", 0x03bf), +("omicrontonos", 0x03cc), +("omonospace", 0xff4f), +("one", 0x0031), +("onearabic", 0x0661), +("onebengali", 0x09e7), +("onecircle", 0x2460), +("onecircleinversesansserif", 0x278a), +("onedeva", 0x0967), +("onedotenleader", 0x2024), +("oneeighth", 0x215b), +("onefitted", 0xf6dc), +("onegujarati", 0x0ae7), +("onegurmukhi", 0x0a67), +("onehackarabic", 0x0661), +("onehalf", 0x00bd), +("onehangzhou", 0x3021), +("oneideographicparen", 0x3220), +("oneinferior", 0x2081), +("onemonospace", 0xff11), +("onenumeratorbengali", 0x09f4), +("oneoldstyle", 0xf731), +("oneparen", 0x2474), +("oneperiod", 0x2488), +("onepersian", 0x06f1), +("onequarter", 0x00bc), +("oneroman", 0x2170), +("onesuperior", 0x00b9), +("onethai", 0x0e51), +("onethird", 0x2153), +("oogonek", 0x01eb), +("oogonekmacron", 0x01ed), +("oogurmukhi", 0x0a13), +("oomatragurmukhi", 0x0a4b), +("oopen", 0x0254), +("oparen", 0x24aa), +("openbullet", 0x25e6), +("option", 0x2325), +("ordfeminine", 0x00aa), +("ordmasculine", 0x00ba), +("orthogonal", 0x221f), +("orunderscore", 0x22bb), +("oshortdeva", 0x0912), +("oshortvowelsigndeva", 0x094a), +("oslash", 0x00f8), +("oslashacute", 0x01ff), +("osmallhiragana", 0x3049), +("osmallkatakana", 0x30a9), +("osmallkatakanahalfwidth", 0xff6b), +("ostrokeacute", 0x01ff), +("osuperior", 0xf6f0), +("otcyrillic", 0x047f), +("otilde", 0x00f5), +("otildeacute", 0x1e4d), +("otildedieresis", 0x1e4f), +("oubopomofo", 0x3121), +("overline", 0x203e), +("overlinecenterline", 0xfe4a), +("overlinecmb", 0x0305), +("overlinedashed", 0xfe49), +("overlinedblwavy", 0xfe4c), +("overlinewavy", 0xfe4b), +("overscore", 0x00af), +("ovowelsignbengali", 0x09cb), +("ovowelsigndeva", 0x094b), +("ovowelsigngujarati", 0x0acb), +("owner", 0x220b), +("p", 0x0070), +("paampssquare", 0x3380), +("paasentosquare", 0x332b), +("pabengali", 0x09aa), +("pacute", 0x1e55), +("padeva", 0x092a), +("pagedown", 0x21df), +("pageup", 0x21de), +("pagujarati", 0x0aaa), +("pagurmukhi", 0x0a2a), +("pahiragana", 0x3071), +("paiyannoithai", 0x0e2f), +("pakatakana", 0x30d1), +("palatalizationcyrilliccmb", 0x0484), +("palochkacyrillic", 0x04c0), +("pansioskorean", 0x317f), +("paragraph", 0x00b6), +("parallel", 0x2225), +("parenleft", 0x0028), +("parenleftBig", 0x0028), +("parenleftBigg", 0x0028), +("parenleftaltonearabic", 0xfd3e), +("parenleftbig", 0x0028), +("parenleftbigg", 0x0028), +("parenleftbt", 0xf8ed), +("parenleftex", 0xf8ec), +("parenleftinferior", 0x208d), +("parenleftmath", 0x0028), +("parenleftmonospace", 0xff08), +("parenleftsmall", 0xfe59), +("parenleftsuperior", 0x207d), +("parenlefttp", 0xf8eb), +("parenleftvertical", 0xfe35), +("parenright", 0x0029), +("parenrightBig", 0x0029), +("parenrightBigg", 0x0029), +("parenrightaltonearabic", 0xfd3f), +("parenrightbig", 0x0029), +("parenrightbigg", 0x0029), +("parenrightbt", 0xf8f8), +("parenrightex", 0xf8f7), +("parenrightinferior", 0x208e), +("parenrightmath", 0x0029), +("parenrightmonospace", 0xff09), +("parenrightsmall", 0xfe5a), +("parenrightsuperior", 0x207e), +("parenrighttp", 0xf8f6), +("parenrightvertical", 0xfe36), +("partialdiff", 0x2202), +("paseqhebrew", 0x05c0), +("pashtahebrew", 0x0599), +("pasquare", 0x33a9), +("patah", 0x05b7), +("patah11", 0x05b7), +("patah1d", 0x05b7), +("patah2a", 0x05b7), +("patahhebrew", 0x05b7), +("patahnarrowhebrew", 0x05b7), +("patahquarterhebrew", 0x05b7), +("patahwidehebrew", 0x05b7), +("pazerhebrew", 0x05a1), +("pbopomofo", 0x3106), +("pcircle", 0x24df), +("pdotaccent", 0x1e57), +("pe", 0x05e4), +("pecyrillic", 0x043f), +("pedagesh", 0xfb44), +("pedageshhebrew", 0xfb44), +("peezisquare", 0x333b), +("pefinaldageshhebrew", 0xfb43), +("peharabic", 0x067e), +("peharmenian", 0x057a), +("pehebrew", 0x05e4), +("pehfinalarabic", 0xfb57), +("pehinitialarabic", 0xfb58), +("pehiragana", 0x307a), +("pehmedialarabic", 0xfb59), +("pekatakana", 0x30da), +("pemiddlehookcyrillic", 0x04a7), +("perafehebrew", 0xfb4e), +("percent", 0x0025), +("percentarabic", 0x066a), +("percentmonospace", 0xff05), +("percentsmall", 0xfe6a), +("period", 0x002e), +("periodarmenian", 0x0589), +("periodcentered", 0x00b7), +("periodhalfwidth", 0xff61), +("periodinferior", 0xf6e7), +("periodmonospace", 0xff0e), +("periodsmall", 0xfe52), +("periodsuperior", 0xf6e8), +("perispomenigreekcmb", 0x0342), +("perpcorrespond", 0x2a5e), +("perpendicular", 0x22a5), +("pertenthousand", 0x2031), +("perthousand", 0x2030), +("peseta", 0x20a7), +("pfsquare", 0x338a), +("phabengali", 0x09ab), +("phadeva", 0x092b), +("phagujarati", 0x0aab), +("phagurmukhi", 0x0a2b), +("phi", 0x03c6), +("phi1", 0x03d5), +("phieuphacirclekorean", 0x327a), +("phieuphaparenkorean", 0x321a), +("phieuphcirclekorean", 0x326c), +("phieuphkorean", 0x314d), +("phieuphparenkorean", 0x320c), +("philatin", 0x0278), +("phinthuthai", 0x0e3a), +("phisymbolgreek", 0x03d5), +("phook", 0x01a5), +("phophanthai", 0x0e1e), +("phophungthai", 0x0e1c), +("phosamphaothai", 0x0e20), +("pi", 0x03c0), +("pi1", 0x03d6), +("pieupacirclekorean", 0x3273), +("pieupaparenkorean", 0x3213), +("pieupcieuckorean", 0x3176), +("pieupcirclekorean", 0x3265), +("pieupkiyeokkorean", 0x3172), +("pieupkorean", 0x3142), +("pieupparenkorean", 0x3205), +("pieupsioskiyeokkorean", 0x3174), +("pieupsioskorean", 0x3144), +("pieupsiostikeutkorean", 0x3175), +("pieupthieuthkorean", 0x3177), +("pieuptikeutkorean", 0x3173), +("pihiragana", 0x3074), +("pikatakana", 0x30d4), +("pisymbolgreek", 0x03d6), +("piwrarmenian", 0x0583), +("planckover2pi", 0x210f), +("planckover2pi1", 0x210f), +("plus", 0x002b), +("plusbelowcmb", 0x031f), +("pluscircle", 0x2295), +("plusmath", 0x002b), +("plusminus", 0x00b1), +("plusmod", 0x02d6), +("plusmonospace", 0xff0b), +("plussmall", 0xfe62), +("plussuperior", 0x207a), +("pmonospace", 0xff50), +("pmsquare", 0x33d8), +("pohiragana", 0x307d), +("pointingindexdownwhite", 0x261f), +("pointingindexleftwhite", 0x261c), +("pointingindexrightwhite", 0x261e), +("pointingindexupwhite", 0x261d), +("pokatakana", 0x30dd), +("poplathai", 0x0e1b), +("postalmark", 0x3012), +("postalmarkface", 0x3020), +("pparen", 0x24ab), +("precedenotdbleqv", 0x2ab9), +("precedenotslnteql", 0x2ab5), +("precedeornoteqvlnt", 0x22e8), +("precedes", 0x227a), +("precedesequal", 0x227c), +("precedesorcurly", 0x227c), +("precedesorequal", 0x227e), +("prescription", 0x211e), +("prime", 0x2032), +("primemod", 0x02b9), +("primereverse", 0x2035), +("primereversed", 0x2035), +("product", 0x220f), +("productdisplay", 0x220f), +("producttext", 0x220f), +("projective", 0x2305), +("prolongedkana", 0x30fc), +("propellor", 0x2318), +("propersubset", 0x2282), +("propersuperset", 0x2283), +("proportion", 0x2237), +("proportional", 0x221d), +("psi", 0x03c8), +("psicyrillic", 0x0471), +("psilipneumatacyrilliccmb", 0x0486), +("pssquare", 0x33b0), +("puhiragana", 0x3077), +("pukatakana", 0x30d7), +("punctdash", 0x2014), +("pvsquare", 0x33b4), +("pwsquare", 0x33ba), +("q", 0x0071), +("qadeva", 0x0958), +("qadmahebrew", 0x05a8), +("qafarabic", 0x0642), +("qaffinalarabic", 0xfed6), +("qafinitialarabic", 0xfed7), +("qafmedialarabic", 0xfed8), +("qamats", 0x05b8), +("qamats10", 0x05b8), +("qamats1a", 0x05b8), +("qamats1c", 0x05b8), +("qamats27", 0x05b8), +("qamats29", 0x05b8), +("qamats33", 0x05b8), +("qamatsde", 0x05b8), +("qamatshebrew", 0x05b8), +("qamatsnarrowhebrew", 0x05b8), +("qamatsqatanhebrew", 0x05b8), +("qamatsqatannarrowhebrew", 0x05b8), +("qamatsqatanquarterhebrew", 0x05b8), +("qamatsqatanwidehebrew", 0x05b8), +("qamatsquarterhebrew", 0x05b8), +("qamatswidehebrew", 0x05b8), +("qarneyparahebrew", 0x059f), +("qbopomofo", 0x3111), +("qcircle", 0x24e0), +("qhook", 0x02a0), +("qmonospace", 0xff51), +("qof", 0x05e7), +("qofdagesh", 0xfb47), +("qofdageshhebrew", 0xfb47), +("qofhatafpatah", 0x05e7), +("qofhatafpatahhebrew", 0x05e7), +("qofhatafsegol", 0x05e7), +("qofhatafsegolhebrew", 0x05e7), +("qofhebrew", 0x05e7), +("qofhiriq", 0x05e7), +("qofhiriqhebrew", 0x05e7), +("qofholam", 0x05e7), +("qofholamhebrew", 0x05e7), +("qofpatah", 0x05e7), +("qofpatahhebrew", 0x05e7), +("qofqamats", 0x05e7), +("qofqamatshebrew", 0x05e7), +("qofqubuts", 0x05e7), +("qofqubutshebrew", 0x05e7), +("qofsegol", 0x05e7), +("qofsegolhebrew", 0x05e7), +("qofsheva", 0x05e7), +("qofshevahebrew", 0x05e7), +("qoftsere", 0x05e7), +("qoftserehebrew", 0x05e7), +("qparen", 0x24ac), +("quarternote", 0x2669), +("qubuts", 0x05bb), +("qubuts18", 0x05bb), +("qubuts25", 0x05bb), +("qubuts31", 0x05bb), +("qubutshebrew", 0x05bb), +("qubutsnarrowhebrew", 0x05bb), +("qubutsquarterhebrew", 0x05bb), +("qubutswidehebrew", 0x05bb), +("question", 0x003f), +("questionarabic", 0x061f), +("questionarmenian", 0x055e), +("questiondown", 0x00bf), +("questiondownsmall", 0xf7bf), +("questiongreek", 0x037e), +("questionmonospace", 0xff1f), +("questionsmall", 0xf73f), +("quotedbl", 0x0022), +("quotedblbase", 0x201e), +("quotedblleft", 0x201c), +("quotedblmonospace", 0xff02), +("quotedblprime", 0x301e), +("quotedblprimereversed", 0x301d), +("quotedblright", 0x201d), +("quoteleft", 0x2018), +("quoteleftreversed", 0x201b), +("quotereversed", 0x201b), +("quoteright", 0x2019), +("quoterightn", 0x0149), +("quotesinglbase", 0x201a), +("quotesingle", 0x0027), +("quotesinglemonospace", 0xff07), +("r", 0x0072), +("raarmenian", 0x057c), +("rabengali", 0x09b0), +("racute", 0x0155), +("radeva", 0x0930), +("radical", 0x221a), +("radicalBig", 0x221a), +("radicalBigg", 0x221a), +("radicalbig", 0x221a), +("radicalbigg", 0x221a), +("radicalbt", 0x221a), +("radicalex", 0xf8e5), +("radicaltp", 0x221a), +("radicalvertex", 0x221a), +("radoverssquare", 0x33ae), +("radoverssquaredsquare", 0x33af), +("radsquare", 0x33ad), +("rafe", 0x05bf), +("rafehebrew", 0x05bf), +("ragujarati", 0x0ab0), +("ragurmukhi", 0x0a30), +("rahiragana", 0x3089), +("rakatakana", 0x30e9), +("rakatakanahalfwidth", 0xff97), +("ralowerdiagonalbengali", 0x09f1), +("ramiddlediagonalbengali", 0x09f0), +("ramshorn", 0x0264), +("rangedash", 0x2013), +("ratio", 0x2236), +("rbopomofo", 0x3116), +("rcaron", 0x0159), +("rcedilla", 0x0157), +("rcircle", 0x24e1), +("rcommaaccent", 0x0157), +("rdblgrave", 0x0211), +("rdotaccent", 0x1e59), +("rdotbelow", 0x1e5b), +("rdotbelowmacron", 0x1e5d), +("referencemark", 0x203b), +("reflexsubset", 0x2286), +("reflexsuperset", 0x2287), +("registered", 0x00ae), +("registersans", 0xf8e8), +("registerserif", 0xf6da), +("reharabic", 0x0631), +("reharmenian", 0x0580), +("rehfinalarabic", 0xfeae), +("rehiragana", 0x308c), +("rehyehaleflamarabic", 0x0631), +("rekatakana", 0x30ec), +("rekatakanahalfwidth", 0xff9a), +("resh", 0x05e8), +("reshdageshhebrew", 0xfb48), +("reshhatafpatah", 0x05e8), +("reshhatafpatahhebrew", 0x05e8), +("reshhatafsegol", 0x05e8), +("reshhatafsegolhebrew", 0x05e8), +("reshhebrew", 0x05e8), +("reshhiriq", 0x05e8), +("reshhiriqhebrew", 0x05e8), +("reshholam", 0x05e8), +("reshholamhebrew", 0x05e8), +("reshpatah", 0x05e8), +("reshpatahhebrew", 0x05e8), +("reshqamats", 0x05e8), +("reshqamatshebrew", 0x05e8), +("reshqubuts", 0x05e8), +("reshqubutshebrew", 0x05e8), +("reshsegol", 0x05e8), +("reshsegolhebrew", 0x05e8), +("reshsheva", 0x05e8), +("reshshevahebrew", 0x05e8), +("reshtsere", 0x05e8), +("reshtserehebrew", 0x05e8), +("revasymptequal", 0x22cd), +("reversedtilde", 0x223d), +("reviahebrew", 0x0597), +("reviamugrashhebrew", 0x0597), +("revlogicalnot", 0x2310), +("revsimilar", 0x223d), +("rfishhook", 0x027e), +("rfishhookreversed", 0x027f), +("rhabengali", 0x09dd), +("rhadeva", 0x095d), +("rho", 0x03c1), +("rho1", 0x03f1), +("rhook", 0x027d), +("rhookturned", 0x027b), +("rhookturnedsuperior", 0x02b5), +("rhosymbolgreek", 0x03f1), +("rhotichookmod", 0x02de), +("rieulacirclekorean", 0x3271), +("rieulaparenkorean", 0x3211), +("rieulcirclekorean", 0x3263), +("rieulhieuhkorean", 0x3140), +("rieulkiyeokkorean", 0x313a), +("rieulkiyeoksioskorean", 0x3169), +("rieulkorean", 0x3139), +("rieulmieumkorean", 0x313b), +("rieulpansioskorean", 0x316c), +("rieulparenkorean", 0x3203), +("rieulphieuphkorean", 0x313f), +("rieulpieupkorean", 0x313c), +("rieulpieupsioskorean", 0x316b), +("rieulsioskorean", 0x313d), +("rieulthieuthkorean", 0x313e), +("rieultikeutkorean", 0x316a), +("rieulyeorinhieuhkorean", 0x316d), +("rightangle", 0x221f), +("rightanglene", 0x231d), +("rightanglenw", 0x231c), +("rightanglese", 0x231f), +("rightanglesw", 0x231e), +("righttackbelowcmb", 0x0319), +("righttriangle", 0x22bf), +("rihiragana", 0x308a), +("rikatakana", 0x30ea), +("rikatakanahalfwidth", 0xff98), +("ring", 0x02da), +("ringbelowcmb", 0x0325), +("ringcmb", 0x030a), +("ringfitted", 0xd80d), +("ringhalfleft", 0x02bf), +("ringhalfleftarmenian", 0x0559), +("ringhalfleftbelowcmb", 0x031c), +("ringhalfleftcentered", 0x02d3), +("ringhalfright", 0x02be), +("ringhalfrightbelowcmb", 0x0339), +("ringhalfrightcentered", 0x02d2), +("ringinequal", 0x2256), +("rinvertedbreve", 0x0213), +("rittorusquare", 0x3351), +("rlinebelow", 0x1e5f), +("rlongleg", 0x027c), +("rlonglegturned", 0x027a), +("rmonospace", 0xff52), +("rohiragana", 0x308d), +("rokatakana", 0x30ed), +("rokatakanahalfwidth", 0xff9b), +("roruathai", 0x0e23), +("rparen", 0x24ad), +("rrabengali", 0x09dc), +("rradeva", 0x0931), +("rragurmukhi", 0x0a5c), +("rreharabic", 0x0691), +("rrehfinalarabic", 0xfb8d), +("rrvocalicbengali", 0x09e0), +("rrvocalicdeva", 0x0960), +("rrvocalicgujarati", 0x0ae0), +("rrvocalicvowelsignbengali", 0x09c4), +("rrvocalicvowelsigndeva", 0x0944), +("rrvocalicvowelsigngujarati", 0x0ac4), +("rsuperior", 0xf6f1), +("rtblock", 0x2590), +("rturned", 0x0279), +("rturnedsuperior", 0x02b4), +("ruhiragana", 0x308b), +("rukatakana", 0x30eb), +("rukatakanahalfwidth", 0xff99), +("rupeemarkbengali", 0x09f2), +("rupeesignbengali", 0x09f3), +("rupiah", 0xf6dd), +("ruthai", 0x0e24), +("rvocalicbengali", 0x098b), +("rvocalicdeva", 0x090b), +("rvocalicgujarati", 0x0a8b), +("rvocalicvowelsignbengali", 0x09c3), +("rvocalicvowelsigndeva", 0x0943), +("rvocalicvowelsigngujarati", 0x0ac3), +("s", 0x0073), +("sabengali", 0x09b8), +("sacute", 0x015b), +("sacutedotaccent", 0x1e65), +("sadarabic", 0x0635), +("sadeva", 0x0938), +("sadfinalarabic", 0xfeba), +("sadinitialarabic", 0xfebb), +("sadmedialarabic", 0xfebc), +("sagujarati", 0x0ab8), +("sagurmukhi", 0x0a38), +("sahiragana", 0x3055), +("sakatakana", 0x30b5), +("sakatakanahalfwidth", 0xff7b), +("sallallahoualayhewasallamarabic", 0xfdfa), +("samekh", 0x05e1), +("samekhdagesh", 0xfb41), +("samekhdageshhebrew", 0xfb41), +("samekhhebrew", 0x05e1), +("saraaathai", 0x0e32), +("saraaethai", 0x0e41), +("saraaimaimalaithai", 0x0e44), +("saraaimaimuanthai", 0x0e43), +("saraamthai", 0x0e33), +("saraathai", 0x0e30), +("saraethai", 0x0e40), +("saraiileftthai", 0xf886), +("saraiithai", 0x0e35), +("saraileftthai", 0xf885), +("saraithai", 0x0e34), +("saraothai", 0x0e42), +("saraueeleftthai", 0xf888), +("saraueethai", 0x0e37), +("saraueleftthai", 0xf887), +("sarauethai", 0x0e36), +("sarauthai", 0x0e38), +("sarauuthai", 0x0e39), +("satisfies", 0x22a8), +("sbopomofo", 0x3119), +("scaron", 0x0161), +("scarondotaccent", 0x1e67), +("scedilla", 0x015f), +("schwa", 0x0259), +("schwacyrillic", 0x04d9), +("schwadieresiscyrillic", 0x04db), +("schwahook", 0x025a), +("scircle", 0x24e2), +("scircumflex", 0x015d), +("scommaaccent", 0x0219), +("sdotaccent", 0x1e61), +("sdotbelow", 0x1e63), +("sdotbelowdotaccent", 0x1e69), +("seagullbelowcmb", 0x033c), +("second", 0x2033), +("secondtonechinese", 0x02ca), +("section", 0x00a7), +("seenarabic", 0x0633), +("seenfinalarabic", 0xfeb2), +("seeninitialarabic", 0xfeb3), +("seenmedialarabic", 0xfeb4), +("segol", 0x05b6), +("segol13", 0x05b6), +("segol1f", 0x05b6), +("segol2c", 0x05b6), +("segolhebrew", 0x05b6), +("segolnarrowhebrew", 0x05b6), +("segolquarterhebrew", 0x05b6), +("segoltahebrew", 0x0592), +("segolwidehebrew", 0x05b6), +("seharmenian", 0x057d), +("sehiragana", 0x305b), +("sekatakana", 0x30bb), +("sekatakanahalfwidth", 0xff7e), +("semicolon", 0x003b), +("semicolonarabic", 0x061b), +("semicolonmonospace", 0xff1b), +("semicolonsmall", 0xfe54), +("semivoicedmarkkana", 0x309c), +("semivoicedmarkkanahalfwidth", 0xff9f), +("sentisquare", 0x3322), +("sentosquare", 0x3323), +("seven", 0x0037), +("sevenarabic", 0x0667), +("sevenbengali", 0x09ed), +("sevencircle", 0x2466), +("sevencircleinversesansserif", 0x2790), +("sevendeva", 0x096d), +("seveneighths", 0x215e), +("sevengujarati", 0x0aed), +("sevengurmukhi", 0x0a6d), +("sevenhackarabic", 0x0667), +("sevenhangzhou", 0x3027), +("sevenideographicparen", 0x3226), +("seveninferior", 0x2087), +("sevenmonospace", 0xff17), +("sevenoldstyle", 0xf737), +("sevenparen", 0x247a), +("sevenperiod", 0x248e), +("sevenpersian", 0x06f7), +("sevenroman", 0x2176), +("sevensuperior", 0x2077), +("seventeencircle", 0x2470), +("seventeenparen", 0x2484), +("seventeenperiod", 0x2498), +("seventhai", 0x0e57), +("sfthyphen", 0x00ad), +("shaarmenian", 0x0577), +("shabengali", 0x09b6), +("shacyrillic", 0x0448), +("shaddaarabic", 0x0651), +("shaddadammaarabic", 0xfc61), +("shaddadammatanarabic", 0xfc5e), +("shaddafathaarabic", 0xfc60), +("shaddafathatanarabic", 0x0651), +("shaddakasraarabic", 0xfc62), +("shaddakasratanarabic", 0xfc5f), +("shade", 0x2592), +("shadedark", 0x2593), +("shadelight", 0x2591), +("shademedium", 0x2592), +("shadeva", 0x0936), +("shagujarati", 0x0ab6), +("shagurmukhi", 0x0a36), +("shalshelethebrew", 0x0593), +("sharp", 0x266f), +("shbopomofo", 0x3115), +("shchacyrillic", 0x0449), +("sheenarabic", 0x0634), +("sheenfinalarabic", 0xfeb6), +("sheeninitialarabic", 0xfeb7), +("sheenmedialarabic", 0xfeb8), +("sheicoptic", 0x03e3), +("sheqel", 0x20aa), +("sheqelhebrew", 0x20aa), +("sheva", 0x05b0), +("sheva115", 0x05b0), +("sheva15", 0x05b0), +("sheva22", 0x05b0), +("sheva2e", 0x05b0), +("shevahebrew", 0x05b0), +("shevanarrowhebrew", 0x05b0), +("shevaquarterhebrew", 0x05b0), +("shevawidehebrew", 0x05b0), +("shhacyrillic", 0x04bb), +("shiftleft", 0x21b0), +("shiftright", 0x21b1), +("shimacoptic", 0x03ed), +("shin", 0x05e9), +("shindagesh", 0xfb49), +("shindageshhebrew", 0xfb49), +("shindageshshindot", 0xfb2c), +("shindageshshindothebrew", 0xfb2c), +("shindageshsindot", 0xfb2d), +("shindageshsindothebrew", 0xfb2d), +("shindothebrew", 0x05c1), +("shinhebrew", 0x05e9), +("shinshindot", 0xfb2a), +("shinshindothebrew", 0xfb2a), +("shinsindot", 0xfb2b), +("shinsindothebrew", 0xfb2b), +("shook", 0x0282), +("sigma", 0x03c3), +("sigma1", 0x03c2), +("sigmafinal", 0x03c2), +("sigmalunatesymbolgreek", 0x03f2), +("sihiragana", 0x3057), +("sikatakana", 0x30b7), +("sikatakanahalfwidth", 0xff7c), +("siluqhebrew", 0x05bd), +("siluqlefthebrew", 0x05bd), +("similar", 0x223c), +("similarequal", 0x2243), +("sindothebrew", 0x05c2), +("siosacirclekorean", 0x3274), +("siosaparenkorean", 0x3214), +("sioscieuckorean", 0x317e), +("sioscirclekorean", 0x3266), +("sioskiyeokkorean", 0x317a), +("sioskorean", 0x3145), +("siosnieunkorean", 0x317b), +("siosparenkorean", 0x3206), +("siospieupkorean", 0x317d), +("siostikeutkorean", 0x317c), +("six", 0x0036), +("sixarabic", 0x0666), +("sixbengali", 0x09ec), +("sixcircle", 0x2465), +("sixcircleinversesansserif", 0x278f), +("sixdeva", 0x096c), +("sixgujarati", 0x0aec), +("sixgurmukhi", 0x0a6c), +("sixhackarabic", 0x0666), +("sixhangzhou", 0x3026), +("sixideographicparen", 0x3225), +("sixinferior", 0x2086), +("sixmonospace", 0xff16), +("sixoldstyle", 0xf736), +("sixparen", 0x2479), +("sixperiod", 0x248d), +("sixpersian", 0x06f6), +("sixroman", 0x2175), +("sixsuperior", 0x2076), +("sixteencircle", 0x246f), +("sixteencurrencydenominatorbengali", 0x09f9), +("sixteenparen", 0x2483), +("sixteenperiod", 0x2497), +("sixthai", 0x0e56), +("slash", 0x002f), +("slashBig", 0x2215), +("slashBigg", 0x2215), +("slashbig", 0x2215), +("slashbigg", 0x2215), +("slashmonospace", 0xff0f), +("slong", 0x017f), +("slongdotaccent", 0x1e9b), +("slurabove", 0x2322), +("slurbelow", 0x2323), +("smile", 0x2323), +("smileface", 0x263a), +("smonospace", 0xff53), +("sofpasuqhebrew", 0x05c3), +("softhyphen", 0x00ad), +("softsigncyrillic", 0x044c), +("sohiragana", 0x305d), +("sokatakana", 0x30bd), +("sokatakanahalfwidth", 0xff7f), +("soliduslongoverlaycmb", 0x0338), +("solidusshortoverlaycmb", 0x0337), +("sorusithai", 0x0e29), +("sosalathai", 0x0e28), +("sosothai", 0x0e0b), +("sosuathai", 0x0e2a), +("space", 0x0020), +("spacehackarabic", 0x0020), +("spade", 0x2660), +("spadesuitblack", 0x2660), +("spadesuitwhite", 0x2664), +("sparen", 0x24ae), +("sphericalangle", 0x2222), +("square", 0x25a1), +("squarebelowcmb", 0x033b), +("squarecc", 0x33c4), +("squarecm", 0x339d), +("squarediagonalcrosshatchfill", 0x25a9), +("squaredot", 0x22a1), +("squarehorizontalfill", 0x25a4), +("squareimage", 0x228f), +("squarekg", 0x338f), +("squarekm", 0x339e), +("squarekmcapital", 0x33ce), +("squareln", 0x33d1), +("squarelog", 0x33d2), +("squaremg", 0x338e), +("squaremil", 0x33d5), +("squareminus", 0x229f), +("squaremm", 0x339c), +("squaremsquared", 0x33a1), +("squaremultiply", 0x22a0), +("squareoriginal", 0x2290), +("squareorthogonalcrosshatchfill", 0x25a6), +("squareplus", 0x229e), +("squaresolid", 0x25a0), +("squareupperlefttolowerrightfill", 0x25a7), +("squareupperrighttolowerleftfill", 0x25a8), +("squareverticalfill", 0x25a5), +("squarewhitewithsmallblack", 0x25a3), +("squiggleleftright", 0x21ad), +("squiggleright", 0x21dd), +("srsquare", 0x33db), +("ssabengali", 0x09b7), +("ssadeva", 0x0937), +("ssagujarati", 0x0ab7), +("ssangcieuckorean", 0x3149), +("ssanghieuhkorean", 0x3185), +("ssangieungkorean", 0x3180), +("ssangkiyeokkorean", 0x3132), +("ssangnieunkorean", 0x3165), +("ssangpieupkorean", 0x3143), +("ssangsioskorean", 0x3146), +("ssangtikeutkorean", 0x3138), +("ssuperior", 0xf6f2), +("st", 0xfb06), +("star", 0x22c6), +("sterling", 0x00a3), +("sterlingmonospace", 0xffe1), +("strokelongoverlaycmb", 0x0336), +("strokeshortoverlaycmb", 0x0335), +("subset", 0x2282), +("subsetdbl", 0x22d0), +("subsetdblequal", 0x2ac5), +("subsetnoteql", 0x228a), +("subsetnotequal", 0x228a), +("subsetorequal", 0x2286), +("subsetornotdbleql", 0x2acb), +("subsetsqequal", 0x2291), +("succeeds", 0x227b), +("suchthat", 0x220b), +("suhiragana", 0x3059), +("sukatakana", 0x30b9), +("sukatakanahalfwidth", 0xff7d), +("sukunarabic", 0x0652), +("summation", 0x2211), +("summationdisplay", 0x2211), +("summationtext", 0x2211), +("sun", 0x263c), +("superset", 0x2283), +("supersetdbl", 0x22d1), +("supersetdblequal", 0x2ac6), +("supersetnoteql", 0x228b), +("supersetnotequal", 0x228b), +("supersetorequal", 0x2287), +("supersetornotdbleql", 0x2acc), +("supersetsqequal", 0x2292), +("svsquare", 0x33dc), +("syouwaerasquare", 0x337c), +("t", 0x0074), +("tabengali", 0x09a4), +("tackdown", 0x22a4), +("tackleft", 0x22a3), +("tadeva", 0x0924), +("tagujarati", 0x0aa4), +("tagurmukhi", 0x0a24), +("taharabic", 0x0637), +("tahfinalarabic", 0xfec2), +("tahinitialarabic", 0xfec3), +("tahiragana", 0x305f), +("tahmedialarabic", 0xfec4), +("taisyouerasquare", 0x337d), +("takatakana", 0x30bf), +("takatakanahalfwidth", 0xff80), +("tatweelarabic", 0x0640), +("tau", 0x03c4), +("tav", 0x05ea), +("tavdages", 0xfb4a), +("tavdagesh", 0xfb4a), +("tavdageshhebrew", 0xfb4a), +("tavhebrew", 0x05ea), +("tbar", 0x0167), +("tbopomofo", 0x310a), +("tcaron", 0x0165), +("tccurl", 0x02a8), +("tcedilla", 0x0163), +("tcheharabic", 0x0686), +("tchehfinalarabic", 0xfb7b), +("tchehinitialarabic", 0xfb7c), +("tchehmedialarabic", 0xfb7d), +("tchehmeeminitialarabic", 0xfb7c), +("tcircle", 0x24e3), +("tcircumflexbelow", 0x1e71), +("tcommaaccent", 0x0163), +("tdieresis", 0x1e97), +("tdotaccent", 0x1e6b), +("tdotbelow", 0x1e6d), +("tecyrillic", 0x0442), +("tedescendercyrillic", 0x04ad), +("teharabic", 0x062a), +("tehfinalarabic", 0xfe96), +("tehhahinitialarabic", 0xfca2), +("tehhahisolatedarabic", 0xfc0c), +("tehinitialarabic", 0xfe97), +("tehiragana", 0x3066), +("tehjeeminitialarabic", 0xfca1), +("tehjeemisolatedarabic", 0xfc0b), +("tehmarbutaarabic", 0x0629), +("tehmarbutafinalarabic", 0xfe94), +("tehmedialarabic", 0xfe98), +("tehmeeminitialarabic", 0xfca4), +("tehmeemisolatedarabic", 0xfc0e), +("tehnoonfinalarabic", 0xfc73), +("tekatakana", 0x30c6), +("tekatakanahalfwidth", 0xff83), +("telephone", 0x2121), +("telephoneblack", 0x260e), +("telishagedolahebrew", 0x05a0), +("telishaqetanahebrew", 0x05a9), +("tencircle", 0x2469), +("tenideographicparen", 0x3229), +("tenparen", 0x247d), +("tenperiod", 0x2491), +("tenroman", 0x2179), +("tesh", 0x02a7), +("tet", 0x05d8), +("tetdagesh", 0xfb38), +("tetdageshhebrew", 0xfb38), +("tethebrew", 0x05d8), +("tetsecyrillic", 0x04b5), +("tevirhebrew", 0x059b), +("tevirlefthebrew", 0x059b), +("thabengali", 0x09a5), +("thadeva", 0x0925), +("thagujarati", 0x0aa5), +("thagurmukhi", 0x0a25), +("thalarabic", 0x0630), +("thalfinalarabic", 0xfeac), +("thanthakhatlowleftthai", 0xf898), +("thanthakhatlowrightthai", 0xf897), +("thanthakhatthai", 0x0e4c), +("thanthakhatupperleftthai", 0xf896), +("theharabic", 0x062b), +("thehfinalarabic", 0xfe9a), +("thehinitialarabic", 0xfe9b), +("thehmedialarabic", 0xfe9c), +("thereexists", 0x2203), +("therefore", 0x2234), +("theta", 0x03b8), +("theta1", 0x03d1), +("thetasymbolgreek", 0x03d1), +("thieuthacirclekorean", 0x3279), +("thieuthaparenkorean", 0x3219), +("thieuthcirclekorean", 0x326b), +("thieuthkorean", 0x314c), +("thieuthparenkorean", 0x320b), +("thirteencircle", 0x246c), +("thirteenparen", 0x2480), +("thirteenperiod", 0x2494), +("thonangmonthothai", 0x0e11), +("thook", 0x01ad), +("thophuthaothai", 0x0e12), +("thorn", 0x00fe), +("thothahanthai", 0x0e17), +("thothanthai", 0x0e10), +("thothongthai", 0x0e18), +("thothungthai", 0x0e16), +("thousandcyrillic", 0x0482), +("thousandsseparatorarabic", 0x066c), +("thousandsseparatorpersian", 0x066c), +("three", 0x0033), +("threearabic", 0x0663), +("threebengali", 0x09e9), +("threecircle", 0x2462), +("threecircleinversesansserif", 0x278c), +("threedeva", 0x0969), +("threeeighths", 0x215c), +("threegujarati", 0x0ae9), +("threegurmukhi", 0x0a69), +("threehackarabic", 0x0663), +("threehangzhou", 0x3023), +("threeideographicparen", 0x3222), +("threeinferior", 0x2083), +("threemonospace", 0xff13), +("threenumeratorbengali", 0x09f6), +("threeoldstyle", 0xf733), +("threeparen", 0x2476), +("threeperiod", 0x248a), +("threepersian", 0x06f3), +("threequarters", 0x00be), +("threequartersemdash", 0xf6de), +("threeroman", 0x2172), +("threesuperior", 0x00b3), +("threethai", 0x0e53), +("thzsquare", 0x3394), +("tie", 0x2040), +("tihiragana", 0x3061), +("tikatakana", 0x30c1), +("tikatakanahalfwidth", 0xff81), +("tikeutacirclekorean", 0x3270), +("tikeutaparenkorean", 0x3210), +("tikeutcirclekorean", 0x3262), +("tikeutkorean", 0x3137), +("tikeutparenkorean", 0x3202), +("tilde", 0x02dc), +("tildebelowcmb", 0x0330), +("tildecmb", 0x0303), +("tildecomb", 0x0303), +("tildedoublecmb", 0x0360), +("tildeoperator", 0x223c), +("tildeoverlaycmb", 0x0334), +("tildeverticalcmb", 0x033e), +("tildewide", 0x0303), +("tildewider", 0x0303), +("tildewiderr", 0x0303), +("tildewidest", 0x02dc), +("timescircle", 0x2297), +("tipehahebrew", 0x0596), +("tipehalefthebrew", 0x0596), +("tippigurmukhi", 0x0a70), +("titlocyrilliccmb", 0x0483), +("tiwnarmenian", 0x057f), +("tlinebelow", 0x1e6f), +("tmonospace", 0xff54), +("toarmenian", 0x0569), +("tohiragana", 0x3068), +("tokatakana", 0x30c8), +("tokatakanahalfwidth", 0xff84), +("tonebarextrahighmod", 0x02e5), +("tonebarextralowmod", 0x02e9), +("tonebarhighmod", 0x02e6), +("tonebarlowmod", 0x02e8), +("tonebarmidmod", 0x02e7), +("tonefive", 0x01bd), +("tonesix", 0x0185), +("tonetwo", 0x01a8), +("tonos", 0x0384), +("tonsquare", 0x3327), +("topatakthai", 0x0e0f), +("tortoiseshellbracketleft", 0x3014), +("tortoiseshellbracketleftsmall", 0xfe5d), +("tortoiseshellbracketleftvertical", 0xfe39), +("tortoiseshellbracketright", 0x3015), +("tortoiseshellbracketrightsmall", 0xfe5e), +("tortoiseshellbracketrightvertical", 0xfe3a), +("totaothai", 0x0e15), +("tpalatalhook", 0x01ab), +("tparen", 0x24af), +("trademark", 0x2122), +("trademarksans", 0xf8ea), +("trademarkserif", 0xf6db), +("tretroflexhook", 0x0288), +("triagdn", 0x25bc), +("triaglf", 0x25c4), +("triagrt", 0x25ba), +("triagup", 0x25b2), +("triangle", 0x25b3), +("triangledownsld", 0x25bc), +("triangleinv", 0x25bd), +("triangleleft", 0x25b9), +("triangleleftequal", 0x22b4), +("triangleleftsld", 0x25c0), +("triangleright", 0x25c3), +("trianglerightequal", 0x22b5), +("trianglerightsld", 0x25b6), +("trianglesolid", 0x25b2), +("ts", 0x02a6), +("tsadi", 0x05e6), +("tsadidagesh", 0xfb46), +("tsadidageshhebrew", 0xfb46), +("tsadihebrew", 0x05e6), +("tsecyrillic", 0x0446), +("tsere", 0x05b5), +("tsere12", 0x05b5), +("tsere1e", 0x05b5), +("tsere2b", 0x05b5), +("tserehebrew", 0x05b5), +("tserenarrowhebrew", 0x05b5), +("tserequarterhebrew", 0x05b5), +("tserewidehebrew", 0x05b5), +("tshecyrillic", 0x045b), +("tsuperior", 0xf6f3), +("ttabengali", 0x099f), +("ttadeva", 0x091f), +("ttagujarati", 0x0a9f), +("ttagurmukhi", 0x0a1f), +("tteharabic", 0x0679), +("ttehfinalarabic", 0xfb67), +("ttehinitialarabic", 0xfb68), +("ttehmedialarabic", 0xfb69), +("tthabengali", 0x09a0), +("tthadeva", 0x0920), +("tthagujarati", 0x0aa0), +("tthagurmukhi", 0x0a20), +("tturned", 0x0287), +("tuhiragana", 0x3064), +("tukatakana", 0x30c4), +("tukatakanahalfwidth", 0xff82), +("turnstileleft", 0x22a2), +("turnstileright", 0x22a3), +("tusmallhiragana", 0x3063), +("tusmallkatakana", 0x30c3), +("tusmallkatakanahalfwidth", 0xff6f), +("twelvecircle", 0x246b), +("twelveparen", 0x247f), +("twelveperiod", 0x2493), +("twelveroman", 0x217b), +("twelveudash", 0xf6de), +("twentycircle", 0x2473), +("twentyhangzhou", 0x5344), +("twentyparen", 0x2487), +("twentyperiod", 0x249b), +("two", 0x0032), +("twoarabic", 0x0662), +("twobengali", 0x09e8), +("twocircle", 0x2461), +("twocircleinversesansserif", 0x278b), +("twodeva", 0x0968), +("twodotenleader", 0x2025), +("twodotleader", 0x2025), +("twodotleadervertical", 0xfe30), +("twogujarati", 0x0ae8), +("twogurmukhi", 0x0a68), +("twohackarabic", 0x0662), +("twohangzhou", 0x3022), +("twoideographicparen", 0x3221), +("twoinferior", 0x2082), +("twomonospace", 0xff12), +("twonumeratorbengali", 0x09f5), +("twooldstyle", 0xf732), +("twoparen", 0x2475), +("twoperiod", 0x2489), +("twopersian", 0x06f2), +("tworoman", 0x2171), +("twostroke", 0x01bb), +("twosuperior", 0x00b2), +("twothai", 0x0e52), +("twothirds", 0x2154), +("u", 0x0075), +("uacute", 0x00fa), +("ubar", 0x0289), +("ubengali", 0x0989), +("ubopomofo", 0x3128), +("ubreve", 0x016d), +("ucaron", 0x01d4), +("ucircle", 0x24e4), +("ucircumflex", 0x00fb), +("ucircumflexbelow", 0x1e77), +("ucyrillic", 0x0443), +("udattadeva", 0x0951), +("udblacute", 0x0171), +("udblgrave", 0x0215), +("udeva", 0x0909), +("udieresis", 0x00fc), +("udieresisacute", 0x01d8), +("udieresisbelow", 0x1e73), +("udieresiscaron", 0x01da), +("udieresiscyrillic", 0x04f1), +("udieresisgrave", 0x01dc), +("udieresismacron", 0x01d6), +("udotbelow", 0x1ee5), +("ugrave", 0x00f9), +("ugujarati", 0x0a89), +("ugurmukhi", 0x0a09), +("uhiragana", 0x3046), +("uhookabove", 0x1ee7), +("uhorn", 0x01b0), +("uhornacute", 0x1ee9), +("uhorndotbelow", 0x1ef1), +("uhorngrave", 0x1eeb), +("uhornhookabove", 0x1eed), +("uhorntilde", 0x1eef), +("uhungarumlaut", 0x0171), +("uhungarumlautcyrillic", 0x04f3), +("uinvertedbreve", 0x0217), +("ukatakana", 0x30a6), +("ukatakanahalfwidth", 0xff73), +("ukcyrillic", 0x0479), +("ukorean", 0x315c), +("umacron", 0x016b), +("umacroncyrillic", 0x04ef), +("umacrondieresis", 0x1e7b), +("umatragurmukhi", 0x0a41), +("umonospace", 0xff55), +("underscore", 0x005f), +("underscoredbl", 0x2017), +("underscoremonospace", 0xff3f), +("underscorevertical", 0xfe33), +("underscorewavy", 0xfe4f), +("union", 0x222a), +("uniondbl", 0x22d3), +("uniondisplay", 0x22c3), +("unionmulti", 0x228e), +("unionmultidisplay", 0x228e), +("unionmultitext", 0x228e), +("unionsq", 0x2294), +("unionsqdisplay", 0x2294), +("unionsqtext", 0x2294), +("uniontext", 0x22c3), +("universal", 0x2200), +("uogonek", 0x0173), +("uparen", 0x24b0), +("upblock", 0x2580), +("upperdothebrew", 0x05c4), +("uprise", 0x22cf), +("upsilon", 0x03c5), +("upsilondieresis", 0x03cb), +("upsilondieresistonos", 0x03b0), +("upsilonlatin", 0x028a), +("upsilontonos", 0x03cd), +("upslope", 0x29f8), +("uptackbelowcmb", 0x031d), +("uptackmod", 0x02d4), +("uragurmukhi", 0x0a73), +("uring", 0x016f), +("ushortcyrillic", 0x045e), +("usmallhiragana", 0x3045), +("usmallkatakana", 0x30a5), +("usmallkatakanahalfwidth", 0xff69), +("ustraightcyrillic", 0x04af), +("ustraightstrokecyrillic", 0x04b1), +("utilde", 0x0169), +("utildeacute", 0x1e79), +("utildebelow", 0x1e75), +("uubengali", 0x098a), +("uudeva", 0x090a), +("uugujarati", 0x0a8a), +("uugurmukhi", 0x0a0a), +("uumatragurmukhi", 0x0a42), +("uuvowelsignbengali", 0x09c2), +("uuvowelsigndeva", 0x0942), +("uuvowelsigngujarati", 0x0ac2), +("uvowelsignbengali", 0x09c1), +("uvowelsigndeva", 0x0941), +("uvowelsigngujarati", 0x0ac1), +("v", 0x0076), +("vadeva", 0x0935), +("vagujarati", 0x0ab5), +("vagurmukhi", 0x0a35), +("vakatakana", 0x30f7), +("vav", 0x05d5), +("vavdagesh", 0xfb35), +("vavdagesh65", 0xfb35), +("vavdageshhebrew", 0xfb35), +("vavhebrew", 0x05d5), +("vavholam", 0xfb4b), +("vavholamhebrew", 0xfb4b), +("vavvavhebrew", 0x05f0), +("vavyodhebrew", 0x05f1), +("vcircle", 0x24e5), +("vdotbelow", 0x1e7f), +("vector", 0x20d7), +("vecyrillic", 0x0432), +("veharabic", 0x06a4), +("vehfinalarabic", 0xfb6b), +("vehinitialarabic", 0xfb6c), +("vehmedialarabic", 0xfb6d), +("vekatakana", 0x30f9), +("venus", 0x2640), +("verticalbar", 0x007c), +("verticallineabovecmb", 0x030d), +("verticallinebelowcmb", 0x0329), +("verticallinelowmod", 0x02cc), +("verticallinemod", 0x02c8), +("vewarmenian", 0x057e), +("vextenddouble", 0x2225), +("vextendsingle", 0x2223), +("vhook", 0x028b), +("vikatakana", 0x30f8), +("viramabengali", 0x09cd), +("viramadeva", 0x094d), +("viramagujarati", 0x0acd), +("visargabengali", 0x0983), +("visargadeva", 0x0903), +("visargagujarati", 0x0a83), +("visiblespace", 0x2423), +("visualspace", 0x2423), +("vmonospace", 0xff56), +("voarmenian", 0x0578), +("voicediterationhiragana", 0x309e), +("voicediterationkatakana", 0x30fe), +("voicedmarkkana", 0x309b), +("voicedmarkkanahalfwidth", 0xff9e), +("vokatakana", 0x30fa), +("vparen", 0x24b1), +("vtilde", 0x1e7d), +("vturned", 0x028c), +("vuhiragana", 0x3094), +("vukatakana", 0x30f4), +("w", 0x0077), +("wacute", 0x1e83), +("waekorean", 0x3159), +("wahiragana", 0x308f), +("wakatakana", 0x30ef), +("wakatakanahalfwidth", 0xff9c), +("wakorean", 0x3158), +("wasmallhiragana", 0x308e), +("wasmallkatakana", 0x30ee), +("wattosquare", 0x3357), +("wavedash", 0x301c), +("wavyunderscorevertical", 0xfe34), +("wawarabic", 0x0648), +("wawfinalarabic", 0xfeee), +("wawhamzaabovearabic", 0x0624), +("wawhamzaabovefinalarabic", 0xfe86), +("wbsquare", 0x33dd), +("wcircle", 0x24e6), +("wcircumflex", 0x0175), +("wdieresis", 0x1e85), +("wdotaccent", 0x1e87), +("wdotbelow", 0x1e89), +("wehiragana", 0x3091), +("weierstrass", 0x2118), +("wekatakana", 0x30f1), +("wekorean", 0x315e), +("weokorean", 0x315d), +("wgrave", 0x1e81), +("whitebullet", 0x25e6), +("whitecircle", 0x25cb), +("whitecircleinverse", 0x25d9), +("whitecornerbracketleft", 0x300e), +("whitecornerbracketleftvertical", 0xfe43), +("whitecornerbracketright", 0x300f), +("whitecornerbracketrightvertical", 0xfe44), +("whitediamond", 0x25c7), +("whitediamondcontainingblacksmalldiamond", 0x25c8), +("whitedownpointingsmalltriangle", 0x25bf), +("whitedownpointingtriangle", 0x25bd), +("whiteleftpointingsmalltriangle", 0x25c3), +("whiteleftpointingtriangle", 0x25c1), +("whitelenticularbracketleft", 0x3016), +("whitelenticularbracketright", 0x3017), +("whiterightpointingsmalltriangle", 0x25b9), +("whiterightpointingtriangle", 0x25b7), +("whitesmallsquare", 0x25ab), +("whitesmilingface", 0x263a), +("whitesquare", 0x25a1), +("whitestar", 0x2606), +("whitetelephone", 0x260f), +("whitetortoiseshellbracketleft", 0x3018), +("whitetortoiseshellbracketright", 0x3019), +("whiteuppointingsmalltriangle", 0x25b5), +("whiteuppointingtriangle", 0x25b3), +("wihiragana", 0x3090), +("wikatakana", 0x30f0), +("wikorean", 0x315f), +("wmonospace", 0xff57), +("wohiragana", 0x3092), +("wokatakana", 0x30f2), +("wokatakanahalfwidth", 0xff66), +("won", 0x20a9), +("wonmonospace", 0xffe6), +("wowaenthai", 0x0e27), +("wparen", 0x24b2), +("wreathproduct", 0x2240), +("wring", 0x1e98), +("wsuperior", 0x02b7), +("wturned", 0x028d), +("wynn", 0x01bf), +("x", 0x0078), +("xabovecmb", 0x033d), +("xbopomofo", 0x3112), +("xcircle", 0x24e7), +("xdieresis", 0x1e8d), +("xdotaccent", 0x1e8b), +("xeharmenian", 0x056d), +("xi", 0x03be), +("xmonospace", 0xff58), +("xparen", 0x24b3), +("xsuperior", 0x02e3), +("y", 0x0079), +("yaadosquare", 0x334e), +("yabengali", 0x09af), +("yacute", 0x00fd), +("yadeva", 0x092f), +("yaekorean", 0x3152), +("yagujarati", 0x0aaf), +("yagurmukhi", 0x0a2f), +("yahiragana", 0x3084), +("yakatakana", 0x30e4), +("yakatakanahalfwidth", 0xff94), +("yakorean", 0x3151), +("yamakkanthai", 0x0e4e), +("yasmallhiragana", 0x3083), +("yasmallkatakana", 0x30e3), +("yasmallkatakanahalfwidth", 0xff6c), +("yatcyrillic", 0x0463), +("ycircle", 0x24e8), +("ycircumflex", 0x0177), +("ydieresis", 0x00ff), +("ydotaccent", 0x1e8f), +("ydotbelow", 0x1ef5), +("yeharabic", 0x064a), +("yehbarreearabic", 0x06d2), +("yehbarreefinalarabic", 0xfbaf), +("yehfinalarabic", 0xfef2), +("yehhamzaabovearabic", 0x0626), +("yehhamzaabovefinalarabic", 0xfe8a), +("yehhamzaaboveinitialarabic", 0xfe8b), +("yehhamzaabovemedialarabic", 0xfe8c), +("yehinitialarabic", 0xfef3), +("yehmedialarabic", 0xfef4), +("yehmeeminitialarabic", 0xfcdd), +("yehmeemisolatedarabic", 0xfc58), +("yehnoonfinalarabic", 0xfc94), +("yehthreedotsbelowarabic", 0x06d1), +("yekorean", 0x3156), +("yen", 0x00a5), +("yenmonospace", 0xffe5), +("yeokorean", 0x3155), +("yeorinhieuhkorean", 0x3186), +("yerahbenyomohebrew", 0x05aa), +("yerahbenyomolefthebrew", 0x05aa), +("yericyrillic", 0x044b), +("yerudieresiscyrillic", 0x04f9), +("yesieungkorean", 0x3181), +("yesieungpansioskorean", 0x3183), +("yesieungsioskorean", 0x3182), +("yetivhebrew", 0x059a), +("ygrave", 0x1ef3), +("yhook", 0x01b4), +("yhookabove", 0x1ef7), +("yiarmenian", 0x0575), +("yicyrillic", 0x0457), +("yikorean", 0x3162), +("yinyang", 0x262f), +("yiwnarmenian", 0x0582), +("ymonospace", 0xff59), +("yod", 0x05d9), +("yoddagesh", 0xfb39), +("yoddageshhebrew", 0xfb39), +("yodhebrew", 0x05d9), +("yodyodhebrew", 0x05f2), +("yodyodpatahhebrew", 0xfb1f), +("yohiragana", 0x3088), +("yoikorean", 0x3189), +("yokatakana", 0x30e8), +("yokatakanahalfwidth", 0xff96), +("yokorean", 0x315b), +("yosmallhiragana", 0x3087), +("yosmallkatakana", 0x30e7), +("yosmallkatakanahalfwidth", 0xff6e), +("yotgreek", 0x03f3), +("yoyaekorean", 0x3188), +("yoyakorean", 0x3187), +("yoyakthai", 0x0e22), +("yoyingthai", 0x0e0d), +("yparen", 0x24b4), +("ypogegrammeni", 0x037a), +("ypogegrammenigreekcmb", 0x0345), +("yr", 0x01a6), +("yring", 0x1e99), +("ysuperior", 0x02b8), +("ytilde", 0x1ef9), +("yturned", 0x028e), +("yuhiragana", 0x3086), +("yuikorean", 0x318c), +("yukatakana", 0x30e6), +("yukatakanahalfwidth", 0xff95), +("yukorean", 0x3160), +("yusbigcyrillic", 0x046b), +("yusbigiotifiedcyrillic", 0x046d), +("yuslittlecyrillic", 0x0467), +("yuslittleiotifiedcyrillic", 0x0469), +("yusmallhiragana", 0x3085), +("yusmallkatakana", 0x30e5), +("yusmallkatakanahalfwidth", 0xff6d), +("yuyekorean", 0x318b), +("yuyeokorean", 0x318a), +("yyabengali", 0x09df), +("yyadeva", 0x095f), +("z", 0x007a), +("zaarmenian", 0x0566), +("zacute", 0x017a), +("zadeva", 0x095b), +("zagurmukhi", 0x0a5b), +("zaharabic", 0x0638), +("zahfinalarabic", 0xfec6), +("zahinitialarabic", 0xfec7), +("zahiragana", 0x3056), +("zahmedialarabic", 0xfec8), +("zainarabic", 0x0632), +("zainfinalarabic", 0xfeb0), +("zakatakana", 0x30b6), +("zaqefgadolhebrew", 0x0595), +("zaqefqatanhebrew", 0x0594), +("zarqahebrew", 0x0598), +("zayin", 0x05d6), +("zayindagesh", 0xfb36), +("zayindageshhebrew", 0xfb36), +("zayinhebrew", 0x05d6), +("zbopomofo", 0x3117), +("zcaron", 0x017e), +("zcircle", 0x24e9), +("zcircumflex", 0x1e91), +("zcurl", 0x0291), +("zdot", 0x017c), +("zdotaccent", 0x017c), +("zdotbelow", 0x1e93), +("zecyrillic", 0x0437), +("zedescendercyrillic", 0x0499), +("zedieresiscyrillic", 0x04df), +("zehiragana", 0x305c), +("zekatakana", 0x30bc), +("zero", 0x0030), +("zeroarabic", 0x0660), +("zerobengali", 0x09e6), +("zerodeva", 0x0966), +("zerogujarati", 0x0ae6), +("zerogurmukhi", 0x0a66), +("zerohackarabic", 0x0660), +("zeroinferior", 0x2080), +("zeromonospace", 0xff10), +("zerooldstyle", 0xf730), +("zeropersian", 0x06f0), +("zerosuperior", 0x2070), +("zerothai", 0x0e50), +("zerowidthjoiner", 0xfeff), +("zerowidthnonjoiner", 0x200c), +("zerowidthspace", 0x200b), +("zeta", 0x03b6), +("zhbopomofo", 0x3113), +("zhearmenian", 0x056a), +("zhebrevecyrillic", 0x04c2), +("zhecyrillic", 0x0436), +("zhedescendercyrillic", 0x0497), +("zhedieresiscyrillic", 0x04dd), +("zihiragana", 0x3058), +("zikatakana", 0x30b8), +("zinorhebrew", 0x05ae), +("zlinebelow", 0x1e95), +("zmonospace", 0xff5a), +("zohiragana", 0x305e), +("zokatakana", 0x30be), +("zparen", 0x24b5), +("zretroflexhook", 0x0290), +("zstroke", 0x01b6), +("zuhiragana", 0x305a), +("zukatakana", 0x30ba) + ]; + let result = names.binary_search_by_key(&name, |&(name,_code)| &name); + result.ok().map(|indx| names[indx].1) +} diff --git a/frontend/src-tauri/patches/pdf-extract-0.12.0/src/lib.rs b/frontend/src-tauri/patches/pdf-extract-0.12.0/src/lib.rs new file mode 100644 index 00000000..32a97d8a --- /dev/null +++ b/frontend/src-tauri/patches/pdf-extract-0.12.0/src/lib.rs @@ -0,0 +1,2423 @@ +extern crate lopdf; + +use adobe_cmap_parser::{ByteMapping, CodeRange, CIDRange}; +use encoding_rs::UTF_16BE; +use lopdf::content::Content; +pub use lopdf::*; +use euclid::*; +use lopdf::encryption::DecryptionError; +use std::fmt::{Debug, Formatter}; +extern crate encoding_rs; +extern crate euclid; +extern crate adobe_cmap_parser; +extern crate type1_encoding_parser; +extern crate unicode_normalization; +use euclid::vec2; +use unicode_normalization::UnicodeNormalization; +use std::fmt; +use std::str; +use std::fs::File; +use std::slice::Iter; +use std::collections::HashMap; +use std::collections::hash_map::Entry; +use std::rc::Rc; +use std::marker::PhantomData; +use std::result::Result; +use log::{warn, error, debug}; +mod core_fonts; +mod glyphnames; +mod zapfglyphnames; +mod encodings; + +pub struct Space; +pub type Transform = Transform2D; + +#[derive(Debug)] +pub enum OutputError +{ + FormatError(std::fmt::Error), + IoError(std::io::Error), + PdfError(lopdf::Error) +} + +impl std::fmt::Display for OutputError +{ + fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), std::fmt::Error> { + match self { + OutputError::FormatError(e) => write!(f, "Formating error: {}", e), + OutputError::IoError(e) => write!(f, "IO error: {}", e), + OutputError::PdfError(e) => write!(f, "PDF error: {}", e) + } + } +} + +impl std::error::Error for OutputError{} + +impl From for OutputError { + fn from(e: std::fmt::Error) -> Self { + OutputError::FormatError(e) + } +} + +impl From for OutputError { + fn from(e: std::io::Error) -> Self { + OutputError::IoError(e) + } +} + +impl From for OutputError { + fn from(e: lopdf::Error) -> Self { + OutputError::PdfError(e) + } +} + +macro_rules! dlog { + ($($e:expr),*) => { {} } + //($($t:tt)*) => { println!($($t)*) } +} + +fn get_info(doc: &Document) -> Option<&Dictionary> { + match doc.trailer.get(b"Info") { + Ok(&Object::Reference(ref id)) => { + match doc.get_object(*id) { + Ok(&Object::Dictionary(ref info)) => { return Some(info); } + _ => {} + } + } + _ => {} + } + None +} + +fn get_catalog(doc: &Document) -> &Dictionary { + match doc.trailer.get(b"Root").unwrap() { + &Object::Reference(ref id) => { + match doc.get_object(*id) { + Ok(&Object::Dictionary(ref catalog)) => { return catalog; } + _ => {} + } + } + _ => {} + } + panic!(); +} + +fn get_pages(doc: &Document) -> &Dictionary { + let catalog = get_catalog(doc); + match catalog.get(b"Pages").unwrap() { + &Object::Reference(ref id) => { + match doc.get_object(*id) { + Ok(&Object::Dictionary(ref pages)) => { return pages; } + other => {dlog!("pages: {:?}", other)} + } + } + other => { dlog!("pages: {:?}", other)} + } + dlog!("catalog {:?}", catalog); + panic!(); +} + +#[allow(non_upper_case_globals)] +const PDFDocEncoding: &'static [u16] = &[ + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, + 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, + 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x02d8, 0x02c7, 0x02c6, + 0x02d9, 0x02dd, 0x02db, 0x02da, 0x02dc, 0x0020, 0x0021, 0x0022, 0x0023, + 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, + 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, + 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, + 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, + 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, + 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, + 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, + 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, + 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, + 0x007e, 0x0000, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x0192, + 0x2044, 0x2039, 0x203a, 0x2212, 0x2030, 0x201e, 0x201c, 0x201d, 0x2018, + 0x2019, 0x201a, 0x2122, 0xfb01, 0xfb02, 0x0141, 0x0152, 0x0160, 0x0178, + 0x017d, 0x0131, 0x0142, 0x0153, 0x0161, 0x017e, 0x0000, 0x20ac, 0x00a1, + 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00aa, + 0x00ab, 0x00ac, 0x0000, 0x00ae, 0x00af, 0x00b0, 0x00b1, 0x00b2, 0x00b3, + 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, + 0x00bd, 0x00be, 0x00bf, 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, + 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, + 0x00cf, 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, + 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, 0x00e0, + 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, + 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, 0x00f0, 0x00f1, 0x00f2, + 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, + 0x00fc, 0x00fd, 0x00fe, 0x00ff]; + +fn pdf_to_utf8(s: &[u8]) -> String { + if s.len() > 2 && s[0] == 0xfe && s[1] == 0xff { + return UTF_16BE.decode_without_bom_handling_and_without_replacement(&s[2..]).unwrap().to_string() + } else { + let r : Vec = s.iter().map(|x| *x).flat_map(|x| { + let k = PDFDocEncoding[x as usize]; + vec![(k>>8) as u8, k as u8].into_iter()}).collect(); + return UTF_16BE.decode_without_bom_handling_and_without_replacement(&r).unwrap().to_string() + } +} + +fn to_utf8(encoding: &[u16], s: &[u8]) -> String { + if s.len() > 2 && s[0] == 0xfe && s[1] == 0xff { + return UTF_16BE.decode_without_bom_handling_and_without_replacement(&s[2..]).unwrap().to_string() + } else { + let r : Vec = s.iter().map(|x| *x).flat_map(|x| { + let k = encoding[x as usize]; + vec![(k>>8) as u8, k as u8].into_iter()}).collect(); + return UTF_16BE.decode_without_bom_handling_and_without_replacement(&r).unwrap().to_string() + } +} + + +fn maybe_deref<'a>(doc: &'a Document, o: &'a Object) -> &'a Object { + match o { + &Object::Reference(r) => doc.get_object(r).expect("missing object reference"), + _ => o + } +} + +fn maybe_get_obj<'a>(doc: &'a Document, dict: &'a Dictionary, key: &[u8]) -> Option<&'a Object> { + dict.get(key).map(|o| maybe_deref(doc, o)).ok() +} + +// an intermediate trait that can be used to chain conversions that may have failed +trait FromOptObj<'a> { + fn from_opt_obj(doc: &'a Document, obj: Option<&'a Object>, key: &[u8]) -> Self; +} + +// conditionally convert to Self returns None if the conversion failed +trait FromObj<'a> where Self: std::marker::Sized { + fn from_obj(doc: &'a Document, obj: &'a Object) -> Option; +} + +impl<'a, T: FromObj<'a>> FromOptObj<'a> for Option { + fn from_opt_obj(doc: &'a Document, obj: Option<&'a Object>, _key: &[u8]) -> Self { + obj.and_then(|x| T::from_obj(doc,x)) + } +} + +impl<'a, T: FromObj<'a>> FromOptObj<'a> for T { + fn from_opt_obj(doc: &'a Document, obj: Option<&'a Object>, key: &[u8]) -> Self { + T::from_obj(doc, obj.expect(&String::from_utf8_lossy(key))).expect("wrong type") + } +} + +// we follow the same conventions as pdfium for when to support indirect objects: +// on arrays, streams and dicts +impl<'a, T: FromObj<'a>> FromObj<'a> for Vec { + fn from_obj(doc: &'a Document, obj: &'a Object) -> Option { + maybe_deref(doc, obj).as_array().map(|x| x.iter() + .map(|x| T::from_obj(doc, x).expect("wrong type")) + .collect()).ok() + } +} + +// XXX: These will panic if we don't have the right number of items +// we don't want to do that +impl<'a, T: FromObj<'a>> FromObj<'a> for [T; 4] { + fn from_obj(doc: &'a Document, obj: &'a Object) -> Option { + maybe_deref(doc, obj).as_array().map(|x| { + let mut all = x.iter() + .map(|x| T::from_obj(doc, x).expect("wrong type")); + [all.next().unwrap(), all.next().unwrap(), all.next().unwrap(), all.next().unwrap()] + }).ok() + } +} + +impl<'a, T: FromObj<'a>> FromObj<'a> for [T; 3] { + fn from_obj(doc: &'a Document, obj: &'a Object) -> Option { + maybe_deref(doc, obj).as_array().map(|x| { + let mut all = x.iter() + .map(|x| T::from_obj(doc, x).expect("wrong type")); + [all.next().unwrap(), all.next().unwrap(), all.next().unwrap()] + }).ok() + } +} + +impl<'a> FromObj<'a> for f64 { + fn from_obj(_doc: &Document, obj: &Object) -> Option { + match obj { + &Object::Integer(i) => Some(i as f64), + &Object::Real(f) => Some(f.into()), + _ => None + } + } +} + +impl<'a> FromObj<'a> for i64 { + fn from_obj(_doc: &Document, obj: &Object) -> Option { + match obj { + &Object::Integer(i) => Some(i), + _ => None + } + } +} + +impl<'a> FromObj<'a> for &'a Dictionary { + fn from_obj(doc: &'a Document, obj: &'a Object) -> Option<&'a Dictionary> { + maybe_deref(doc, obj).as_dict().ok() + } +} + +impl<'a> FromObj<'a> for &'a Stream { + fn from_obj(doc: &'a Document, obj: &'a Object) -> Option<&'a Stream> { + maybe_deref(doc, obj).as_stream().ok() + } +} + +impl<'a> FromObj<'a> for &'a Object { + fn from_obj(doc: &'a Document, obj: &'a Object) -> Option<&'a Object> { + Some(maybe_deref(doc, obj)) + } +} + +fn get<'a, T: FromOptObj<'a>>(doc: &'a Document, dict: &'a Dictionary, key: &[u8]) -> T { + T::from_opt_obj(doc, dict.get(key).ok(), key) +} + +fn maybe_get<'a, T: FromObj<'a>>(doc: &'a Document, dict: &'a Dictionary, key: &[u8]) -> Option { + maybe_get_obj(doc, dict, key).and_then(|o| T::from_obj(doc, o)) +} + +fn get_name_string<'a>(doc: &'a Document, dict: &'a Dictionary, key: &[u8]) -> String { + pdf_to_utf8(dict.get(key).map(|o| maybe_deref(doc, o)).unwrap_or_else(|_| panic!("deref")).as_name().expect("name")) +} + +#[allow(dead_code)] +fn maybe_get_name_string<'a>(doc: &'a Document, dict: &'a Dictionary, key: &[u8]) -> Option { + maybe_get_obj(doc, dict, key).and_then(|n| n.as_name().ok()).map(|n| pdf_to_utf8(n)) +} + +fn maybe_get_name<'a>(doc: &'a Document, dict: &'a Dictionary, key: &[u8]) -> Option<&'a [u8]> { + maybe_get_obj(doc, dict, key).and_then(|n| n.as_name().ok()) +} + +fn maybe_get_array<'a>(doc: &'a Document, dict: &'a Dictionary, key: &[u8]) -> Option<&'a Vec> { + maybe_get_obj(doc, dict, key).and_then(|n| n.as_array().ok()) +} + +#[derive(Clone)] +struct PdfSimpleFont<'a> { + font: &'a Dictionary, + doc: &'a Document, + encoding: Option>, + unicode_map: Option>, + widths: HashMap, // should probably just use i32 here + missing_width: f64, +} + +#[derive(Clone)] +struct PdfType3Font<'a> { + font: &'a Dictionary, + doc: &'a Document, + encoding: Option>, + unicode_map: Option>, + widths: HashMap, // should probably just use i32 here +} + + +fn make_font<'a>(doc: &'a Document, font: &'a Dictionary) -> Rc { + let subtype = get_name_string(doc, font, b"Subtype"); + dlog!("MakeFont({})", subtype); + if subtype == "Type0" { + Rc::new(PdfCIDFont::new(doc, font)) + } else if subtype == "Type3" { + Rc::new(PdfType3Font::new(doc, font)) + } else { + Rc::new(PdfSimpleFont::new(doc, font)) + } +} + +fn is_core_font(name: &str) -> bool { + match name { + "Courier-Bold" | + "Courier-BoldOblique" | + "Courier-Oblique" | + "Courier" | + "Helvetica-Bold" | + "Helvetica-BoldOblique" | + "Helvetica-Oblique" | + "Helvetica" | + "Symbol" | + "Times-Bold" | + "Times-BoldItalic" | + "Times-Italic" | + "Times-Roman" | + "ZapfDingbats" => true, + _ => false, + } +} + +fn encoding_to_unicode_table(name: &[u8]) -> Vec { + let encoding = match &name[..] { + b"MacRomanEncoding" => encodings::MAC_ROMAN_ENCODING, + b"MacExpertEncoding" => encodings::MAC_EXPERT_ENCODING, + b"WinAnsiEncoding" => encodings::WIN_ANSI_ENCODING, + _ => panic!("unexpected encoding {:?}", pdf_to_utf8(name)) + }; + let encoding_table = encoding.iter() + .map(|x| if let &Some(x) = x { glyphnames::name_to_unicode(x).unwrap() } else { 0 }) + .collect(); + encoding_table +} + +/* "Glyphs in the font are selected by single-byte character codes obtained from a string that + is shown by the text-showing operators. Logically, these codes index into a table of 256 + glyphs; the mapping from codes to glyphs is called the font’s encoding. Each font program + has a built-in encoding. Under some circumstances, the encoding can be altered by means + described in Section 5.5.5, “Character Encoding.” +*/ +impl<'a> PdfSimpleFont<'a> { + fn new(doc: &'a Document, font: &'a Dictionary) -> PdfSimpleFont<'a> { + let base_name = get_name_string(doc, font, b"BaseFont"); + let subtype = get_name_string(doc, font, b"Subtype"); + + let encoding: Option<&Object> = get(doc, font, b"Encoding"); + dlog!("base_name {} {} enc:{:?} {:?}", base_name, subtype, encoding, font); + let descriptor: Option<&Dictionary> = get(doc, font, b"FontDescriptor"); + let mut type1_encoding = None; + let mut unicode_map = None; + if let Some(descriptor) = descriptor { + dlog!("descriptor {:?}", descriptor); + if subtype == "Type1" { + let file = maybe_get_obj(doc, descriptor, b"FontFile"); + match file { + Some(&Object::Stream(ref s)) => { + let s = get_contents(s); + //dlog!("font contents {:?}", pdf_to_utf8(&s)); + type1_encoding = Some(type1_encoding_parser::get_encoding_map(&s).expect("encoding")); + } + _ => { dlog!("font file {:?}", file) } + } + } else if subtype == "TrueType" { + let file = maybe_get_obj(doc, descriptor, b"FontFile2"); + match file { + Some(&Object::Stream(ref s)) => { + let _s = get_contents(s); + //File::create(format!("/tmp/{}", base_name)).unwrap().write_all(&s); + } + _ => { dlog!("font file {:?}", file) } + } + } + + let font_file3 = get::>(doc, descriptor, b"FontFile3"); + match font_file3 { + Some(&Object::Stream(ref s)) => { + let subtype = get_name_string(doc, &s.dict, b"Subtype"); + dlog!("font file {}, {:?}", subtype, s); + let s = get_contents(s); + if subtype == "Type1C" { + let table = cff_parser::Table::parse(&s).unwrap(); + //use std::io::Write; + //File::create(format!("/tmp/{}", base_name)).unwrap().write_all(&s); + + let encoding = table.encoding.get_code_to_sid_table(&table.charset); + + let mapping: HashMap = encoding.into_iter().filter_map(|(cid, sid)| { + let name = cff_parser::string_by_id(&table, sid).unwrap(); + if name == ".notdef" { + return None; + } + let unicode = glyphnames::name_to_unicode(&name).or_else(|| { + zapfglyphnames::zapfdigbats_names_to_unicode(name) + }); + if unicode.is_none() { + warn!("Couldn't find unicode for {}", name); + return None; + } + let str = String::from_utf16(&[unicode.unwrap()]).unwrap(); + Some((cid as u32, str)) + }).collect(); + unicode_map = Some(mapping); + } + + // + //File::create(format!("/tmp/{}", base_name)).unwrap().write_all(&s); + } + None => {} + _ => { dlog!("unexpected") } + } + + let charset = maybe_get_obj(doc, descriptor, b"CharSet"); + let _charset = match charset { + Some(&Object::String(ref s, _)) => { Some(pdf_to_utf8(&s)) } + _ => { None } + }; + //dlog!("charset {:?}", charset); + } + + // The PDF Encoding entry defines character codes in content streams; + // an embedded CFF font's built-in encoding is only a fallback. + if encoding.is_some() { + unicode_map = None; + } + + let mut unicode_map = match unicode_map { + Some(mut unicode_map) => { + unicode_map.extend(get_unicode_map(doc, font).unwrap_or(HashMap::new())); + Some(unicode_map) + } + None => { + get_unicode_map(doc, font) + } + }; + + + let mut encoding_table = None; + match encoding { + Some(&Object::Name(ref encoding_name)) => { + dlog!("encoding {:?}", pdf_to_utf8(encoding_name)); + encoding_table = Some(encoding_to_unicode_table(encoding_name)); + } + Some(&Object::Dictionary(ref encoding)) => { + //dlog!("Encoding {:?}", encoding); + let mut table = if let Some(base_encoding) = maybe_get_name(doc, encoding, b"BaseEncoding") { + dlog!("BaseEncoding {:?}", base_encoding); + encoding_to_unicode_table(base_encoding) + } else { + Vec::from(PDFDocEncoding) + }; + let differences = maybe_get_array(doc, encoding, b"Differences"); + if let Some(differences) = differences { + dlog!("Differences"); + let mut code = 0; + for o in differences { + let o = maybe_deref(doc, o); + match o { + &Object::Integer(i) => { code = i; }, + &Object::Name(ref n) => { + let name = pdf_to_utf8(&n); + // XXX: names of Type1 fonts can map to arbitrary strings instead of real + // unicode names, so we should probably handle this differently + let unicode = glyphnames::name_to_unicode(&name); + if let Some(unicode) = unicode{ + table[code as usize] = unicode; + if let Some(ref mut unicode_map) = unicode_map { + let be = [unicode]; + match unicode_map.entry(code as u32) { + // If there's a unicode table entry missing use one based on the name + Entry::Vacant(v) => { v.insert(String::from_utf16(&be).unwrap()); } + Entry::Occupied(e) => { + if e.get() != &String::from_utf16(&be).unwrap() { + let normal_match = e.get().nfkc().eq(String::from_utf16(&be).unwrap().nfkc()); + if !normal_match { + warn!("Unicode mismatch {} {} {:?} {:?} {:?}", normal_match, name, e.get(), String::from_utf16(&be), be); + } + } + } + } + } + } else { + match unicode_map { + Some(ref mut unicode_map) if base_name.contains("FontAwesome") => { + // the fontawesome tex package will use glyph names that don't have a corresponding unicode + // code point, so we'll use an empty string instead. See issue #76 + match unicode_map.entry(code as u32) { + Entry::Vacant(v) => { v.insert("".to_owned()); } + Entry::Occupied(e) => { + panic!("unexpected entry in unicode map") + } + } + } + _ => { + warn!("unknown glyph name '{}' for font {}", name, base_name); + } + } + } + dlog!("{} = {} ({:?})", code, name, unicode); + if let Some(ref mut unicode_map) = unicode_map { + // The unicode map might not have the code in it, but the code might + // not be used so we don't want to panic here. + // An example of this is the 'suppress' character in the TeX Latin Modern font. + // This shows up in https://arxiv.org/pdf/2405.01295v1.pdf + dlog!("{} {:?}", code, unicode_map.get(&(code as u32))); + } + code += 1; + } + _ => { panic!("wrong type {:?}", o); } + } + } + } + // "Type" is optional + let name = encoding.get(b"Type").and_then(|x| x.as_name()).and_then(|x| Ok(pdf_to_utf8(x))); + dlog!("name: {}", name); + + encoding_table = Some(table); + } + None => { + if let Some(type1_encoding) = type1_encoding { + let mut table = Vec::from(PDFDocEncoding); + dlog!("type1encoding"); + for (code, name) in type1_encoding { + let unicode = glyphnames::name_to_unicode(&pdf_to_utf8(&name)); + if let Some(unicode) = unicode { + table[code as usize] = unicode; + } else { + dlog!("unknown character {}", pdf_to_utf8(&name)); + } + } + encoding_table = Some(table) + } else if subtype == "TrueType" { + encoding_table = Some(encodings::WIN_ANSI_ENCODING.iter() + .map(|x| if let &Some(x) = x { glyphnames::name_to_unicode(x).unwrap() } else { 0 }) + .collect()); + } + } + _ => { panic!() } + } + + let mut width_map = HashMap::new(); + /* "Ordinarily, a font dictionary that refers to one of the standard fonts + should omit the FirstChar, LastChar, Widths, and FontDescriptor entries. + However, it is permissible to override a standard font by including these + entries and embedding the font program in the PDF file." + + Note: some PDFs include a descriptor but still don't include these entries */ + + // If we have widths prefer them over the core font widths. Needed for https://dkp.de/wp-content/uploads/parteitage/Sozialismusvorstellungen-der-DKP.pdf + if let (Some(first_char), Some(last_char), Some(widths)) = (maybe_get::(doc, font, b"FirstChar"), maybe_get::(doc, font, b"LastChar"), maybe_get::>(doc, font, b"Widths")) { + // Some PDF's don't have these like fips-197.pdf + let mut i: i64 = 0; + dlog!("first_char {:?}, last_char: {:?}, widths: {} {:?}", first_char, last_char, widths.len(), widths); + + for w in widths { + width_map.insert((first_char + i) as CharCode, w); + i += 1; + } + assert_eq!(first_char + i - 1, last_char); + } else { + let name = if is_core_font(&base_name) { + &base_name + } else { + warn!("no widths and not core font {:?}", base_name); + + // This situation is handled differently by different readers + // but basically we try to substitute the best font that we can. + + // Poppler/Xpdf: + // this is technically an error -- the Widths entry is required + // for all but the Base-14 fonts -- but certain PDF generators + // apparently don't include widths for Arial and TimesNewRoman + + // Pdfium: CFX_FontMapper::FindSubstFont + + // mupdf: pdf_load_substitute_font + + // We can try to do a better job guessing at a font by looking at the flags + // or the basename but for now we'll just use Helvetica + "Helvetica" + }; + for font_metrics in core_fonts::metrics().iter() { + if font_metrics.0 == base_name { + if let Some(ref encoding) = encoding_table { + dlog!("has encoding"); + for w in font_metrics.2 { + let c = glyphnames::name_to_unicode(w.2).unwrap(); + for i in 0..encoding.len() { + if encoding[i] == c { + width_map.insert(i as CharCode, w.1 as f64); + } + } + } + } else { + // Instead of using the encoding from the core font we'll just look up all + // of the character names. We should probably verify that this produces the + // same result. + + let mut table = vec![0; 256]; + for w in font_metrics.2 { + dlog!("{} {}", w.0, w.2); + // -1 is "not encoded" + if w.0 != -1 { + table[w.0 as usize] = if base_name == "ZapfDingbats" { + zapfglyphnames::zapfdigbats_names_to_unicode(w.2).unwrap_or_else(|| panic!("bad name {:?}", w)) + } else { + glyphnames::name_to_unicode(w.2).unwrap() + } + } + } + + let encoding = &table[..]; + for w in font_metrics.2 { + width_map.insert(w.0 as CharCode, w.1 as f64); + // -1 is "not encoded" + } + encoding_table = Some(encoding.to_vec()); + } + /* "Ordinarily, a font dictionary that refers to one of the standard fonts + should omit the FirstChar, LastChar, Widths, and FontDescriptor entries. + However, it is permissible to override a standard font by including these + entries and embedding the font program in the PDF file." + + Note: some PDFs include a descriptor but still don't include these entries */ + // assert!(maybe_get_obj(doc, font, b"FirstChar").is_none()); + // assert!(maybe_get_obj(doc, font, b"LastChar").is_none()); + // assert!(maybe_get_obj(doc, font, b"Widths").is_none()); + } + } + } + + let missing_width = get::>(doc, font, b"MissingWidth").unwrap_or(0.); + PdfSimpleFont {doc, font, widths: width_map, encoding: encoding_table, missing_width, unicode_map} + } + + #[allow(dead_code)] + fn get_type(&self) -> String { + get_name_string(self.doc, self.font, b"Type") + } + #[allow(dead_code)] + fn get_basefont(&self) -> String { + get_name_string(self.doc, self.font, b"BaseFont") + } + #[allow(dead_code)] + fn get_subtype(&self) -> String { + get_name_string(self.doc, self.font, b"Subtype") + } + #[allow(dead_code)] + fn get_widths(&self) -> Option<&Vec> { + maybe_get_obj(self.doc, self.font, b"Widths").map(|widths| widths.as_array().expect("Widths should be an array")) + } + /* For type1: This entry is obsolescent and its use is no longer recommended. (See + * implementation note 42 in Appendix H.) */ + #[allow(dead_code)] + fn get_name(&self) -> Option { + maybe_get_name_string(self.doc, self.font, b"Name") + } + + #[allow(dead_code)] + fn get_descriptor(&self) -> Option { + maybe_get_obj(self.doc, self.font, b"FontDescriptor").and_then(|desc| desc.as_dict().ok()).map(|desc| PdfFontDescriptor{desc: desc, doc: self.doc}) + } +} + + + +impl<'a> PdfType3Font<'a> { + fn new(doc: &'a Document, font: &'a Dictionary) -> PdfType3Font<'a> { + + let unicode_map = get_unicode_map(doc, font); + let encoding: Option<&Object> = get(doc, font, b"Encoding"); + + let encoding_table; + match encoding { + Some(&Object::Name(ref encoding_name)) => { + dlog!("encoding {:?}", pdf_to_utf8(encoding_name)); + encoding_table = Some(encoding_to_unicode_table(encoding_name)); + } + Some(&Object::Dictionary(ref encoding)) => { + //dlog!("Encoding {:?}", encoding); + let mut table = if let Some(base_encoding) = maybe_get_name(doc, encoding, b"BaseEncoding") { + dlog!("BaseEncoding {:?}", base_encoding); + encoding_to_unicode_table(base_encoding) + } else { + Vec::from(PDFDocEncoding) + }; + let differences = maybe_get_array(doc, encoding, b"Differences"); + if let Some(differences) = differences { + dlog!("Differences"); + let mut code = 0; + for o in differences { + match o { + &Object::Integer(i) => { code = i; }, + &Object::Name(ref n) => { + let name = pdf_to_utf8(&n); + // XXX: names of Type1 fonts can map to arbitrary strings instead of real + // unicode names, so we should probably handle this differently + let unicode = glyphnames::name_to_unicode(&name); + if let Some(unicode) = unicode{ + table[code as usize] = unicode; + } + dlog!("{} = {} ({:?})", code, name, unicode); + if let Some(ref unicode_map) = unicode_map { + dlog!("{} {:?}", code, unicode_map.get(&(code as u32))); + } + code += 1; + } + _ => { panic!("wrong type"); } + } + } + } + let name_encoded = encoding.get(b"Type"); + if let Ok(Object::Name(name)) = name_encoded { + dlog!("name: {}", pdf_to_utf8(name)); + } else { + dlog!("name not found"); + } + + encoding_table = Some(table); + } + _ => { panic!() } + } + + let first_char: i64 = get(doc, font, b"FirstChar"); + let last_char: i64 = get(doc, font, b"LastChar"); + let widths: Vec = get(doc, font, b"Widths"); + + let mut width_map = HashMap::new(); + + let mut i = 0; + dlog!("first_char {:?}, last_char: {:?}, widths: {} {:?}", first_char, last_char, widths.len(), widths); + + for w in widths { + width_map.insert((first_char + i) as CharCode, w); + i += 1; + } + assert_eq!(first_char + i - 1, last_char); + PdfType3Font {doc, font, widths: width_map, encoding: encoding_table, unicode_map} + } +} + +type CharCode = u32; + +struct PdfFontIter<'a> +{ + i: Iter<'a, u8>, + font: &'a dyn PdfFont, +} + +impl<'a> Iterator for PdfFontIter<'a> { + type Item = (CharCode, u8); + fn next(&mut self) -> Option<(CharCode, u8)> { + self.font.next_char(&mut self.i) + } +} + +trait PdfFont : Debug { + fn get_width(&self, id: CharCode) -> f64; + fn next_char(&self, iter: &mut Iter) -> Option<(CharCode, u8)>; + fn decode_char(&self, char: CharCode) -> String; + + /*fn char_codes<'a>(&'a self, chars: &'a [u8]) -> PdfFontIter { + let p = self; + PdfFontIter{i: chars.iter(), font: p as &PdfFont} + }*/ + +} + +impl<'a> dyn PdfFont + 'a { + fn char_codes(&'a self, chars: &'a [u8]) -> PdfFontIter { + PdfFontIter{i: chars.iter(), font: self} + } + fn decode(&self, chars: &[u8]) -> String { + let strings = self.char_codes(chars).map(|x| self.decode_char(x.0)).collect::>(); + strings.join("") + } + +} + + +impl<'a> PdfFont for PdfSimpleFont<'a> { + fn get_width(&self, id: CharCode) -> f64 { + let width = self.widths.get(&id); + if let Some(width) = width { + return *width; + } else { + let mut widths = self.widths.iter().collect::>(); + widths.sort_by_key(|x| x.0); + dlog!("missing width for {} len(widths) = {}, {:?} falling back to missing_width {:?}", id, self.widths.len(), widths, self.font); + return self.missing_width; + } + } + /*fn decode(&self, chars: &[u8]) -> String { + let encoding = self.encoding.as_ref().map(|x| &x[..]).unwrap_or(&PDFDocEncoding); + to_utf8(encoding, chars) + }*/ + + fn next_char(&self, iter: &mut Iter) -> Option<(CharCode, u8)> { + iter.next().map(|x| (*x as CharCode, 1)) + } + fn decode_char(&self, char: CharCode) -> String { + let slice = [char as u8]; + if let Some(ref unicode_map) = self.unicode_map { + let s = unicode_map.get(&char); + let s = match s { + None => { + debug!("missing char {:?} in unicode map {:?} for {:?}", char, unicode_map, self.font); + // some pdf's like http://arxiv.org/pdf/2312.00064v1 are missing entries in their unicode map but do have + // entries in the encoding. + let encoding = self.encoding.as_ref().map(|x| &x[..]).expect("missing unicode map and encoding"); + let s = to_utf8(encoding, &slice); + debug!("falling back to encoding {} -> {:?}", char, s); + s + } + Some(s) => { s.clone() } + }; + return s + } + let encoding = self.encoding.as_ref().map(|x| &x[..]).unwrap_or(&PDFDocEncoding); + //dlog!("char_code {:?} {:?}", char, self.encoding); + let s = to_utf8(encoding, &slice); + s + } +} + + + +impl<'a> fmt::Debug for PdfSimpleFont<'a> { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + self.font.fmt(f) + } +} + +impl<'a> PdfFont for PdfType3Font<'a> { + fn get_width(&self, id: CharCode) -> f64 { + let width = self.widths.get(&id); + if let Some(width) = width { + return *width; + } else { + panic!("missing width for {} {:?}", id, self.font); + } + } + /*fn decode(&self, chars: &[u8]) -> String { + let encoding = self.encoding.as_ref().map(|x| &x[..]).unwrap_or(&PDFDocEncoding); + to_utf8(encoding, chars) + }*/ + + fn next_char(&self, iter: &mut Iter) -> Option<(CharCode, u8)> { + iter.next().map(|x| (*x as CharCode, 1)) + } + fn decode_char(&self, char: CharCode) -> String { + let slice = [char as u8]; + if let Some(ref unicode_map) = self.unicode_map { + let s = unicode_map.get(&char); + let s = match s { + None => { + debug!("missing char {:?} in unicode map {:?} for {:?}", char, unicode_map, self.font); + // some pdf's like http://arxiv.org/pdf/2312.00577v1 are missing entries in their unicode map but do have + // entries in the encoding. + let encoding = self.encoding.as_ref().map(|x| &x[..]).expect("missing unicode map and encoding"); + let s = to_utf8(encoding, &slice); + debug!("falling back to encoding {} -> {:?}", char, s); + s + } + Some(s) => { s.clone() } + }; + return s + } + let encoding = self.encoding.as_ref().map(|x| &x[..]).unwrap_or(&PDFDocEncoding); + //dlog!("char_code {:?} {:?}", char, self.encoding); + let s = to_utf8(encoding, &slice); + s + } +} + + + +impl<'a> fmt::Debug for PdfType3Font<'a> { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + self.font.fmt(f) + } +} + +struct PdfCIDFont<'a> { + font: &'a Dictionary, + #[allow(dead_code)] + doc: &'a Document, + #[allow(dead_code)] + encoding: ByteMapping, + to_unicode: Option>, + widths: HashMap, // should probably just use i32 here + default_width: Option, // only used for CID fonts and we should probably brake out the different font types +} + +fn get_unicode_map<'a>(doc: &'a Document, font: &'a Dictionary) -> Option> { + let to_unicode = maybe_get_obj(doc, font, b"ToUnicode"); + dlog!("ToUnicode: {:?}", to_unicode); + let mut unicode_map = None; + match to_unicode { + Some(&Object::Stream(ref stream)) => { + let contents = get_contents(stream); + dlog!("Stream: {}", String::from_utf8(contents.clone()).unwrap()); + + let cmap = adobe_cmap_parser::get_unicode_map(&contents).unwrap(); + let mut unicode = HashMap::new(); + // "It must use the beginbfchar, endbfchar, beginbfrange, and endbfrange operators to + // define the mapping from character codes to Unicode character sequences expressed in + // UTF-16BE encoding." + for (&k, v) in cmap.iter() { + let mut be: Vec = Vec::new(); + let mut i = 0; + assert!(v.len() % 2 == 0); + while i < v.len() { + be.push(((v[i] as u16) << 8) | v[i+1] as u16); + i += 2; + } + match &be[..] { + [0xd800 ..= 0xdfff] => { + // this range is not specified as not being encoded + // we ignore them so we don't an error from from_utt16 + continue; + } + _ => {} + } + let s = String::from_utf16(&be).unwrap(); + + unicode.insert(k, s); + } + unicode_map = Some(unicode); + + dlog!("map: {:?}", unicode_map); + } + None => { } + Some(&Object::Name(ref name)) => { + let name = pdf_to_utf8(name); + if name != "Identity-H" { + todo!("unsupported ToUnicode name: {:?}", name); + } + } + _ => { panic!("unsupported cmap {:?}", to_unicode)} + } + unicode_map +} + + +impl<'a> PdfCIDFont<'a> { + fn new(doc: &'a Document, font: &'a Dictionary) -> PdfCIDFont<'a> { + let base_name = get_name_string(doc, font, b"BaseFont"); + let descendants = maybe_get_array(doc, font, b"DescendantFonts").expect("Descendant fonts required"); + let ciddict = maybe_deref(doc, &descendants[0]).as_dict().expect("should be CID dict"); + let encoding = maybe_get_obj(doc, font, b"Encoding").expect("Encoding required in type0 fonts"); + dlog!("base_name {} {:?}", base_name, font); + + let encoding = match encoding { + &Object::Name(ref name) => { + let name = pdf_to_utf8(name); + dlog!("encoding {:?}", name); + if name == "Identity-H" || name == "Identity-V" { + ByteMapping { codespace: vec![CodeRange{width: 2, start: 0, end: 0xffff }], cid: vec![CIDRange{ src_code_lo: 0, src_code_hi: 0xffff, dst_CID_lo: 0 }]} + } else { + panic!("unsupported encoding {}", name); + } + } + &Object::Stream(ref stream) => { + let contents = get_contents(stream); + dlog!("Stream: {}", String::from_utf8(contents.clone()).unwrap()); + adobe_cmap_parser::get_byte_mapping(&contents).unwrap() + } + _ => { panic!("unsupported encoding {:?}", encoding)} + }; + + // Sometimes a Type0 font might refer to the same underlying data as regular font. In this case we may be able to extract some encoding + // data. + // We should also look inside the truetype data to see if there's a cmap table. It will help us convert as well. + // This won't work if the cmap has been subsetted. A better approach might be to hash glyph contents and use that against + // a global library of glyph hashes + let unicode_map = get_unicode_map(doc, font); + + dlog!("descendents {:?} {:?}", descendants, ciddict); + + let font_dict = maybe_get_obj(doc, ciddict, b"FontDescriptor").expect("required"); + dlog!("{:?}", font_dict); + let _f = font_dict.as_dict().expect("must be dict"); + let default_width = get::>(doc, ciddict, b"DW").unwrap_or(1000); + let w: Option> = get(doc, ciddict, b"W"); + dlog!("widths {:?}", w); + let mut widths = HashMap::new(); + let mut i = 0; + if let Some(w) = w { + while i < w.len() { + if let &Object::Array(ref wa) = w[i+1] { + let cid = w[i].as_i64().expect("id should be num"); + let mut j = 0; + dlog!("wa: {:?} -> {:?}", cid, wa); + for w in wa { + widths.insert((cid + j) as CharCode, as_num(w) ); + j += 1; + } + i += 2; + } else { + let c_first = w[i].as_i64().expect("first should be num"); + let c_last = w[i].as_i64().expect("last should be num"); + let c_width = as_num(&w[i]); + for id in c_first..c_last { + widths.insert(id as CharCode, c_width); + } + i += 3; + } + } + } + PdfCIDFont{doc, font, widths, to_unicode: unicode_map, encoding, default_width: Some(default_width as f64) } + } +} + +impl<'a> PdfFont for PdfCIDFont<'a> { + fn get_width(&self, id: CharCode) -> f64 { + let width = self.widths.get(&id); + if let Some(width) = width { + dlog!("GetWidth {} -> {}", id, *width); + return *width; + } else { + dlog!("missing width for {} falling back to default_width", id); + return self.default_width.unwrap(); + } + }/* + fn decode(&self, chars: &[u8]) -> String { + self.char_codes(chars); + + //let utf16 = Vec::new(); + + let encoding = self.encoding.as_ref().map(|x| &x[..]).unwrap_or(&PDFDocEncoding); + to_utf8(encoding, chars) + }*/ + + fn next_char(&self, iter: &mut Iter) -> Option<(CharCode, u8)> { + let mut c = *iter.next()? as u32; + let mut code = None; + 'outer: for width in 1..=4 { + for range in &self.encoding.codespace { + if c as u32 >= range.start && c as u32 <= range.end && range.width == width { + code = Some((c as u32, width)); + break 'outer; + } + } + let next = *iter.next()?; + c = ((c as u32) << 8) | next as u32; + } + let code = code?; + for range in &self.encoding.cid { + if code.0 >= range.src_code_lo && code.0 <= range.src_code_hi { + return Some((code.0 + range.dst_CID_lo, code.1 as u8)); + } + } + None + } + fn decode_char(&self, char: CharCode) -> String { + let s = self.to_unicode.as_ref().and_then(|x| x.get(&char)); + if let Some(s) = s { + s.clone() + } else { + dlog!("Unknown character {:?} in {:?} {:?}", char, self.font, self.to_unicode); + "".to_string() + } + } +} + +impl<'a> fmt::Debug for PdfCIDFont<'a> { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + self.font.fmt(f) + } +} + + + +#[derive(Copy, Clone)] +struct PdfFontDescriptor<'a> { + desc: &'a Dictionary, + doc: &'a Document +} + +impl<'a> PdfFontDescriptor<'a> { + #[allow(dead_code)] + fn get_file(&self) -> Option<&'a Object> { + maybe_get_obj(self.doc, self.desc, b"FontFile") + } +} + +impl<'a> fmt::Debug for PdfFontDescriptor<'a> { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + self.desc.fmt(f) + } +} + +#[derive(Clone, Debug)] +struct Type0Func { + domain: Vec, + range: Vec, + contents: Vec, + size: Vec, + bits_per_sample: i64, + encode: Vec, + decode: Vec, +} + +#[allow(dead_code)] +fn interpolate(x: f64, x_min: f64, _x_max: f64, y_min: f64, y_max: f64) -> f64 { + let divisor = x - x_min; + if divisor != 0. { + y_min + (x - x_min) * ((y_max - y_min) / divisor) + } else { + // (x - x_min) will be 0 which means we want to discard the interpolation + // and arbitrarily choose y_min to match pdfium + y_min + } +} + +impl Type0Func { + #[allow(dead_code)] + fn eval(&self, _input: &[f64], _output: &mut [f64]) { + let _n_inputs = self.domain.len() / 2; + let _n_ouputs = self.range.len() / 2; + + } +} + +#[derive(Clone, Debug)] +struct Type2Func { + c0: Option>, + c1: Option>, + n: f64, +} + +#[derive(Clone, Debug)] +enum Function { + Type0(Type0Func), + Type2(Type2Func), + #[allow(dead_code)] + Type3, + #[allow(dead_code)] + Type4(Vec) +} + +impl Function { + fn new(doc: &Document, obj: &Object) -> Function { + let dict = match obj { + &Object::Dictionary(ref dict) => dict, + &Object::Stream(ref stream) => &stream.dict, + _ => panic!() + }; + let function_type: i64 = get(doc, dict, b"FunctionType"); + let f = match function_type { + 0 => { + // Sampled function + let stream = match obj { + &Object::Stream(ref stream) => stream, + _ => panic!() + }; + let range: Vec = get(doc, dict, b"Range"); + let domain: Vec = get(doc, dict, b"Domain"); + let contents = get_contents(stream); + let size: Vec = get(doc, dict, b"Size"); + let bits_per_sample = get(doc, dict, b"BitsPerSample"); + // We ignore 'Order' like pdfium, poppler and pdf.js + + let encode = get::>>(doc, dict, b"Encode"); + // maybe there's some better way to write this. + let encode = encode.unwrap_or_else(|| { + let mut default = Vec::new(); + for i in &size { + default.extend([0., (i - 1) as f64].iter()); + } + default + }); + let decode = get::>>(doc, dict, b"Decode").unwrap_or_else(|| range.clone()); + + Function::Type0(Type0Func { domain, range, size, contents, bits_per_sample, encode, decode }) + } + 2 => { + // Exponential interpolation function + let c0 = get::>>(doc, dict, b"C0"); + let c1 = get::>>(doc, dict, b"C1"); + let n = get::(doc, dict, b"N"); + Function::Type2(Type2Func { c0, c1, n}) + } + 3 => { + // Stitching function + Function::Type3 + } + 4 => { + // PostScript calculator function + let contents = match obj { + &Object::Stream(ref stream) => { + let contents = get_contents(stream); + warn!("unhandled type-4 function"); + contents + } + _ => { panic!("type 4 functions should be streams") } + }; + Function::Type4(contents) + } + _ => { panic!("unhandled function type {}", function_type) } + }; + f + } +} + +fn as_num(o: &Object) -> f64 { + match o { + &Object::Integer(i) => { i as f64 } + &Object::Real(f) => { f.into() } + _ => { panic!("not a number") } + } +} + +#[derive(Clone)] +struct TextState<'a> +{ + font: Option>, + font_size: f64, + character_spacing: f64, + word_spacing: f64, + horizontal_scaling: f64, + leading: f64, + rise: f64, + tm: Transform, +} + +// XXX: We'd ideally implement this without having to copy the uncompressed data +fn get_contents(contents: &Stream) -> Vec { + if contents.filters().is_ok() { + contents.decompressed_content().unwrap_or_else(|_|contents.content.clone()) + } else { + contents.content.clone() + } +} + +#[derive(Clone)] +struct GraphicsState<'a> +{ + ctm: Transform, + ts: TextState<'a>, + smask: Option, + fill_colorspace: ColorSpace, + fill_color: Vec, + stroke_colorspace: ColorSpace, + stroke_color: Vec, + line_width: f64, +} + +fn show_text(gs: &mut GraphicsState, s: &[u8], + _tlm: &Transform, + _flip_ctm: &Transform, + output: &mut dyn OutputDev) -> Result<(), OutputError> { + let ts = &mut gs.ts; + let font = ts.font.as_ref().unwrap(); + //let encoding = font.encoding.as_ref().map(|x| &x[..]).unwrap_or(&PDFDocEncoding); + dlog!("{:?}", font.decode(s)); + dlog!("{:?}", font.decode(s).as_bytes()); + dlog!("{:?}", s); + output.begin_word()?; + + for (c, length) in font.char_codes(s) { + // 5.3.3 Text Space Details + let tsm = Transform2D::row_major(ts.horizontal_scaling, + 0., + 0., + 1.0, + 0., + ts.rise); + // Trm = Tsm × Tm × CTM + let trm = tsm.post_transform(&ts.tm.post_transform(&gs.ctm)); + //dlog!("ctm: {:?} tm {:?}", gs.ctm, tm); + //dlog!("current pos: {:?}", position); + // 5.9 Extraction of Text Content + + + //dlog!("w: {}", font.widths[&(*c as i64)]); + let w0 = font.get_width(c) / 1000.; + + let mut spacing = ts.character_spacing; + // "Word spacing is applied to every occurrence of the single-byte character code 32 in a + // string when using a simple font or a composite font that defines code 32 as a + // single-byte code. It does not apply to occurrences of the byte value 32 in + // multiple-byte codes." + let is_space = c == 32 && length == 1; + if is_space { spacing += ts.word_spacing } + + output.output_character(&trm, w0, spacing, ts.font_size, &font.decode_char(c))?; + let tj = 0.; + let ty = 0.; + let tx = ts.horizontal_scaling * ((w0 - tj/1000.)* ts.font_size + spacing); + dlog!("horizontal {} adjust {} {} {} {}", ts.horizontal_scaling, tx, w0, ts.font_size, spacing); + // dlog!("w0: {}, tx: {}", w0, tx); + ts.tm = ts.tm.pre_transform(&Transform2D::create_translation(tx, ty)); + let _trm = ts.tm.pre_transform(&gs.ctm); + //dlog!("post pos: {:?}", trm); + + } + output.end_word()?; + Ok(()) +} + +#[derive(Debug, Clone, Copy)] +pub struct MediaBox { + pub llx: f64, + pub lly: f64, + pub urx: f64, + pub ury: f64 +} + +fn apply_state(doc: &Document, gs: &mut GraphicsState, state: &Dictionary) { + for (k, v) in state.iter() { + let k : &[u8] = k.as_ref(); + match k { + b"SMask" => { match maybe_deref(doc, v) { + &Object::Name(ref name) => { + if name == b"None" { + gs.smask = None; + } else { + panic!("unexpected smask name") + } + } + &Object::Dictionary(ref dict) => { + gs.smask = Some(dict.clone()); + } + _ => { panic!("unexpected smask type {:?}", v) } + }} + b"Type" => { match v { + &Object::Name(ref name) => { + assert_eq!(name, b"ExtGState") + } + _ => { panic!("unexpected type") } + }} + _ => { dlog!("unapplied state: {:?} {:?}", k, v); } + } + } + +} + +#[derive(Debug)] +pub enum PathOp { + MoveTo(f64, f64), + LineTo(f64, f64), + // XXX: is it worth distinguishing the different kinds of curve ops? + CurveTo(f64, f64, f64, f64, f64, f64), + Rect(f64, f64, f64, f64), + Close, +} + +#[derive(Debug)] +pub struct Path { + pub ops: Vec +} + +impl Path { + fn new() -> Path { + Path { ops: Vec::new() } + } + fn current_point(&self) -> (f64, f64) { + match self.ops.last().unwrap() { + &PathOp::MoveTo(x, y) => { (x, y) } + &PathOp::LineTo(x, y) => { (x, y) } + &PathOp::CurveTo(_, _, _, _, x, y) => { (x, y) } + _ => { panic!() } + } + } +} + +#[derive(Clone, Debug)] +pub struct CalGray { + white_point: [f64; 3], + black_point: Option<[f64; 3]>, + gamma: Option, +} + +#[derive(Clone, Debug)] +pub struct CalRGB { + white_point: [f64; 3], + black_point: Option<[f64; 3]>, + gamma: Option<[f64; 3]>, + matrix: Option> +} + +#[derive(Clone, Debug)] +pub struct Lab { + white_point: [f64; 3], + black_point: Option<[f64; 3]>, + range: Option<[f64; 4]>, +} + +#[derive(Clone, Debug)] +pub enum AlternateColorSpace { + DeviceGray, + DeviceRGB, + DeviceCMYK, + CalRGB(CalRGB), + CalGray(CalGray), + Lab(Lab), + ICCBased(Vec) +} + +#[derive(Clone)] +pub struct Separation { + name: String, + alternate_space: AlternateColorSpace, + tint_transform: Box, +} + +#[derive(Clone)] +pub enum ColorSpace { + DeviceGray, + DeviceRGB, + DeviceCMYK, + DeviceN, + Pattern, + CalRGB(CalRGB), + CalGray(CalGray), + Lab(Lab), + Separation(Separation), + ICCBased(Vec) +} + +fn make_colorspace<'a>(doc: &'a Document, name: &[u8], resources: &'a Dictionary) -> ColorSpace { + match name { + b"DeviceGray" => ColorSpace::DeviceGray, + b"DeviceRGB" => ColorSpace::DeviceRGB, + b"DeviceCMYK" => ColorSpace::DeviceCMYK, + b"Pattern" => ColorSpace::Pattern, + _ => { + let colorspaces: &Dictionary = get(&doc, resources, b"ColorSpace"); + let cs: &Object = maybe_get_obj(doc, colorspaces, &name[..]).unwrap_or_else(|| panic!("missing colorspace {:?}", &name[..])); + if let Ok(cs) = cs.as_array() { + let cs_name = pdf_to_utf8(cs[0].as_name().expect("first arg must be a name")); + match cs_name.as_ref() { + "Separation" => { + let name = pdf_to_utf8(cs[1].as_name().expect("second arg must be a name")); + let alternate_space = match &maybe_deref(doc, &cs[2]) { + Object::Name(name) => { + match &name[..] { + b"DeviceGray" => AlternateColorSpace::DeviceGray, + b"DeviceRGB" => AlternateColorSpace::DeviceRGB, + b"DeviceCMYK" => AlternateColorSpace::DeviceCMYK, + _ => panic!("unexpected color space name") + } + } + Object::Array(cs) => { + let cs_name = pdf_to_utf8(cs[0].as_name().expect("first arg must be a name")); + match cs_name.as_ref() { + "ICCBased" => { + let stream = maybe_deref(doc, &cs[1]).as_stream().unwrap(); + dlog!("ICCBased {:?}", stream); + // XXX: we're going to be continually decompressing everytime this object is referenced + AlternateColorSpace::ICCBased(get_contents(stream)) + } + "CalGray" => { + let dict = cs[1].as_dict().expect("second arg must be a dict"); + AlternateColorSpace::CalGray(CalGray { + white_point: get(&doc, dict, b"WhitePoint"), + black_point: get(&doc, dict, b"BackPoint"), + gamma: get(&doc, dict, b"Gamma"), + }) + } + "CalRGB" => { + let dict = cs[1].as_dict().expect("second arg must be a dict"); + AlternateColorSpace::CalRGB(CalRGB { + white_point: get(&doc, dict, b"WhitePoint"), + black_point: get(&doc, dict, b"BackPoint"), + gamma: get(&doc, dict, b"Gamma"), + matrix: get(&doc, dict, b"Matrix"), + }) + } + "Lab" => { + let dict = cs[1].as_dict().expect("second arg must be a dict"); + AlternateColorSpace::Lab(Lab { + white_point: get(&doc, dict, b"WhitePoint"), + black_point: get(&doc, dict, b"BackPoint"), + range: get(&doc, dict, b"Range"), + }) + } + _ => panic!("Unexpected color space name") + } + } + _ => panic!("Alternate space should be name or array {:?}", cs[2]) + }; + let tint_transform = Box::new(Function::new(doc, maybe_deref(doc, &cs[3]))); + + dlog!("{:?} {:?} {:?}", name, alternate_space, tint_transform); + ColorSpace::Separation(Separation{ name, alternate_space, tint_transform}) + } + "ICCBased" => { + let stream = maybe_deref(doc, &cs[1]).as_stream().unwrap(); + dlog!("ICCBased {:?}", stream); + // XXX: we're going to be continually decompressing everytime this object is referenced + ColorSpace::ICCBased(get_contents(stream)) + } + "CalGray" => { + let dict = cs[1].as_dict().expect("second arg must be a dict"); + ColorSpace::CalGray(CalGray { + white_point: get(&doc, dict, b"WhitePoint"), + black_point: get(&doc, dict, b"BackPoint"), + gamma: get(&doc, dict, b"Gamma"), + }) + } + "CalRGB" => { + let dict = cs[1].as_dict().expect("second arg must be a dict"); + ColorSpace::CalRGB(CalRGB { + white_point: get(&doc, dict, b"WhitePoint"), + black_point: get(&doc, dict, b"BackPoint"), + gamma: get(&doc, dict, b"Gamma"), + matrix: get(&doc, dict, b"Matrix"), + }) + } + "Lab" => { + let dict = cs[1].as_dict().expect("second arg must be a dict"); + ColorSpace::Lab(Lab { + white_point: get(&doc, dict, b"WhitePoint"), + black_point: get(&doc, dict, b"BackPoint"), + range: get(&doc, dict, b"Range"), + }) + } + "Pattern" => { + ColorSpace::Pattern + }, + "DeviceGray" => ColorSpace::DeviceGray, + "DeviceRGB" => ColorSpace::DeviceRGB, + "DeviceCMYK" => ColorSpace::DeviceCMYK, + "DeviceN" => ColorSpace::DeviceN, + _ => { + panic!("color_space {:?} {:?} {:?}", name, cs_name, cs) + } + } + } else if let Ok(cs) = cs.as_name() { + match pdf_to_utf8(cs).as_ref() { + "DeviceRGB" => ColorSpace::DeviceRGB, + "DeviceGray" => ColorSpace::DeviceGray, + _ => panic!() + } + } else { + panic!(); + } + } + } +} + +struct Processor<'a> { + font_table: HashMap<*const Dictionary, Rc>, + _none: PhantomData<&'a ()>, +} + +impl<'a> Processor<'a> { + fn new() -> Processor<'a> { + Processor { font_table: HashMap::new(), _none: PhantomData } + } + + fn process_stream(&mut self, doc: &'a Document, content: Vec, resources: &'a Dictionary, media_box: &MediaBox, output: &mut dyn OutputDev, page_num: u32) -> Result<(), OutputError> { + let content = Content::decode(&content).unwrap(); + let mut gs: GraphicsState = GraphicsState { + ts: TextState { + font: None, + font_size: std::f64::NAN, + character_spacing: 0., + word_spacing: 0., + horizontal_scaling: 100. / 100., + leading: 0., + rise: 0., + tm: Transform2D::identity(), + }, + fill_color: Vec::new(), + fill_colorspace: ColorSpace::DeviceGray, + stroke_color: Vec::new(), + stroke_colorspace: ColorSpace::DeviceGray, + line_width: 1., + ctm: Transform2D::identity(), + smask: None + }; + //let mut ts = &mut gs.ts; + let mut gs_stack = Vec::new(); + let mut mc_stack = Vec::new(); + // XXX: replace tlm with a point for text start + let mut tlm = Transform2D::identity(); + let mut path = Path::new(); + let flip_ctm = Transform2D::row_major(1., 0., 0., -1., 0., media_box.ury - media_box.lly); + dlog!("MediaBox {:?}", media_box); + for operation in &content.operations { + //dlog!("op: {:?}", operation); + + match operation.operator.as_ref() { + "BT" => { + tlm = Transform2D::identity(); + gs.ts.tm = tlm; + } + "ET" => { + tlm = Transform2D::identity(); + gs.ts.tm = tlm; + } + "cm" => { + assert!(operation.operands.len() == 6); + let m = Transform2D::row_major(as_num(&operation.operands[0]), + as_num(&operation.operands[1]), + as_num(&operation.operands[2]), + as_num(&operation.operands[3]), + as_num(&operation.operands[4]), + as_num(&operation.operands[5])); + gs.ctm = gs.ctm.pre_transform(&m); + dlog!("matrix {:?}", gs.ctm); + } + "CS" => { + let name = operation.operands[0].as_name().unwrap(); + gs.stroke_colorspace = make_colorspace(doc, name, resources); + } + "cs" => { + let name = operation.operands[0].as_name().unwrap(); + gs.fill_colorspace = make_colorspace(doc, name, resources); + } + "SC" | "SCN" => { + gs.stroke_color = match gs.stroke_colorspace { + ColorSpace::Pattern => { dlog!("unhandled pattern color"); Vec::new() } + _ => { operation.operands.iter().map(|x| as_num(x)).collect() } + }; + } + "sc" | "scn" => { + gs.fill_color = match gs.fill_colorspace { + ColorSpace::Pattern => { dlog!("unhandled pattern color"); Vec::new() } + _ => { operation.operands.iter().map(|x| as_num(x)).collect() } + }; + } + "G" | "g" | "RG" | "rg" | "K" | "k" => { + dlog!("unhandled color operation {:?}", operation); + } + "TJ" => { + match operation.operands[0] { + Object::Array(ref array) => { + for e in array { + match e { + &Object::String(ref s, _) => { + show_text(&mut gs, s, &tlm, &flip_ctm, output)?; + } + &Object::Integer(i) => { + let ts = &mut gs.ts; + let w0 = 0.; + let tj = i as f64; + let ty = 0.; + let tx = ts.horizontal_scaling * ((w0 - tj / 1000.) * ts.font_size); + ts.tm = ts.tm.pre_transform(&Transform2D::create_translation(tx, ty)); + dlog!("adjust text by: {} {:?}", i, ts.tm); + } + &Object::Real(i) => { + let ts = &mut gs.ts; + let w0 = 0.; + let tj = i as f64; + let ty = 0.; + let tx = ts.horizontal_scaling * ((w0 - tj / 1000.) * ts.font_size); + ts.tm = ts.tm.pre_transform(&Transform2D::create_translation(tx, ty)); + dlog!("adjust text by: {} {:?}", i, ts.tm); + } + _ => { dlog!("kind of {:?}", e); } + } + } + } + _ => {} + } + } + "Tj" => { + match operation.operands[0] { + Object::String(ref s, _) => { + show_text(&mut gs, s, &tlm, &flip_ctm, output)?; + } + _ => { panic!("unexpected Tj operand {:?}", operation) } + } + } + "Tc" => { + gs.ts.character_spacing = as_num(&operation.operands[0]); + } + "Tw" => { + gs.ts.word_spacing = as_num(&operation.operands[0]); + } + "Tz" => { + gs.ts.horizontal_scaling = as_num(&operation.operands[0]) / 100.; + } + "TL" => { + gs.ts.leading = as_num(&operation.operands[0]); + } + "Tf" => { + let fonts: &Dictionary = get(&doc, resources, b"Font"); + let name = operation.operands[0].as_name().unwrap(); + let font_dict = get::<&Dictionary>(doc, fonts, name); + let font_key = font_dict as *const Dictionary; + let font = self.font_table.entry(font_key).or_insert_with(|| make_font(doc, font_dict)).clone(); + { + /*let file = font.get_descriptor().and_then(|desc| desc.get_file()); + if let Some(file) = file { + let file_contents = filter_data(file.as_stream().unwrap()); + let mut cursor = Cursor::new(&file_contents[..]); + //let f = Font::read(&mut cursor); + //dlog!("font file: {:?}", f); + }*/ + } + gs.ts.font = Some(font); + + gs.ts.font_size = as_num(&operation.operands[1]); + dlog!("font {} size: {} {:?}", pdf_to_utf8(name), gs.ts.font_size, operation); + } + "Ts" => { + gs.ts.rise = as_num(&operation.operands[0]); + } + "Tm" => { + assert!(operation.operands.len() == 6); + tlm = Transform2D::row_major(as_num(&operation.operands[0]), + as_num(&operation.operands[1]), + as_num(&operation.operands[2]), + as_num(&operation.operands[3]), + as_num(&operation.operands[4]), + as_num(&operation.operands[5])); + gs.ts.tm = tlm; + dlog!("Tm: matrix {:?}", gs.ts.tm); + output.end_line()?; + } + "Td" => { + /* Move to the start of the next line, offset from the start of the current line by (tx , ty ). + tx and ty are numbers expressed in unscaled text space units. + More precisely, this operator performs the following assignments: + */ + assert!(operation.operands.len() == 2); + let tx = as_num(&operation.operands[0]); + let ty = as_num(&operation.operands[1]); + dlog!("translation: {} {}", tx, ty); + + tlm = tlm.pre_transform(&Transform2D::create_translation(tx, ty)); + gs.ts.tm = tlm; + dlog!("Td matrix {:?}", gs.ts.tm); + output.end_line()?; + } + + "TD" => { + /* Move to the start of the next line, offset from the start of the current line by (tx , ty ). + As a side effect, this operator sets the leading parameter in the text state. + */ + assert!(operation.operands.len() == 2); + let tx = as_num(&operation.operands[0]); + let ty = as_num(&operation.operands[1]); + dlog!("translation: {} {}", tx, ty); + gs.ts.leading = -ty; + + tlm = tlm.pre_transform(&Transform2D::create_translation(tx, ty)); + gs.ts.tm = tlm; + dlog!("TD matrix {:?}", gs.ts.tm); + output.end_line()?; + } + + "T*" => { + let tx = 0.0; + let ty = -gs.ts.leading; + + tlm = tlm.pre_transform(&Transform2D::create_translation(tx, ty)); + gs.ts.tm = tlm; + dlog!("T* matrix {:?}", gs.ts.tm); + output.end_line()?; + } + "q" => { gs_stack.push(gs.clone()); } + "Q" => { + let s = gs_stack.pop(); + if let Some(s) = s { + gs = s; + } else { + warn!("No state to pop"); + } + } + "gs" => { + let ext_gstate: &Dictionary = get(doc, resources, b"ExtGState"); + let name = operation.operands[0].as_name().unwrap(); + let state: &Dictionary = get(doc, ext_gstate, name); + apply_state(doc, &mut gs, state); + } + "i" => { dlog!("unhandled graphics state flattness operator {:?}", operation); } + "w" => { gs.line_width = as_num(&operation.operands[0]); } + "J" | "j" | "M" | "d" | "ri" => { dlog!("unknown graphics state operator {:?}", operation); } + "m" => { path.ops.push(PathOp::MoveTo(as_num(&operation.operands[0]), as_num(&operation.operands[1]))) } + "l" => { path.ops.push(PathOp::LineTo(as_num(&operation.operands[0]), as_num(&operation.operands[1]))) } + "c" => { + path.ops.push(PathOp::CurveTo( + as_num(&operation.operands[0]), + as_num(&operation.operands[1]), + as_num(&operation.operands[2]), + as_num(&operation.operands[3]), + as_num(&operation.operands[4]), + as_num(&operation.operands[5]))) + } + "v" => { + let (x, y) = path.current_point(); + path.ops.push(PathOp::CurveTo( + x, + y, + as_num(&operation.operands[0]), + as_num(&operation.operands[1]), + as_num(&operation.operands[2]), + as_num(&operation.operands[3]))) + } + "y" => { + path.ops.push(PathOp::CurveTo( + as_num(&operation.operands[0]), + as_num(&operation.operands[1]), + as_num(&operation.operands[2]), + as_num(&operation.operands[3]), + as_num(&operation.operands[2]), + as_num(&operation.operands[3]))) + } + "h" => { path.ops.push(PathOp::Close) } + "re" => { + path.ops.push(PathOp::Rect(as_num(&operation.operands[0]), + as_num(&operation.operands[1]), + as_num(&operation.operands[2]), + as_num(&operation.operands[3]))) + } + "s" | "f*" | "B" | "B*" | "b" => { + dlog!("unhandled path op {:?}", operation); + } + "S" => { + output.stroke(&gs.ctm, &gs.stroke_colorspace, &gs.stroke_color, &path)?; + path.ops.clear(); + } + "F" | "f" => { + output.fill(&gs.ctm, &gs.fill_colorspace, &gs.fill_color, &path)?; + path.ops.clear(); + } + "W" | "w*" => { dlog!("unhandled clipping operation {:?}", operation); } + "n" => { + dlog!("discard {:?}", path); + path.ops.clear(); + } + "BMC" | "BDC" => { + mc_stack.push(operation); + } + "EMC" => { + mc_stack.pop(); + } + "Do" => { + // `Do` process an entire subdocument, so we do a recursive call to `process_stream` + // with the subdocument content and resources + let xobject: &Dictionary = get(&doc, resources, b"XObject"); + let name = operation.operands[0].as_name().unwrap(); + let xf: &Stream = get(&doc, xobject, name); + let resources = maybe_get_obj(&doc, &xf.dict, b"Resources").and_then(|n| n.as_dict().ok()).unwrap_or(resources); + let contents = get_contents(xf); + self.process_stream(&doc, contents, resources, &media_box, output, page_num)?; + } + _ => { dlog!("unknown operation {:?}", operation); } + + } + } + Ok(()) + } +} + + +pub trait OutputDev { + fn begin_page(&mut self, page_num: u32, media_box: &MediaBox, art_box: Option<(f64, f64, f64, f64)>)-> Result<(), OutputError>; + fn end_page(&mut self)-> Result<(), OutputError>; + fn output_character(&mut self, trm: &Transform, width: f64, spacing: f64, font_size: f64, char: &str) -> Result<(), OutputError>; + fn begin_word(&mut self)-> Result<(), OutputError>; + fn end_word(&mut self)-> Result<(), OutputError>; + fn end_line(&mut self)-> Result<(), OutputError>; + fn stroke(&mut self, _ctm: &Transform, _colorspace: &ColorSpace, _color: &[f64], _path: &Path)-> Result<(), OutputError> {Ok(())} + fn fill(&mut self, _ctm: &Transform, _colorspace: &ColorSpace, _color: &[f64], _path: &Path)-> Result<(), OutputError> {Ok(())} +} + + +pub struct HTMLOutput<'a> { + file: &'a mut dyn std::io::Write, + flip_ctm: Transform, + last_ctm: Transform, + buf_ctm: Transform, + buf_font_size: f64, + buf: String +} + +fn insert_nbsp(input: &str) -> String { + let mut result = String::new(); + let mut word_end = false; + let mut chars = input.chars().peekable(); + while let Some(c) = chars.next() { + if c == ' ' { + if !word_end || chars.peek().filter(|x| **x != ' ').is_none() { + result += " "; + } else { + result += " "; + } + word_end = false; + } else { + word_end = true; + result.push(c); + } + } + result +} + +impl<'a> HTMLOutput<'a> { + pub fn new(file: &mut dyn std::io::Write) -> HTMLOutput { + HTMLOutput { + file, + flip_ctm: Transform2D::identity(), + last_ctm: Transform2D::identity(), + buf_ctm: Transform2D::identity(), + buf: String::new(), + buf_font_size: 0., + } + } + fn flush_string(&mut self) -> Result<(), OutputError>{ + if self.buf.len() != 0 { + + let position = self.buf_ctm.post_transform(&self.flip_ctm); + let transformed_font_size_vec = self.buf_ctm.transform_vector(vec2(self.buf_font_size, self.buf_font_size)); + // get the length of one sized of the square with the same area with a rectangle of size (x, y) + let transformed_font_size = (transformed_font_size_vec.x * transformed_font_size_vec.y).sqrt(); + let (x, y) = (position.m31, position.m32); + warn!("flush {} {:?}", self.buf, (x,y)); + + write!(self.file, "
{}
\n", + x, y, transformed_font_size, insert_nbsp(&self.buf))?; + } + Ok(()) + } +} + +type ArtBox = (f64, f64, f64, f64); + +impl<'a> OutputDev for HTMLOutput<'a> { + fn begin_page(&mut self, page_num: u32, media_box: &MediaBox, _: Option) -> Result<(), OutputError> { + write!(self.file, " ")?; + write!(self.file, "", page_num)?; + write!(self.file, "
", page_num, media_box.ury - media_box.lly, media_box.urx - media_box.llx)?; + self.flip_ctm = Transform::row_major(1., 0., 0., -1., 0., media_box.ury - media_box.lly); + Ok(()) + } + fn end_page(&mut self) -> Result<(), OutputError> { + self.flush_string()?; + self.buf = String::new(); + self.last_ctm = Transform::identity(); + write!(self.file, "
")?; + Ok(()) + } + fn output_character(&mut self, trm: &Transform, width: f64, spacing: f64, font_size: f64, char: &str) -> Result<(), OutputError>{ + if trm.approx_eq(&self.last_ctm) { + let position = trm.post_transform(&self.flip_ctm); + let (x, y) = (position.m31, position.m32); + + warn!("accum {} {:?}", char, (x,y)); + self.buf += char; + } else { + warn!("flush {} {:?} {:?} {} {} {}", char, trm, self.last_ctm, width, font_size, spacing); + self.flush_string()?; + self.buf = char.to_owned(); + self.buf_font_size = font_size; + self.buf_ctm = *trm; + } + let position = trm.post_transform(&self.flip_ctm); + let transformed_font_size_vec = trm.transform_vector(vec2(font_size, font_size)); + // get the length of one sized of the square with the same area with a rectangle of size (x, y) + let transformed_font_size = (transformed_font_size_vec.x * transformed_font_size_vec.y).sqrt(); + let (x, y) = (position.m31, position.m32); + write!(self.file, "
{}
", + x, y, transformed_font_size, char)?; + self.last_ctm = trm.pre_transform(&Transform2D::create_translation(width * font_size + spacing, 0.)); + + Ok(()) + } + fn begin_word(&mut self) -> Result<(), OutputError> {Ok(())} + fn end_word(&mut self) -> Result<(), OutputError> {Ok(())} + fn end_line(&mut self) -> Result<(), OutputError> {Ok(())} +} + +pub struct SVGOutput<'a> { + file: &'a mut dyn std::io::Write +} +impl<'a> SVGOutput<'a> { + pub fn new(file: &mut dyn std::io::Write) -> SVGOutput { + SVGOutput{file} + } +} + +impl<'a> OutputDev for SVGOutput<'a> { + fn begin_page(&mut self, _page_num: u32, media_box: &MediaBox, art_box: Option<(f64, f64, f64, f64)>) -> Result<(), OutputError> { + let ver = 1.1; + write!(self.file, "\n")?; + if ver == 1.1 { + write!(self.file, r#""#)?; + } else { + write!(self.file, r#""#)?; + } + if let Some(art_box) = art_box { + let width = art_box.2 - art_box.0; + let height = art_box.3 - art_box.1; + let y = media_box.ury - art_box.1 - height; + write!(self.file, "", width, height, ver, art_box.0, y, width, height)?; + } else { + let width = media_box.urx - media_box.llx; + let height = media_box.ury - media_box.lly; + write!(self.file, "", width, height, ver, media_box.llx, media_box.lly, width, height)?; + } + write!(self.file, "\n")?; + type Mat = Transform; + + let ctm = Mat::create_scale(1., -1.).post_translate(vec2(0., media_box.ury)); + write!(self.file, "\n", + ctm.m11, + ctm.m12, + ctm.m21, + ctm.m22, + ctm.m31, + ctm.m32, + )?; + Ok(()) + } + fn end_page(&mut self) -> Result<(), OutputError>{ + write!(self.file, "\n")?; + write!(self.file, "")?; + Ok(()) + } + fn output_character(&mut self, _trm: &Transform, _width: f64, _spacing: f64, _font_size: f64, _char: &str) -> Result<(), OutputError>{ + Ok(()) + } + fn begin_word(&mut self) -> Result<(), OutputError> {Ok(())} + fn end_word(&mut self) -> Result<(), OutputError> {Ok(())} + fn end_line(&mut self) -> Result<(), OutputError> {Ok(())} + fn fill(&mut self, ctm: &Transform, _colorspace: &ColorSpace, _color: &[f64], path: &Path) -> Result<(), OutputError>{ + write!(self.file, "", + ctm.m11, + ctm.m12, + ctm.m21, + ctm.m22, + ctm.m31, + ctm.m32, + )?; + + /*if path.ops.len() == 1 { + if let PathOp::Rect(x, y, width, height) = path.ops[0] { + write!(self.file, "\n", x, y, width, height); + write!(self.file, ""); + return; + } + }*/ + let mut d = Vec::new(); + for op in &path.ops { + match op { + &PathOp::MoveTo(x, y) => { d.push(format!("M{} {}", x, y))} + &PathOp::LineTo(x, y) => { d.push(format!("L{} {}", x, y))}, + &PathOp::CurveTo(x1, y1, x2, y2, x, y) => { d.push(format!("C{} {} {} {} {} {}", x1, y1, x2, y2, x, y))}, + &PathOp::Close => { d.push(format!("Z"))}, + &PathOp::Rect(x, y, width, height) => { + d.push(format!("M{} {}", x, y)); + d.push(format!("L{} {}", x + width, y)); + d.push(format!("L{} {}", x + width, y + height)); + d.push(format!("L{} {}", x, y + height)); + d.push(format!("Z")); + } + + } + } + write!(self.file, "", d.join(" "))?; + write!(self.file, "")?; + write!(self.file, "\n")?; + Ok(()) + } +} + +/* +File doesn't implement std::fmt::Write so we have +to do some gymnastics to accept a File or String +See https://github.com/rust-lang/rust/issues/51305 +*/ + +pub trait ConvertToFmt { + type Writer: std::fmt::Write; + fn convert(self) -> Self::Writer; +} + +impl<'a> ConvertToFmt for &'a mut String { + type Writer = &'a mut String; + fn convert(self) -> Self::Writer { + self + } +} + +pub struct WriteAdapter { + f: W, +} + +impl std::fmt::Write for WriteAdapter { + fn write_str(&mut self, s: &str) -> Result<(), std::fmt::Error> { + self.f.write_all(s.as_bytes()).map_err(|_| fmt::Error) + } +} + +impl<'a> ConvertToFmt for &'a mut dyn std::io::Write { + type Writer = WriteAdapter; + fn convert(self) -> Self::Writer { + WriteAdapter { f: self } + } +} + +impl<'a> ConvertToFmt for &'a mut File { + type Writer = WriteAdapter; + fn convert(self) -> Self::Writer { + WriteAdapter { f: self } + } +} + +pub struct PlainTextOutput { + writer: W::Writer, + last_end: f64, + last_y: f64, + first_char: bool, + flip_ctm: Transform, +} + +impl PlainTextOutput { + pub fn new(writer: W) -> PlainTextOutput { + PlainTextOutput{ + writer: writer.convert(), + last_end: 100000., + first_char: false, + last_y: 0., + flip_ctm: Transform2D::identity(), + } + } +} + +/* There are some structural hints that PDFs can use to signal word and line endings: + * however relying on these is not likely to be sufficient. */ +impl OutputDev for PlainTextOutput { + fn begin_page(&mut self, _page_num: u32, media_box: &MediaBox, _: Option) -> Result<(), OutputError> { + self.flip_ctm = Transform2D::row_major(1., 0., 0., -1., 0., media_box.ury - media_box.lly); + Ok(()) + } + fn end_page(&mut self) -> Result<(), OutputError> { + Ok(()) + } + fn output_character(&mut self, trm: &Transform, width: f64, _spacing: f64, font_size: f64, char: &str) -> Result<(), OutputError> { + let position = trm.post_transform(&self.flip_ctm); + let transformed_font_size_vec = trm.transform_vector(vec2(font_size, font_size)); + // get the length of one sized of the square with the same area with a rectangle of size (x, y) + let transformed_font_size = (transformed_font_size_vec.x*transformed_font_size_vec.y).sqrt(); + let (x, y) = (position.m31, position.m32); + use std::fmt::Write; + //dlog!("last_end: {} x: {}, width: {}", self.last_end, x, width); + if self.first_char { + if (y - self.last_y).abs() > transformed_font_size * 1.5 { + write!(self.writer, "\n")?; + } + + // we've moved to the left and down + if x < self.last_end && (y - self.last_y).abs() > transformed_font_size * 0.5 { + write!(self.writer, "\n")?; + } + + if x > self.last_end + transformed_font_size * 0.1 { + dlog!("width: {}, space: {}, thresh: {}", width, x - self.last_end, transformed_font_size * 0.1); + write!(self.writer, " ")?; + } + } + //let norm = unicode_normalization::UnicodeNormalization::nfkc(char); + write!(self.writer, "{}", char)?; + self.first_char = false; + self.last_y = y; + self.last_end = x + width * transformed_font_size; + Ok(()) + } + fn begin_word(&mut self) -> Result<(), OutputError> { + self.first_char = true; + Ok(()) + } + fn end_word(&mut self) -> Result<(), OutputError> {Ok(())} + fn end_line(&mut self) -> Result<(), OutputError>{ + //write!(self.file, "\n"); + Ok(()) + } +} + + +pub fn print_metadata(doc: &Document) { + dlog!("Version: {}", doc.version); + if let Some(ref info) = get_info(&doc) { + for (k, v) in *info { + match v { + &Object::String(ref s, StringFormat::Literal) => { dlog!("{}: {}", pdf_to_utf8(k), pdf_to_utf8(s)); } + _ => {} + } + } + } + dlog!("Page count: {}", get::(&doc, &get_pages(&doc), b"Count")); + dlog!("Pages: {:?}", get_pages(&doc)); + dlog!("Type: {:?}", get_pages(&doc).get(b"Type").and_then(|x| x.as_name()).unwrap()); +} + +/// Extract the text from a pdf at `path` and return a `String` with the results +pub fn extract_text>(path: P) -> Result { + let mut s = String::new(); + { + let mut output = PlainTextOutput::new(&mut s); + let mut doc = Document::load(path)?; + maybe_decrypt(&mut doc)?; + output_doc(&doc, &mut output)?; + } + Ok(s) +} + +fn maybe_decrypt(doc: &mut Document) -> Result<(), OutputError> { + if ! doc.is_encrypted() { + return Ok(()); + } + + if let Err(e) = doc.decrypt("") { + if let Error::Decryption(DecryptionError::IncorrectPassword) = e { + error!("Encrypted documents must be decrypted with a password using {{extract_text|extract_text_from_mem|output_doc}}_encrypted") + } + + return Err(OutputError::PdfError(e)); + } + + Ok(()) +} + +pub fn extract_text_encrypted>( + path: P, + password: &str, +) -> Result { + let mut s = String::new(); + { + let mut output = PlainTextOutput::new(&mut s); + let mut doc = Document::load(path)?; + output_doc_encrypted(&mut doc, &mut output, password)?; + } + Ok(s) +} + +pub fn extract_text_from_mem(buffer: &[u8]) -> Result { + let mut s = String::new(); + { + let mut output = PlainTextOutput::new(&mut s); + let mut doc = Document::load_mem(buffer)?; + maybe_decrypt(&mut doc)?; + output_doc(&doc, &mut output)?; + } + Ok(s) +} + +pub fn extract_text_from_mem_encrypted( + buffer: &[u8], + password: &str, +) -> Result { + let mut s = String::new(); + { + let mut output = PlainTextOutput::new(&mut s); + let mut doc = Document::load_mem(buffer)?; + output_doc_encrypted(&mut doc, &mut output, password)?; + } + Ok(s) +} + + +fn extract_text_by_page(doc: &Document, page_num: u32) -> Result { + let mut s = String::new(); + { + let mut output = PlainTextOutput::new(&mut s); + output_doc_page(doc, &mut output, page_num)?; + } + Ok(s) +} + +/// Extract the text from a pdf at `path` and return a `Vec` with the results separately by page + +pub fn extract_text_by_pages>(path: P) -> Result, OutputError> { + let mut v = Vec::new(); + { + let mut doc = Document::load(path)?; + maybe_decrypt(&mut doc)?; + let mut page_num = 1; + while let Ok(content) = extract_text_by_page(&doc, page_num) { + v.push(content); + page_num += 1; + } + } + Ok(v) +} + +pub fn extract_text_by_pages_encrypted>(path: P, password: &str) -> Result, OutputError> { + let mut v = Vec::new(); + { + let mut doc = Document::load(path)?; + doc.decrypt(password)?; + let mut page_num = 1; + while let Ok(content) = extract_text_by_page(&mut doc, page_num) { + v.push(content); + page_num += 1; + } + } + Ok(v) +} + +pub fn extract_text_from_mem_by_pages(buffer: &[u8]) -> Result, OutputError> { + let mut v = Vec::new(); + { + let mut doc = Document::load_mem(buffer)?; + maybe_decrypt(&mut doc)?; + let mut page_num = 1; + while let Ok(content) = extract_text_by_page(&doc, page_num) { + v.push(content); + page_num += 1; + } + } + Ok(v) +} + +pub fn extract_text_from_mem_by_pages_encrypted(buffer: &[u8], password: &str) -> Result, OutputError> { + let mut v = Vec::new(); + { + let mut doc = Document::load_mem(buffer)?; + doc.decrypt(password)?; + let mut page_num = 1; + while let Ok(content) = extract_text_by_page(&doc, page_num) { + v.push(content); + page_num += 1; + } + } + Ok(v) +} + + +fn get_inherited<'a, T: FromObj<'a>>(doc: &'a Document, dict: &'a Dictionary, key: &[u8]) -> Option { + let o: Option = get(doc, dict, key); + if let Some(o) = o { + Some(o) + } else { + let parent = dict.get(b"Parent") + .and_then(|parent| parent.as_reference()) + .and_then(|id| doc.get_dictionary(id)).ok()?; + get_inherited(doc, parent, key) + } +} + +pub fn output_doc_encrypted( + doc: &mut Document, + output: &mut dyn OutputDev, + password: &str, +) -> Result<(), OutputError> { + doc.decrypt(password)?; + output_doc(doc, output) +} + +/// Parse a given document and output it to `output` +pub fn output_doc(doc: &Document, output: &mut dyn OutputDev) -> Result<(), OutputError> { + if doc.is_encrypted() { + error!("Encrypted documents must be decrypted with a password using {{extract_text|extract_text_from_mem|output_doc}}_encrypted"); + } + let empty_resources = Dictionary::new(); + let pages = doc.get_pages(); + let mut p = Processor::new(); + for dict in pages { + let page_num = dict.0; + let object_id = dict.1; + output_doc_inner(page_num, object_id, doc, &mut p, output, &empty_resources)?; + } + Ok(()) +} + +pub fn output_doc_page(doc: &Document, output: &mut dyn OutputDev, page_num: u32) -> Result<(), OutputError> { + if doc.is_encrypted() { + error!("Encrypted documents must be decrypted with a password using {{extract_text|extract_text_from_mem|output_doc}}_encrypted"); + } + let empty_resources = Dictionary::new(); + let pages = doc.get_pages(); + let object_id = pages.get(&page_num).ok_or(lopdf::Error::PageNumberNotFound(page_num))?; + let mut p = Processor::new(); + output_doc_inner(page_num, *object_id, doc, &mut p, output, &empty_resources)?; + Ok(()) +} + +fn output_doc_inner<'a>(page_num: u32, object_id: ObjectId, doc: &'a Document, p: & mut Processor<'a>, output: &mut dyn OutputDev, empty_resources: &'a Dictionary) -> Result<(), OutputError> { + let page_dict = doc.get_object(object_id).unwrap().as_dict().unwrap(); + dlog!("page {} {:?}", page_num, page_dict); + // XXX: Some pdfs lack a Resources directory + let resources = get_inherited(doc, page_dict, b"Resources").unwrap_or(empty_resources); + dlog!("resources {:?}", resources); + // pdfium searches up the page tree for MediaBoxes as needed + let media_box: Vec = get_inherited(doc, page_dict, b"MediaBox").expect("MediaBox"); + let media_box = MediaBox { llx: media_box[0], lly: media_box[1], urx: media_box[2], ury: media_box[3] }; + let art_box = get::>>(&doc, page_dict, b"ArtBox") + .map(|x| (x[0], x[1], x[2], x[3])); + output.begin_page(page_num, &media_box, art_box)?; + p.process_stream(&doc, doc.get_page_content(object_id).unwrap(), resources, &media_box, output, page_num)?; + output.end_page()?; + Ok(()) +} diff --git a/frontend/src-tauri/patches/pdf-extract-0.12.0/src/zapfglyphnames.rs b/frontend/src-tauri/patches/pdf-extract-0.12.0/src/zapfglyphnames.rs new file mode 100644 index 00000000..ab1c3e36 --- /dev/null +++ b/frontend/src-tauri/patches/pdf-extract-0.12.0/src/zapfglyphnames.rs @@ -0,0 +1,210 @@ +pub fn zapfdigbats_names_to_unicode(name: &str) -> Option { + let names = [ + ("a1", 0x2701), + ("a10", 0x2721), + ("a100", 0x275e), + ("a101", 0x2761), + ("a102", 0x2762), + ("a103", 0x2763), + ("a104", 0x2764), + ("a105", 0x2710), + ("a106", 0x2765), + ("a107", 0x2766), + ("a108", 0x2767), + ("a109", 0x2660), + ("a11", 0x261b), + ("a110", 0x2665), + ("a111", 0x2666), + ("a112", 0x2663), + ("a117", 0x2709), + ("a118", 0x2708), + ("a119", 0x2707), + ("a12", 0x261e), + ("a120", 0x2460), + ("a121", 0x2461), + ("a122", 0x2462), + ("a123", 0x2463), + ("a124", 0x2464), + ("a125", 0x2465), + ("a126", 0x2466), + ("a127", 0x2467), + ("a128", 0x2468), + ("a129", 0x2469), + ("a13", 0x270c), + ("a130", 0x2776), + ("a131", 0x2777), + ("a132", 0x2778), + ("a133", 0x2779), + ("a134", 0x277a), + ("a135", 0x277b), + ("a136", 0x277c), + ("a137", 0x277d), + ("a138", 0x277e), + ("a139", 0x277f), + ("a14", 0x270d), + ("a140", 0x2780), + ("a141", 0x2781), + ("a142", 0x2782), + ("a143", 0x2783), + ("a144", 0x2784), + ("a145", 0x2785), + ("a146", 0x2786), + ("a147", 0x2787), + ("a148", 0x2788), + ("a149", 0x2789), + ("a15", 0x270e), + ("a150", 0x278a), + ("a151", 0x278b), + ("a152", 0x278c), + ("a153", 0x278d), + ("a154", 0x278e), + ("a155", 0x278f), + ("a156", 0x2790), + ("a157", 0x2791), + ("a158", 0x2792), + ("a159", 0x2793), + ("a16", 0x270f), + ("a160", 0x2794), + ("a161", 0x2192), + ("a162", 0x27a3), + ("a163", 0x2194), + ("a164", 0x2195), + ("a165", 0x2799), + ("a166", 0x279b), + ("a167", 0x279c), + ("a168", 0x279d), + ("a169", 0x279e), + ("a17", 0x2711), + ("a170", 0x279f), + ("a171", 0x27a0), + ("a172", 0x27a1), + ("a173", 0x27a2), + ("a174", 0x27a4), + ("a175", 0x27a5), + ("a176", 0x27a6), + ("a177", 0x27a7), + ("a178", 0x27a8), + ("a179", 0x27a9), + ("a18", 0x2712), + ("a180", 0x27ab), + ("a181", 0x27ad), + ("a182", 0x27af), + ("a183", 0x27b2), + ("a184", 0x27b3), + ("a185", 0x27b5), + ("a186", 0x27b8), + ("a187", 0x27ba), + ("a188", 0x27bb), + ("a189", 0x27bc), + ("a19", 0x2713), + ("a190", 0x27bd), + ("a191", 0x27be), + ("a192", 0x279a), + ("a193", 0x27aa), + ("a194", 0x27b6), + ("a195", 0x27b9), + ("a196", 0x2798), + ("a197", 0x27b4), + ("a198", 0x27b7), + ("a199", 0x27ac), + ("a2", 0x2702), + ("a20", 0x2714), + ("a200", 0x27ae), + ("a201", 0x27b1), + ("a202", 0x2703), + ("a203", 0x2750), + ("a204", 0x2752), + ("a205", 0x276e), + ("a206", 0x2770), + ("a21", 0x2715), + ("a22", 0x2716), + ("a23", 0x2717), + ("a24", 0x2718), + ("a25", 0x2719), + ("a26", 0x271a), + ("a27", 0x271b), + ("a28", 0x271c), + ("a29", 0x2722), + ("a3", 0x2704), + ("a30", 0x2723), + ("a31", 0x2724), + ("a32", 0x2725), + ("a33", 0x2726), + ("a34", 0x2727), + ("a35", 0x2605), + ("a36", 0x2729), + ("a37", 0x272a), + ("a38", 0x272b), + ("a39", 0x272c), + ("a4", 0x260e), + ("a40", 0x272d), + ("a41", 0x272e), + ("a42", 0x272f), + ("a43", 0x2730), + ("a44", 0x2731), + ("a45", 0x2732), + ("a46", 0x2733), + ("a47", 0x2734), + ("a48", 0x2735), + ("a49", 0x2736), + ("a5", 0x2706), + ("a50", 0x2737), + ("a51", 0x2738), + ("a52", 0x2739), + ("a53", 0x273a), + ("a54", 0x273b), + ("a55", 0x273c), + ("a56", 0x273d), + ("a57", 0x273e), + ("a58", 0x273f), + ("a59", 0x2740), + ("a6", 0x271d), + ("a60", 0x2741), + ("a61", 0x2742), + ("a62", 0x2743), + ("a63", 0x2744), + ("a64", 0x2745), + ("a65", 0x2746), + ("a66", 0x2747), + ("a67", 0x2748), + ("a68", 0x2749), + ("a69", 0x274a), + ("a7", 0x271e), + ("a70", 0x274b), + ("a71", 0x25cf), + ("a72", 0x274d), + ("a73", 0x25a0), + ("a74", 0x274f), + ("a75", 0x2751), + ("a76", 0x25b2), + ("a77", 0x25bc), + ("a78", 0x25c6), + ("a79", 0x2756), + ("a8", 0x271f), + ("a81", 0x25d7), + ("a82", 0x2758), + ("a83", 0x2759), + ("a84", 0x275a), + ("a85", 0x276f), + ("a86", 0x2771), + ("a87", 0x2772), + ("a88", 0x2773), + ("a89", 0x2768), + ("a9", 0x2720), + + ("a90", 0x2769), + ("a91", 0x276c), + ("a92", 0x276d), + ("a93", 0x276a), + ("a94", 0x276b), + ("a95", 0x2774), + ("a96", 0x2775), + ("a97", 0x275b), + ("a98", 0x275c), + ("a99", 0x275d), + ("space", 0x0020), + ]; + + let result = names.binary_search_by_key(&name, |&(name,_code)| &name); + result.ok().map(|indx| names[indx].1) +} diff --git a/frontend/src-tauri/src/pdf_extractor.rs b/frontend/src-tauri/src/pdf_extractor.rs index 2b652a24..4545b57b 100644 --- a/frontend/src-tauri/src/pdf_extractor.rs +++ b/frontend/src-tauri/src/pdf_extractor.rs @@ -2,6 +2,27 @@ use base64::{engine::general_purpose::STANDARD as BASE64, Engine}; use pdf_extract::extract_text_from_mem; use serde::{Deserialize, Serialize}; +const PDF_EXTRACTION_FAILED: &str = "Failed to extract text from PDF"; + +async fn run_pdf_extraction(extract: F) -> Result +where + F: FnOnce() -> Result + Send + 'static, +{ + match tokio::task::spawn_blocking(extract).await { + Ok(result) => result, + Err(error) => { + if error.is_panic() { + log::error!("PDF text extraction task panicked"); + } else { + log::error!("PDF text extraction task was cancelled"); + } + Err(format!( + "{PDF_EXTRACTION_FAILED}: parser failed unexpectedly" + )) + } + } +} + #[derive(Debug, Serialize, Deserialize)] pub struct DocumentData { pub filename: String, @@ -27,9 +48,11 @@ pub async fn extract_document_content( let text_content = match file_type.as_str() { "pdf" | "application/pdf" => { - // Extract text from PDF - extract_text_from_mem(&file_bytes) - .map_err(|e| format!("Failed to extract text from PDF: {e}"))? + run_pdf_extraction(move || { + extract_text_from_mem(&file_bytes) + .map_err(|error| format!("{PDF_EXTRACTION_FAILED}: {error}")) + }) + .await? } "txt" | "text/plain" | "md" | "text/markdown" => { // For text files, just convert bytes to string @@ -51,9 +74,26 @@ pub async fn extract_document_content( #[cfg(test)] mod tests { - use super::extract_document_content; + use super::{extract_document_content, run_pdf_extraction, PDF_EXTRACTION_FAILED}; use base64::{engine::general_purpose::STANDARD as BASE64, Engine}; + const TYPE4_PDF: &[u8] = include_bytes!("../tests/fixtures/type4-separation.pdf"); + const PAGE_FONT_COLLISION_PDF: &[u8] = + include_bytes!("../tests/fixtures/page-font-name-collision.pdf"); + const XOBJECT_FONT_COLLISION_PDF: &[u8] = + include_bytes!("../tests/fixtures/xobject-font-name-collision.pdf"); + const INVALID_PDF: &[u8] = include_bytes!("../tests/fixtures/invalid.pdf"); + + async fn extract_pdf(pdf: &[u8], filename: &str) -> super::DocumentResponse { + extract_document_content( + BASE64.encode(pdf), + filename.to_string(), + "application/pdf".to_string(), + ) + .await + .expect("expected PDF extraction to succeed") + } + #[tokio::test] async fn extract_document_content_text_plain_success() { let file_base64 = BASE64.encode(b"Hello, Maple!"); @@ -71,6 +111,78 @@ mod tests { assert_eq!(resp.document.text_content, "Hello, Maple!"); } + #[tokio::test] + async fn extract_document_content_accepts_type4_separation_pdf() { + let response = extract_pdf(TYPE4_PDF, "type4-separation.pdf").await; + + assert_eq!(response.status, "completed"); + assert_eq!(response.document.filename, "type4-separation.pdf"); + assert!( + response.document.text_content.contains("Type 4 regression"), + "unexpected text: {:?}", + response.document.text_content + ); + } + + #[tokio::test] + async fn extract_document_content_keeps_page_font_resources_scoped() { + let response = extract_pdf(PAGE_FONT_COLLISION_PDF, "page-fonts.pdf").await; + let text: String = response + .document + .text_content + .chars() + .filter(|character| !character.is_whitespace()) + .collect(); + + assert_eq!(text, "AB"); + } + + #[tokio::test] + async fn extract_document_content_keeps_xobject_font_resources_scoped() { + let response = extract_pdf(XOBJECT_FONT_COLLISION_PDF, "xobject-fonts.pdf").await; + let text: String = response + .document + .text_content + .chars() + .filter(|character| !character.is_whitespace()) + .collect(); + + assert_eq!(text, "AB"); + } + + #[tokio::test] + async fn pdf_parser_panics_are_returned_as_errors() { + let error = run_pdf_extraction(|| -> Result { + panic!("synthetic PDF parser panic") + }) + .await + .expect_err("expected a parser panic to become an error"); + + assert_eq!( + error, + format!("{PDF_EXTRACTION_FAILED}: parser failed unexpectedly") + ); + + let response = extract_pdf(TYPE4_PDF, "after-parser-panic.pdf").await; + assert!(response.document.text_content.contains("Type 4 regression")); + } + + #[tokio::test] + async fn extract_document_content_rejects_invalid_pdf() { + let error = extract_document_content( + BASE64.encode(INVALID_PDF), + "invalid.pdf".to_string(), + "application/pdf".to_string(), + ) + .await + .expect_err("expected invalid PDF extraction to fail"); + + assert!( + error.starts_with(PDF_EXTRACTION_FAILED), + "unexpected error: {error}" + ); + } + #[tokio::test] async fn extract_document_content_rejects_unsupported_file_type() { let file_base64 = BASE64.encode(b"whatever"); diff --git a/frontend/src-tauri/tests/fixtures/invalid.pdf b/frontend/src-tauri/tests/fixtures/invalid.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d40724932920de9ab85c63716045cbb13081311c GIT binary patch literal 78 zcmWm1u?c`c3RCBy&?M$`MSQDVp>#%YtQb@qQyo#$Ukk$JV zL0+q%S~~}MPbMBRB0RugAkfrI1z_Um7$ z_kXK?d8E!hepZhW$j8-7h^glSq##Gi%$ACAL+C$OeuzS*G zXuLiEH@az%^2>>v_H&TK=a{F7c0OD$lmiBD)rZZKuET=aNy6M+0y)tCBZSePhQK|s z3*i>cJS?EwxOUix z1WJ+Y7nLaQ=Fq?%>(T7;0&~DhnwKLi&1vS2u&gLguwFv_dBmgYpI}9K%DXHmt2^7^ lly1?*C*@K9L?~%+tqs6$O?*mxP%gw6%e)kw&iMO8`~u{TOZor+ literal 0 HcmV?d00001 diff --git a/frontend/src-tauri/tests/fixtures/type4-separation.pdf b/frontend/src-tauri/tests/fixtures/type4-separation.pdf new file mode 100644 index 0000000000000000000000000000000000000000..82ff2cf64b664d58755f00224d65a4afec123f45 GIT binary patch literal 857 zcmZWn!EW0y487|scnPo`R#}amq(IR_lDY%7Vnys*(1U6-o(oqpB)P~o?B7S)PS?x= zd?5WuK0dzL<2L=QE|+2k54vp-@}Dh23=S)Y-q+T^p+1Jrp->QkeSQ%)Hz0eI+~}Yi zTY-Gk6?(WLzz%M21)7q99G@2qIQg|MJ?!TUe*(F&oe7{m6!M>GA&+rL&|!{zz_QkB zdxU*N_<0n;RTMo50FXQMwsQq>VzL|CSeLcBz#+^O>}7_nb~^BaGHY!Bxy84-z}@{C zl7Sg*Le0*fOf50suBn0r4RI>G zh%OWGg%RsqaDTOe{2<~86fKvR;?v|f7m&Y*yPOptTaDWD3a5!_X9`|)td?8*s%yit zDUyGuO@)0xC46H}jwDrom9g`0D7&`*{!Hhw6sLKEIeMXF);$MyRPPuCa;-fMf4*Sz zhM_L>hr=Ho9z+C75xqYWDw!v6fcIQX_TUHRU+$Vb@n25G*OS~lSxs{Ba$1|L=whdS l!Rfj|*ZV%Je<3VMG)sFOpcyW_RCH@fTiU-BX0RxEr31qg)q=X!VBEpd7>(aNau5hn#X?1!oVyf`Ugf)JIoTCIFjYskM4+)n^K%7}S@y+6%YBCiea0mQ9=Y$No* zGzO9eZS|1*`L$ed_PU!}R}ZR60Bp#Os4e$m{YzMxb6}GySB0z=?k;ut4v_OWp5A0N zsEj-UV_B90rRP}WSsVcyd^iA^LA54F6RE_3FF} zZ8MLJm@2)Y*6WR{H1*_5gFed+Yz32y>fKPAWuReduiZrK`JY8haF#D4GMv+~x(>Y8qV#;|d;a0WafreQN;qIW ztQvh#9kCQuUSL6lyLEwuKCa^h)=T?WSe#z-`pHRNtGQeY?cR@9`A0w>cU37`{pQ^; RmTT+uq;ceRI+LfV_ZR9aOQ`?= literal 0 HcmV?d00001 From 8a9cfe28f250adb662634ddd5e2cd6e22f75bf2a Mon Sep 17 00:00:00 2001 From: Anthony Ronning <101225832+AnthonyRonning@users.noreply.github.com> Date: Tue, 21 Jul 2026 00:46:56 +0000 Subject: [PATCH 2/2] fix: harden PDF extraction edge cases --- .../pdf-extract-0.12.0/MAPLE_PATCHES.md | 29 ++- .../patches/pdf-extract-0.12.0/src/lib.rs | 179 ++++++++++++++---- frontend/src-tauri/src/pdf_extractor.rs | 178 +++++++++++++++-- .../fixtures/absent-cff-charset-glyph.pdf | Bin 0 -> 1870 bytes .../declared-encoding-overrides-builtin.pdf | Bin 0 -> 1926 bytes .../differences-only-embedded-cff.pdf | Bin 0 -> 1878 bytes .../tests/fixtures/embedded-non-zapf-a1.pdf | Bin 0 -> 1033 bytes .../tests/fixtures/finite-form-reentry.pdf | Bin 0 -> 798 bytes .../fontawesome-tounicode-occupied.pdf | Bin 0 -> 1304 bytes .../fixtures/no-encoding-missing-slot-cff.pdf | Bin 0 -> 1842 bytes .../tests/fixtures/non-zapf-differences.pdf | Bin 0 -> 627 bytes .../notdef-difference-embedded-cff.pdf | Bin 0 -> 1879 bytes .../tests/fixtures/recursive-form-xobject.pdf | Bin 0 -> 637 bytes .../tests/fixtures/symbol-differences.pdf | Bin 0 -> 614 bytes .../fixtures/type1-encoding-code-300.pdf | Bin 0 -> 1041 bytes .../tests/fixtures/xobject-depth-101.pdf | Bin 0 -> 14857 bytes .../fixtures/zapf-dingbats-differences.pdf | Bin 0 -> 617 bytes 17 files changed, 327 insertions(+), 59 deletions(-) create mode 100644 frontend/src-tauri/tests/fixtures/absent-cff-charset-glyph.pdf create mode 100644 frontend/src-tauri/tests/fixtures/declared-encoding-overrides-builtin.pdf create mode 100644 frontend/src-tauri/tests/fixtures/differences-only-embedded-cff.pdf create mode 100644 frontend/src-tauri/tests/fixtures/embedded-non-zapf-a1.pdf create mode 100644 frontend/src-tauri/tests/fixtures/finite-form-reentry.pdf create mode 100644 frontend/src-tauri/tests/fixtures/fontawesome-tounicode-occupied.pdf create mode 100644 frontend/src-tauri/tests/fixtures/no-encoding-missing-slot-cff.pdf create mode 100644 frontend/src-tauri/tests/fixtures/non-zapf-differences.pdf create mode 100644 frontend/src-tauri/tests/fixtures/notdef-difference-embedded-cff.pdf create mode 100644 frontend/src-tauri/tests/fixtures/recursive-form-xobject.pdf create mode 100644 frontend/src-tauri/tests/fixtures/symbol-differences.pdf create mode 100644 frontend/src-tauri/tests/fixtures/type1-encoding-code-300.pdf create mode 100644 frontend/src-tauri/tests/fixtures/xobject-depth-101.pdf create mode 100644 frontend/src-tauri/tests/fixtures/zapf-dingbats-differences.pdf diff --git a/frontend/src-tauri/patches/pdf-extract-0.12.0/MAPLE_PATCHES.md b/frontend/src-tauri/patches/pdf-extract-0.12.0/MAPLE_PATCHES.md index 8445a5b2..21ccca50 100644 --- a/frontend/src-tauri/patches/pdf-extract-0.12.0/MAPLE_PATCHES.md +++ b/frontend/src-tauri/patches/pdf-extract-0.12.0/MAPLE_PATCHES.md @@ -6,19 +6,38 @@ This directory starts from the published `pdf-extract` 0.12.0 crate: - crates.io archive SHA-256: `417e8fdc940f1d5bc62c5f89864c3a2255f74f69aa353c98509213d67df61e73` -Maple carries three narrowly scoped changes: +Maple carries four narrowly scoped changes: 1. Prefer an explicit PDF `/Encoding` over an embedded CFF font's built-in - encoding. This prevents confirmed accented-text corruption introduced in - 0.11.0. + encoding, while preserving that built-in encoding as the base for symbolic + or nonsymbolic embedded-font `Differences` dictionaries, using the standard + Symbol and ZapfDingbats built-in encodings when those fonts are not embedded, + leaving unmapped built-in slots empty, and treating every `Differences` entry + as a replacement for its base slot. Out-of-range embedded Type 1 codes are + ignored. Unknown FontAwesome glyph names retain an explicit `/ToUnicode` + mapping, while ZapfDingbats-only names are not applied to unrelated fonts. + This prevents confirmed character corruption + introduced after 0.10.0 and shipped in 0.12.0. The implementation is based on + [upstream PR #155](https://github.com/jrmuizel/pdf-extract/pull/155) at + commit `d87b1f4c05778bd45b17aec995ed00a0dab37624`, with the embedded-font + implicit-base and unmapped-slot corrections required by PDF 32000-1 Table + 114. 2. Cache fonts by the resolved font dictionary rather than by resource name. Resource names are local to each PDF resource dictionary, so a document may legally reuse `/F1` for different fonts across pages or nested XObjects. 3. Do not log the contents of Type 4 calculator-function streams. Those bytes are user-controlled document content, and the upstream UTF-8 conversion can itself panic. +4. Reject recursive Form XObject-and-resource pairs and cap Form XObject + nesting at 100 levels. Cycles otherwise recurse until the native stack + overflows and aborts the process, which cannot be recovered by a Rust panic + boundary. Including the effective resources in the cycle key preserves + valid finite re-entry through inherited resource dictionaries. The Type 4 handling and `lopdf` 0.42 dependency otherwise remain exactly as published in 0.12.0. Maple's PDF extractor tests cover the Type 4 crash and -both page-level and nested-XObject resource-name collisions. The CFF fix was -also compared against the upstream affected corpus during the upgrade audit. +both page-level and nested-XObject resource-name collisions. They also cover +the CFF named, implicit, and `Differences` encoding modes above; Symbol and +ZapfDingbats `Differences`; preservation of explicit `/ToUnicode` mappings; +recursive and excessively deep Form XObject errors; and valid finite Form +re-entry and sibling reuse. diff --git a/frontend/src-tauri/patches/pdf-extract-0.12.0/src/lib.rs b/frontend/src-tauri/patches/pdf-extract-0.12.0/src/lib.rs index 32a97d8a..a014320b 100644 --- a/frontend/src-tauri/patches/pdf-extract-0.12.0/src/lib.rs +++ b/frontend/src-tauri/patches/pdf-extract-0.12.0/src/lib.rs @@ -18,7 +18,7 @@ use std::fmt; use std::str; use std::fs::File; use std::slice::Iter; -use std::collections::HashMap; +use std::collections::{HashMap, HashSet}; use std::collections::hash_map::Entry; use std::rc::Rc; use std::marker::PhantomData; @@ -164,9 +164,14 @@ fn to_utf8(encoding: &[u16], s: &[u8]) -> String { if s.len() > 2 && s[0] == 0xfe && s[1] == 0xff { return UTF_16BE.decode_without_bom_handling_and_without_replacement(&s[2..]).unwrap().to_string() } else { - let r : Vec = s.iter().map(|x| *x).flat_map(|x| { + let mut r = Vec::with_capacity(s.len() * 2); + for &x in s { let k = encoding[x as usize]; - vec![(k>>8) as u8, k as u8].into_iter()}).collect(); + if k != 0 { + r.push((k >> 8) as u8); + r.push(k as u8); + } + } return UTF_16BE.decode_without_bom_handling_and_without_replacement(&r).unwrap().to_string() } } @@ -351,17 +356,32 @@ fn is_core_font(name: &str) -> bool { } } +fn glyph_encoding_to_unicode_table(encoding: &[Option<&str>]) -> Vec { + encoding.iter() + .map(|x| if let &Some(x) = x { glyphnames::name_to_unicode(x).unwrap() } else { 0 }) + .collect() +} + fn encoding_to_unicode_table(name: &[u8]) -> Vec { - let encoding = match &name[..] { - b"MacRomanEncoding" => encodings::MAC_ROMAN_ENCODING, - b"MacExpertEncoding" => encodings::MAC_EXPERT_ENCODING, - b"WinAnsiEncoding" => encodings::WIN_ANSI_ENCODING, + let encoding: &[Option<&str>] = match &name[..] { + b"MacRomanEncoding" => &encodings::MAC_ROMAN_ENCODING, + b"MacExpertEncoding" => &encodings::MAC_EXPERT_ENCODING, + b"WinAnsiEncoding" => &encodings::WIN_ANSI_ENCODING, _ => panic!("unexpected encoding {:?}", pdf_to_utf8(name)) }; - let encoding_table = encoding.iter() - .map(|x| if let &Some(x) = x { glyphnames::name_to_unicode(x).unwrap() } else { 0 }) - .collect(); - encoding_table + glyph_encoding_to_unicode_table(encoding) +} + +fn core_symbolic_encoding_to_unicode_table(name: &str) -> Option> { + match name { + "Symbol" => Some(glyph_encoding_to_unicode_table(&encodings::SYMBOL_ENCODING)), + "ZapfDingbats" => Some(encodings::ZAPFDINGBATS_ENCODING.iter() + .map(|glyph| glyph + .and_then(zapfglyphnames::zapfdigbats_names_to_unicode) + .unwrap_or(0)) + .collect()), + _ => None, + } } /* "Glyphs in the font are selected by single-byte character codes obtained from a string that @@ -374,6 +394,8 @@ impl<'a> PdfSimpleFont<'a> { fn new(doc: &'a Document, font: &'a Dictionary) -> PdfSimpleFont<'a> { let base_name = get_name_string(doc, font, b"BaseFont"); let subtype = get_name_string(doc, font, b"Subtype"); + let is_zapf_dingbats = base_name == "ZapfDingbats" + || base_name.ends_with("+ZapfDingbats"); let encoding: Option<&Object> = get(doc, font, b"Encoding"); dlog!("base_name {} {} enc:{:?} {:?}", base_name, subtype, encoding, font); @@ -415,14 +437,21 @@ impl<'a> PdfSimpleFont<'a> { //File::create(format!("/tmp/{}", base_name)).unwrap().write_all(&s); let encoding = table.encoding.get_code_to_sid_table(&table.charset); + let charset: Vec<_> = (0..table.number_of_glyphs()) + .filter_map(|gid| table.charset.gid_to_sid(cff_parser::GlyphId(gid))) + .collect(); let mapping: HashMap = encoding.into_iter().filter_map(|(cid, sid)| { - let name = cff_parser::string_by_id(&table, sid).unwrap(); - if name == ".notdef" { + if sid.0 == 0 || !charset.contains(&sid) { return None; } + let name = cff_parser::string_by_id(&table, sid).unwrap(); let unicode = glyphnames::name_to_unicode(&name).or_else(|| { - zapfglyphnames::zapfdigbats_names_to_unicode(name) + if is_zapf_dingbats { + zapfglyphnames::zapfdigbats_names_to_unicode(name) + } else { + None + } }); if unicode.is_none() { warn!("Couldn't find unicode for {}", name); @@ -449,10 +478,50 @@ impl<'a> PdfSimpleFont<'a> { //dlog!("charset {:?}", charset); } - // The PDF Encoding entry defines character codes in content streams; - // an embedded CFF font's built-in encoding is only a fallback. - if encoding.is_some() { - unicode_map = None; + // The font program's built-in encoding as a code -> unicode + // table, when the program carries one (a Type1 FontFile or a + // Type1C FontFile3), or the known built-in encoding of a + // symbolic Base-14 font. It is the base an /Encoding dictionary + // without a BaseEncoding builds on (PDF 32000-1 s9.6.6). + let builtin_base: Option> = if let Some(ref map) = unicode_map { + let mut table = vec![0u16; 256]; + for (&code, s) in map.iter() { + if code < 256 { + if let Some(unit) = s.encode_utf16().next() { + table[code as usize] = unit; + } + } + } + Some(table) + } else if let Some(ref type1_encoding) = type1_encoding { + let mut table = vec![0u16; 256]; + for (code, name) in type1_encoding { + if *code < 256 { + if let Some(unicode) = glyphnames::name_to_unicode(&pdf_to_utf8(name)) { + table[*code as usize] = unicode; + } + } + } + Some(table) + } else { + core_symbolic_encoding_to_unicode_table(&base_name) + }; + + // Without an embedded font program, the implicit base depends + // on whether the font is symbolic (FontDescriptor Flags bit 3). + let symbolic = descriptor + .and_then(|d| maybe_get::(doc, d, b"Flags")) + .map_or(base_name == "Symbol" || is_zapf_dingbats, |flags| flags & 4 != 0); + + // PDF 32000-1 s9.6.6: a declared /Encoding supersedes the font + // program's built-in encoding, so the built-in map must not + // answer decode lookups ahead of the declared table -- e.g. + // Arbortext Type1C subsets keep Standard-slot names (Oslash at + // 0xE9) where the declared WinAnsi text means eacute. The map + // stays present-but-empty so a Differences entry with an + // unresolvable name (issue #76) can still register into it. + if matches!(encoding, Some(&Object::Name(_)) | Some(&Object::Dictionary(_))) { + unicode_map = unicode_map.map(|_| HashMap::new()); } let mut unicode_map = match unicode_map { @@ -477,6 +546,12 @@ impl<'a> PdfSimpleFont<'a> { let mut table = if let Some(base_encoding) = maybe_get_name(doc, encoding, b"BaseEncoding") { dlog!("BaseEncoding {:?}", base_encoding); encoding_to_unicode_table(base_encoding) + } else if let Some(builtin) = builtin_base.clone() { + // Differences overlay an embedded font program's or + // nonembedded symbolic font's built-in encoding (Table 114). + builtin + } else if !symbolic { + glyph_encoding_to_unicode_table(&encodings::STANDARD_ENCODING) } else { Vec::from(PDFDocEncoding) }; @@ -490,9 +565,18 @@ impl<'a> PdfSimpleFont<'a> { &Object::Integer(i) => { code = i; }, &Object::Name(ref n) => { let name = pdf_to_utf8(&n); + // A Difference replaces the base slot even if the + // replacement is .notdef or has no Unicode mapping. + table[code as usize] = 0; // XXX: names of Type1 fonts can map to arbitrary strings instead of real // unicode names, so we should probably handle this differently - let unicode = glyphnames::name_to_unicode(&name); + let unicode = glyphnames::name_to_unicode(&name).or_else(|| { + if is_zapf_dingbats { + zapfglyphnames::zapfdigbats_names_to_unicode(&name) + } else { + None + } + }); if let Some(unicode) = unicode{ table[code as usize] = unicode; if let Some(ref mut unicode_map) = unicode_map { @@ -515,12 +599,7 @@ impl<'a> PdfSimpleFont<'a> { Some(ref mut unicode_map) if base_name.contains("FontAwesome") => { // the fontawesome tex package will use glyph names that don't have a corresponding unicode // code point, so we'll use an empty string instead. See issue #76 - match unicode_map.entry(code as u32) { - Entry::Vacant(v) => { v.insert("".to_owned()); } - Entry::Occupied(e) => { - panic!("unexpected entry in unicode map") - } - } + unicode_map.entry(code as u32).or_insert_with(String::new); } _ => { warn!("unknown glyph name '{}' for font {}", name, base_name); @@ -548,18 +627,8 @@ impl<'a> PdfSimpleFont<'a> { encoding_table = Some(table); } None => { - if let Some(type1_encoding) = type1_encoding { - let mut table = Vec::from(PDFDocEncoding); - dlog!("type1encoding"); - for (code, name) in type1_encoding { - let unicode = glyphnames::name_to_unicode(&pdf_to_utf8(&name)); - if let Some(unicode) = unicode { - table[code as usize] = unicode; - } else { - dlog!("unknown character {}", pdf_to_utf8(&name)); - } - } - encoding_table = Some(table) + if let Some(builtin) = builtin_base { + encoding_table = Some(builtin) } else if subtype == "TrueType" { encoding_table = Some(encodings::WIN_ANSI_ENCODING.iter() .map(|x| if let &Some(x) = x { glyphnames::name_to_unicode(x).unwrap() } else { 0 }) @@ -615,7 +684,11 @@ impl<'a> PdfSimpleFont<'a> { if let Some(ref encoding) = encoding_table { dlog!("has encoding"); for w in font_metrics.2 { - let c = glyphnames::name_to_unicode(w.2).unwrap(); + let c = if is_zapf_dingbats { + zapfglyphnames::zapfdigbats_names_to_unicode(w.2) + } else { + glyphnames::name_to_unicode(w.2) + }.unwrap(); for i in 0..encoding.len() { if encoding[i] == c { width_map.insert(i as CharCode, w.1 as f64); @@ -1573,17 +1646,26 @@ fn make_colorspace<'a>(doc: &'a Document, name: &[u8], resources: &'a Dictionary } } +// Match lopdf's parser nesting limit while bounding pdf-extract's separate +// recursive walk through Form XObjects. +const MAX_XOBJECT_DEPTH: usize = 100; + struct Processor<'a> { font_table: HashMap<*const Dictionary, Rc>, + active_xobjects: HashSet<(*const Stream, *const Dictionary)>, _none: PhantomData<&'a ()>, } impl<'a> Processor<'a> { fn new() -> Processor<'a> { - Processor { font_table: HashMap::new(), _none: PhantomData } + Processor { + font_table: HashMap::new(), + active_xobjects: HashSet::new(), + _none: PhantomData, + } } - fn process_stream(&mut self, doc: &'a Document, content: Vec, resources: &'a Dictionary, media_box: &MediaBox, output: &mut dyn OutputDev, page_num: u32) -> Result<(), OutputError> { + fn process_stream(&mut self, doc: &'a Document, content: Vec, resources: &'a Dictionary, media_box: &MediaBox, output: &mut dyn OutputDev, page_num: u32, xobject_depth: usize) -> Result<(), OutputError> { let content = Content::decode(&content).unwrap(); let mut gs: GraphicsState = GraphicsState { ts: TextState { @@ -1867,12 +1949,25 @@ impl<'a> Processor<'a> { "Do" => { // `Do` process an entire subdocument, so we do a recursive call to `process_stream` // with the subdocument content and resources + if xobject_depth >= MAX_XOBJECT_DEPTH { + return Err(lopdf::Error::InvalidStream(format!( + "Form XObject nesting exceeds {MAX_XOBJECT_DEPTH} levels" + )).into()); + } let xobject: &Dictionary = get(&doc, resources, b"XObject"); let name = operation.operands[0].as_name().unwrap(); let xf: &Stream = get(&doc, xobject, name); let resources = maybe_get_obj(&doc, &xf.dict, b"Resources").and_then(|n| n.as_dict().ok()).unwrap_or(resources); + let xobject_key = (xf as *const Stream, resources as *const Dictionary); + if !self.active_xobjects.insert(xobject_key) { + return Err(lopdf::Error::InvalidStream( + "recursive Form XObject reference".to_string() + ).into()); + } let contents = get_contents(xf); - self.process_stream(&doc, contents, resources, &media_box, output, page_num)?; + let result = self.process_stream(&doc, contents, resources, &media_box, output, page_num, xobject_depth + 1); + self.active_xobjects.remove(&xobject_key); + result?; } _ => { dlog!("unknown operation {:?}", operation); } @@ -2417,7 +2512,7 @@ fn output_doc_inner<'a>(page_num: u32, object_id: ObjectId, doc: &'a Document, p let art_box = get::>>(&doc, page_dict, b"ArtBox") .map(|x| (x[0], x[1], x[2], x[3])); output.begin_page(page_num, &media_box, art_box)?; - p.process_stream(&doc, doc.get_page_content(object_id).unwrap(), resources, &media_box, output, page_num)?; + p.process_stream(&doc, doc.get_page_content(object_id).unwrap(), resources, &media_box, output, page_num, 0)?; output.end_page()?; Ok(()) } diff --git a/frontend/src-tauri/src/pdf_extractor.rs b/frontend/src-tauri/src/pdf_extractor.rs index 4545b57b..35a969c9 100644 --- a/frontend/src-tauri/src/pdf_extractor.rs +++ b/frontend/src-tauri/src/pdf_extractor.rs @@ -82,6 +82,33 @@ mod tests { include_bytes!("../tests/fixtures/page-font-name-collision.pdf"); const XOBJECT_FONT_COLLISION_PDF: &[u8] = include_bytes!("../tests/fixtures/xobject-font-name-collision.pdf"); + const DECLARED_ENCODING_CFF_PDF: &[u8] = + include_bytes!("../tests/fixtures/declared-encoding-overrides-builtin.pdf"); + const TYPE1_OUT_OF_RANGE_ENCODING_PDF: &[u8] = + include_bytes!("../tests/fixtures/type1-encoding-code-300.pdf"); + const DIFFERENCES_ONLY_CFF_PDF: &[u8] = + include_bytes!("../tests/fixtures/differences-only-embedded-cff.pdf"); + const NO_ENCODING_MISSING_SLOT_CFF_PDF: &[u8] = + include_bytes!("../tests/fixtures/no-encoding-missing-slot-cff.pdf"); + const ABSENT_CFF_CHARSET_GLYPH_PDF: &[u8] = + include_bytes!("../tests/fixtures/absent-cff-charset-glyph.pdf"); + const NOTDEF_DIFFERENCE_CFF_PDF: &[u8] = + include_bytes!("../tests/fixtures/notdef-difference-embedded-cff.pdf"); + const SYMBOL_DIFFERENCES_PDF: &[u8] = + include_bytes!("../tests/fixtures/symbol-differences.pdf"); + const ZAPF_DINGBATS_DIFFERENCES_PDF: &[u8] = + include_bytes!("../tests/fixtures/zapf-dingbats-differences.pdf"); + const NON_ZAPF_DIFFERENCES_PDF: &[u8] = + include_bytes!("../tests/fixtures/non-zapf-differences.pdf"); + const EMBEDDED_NON_ZAPF_A1_PDF: &[u8] = + include_bytes!("../tests/fixtures/embedded-non-zapf-a1.pdf"); + const FONTAWESOME_TOUNICODE_PDF: &[u8] = + include_bytes!("../tests/fixtures/fontawesome-tounicode-occupied.pdf"); + const FINITE_XOBJECT_REENTRY_PDF: &[u8] = + include_bytes!("../tests/fixtures/finite-form-reentry.pdf"); + const RECURSIVE_XOBJECT_PDF: &[u8] = + include_bytes!("../tests/fixtures/recursive-form-xobject.pdf"); + const DEEP_XOBJECT_PDF: &[u8] = include_bytes!("../tests/fixtures/xobject-depth-101.pdf"); const INVALID_PDF: &[u8] = include_bytes!("../tests/fixtures/invalid.pdf"); async fn extract_pdf(pdf: &[u8], filename: &str) -> super::DocumentResponse { @@ -94,6 +121,12 @@ mod tests { .expect("expected PDF extraction to succeed") } + fn compact_text(text: &str) -> String { + text.chars() + .filter(|character| !character.is_whitespace()) + .collect() + } + #[tokio::test] async fn extract_document_content_text_plain_success() { let file_base64 = BASE64.encode(b"Hello, Maple!"); @@ -127,12 +160,7 @@ mod tests { #[tokio::test] async fn extract_document_content_keeps_page_font_resources_scoped() { let response = extract_pdf(PAGE_FONT_COLLISION_PDF, "page-fonts.pdf").await; - let text: String = response - .document - .text_content - .chars() - .filter(|character| !character.is_whitespace()) - .collect(); + let text = compact_text(&response.document.text_content); assert_eq!(text, "AB"); } @@ -140,16 +168,142 @@ mod tests { #[tokio::test] async fn extract_document_content_keeps_xobject_font_resources_scoped() { let response = extract_pdf(XOBJECT_FONT_COLLISION_PDF, "xobject-fonts.pdf").await; - let text: String = response - .document - .text_content - .chars() - .filter(|character| !character.is_whitespace()) - .collect(); + let text = compact_text(&response.document.text_content); assert_eq!(text, "AB"); } + #[tokio::test] + async fn declared_encoding_overrides_embedded_cff_encoding() { + let response = extract_pdf(DECLARED_ENCODING_CFF_PDF, "declared-encoding.pdf").await; + + assert_eq!(response.document.text_content.trim(), "Mooré"); + } + + #[tokio::test] + async fn declared_encoding_ignores_out_of_range_type1_builtin_codes() { + let response = extract_pdf(TYPE1_OUT_OF_RANGE_ENCODING_PDF, "type1-code-300.pdf").await; + + assert_eq!(response.document.text_content.trim(), "A"); + } + + #[tokio::test] + async fn differences_only_encoding_uses_embedded_cff_base() { + let response = extract_pdf(DIFFERENCES_ONLY_CFF_PDF, "differences-only.pdf").await; + + assert_eq!(response.document.text_content.trim(), "éMoorØ"); + } + + #[tokio::test] + async fn embedded_cff_without_declared_encoding_skips_unmapped_slots() { + let response = extract_pdf(NO_ENCODING_MISSING_SLOT_CFF_PDF, "no-encoding.pdf").await; + + assert_eq!(response.document.text_content.trim(), "MoorØ"); + } + + #[tokio::test] + async fn embedded_cff_skips_encoding_entries_absent_from_its_charset() { + let response = extract_pdf(ABSENT_CFF_CHARSET_GLYPH_PDF, "absent-cff-glyph.pdf").await; + + assert_eq!(response.document.text_content.trim(), "Moor"); + } + + #[tokio::test] + async fn notdef_difference_clears_the_embedded_cff_base_slot() { + let response = extract_pdf(NOTDEF_DIFFERENCE_CFF_PDF, "notdef-difference.pdf").await; + + assert_eq!(response.document.text_content.trim(), "MoorØ"); + } + + #[tokio::test] + async fn differences_only_encoding_uses_symbol_font_base() { + let response = extract_pdf(SYMBOL_DIFFERENCES_PDF, "symbol-differences.pdf").await; + + assert_eq!(response.document.text_content.trim(), "ΓΒ"); + } + + #[tokio::test] + async fn differences_only_encoding_uses_zapf_dingbats_font_base() { + let response = extract_pdf( + ZAPF_DINGBATS_DIFFERENCES_PDF, + "zapf-dingbats-differences.pdf", + ) + .await; + + assert_eq!(response.document.text_content.trim(), "✁✁"); + } + + #[tokio::test] + async fn zapf_glyph_names_do_not_apply_to_other_fonts() { + let response = extract_pdf(NON_ZAPF_DIFFERENCES_PDF, "non-zapf-differences.pdf").await; + + assert_eq!(response.document.text_content.trim(), "B"); + } + + #[tokio::test] + async fn embedded_zapf_glyph_names_do_not_apply_to_other_fonts() { + let response = extract_pdf(EMBEDDED_NON_ZAPF_A1_PDF, "embedded-non-zapf-a1.pdf").await; + + assert!(response.document.text_content.trim().is_empty()); + } + + #[tokio::test] + async fn unknown_fontawesome_difference_preserves_tounicode_mapping() { + let response = extract_pdf(FONTAWESOME_TOUNICODE_PDF, "fontawesome-tounicode.pdf").await; + + assert_eq!(response.document.text_content.trim(), "✉"); + } + + #[tokio::test] + async fn form_xobjects_may_reenter_with_different_resources_and_repeat() { + let response = extract_pdf(FINITE_XOBJECT_REENTRY_PDF, "finite-reentry.pdf").await; + + assert_eq!(response.status, "completed"); + } + + #[tokio::test] + async fn excessive_form_xobject_nesting_returns_an_error() { + let error = extract_document_content( + BASE64.encode(DEEP_XOBJECT_PDF), + "deep-xobjects.pdf".to_string(), + "application/pdf".to_string(), + ) + .await + .expect_err("expected excessive Form XObject nesting to fail extraction"); + + assert!( + error.starts_with(PDF_EXTRACTION_FAILED), + "unexpected error: {error}" + ); + assert!( + error.contains("Form XObject nesting exceeds 100 levels"), + "unexpected error: {error}" + ); + } + + #[tokio::test] + async fn recursive_form_xobjects_return_an_error_without_aborting() { + let error = extract_document_content( + BASE64.encode(RECURSIVE_XOBJECT_PDF), + "recursive-xobject.pdf".to_string(), + "application/pdf".to_string(), + ) + .await + .expect_err("expected recursive Form XObjects to fail extraction"); + + assert!( + error.starts_with(PDF_EXTRACTION_FAILED), + "unexpected error: {error}" + ); + assert!( + error.contains("recursive Form XObject reference"), + "unexpected error: {error}" + ); + + let response = extract_pdf(TYPE4_PDF, "after-recursive-xobject.pdf").await; + assert!(response.document.text_content.contains("Type 4 regression")); + } + #[tokio::test] async fn pdf_parser_panics_are_returned_as_errors() { let error = run_pdf_extraction(|| -> Result { diff --git a/frontend/src-tauri/tests/fixtures/absent-cff-charset-glyph.pdf b/frontend/src-tauri/tests/fixtures/absent-cff-charset-glyph.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f342d693cefcdfd270bf6712d4b5d8dfe45473c9 GIT binary patch literal 1870 zcmeHI&2G~`5Vj>yB_n7jQS$n@J`Au(|?v#zvx9=BU4GJdk z;}c_lp9JqFj5IeMKyhl1tqfC-69f=SX!`#eh07^ydt!GK}SSWnk=NUetzcu6K?V;E*& zTjVe-=9X=fw@D<22t;<9XLAOdf8d}0Krh#aCKLTEnMj_2yQ&DvT)(|bbiVmzIL3>- zyt&>ej8R$gwfbC|wyokeR!p-;4p1bMel3kh3`|lJeI;kOLR4TiS8&wQ$#a&(L#c#@ zbR-+UK~NsmOGeCw-BqT_ESRpSOM?_rMjcevLd$gRhOX(lerw5FnfK1mW}h$po1gBU z{e1f1%Y7{$y0)YFT1We+U1(dne*000K0A0l`*Hs8(w}|!$97-<3m-+1RRhwc&&7_g=A#rF)|$_Qb3mA zB^{$WE}vg-L?fj%*><}StxdZ)mJQ27>OBN-m;?1v-O8TVeO+-ns2RD)ky@s~g>32C4PDc9{np|&lzH#` zZ1&~Szxny@+3%+hzTVferE6Q7ul2M~+J&~E>$e|O$g{oIvtQ>AFa6oaKmNv@|Mk2o ztf!m}3=0~Db+y2))tnj(;0hxsziL6Uz+4pi5=LwsawW{JV)IIvgW_7kh}~?iVAaNw opX3z34bSFhFaE%wfwL-2)#xkcrjV4&?0rbxvW-fm`^q!^0#xzaB>(^b literal 0 HcmV?d00001 diff --git a/frontend/src-tauri/tests/fixtures/differences-only-embedded-cff.pdf b/frontend/src-tauri/tests/fixtures/differences-only-embedded-cff.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ba3f805eb56588ad38ef7d7ae4ef6197d4747fd7 GIT binary patch literal 1878 zcmeHIOKaOe5SE}Npwj1|(A!)LEhSm4WH}Bb20v+N(wbOp55b3xy_OYh$!OP*_S9n` z^zZag$f-XdhyH{1ROr3Vq0kvciEUAO>d^~AJG0-sR+?`L?M7>zZxpSc&WNd zk;E+Co{R!L1h-tND4j?#wrW0*7pDmR05&m_ZG+#3$JPBfPJX<90{$^HeR6ea09Rfq z?qU^`5$jBkG+i0p8)r44WUBV1(s-n#X3eM<_roZ_6wI%g+?UJI_ovaHmj;0(HfpG@=SYzBd1QD z$uJmdA{^Gya{L-Wsn=FGk}hm6r%Ga$>JrD)Sw?BxLx#;b%`|S9hH09&=82Pd@9cE; z`J#RE)7{fwPak}_Z=}mKHjK8>F+LjS#+qr~epKK)yRT+H&mLa1XCHpI*Y5nU{a;A* zB#{HlhO%W}FDQAQ>%jo7bsVXd7DRJh2`58N$2ktJoX&A@*yMDsy_MH-2bn*I8MMV&D+vuuV3OtHh4H8>#RD zAXU5&QeFTF@gm$w4@k_ohWzx(UcB?oxAV=POTkflPwba%0S=^R=l096ZfLJ{teESIo&lJ+~==_x$#z4B-e4P|0y19KzGaGYHS&IHVv2wWyc`*VCs|cz1qgs8`f5!JAU691fK> z=+esYcARO`8p{kSK0lSK`}=rk#=2K=oPJ)`kgm@bZ_x z`~4B2x1?ZJ7}VuIZXg;(Rjt gnY-~v1y$ZjQ~Vu^acLtnlNVDJo?R*(ziHcl0M_3(ga7~l literal 0 HcmV?d00001 diff --git a/frontend/src-tauri/tests/fixtures/finite-form-reentry.pdf b/frontend/src-tauri/tests/fixtures/finite-form-reentry.pdf new file mode 100644 index 0000000000000000000000000000000000000000..68d8742e0cd661bea1e8ad4f2ea1762aa98fca1a GIT binary patch literal 798 zcmbVKOK!q25Di^=(<^wBW$T1Opc0Bi_()YhpirquC<{Xd3N3LJ8!7Y-Jw?|&K{s9Y z6g^8l7zjeyv{962$1{F2?~UDWchB7O8nHh=zJ7>H9V*5P(rB>z^$V~*pMhl8^H`2N zeH2ElC02=|uJ02_Vhk-Gr3`!H1xyqhti}qj=!$g7f_-X&Z(xWrO)E&`b6(a%qK@ zBX*UtW(QE2n@V$pj0vNX5f1RCmjQ+Wfdq$q~fW{QkW92>=E1U G^t!)S@8vN7 literal 0 HcmV?d00001 diff --git a/frontend/src-tauri/tests/fixtures/fontawesome-tounicode-occupied.pdf b/frontend/src-tauri/tests/fixtures/fontawesome-tounicode-occupied.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f917f741b6438944fb5afbd0b24ce0afc7381146 GIT binary patch literal 1304 zcmZuxO>f&U488kT@KT^XY?d8+Nr9k1J{l}oyB3YN9f}?ln|4$rk|8TwvtK__cG5JN zVFMQR$VWa>x_F$Y`?PtzXTL*TxfS$$c8#+rH^Dfgs1d{oWF^r;A|NZ^ za&!gRE8J!rrbBi*Fzr5IE1XX%Tx^%l>&V6k!m(_y-T9%F%dm008vUVqHl+4U*~U#) z(!!S%!aI4i_@xTBB1uy(0DDcb$*roLA+)bAyw$lWl&-uOZ5jttI8|kdBrdD=%;8c0 z#@blV^*nI=OOD^F5Rjp;kJ@B~kp`BC-^nEpRnlY7+bhSp} z3P(-OGeCO~G7T^2cOvVrsH#=Bvv9ci2?KF7RGj%f(?eVP4CuNQPUh1&2~TroO};<} zrP77%rU{lgdtOIsl>>8q->(Y3QpU8ni@8FVKc?IEvEzoiY_J+l_ zuGhF}OQ4x7u%tluvTpTaw|ARw8L<;4YU#NlO)Yb@QdbxZg}8y?Z0673$zJENEOVNl zV3>HNt1sn{K)$tn-h912Ehbl*=A=DfP@9^kegA!&`Zr6N3K#_9@X+9< zy%b7#w_StZ1^sSI2WPe@qBF$L5iU;XLOQYaV!9hnY-w_C>r)#KIA^6=BdJ2S#X|i> c7|ov$Yn0})(Y+&;{Le|3g>(f|Me literal 0 HcmV?d00001 diff --git a/frontend/src-tauri/tests/fixtures/no-encoding-missing-slot-cff.pdf b/frontend/src-tauri/tests/fixtures/no-encoding-missing-slot-cff.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4e33eeef02226f55725b5d78be1f67336c303958 GIT binary patch literal 1842 zcmeHIO>5gg5S5@MpwiDnp|`mhT1v87$zOrQU^_7lOC zLjO(=g`D~Wa_B#3Plev=915M0<;W4Gryji^wEOn$%xJamZNb@VZSt+6QTX=#;;X^I zgy{Ih*x6z3+o@npPkH0WXO8C!2^P+_Yc)fJ10vCIm7I{+^I#ymHZgmw8O=fkJX=C| zehCJT1=5n}>_`j(uMwSgO{A8&1(j{9$J#92K{>Ij|G^lF8gFzIKwD1^@)ytIejJqf27DvSVxJ;Ya}I6Tftb^P$AK0 zrP44h^_qV)S!!3jgzlO8m9E{;HC@+lWrfr5-uc=5^QCk1)7`UQPak}_uO&^_wlqiU zXdkr;Z9~^@KPvFugIDvP=MOKP`G?=m#-0Dw|BFGM#$srgP&Le}2IW%8F2NA4Fpf4# z4Z;j7qwD7|&hb*pVU~p#Ne;8k?L5XU8_&XZ9xs}>=}Sz-9{!e??z>L#PC%8lqX=)T V^e;)}#VYw2UbZZwP}qOj`U6IX%OU^( literal 0 HcmV?d00001 diff --git a/frontend/src-tauri/tests/fixtures/non-zapf-differences.pdf b/frontend/src-tauri/tests/fixtures/non-zapf-differences.pdf new file mode 100644 index 0000000000000000000000000000000000000000..058981704adc0a179f27034e27b14c9be12368df GIT binary patch literal 627 zcmZWnO;3YB5WUZ@mbXmSmO%rKLOw`!4+!_ztvLH=m4Qx&IPkQhl=pS*0(%Rwz z2|V7s_hxpT={UKP*FHGkKc8P9(M7Xd!(ad+eSg&`M#`#Li%MB zbe;)><=)wr2$P^C4|i;YR=ESUhBIW_Ldj`15(*RR$yC#egGW)CxG+$v(T9S{xoVao ziAB6kk;ZxqZoS!5IupUZ)$)P7I2G_Cs9_}A20w&{>swN0-`_m~e-FAoxjHw1nOBN? zxeCgN4W_%Au8i)DvsR!)uJ(n}c%+18-E<_wB#kloP7*}|tHz3Usvaw+QimcMVkNyK zQ@TA4GH@NX85DcRb=m7A)MJEWmRHZ!9bEkb|NIArIZt$i8fD3WmKjtRnSsRR9-gCf zCT)VNX<4)}l9IsSx pa?EUX7T{;eXebVnw*u;HTS^>j#aB`~$aG!|uX+uuRO-Iy{RR^=*aZLp literal 0 HcmV?d00001 diff --git a/frontend/src-tauri/tests/fixtures/recursive-form-xobject.pdf b/frontend/src-tauri/tests/fixtures/recursive-form-xobject.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0e536b563cbe637ba56661f41125fdca17c52e6a GIT binary patch literal 637 zcmbu7KW~FD5XE!Yy6&TU(;`gjcnDy01@fiCOzUo z+j)Xj4gtlQFnUaOtxd}Y!cOhk$#sj+H{wZ~YPF7yY?X#b5?C{B!9 z(6uC(PU?OsVfI*mDm*L9nF|qfe+NWi=!cNQpv}RqLOp2VY@~Uf!Ju*Fn*`BF^XJn+ k(@K;TDtmj9@*5#CCnY5ve0OUaEtIyLK^QQ{dECV82R#p|W&i*H literal 0 HcmV?d00001 diff --git a/frontend/src-tauri/tests/fixtures/symbol-differences.pdf b/frontend/src-tauri/tests/fixtures/symbol-differences.pdf new file mode 100644 index 0000000000000000000000000000000000000000..72582a4473c3678bce6b7b6f09c8f6826e8e2134 GIT binary patch literal 614 zcmZWn%WlFj5WM><=7Q87THAS`RzgTkfgakb2y#Ol3~|yR5?6_lpkLp09)%Vwhj?~& zXLi?v`DAt{?*k?wU^Y888iB{BFAe^ztlFCle6BKG!z021<1y1^;)w44H=*V6*F34Q z@*RCmRm`EZkQa$Aa-Ha8DoxZ@hrjD2SCKhlC5Z0{0VxF4Tj<&xsx29EPG^QPnjeYK zDUy!+NVc?8twzwHy=`~z)!%fP*-!Ysb649+tAa%_Rh94p#3{)l5Qr1pJVm#NcbLYm zPDkwq;dJ|o?c^F)e0kW|W{?h);E}3z7daIhvj?A+Ta)Bv)^sq*(^S(0Tx+Xg2>zmq zLap0|diTdlr%YhT#P7i{4E+!(&e$WGD9SSyK3ri^l5=-1cwRv7;2-9Dw6PwumCEf&U488kTaEAcfp_Sy1#2bnNPMToDx-Dpo^-%1f#)_jNkpoEqn*REcvh&f} z@IfLU$;U@=Fu$8!iR&~Hz@d45iEeIym4}@IHj!R#ni|+#*2+PQfCsp}jg+YfNcZ;v zEsp)vm4l~*;Qug7vo{{ZMId?lfmFsSgtm3qFI8zdZeHPuBR=LF1m~FVLAhpcmq>`1 z&Kise2LTyX#5(k2S>rLAgS4|AY192!{a%^cuOSKSoVQADqj8B@1;i|0oQFivKDmorLBZd0i}OCw+Q`~L z61VD(PcuL+FbaHr;KR_%!qgju`B~wXG&uADqttZ4<3#ShD_yTU&%&$iU&zrx?aVaB zjzS}6wsb$T?Peo5O4ptRzJSX~4L;2mR|USsAS*s%{tdbw@Er9!tJEqws}^TNkk-mW zRPA?=5cvXjdmrI5s2a050O9-dezj=kkVpLV;ry~BgB6@@Um2euq82W#RpqD>em=%xLik^w-QCRVWSuNO+k*^(=@b<-6lIPtq=X=B98`x>7QBj EACt@;)c^nh literal 0 HcmV?d00001 diff --git a/frontend/src-tauri/tests/fixtures/xobject-depth-101.pdf b/frontend/src-tauri/tests/fixtures/xobject-depth-101.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f27cec98856fa82e462ec8dc39ed9a92a7387ca8 GIT binary patch literal 14857 zcmb`OOH5n^7=@=QK1Q*=@QqH@@lEghl@t~&kQj?4)W$}f#ZYc3jWA{&37W8E$&w{I zS+ZnhNK6bHlO}F(R~IHM>yDiy-g|yq2;!oLLr6XzbGSc;@a5n9^~urkA@6)rt^c(7 z^B+~O=GIy>x2qQ}IA4DMUG7Xa=kkv8`TT5W+H=F=n^O(vQmePvt$8CO)qHWbe6fEl zbp6WA?fgd9x!RlQmOo^?)n0HeUTiH*yTvQL^1b0q<(*cqeIxG_kNP)IeDp=W)U5^O zb4H3c=W@O{*S%FsM@Bl`cHUg5+6zWo<)iIOwfj?)siUKxb_)Eq4?RVhQce+3U6d*1 z6freLnNm)XP*apCR3R~k z+Mph%P{gEv7fzy{+M*t(QN*Nua3b~8CiOU#A|~yFlc}e+smJLQF=Zb<=TpR_b8tTO z)jst(pCTshgY&7c-bsDVr-(`W;C$+<_fntpDPqz-IG_6J-PGrNikP$y&ZoY5KMgpa zBBtyk;CzahbPmp^fqFj;IG-XW?Su1apx#dd&Zme;``~;UsQ1%=^C@D|J~*ES>ism} ze2SQ|kC5{zV$wM{pN8uFG~|4Wn6wYhr=fa34LP48ChddsX{g>$L(Zp&N&Db@8mjlx zkn<^G(mpt!hU)z^;(UsjvX6-KDPqz&IG;x9{WRiyikP$y&Zm)jKaDt_A|~yF^J%2s zPb1E!h)Mh4d>X0u(}?paV#+>Z&Zme;=iq!AtM}8G^C@D|J~*Go>isn4e2SQ~56-8t zdOwXhpCTshgY#*u-cMuBr-(`W;CvdZ_tS*)DPqb#63(ZHN$22vnyB~Fg!3t4(mpt! zChGk(;e3jiv=7dwiF!XxIG-XW?Su1aqTWvv&Zmee`$##TA|{=K^J%KyPgBmPh)Mh4 ze448F)0FcmV$wc1pQh^lH06AXn6wYhr>S~BO*x+;ChddsX{z2&GtQ@oDf`GcpCTrm zgY#*o-cK{mr-(`W;Cz~?_tT8?DPqz-IG<+f{WRlzikP$y&Zn7rKg~FwBBt!ab2*_} zPCE&wRL@oKsGiG7)pDoleQ*GE!r_zW9$7>GdoeZDYISQTUQF3V*U<^fbFbp& ztDTnzUgar6aqP9&Ek5fMH(PM}|J-fiA%{Ip&Fu9*lYJ@kQ}cv)lZ( zHD~u`_UNN8KjI%e$$r3;-Kbrk%5OSX=YPnHrzFl-(_SsC`3>i@#o2tR_{4ML#{EOG zB=jFNd8SgSoUK$!j2eCg&P*D92Ojyx@F(!-EyG{HV?DzG(6<6S-fvg~o)|Q208b7X zwt%OG4Ld+}!mtZG-7xF{&ny`Bf&OLS**?Q6aCX434m?*kYy!_mhHc=5F~c3;#cPJU zz)QK|9x%`|8~`t`0I&2L)__+B4I98~LxwHj^$ z1$;7W*a1GBFzfM083DpMgRZ+ literal 0 HcmV?d00001 diff --git a/frontend/src-tauri/tests/fixtures/zapf-dingbats-differences.pdf b/frontend/src-tauri/tests/fixtures/zapf-dingbats-differences.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c0b6acbd4e99e85ba94f00eb6ca7052bca5c9382 GIT binary patch literal 617 zcmZWn%TB^T6y5hLjtdf9=*;v%G$AA+uu&s{t|Tl5I;|zxA?=W$U+=wr2+E|3&Y5%X zIrq_jx5I<*v0|0qPP zNILwHY~d(dg|J0C+kEfTUrdp?4+H_bt6XXHr#FfztAZaQPDvJ_M4aII@#+Tg7L%Cs zwA8i{tlMR5I#;_Ai^JO0jbuVq+7!)pd;XG&R%*E^yh8 zAhcRFHFX6XOOtvMeNX-#^rI+gm@9R@ iGiALgi~QT5PgAj$hum&R<#g$4pJ5Psz24+)>iq!i!lDNN literal 0 HcmV?d00001