@cantoo/fontkit 2.0.5 → 2.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/dist/browser-module.mjs +4423 -1117
  2. package/dist/browser-module.mjs.map +1 -1
  3. package/dist/browser.cjs +4424 -1117
  4. package/dist/browser.cjs.map +1 -1
  5. package/dist/main.cjs +4424 -1117
  6. package/dist/main.cjs.map +1 -1
  7. package/dist/module.mjs +4423 -1117
  8. package/dist/module.mjs.map +1 -1
  9. package/package.json +3 -1
  10. package/src/CmapProcessor.js +59 -20
  11. package/src/DFont.js +114 -14
  12. package/src/TTFFont.js +259 -57
  13. package/src/TrueTypeCollection.js +54 -10
  14. package/src/WOFF2Font.js +128 -16
  15. package/src/WOFFFont.js +45 -8
  16. package/src/aat/AATFeatureMap.js +62 -18
  17. package/src/aat/AATLayoutEngine.js +33 -1
  18. package/src/aat/AATLookupTable.js +22 -4
  19. package/src/aat/AATMorxProcessor.js +189 -52
  20. package/src/aat/AATStateMachine.js +32 -0
  21. package/src/base.js +19 -0
  22. package/src/cff/CFFCharsets.js +3 -0
  23. package/src/cff/CFFDict.js +79 -9
  24. package/src/cff/CFFEncodings.js +2 -0
  25. package/src/cff/CFFFont.js +119 -23
  26. package/src/cff/CFFIndex.js +62 -5
  27. package/src/cff/CFFOperand.js +52 -17
  28. package/src/cff/CFFPointer.js +41 -2
  29. package/src/cff/CFFPrivateDict.js +14 -4
  30. package/src/cff/CFFStandardStrings.js +1 -0
  31. package/src/cff/CFFTop.js +103 -10
  32. package/src/decorators.js +32 -13
  33. package/src/encodings.js +22 -5
  34. package/src/fs.js +10 -0
  35. package/src/glyph/BBox.js +14 -0
  36. package/src/glyph/CFFGlyph.js +290 -148
  37. package/src/glyph/COLRGlyph.js +38 -3
  38. package/src/glyph/Glyph.js +68 -9
  39. package/src/glyph/GlyphVariationProcessor.js +135 -34
  40. package/src/glyph/Path.js +107 -20
  41. package/src/glyph/SBIXGlyph.js +57 -8
  42. package/src/glyph/StandardNames.js +1 -0
  43. package/src/glyph/TTFGlyph.js +176 -29
  44. package/src/glyph/TTFGlyphEncoder.js +32 -0
  45. package/src/glyph/WOFF2Glyph.js +23 -4
  46. package/src/layout/GlyphPosition.js +6 -0
  47. package/src/layout/GlyphRun.js +25 -7
  48. package/src/layout/KernProcessor.js +62 -3
  49. package/src/layout/LayoutEngine.js +86 -12
  50. package/src/layout/Script.js +27 -1
  51. package/src/layout/UnicodeLayoutEngine.js +29 -4
  52. package/src/opentype/GPOSProcessor.js +156 -45
  53. package/src/opentype/GSUBProcessor.js +92 -33
  54. package/src/opentype/GlyphInfo.js +52 -4
  55. package/src/opentype/GlyphIterator.js +51 -2
  56. package/src/opentype/OTLayoutEngine.js +66 -8
  57. package/src/opentype/OTProcessor.js +283 -70
  58. package/src/opentype/ShapingPlan.js +51 -3
  59. package/src/opentype/shapers/ArabicShaper.js +19 -0
  60. package/src/opentype/shapers/DefaultShaper.js +51 -7
  61. package/src/opentype/shapers/HangulShaper.js +85 -7
  62. package/src/opentype/shapers/HebrewShaper.js +45 -11
  63. package/src/opentype/shapers/IndicShaper.js +141 -26
  64. package/src/opentype/shapers/ThaiShaper.js +35 -4
  65. package/src/opentype/shapers/UniversalShaper.js +83 -17
  66. package/src/opentype/shapers/index.js +15 -2
  67. package/src/packages/unicode-properties/data-trie.js +1 -0
  68. package/src/packages/unicode-properties/data.js +12 -0
  69. package/src/packages/unicode-properties/dist/index.cjs +22 -9
  70. package/src/packages/unicode-properties/dist/index.cjs.map +2 -2
  71. package/src/packages/unicode-properties/dist/index.mjs +21 -9
  72. package/src/packages/unicode-properties/dist/index.mjs.map +2 -2
  73. package/src/packages/unicode-properties/index.js +65 -0
  74. package/src/packages/unicode-properties/package.json +1 -1
  75. package/src/packages/unicode-trie/builder.js +128 -7
  76. package/src/packages/unicode-trie/dist/builder.cjs +129 -16
  77. package/src/packages/unicode-trie/dist/builder.cjs.map +2 -2
  78. package/src/packages/unicode-trie/dist/builder.mjs +128 -16
  79. package/src/packages/unicode-trie/dist/builder.mjs.map +2 -2
  80. package/src/packages/unicode-trie/dist/index.cjs +22 -9
  81. package/src/packages/unicode-trie/dist/index.cjs.map +2 -2
  82. package/src/packages/unicode-trie/dist/index.mjs +21 -9
  83. package/src/packages/unicode-trie/dist/index.mjs.map +2 -2
  84. package/src/packages/unicode-trie/index.js +62 -10
  85. package/src/packages/unicode-trie/package.json +1 -1
  86. package/src/packages/unicode-trie/swap.js +13 -0
  87. package/src/subset/CFFSubset.js +112 -22
  88. package/src/subset/Subset.js +21 -1
  89. package/src/subset/TTFSubset.js +79 -36
  90. package/src/tables/BASE.js +1 -0
  91. package/src/tables/COLR.js +1 -0
  92. package/src/tables/CPAL.js +1 -0
  93. package/src/tables/DSIG.js +1 -0
  94. package/src/tables/EBDT.js +10 -3
  95. package/src/tables/EBLC.js +67 -7
  96. package/src/tables/GDEF.js +1 -0
  97. package/src/tables/GPOS.js +79 -16
  98. package/src/tables/GSUB.js +14 -3
  99. package/src/tables/HVAR.js +51 -5
  100. package/src/tables/JSTF.js +3 -2
  101. package/src/tables/LTSH.js +1 -0
  102. package/src/tables/OS2.js +1 -0
  103. package/src/tables/PCLT.js +1 -0
  104. package/src/tables/STAT.js +46 -6
  105. package/src/tables/VDMX.js +1 -0
  106. package/src/tables/VORG.js +1 -0
  107. package/src/tables/WOFF2Directory.js +56 -8
  108. package/src/tables/WOFFDirectory.js +14 -2
  109. package/src/tables/aat.js +160 -35
  110. package/src/tables/avar.js +1 -0
  111. package/src/tables/bsln.js +3 -2
  112. package/src/tables/cmap.js +26 -6
  113. package/src/tables/cvt.js +1 -0
  114. package/src/tables/directory.js +44 -16
  115. package/src/tables/feat.js +24 -2
  116. package/src/tables/fpgm.js +1 -0
  117. package/src/tables/fvar.js +32 -4
  118. package/src/tables/gasp.js +1 -0
  119. package/src/tables/glyf.js +1 -0
  120. package/src/tables/gvar.js +29 -2
  121. package/src/tables/hdmx.js +12 -1
  122. package/src/tables/head.js +1 -0
  123. package/src/tables/hhea.js +1 -0
  124. package/src/tables/hmtx.js +18 -2
  125. package/src/tables/index.js +1 -0
  126. package/src/tables/just.js +15 -4
  127. package/src/tables/kern.js +43 -6
  128. package/src/tables/loca.js +21 -8
  129. package/src/tables/maxp.js +1 -0
  130. package/src/tables/morx.js +14 -7
  131. package/src/tables/name.js +104 -23
  132. package/src/tables/opbd.js +2 -1
  133. package/src/tables/opentype.js +39 -4
  134. package/src/tables/post.js +8 -1
  135. package/src/tables/prep.js +1 -0
  136. package/src/tables/sbix.js +12 -1
  137. package/src/tables/variations.js +23 -3
  138. package/src/tables/vhea.js +1 -0
  139. package/src/tables/vmtx.js +18 -2
  140. package/src/utils.js +15 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../unicode-trie/index.js", "../../unicode-trie/swap.js", "../data.js", "../data-trie.js", "../index.js"],
4
- "sourcesContent": ["import { inflateSync } from 'fflate';\nimport { swap32LE } from './swap.js';\n\n// Shift size for getting the index-1 table offset.\nconst SHIFT_1 = 6 + 5;\n\n// Shift size for getting the index-2 table offset.\nconst SHIFT_2 = 5;\n\n// Difference between the two shift sizes,\n// for getting an index-1 offset from an index-2 offset. 6=11-5\nconst SHIFT_1_2 = SHIFT_1 - SHIFT_2;\n\n// Number of index-1 entries for the BMP. 32=0x20\n// This part of the index-1 table is omitted from the serialized form.\nconst OMITTED_BMP_INDEX_1_LENGTH = 0x10000 >> SHIFT_1;\n\n// Number of entries in an index-2 block. 64=0x40\nconst INDEX_2_BLOCK_LENGTH = 1 << SHIFT_1_2;\n\n// Mask for getting the lower bits for the in-index-2-block offset. */\nconst INDEX_2_MASK = INDEX_2_BLOCK_LENGTH - 1;\n\n// Shift size for shifting left the index array values.\n// Increases possible data size with 16-bit index values at the cost\n// of compactability.\n// This requires data blocks to be aligned by DATA_GRANULARITY.\nconst INDEX_SHIFT = 2;\n\n// Number of entries in a data block. 32=0x20\nconst DATA_BLOCK_LENGTH = 1 << SHIFT_2;\n\n// Mask for getting the lower bits for the in-data-block offset.\nconst DATA_MASK = DATA_BLOCK_LENGTH - 1;\n\n// The part of the index-2 table for U+D800..U+DBFF stores values for\n// lead surrogate code _units_ not code _points_.\n// Values for lead surrogate code _points_ are indexed with this portion of the table.\n// Length=32=0x20=0x400>>SHIFT_2. (There are 1024=0x400 lead surrogates.)\nconst LSCP_INDEX_2_OFFSET = 0x10000 >> SHIFT_2;\nconst LSCP_INDEX_2_LENGTH = 0x400 >> SHIFT_2;\n\n// Count the lengths of both BMP pieces. 2080=0x820\nconst INDEX_2_BMP_LENGTH = LSCP_INDEX_2_OFFSET + LSCP_INDEX_2_LENGTH;\n\n// The 2-byte UTF-8 version of the index-2 table follows at offset 2080=0x820.\n// Length 32=0x20 for lead bytes C0..DF, regardless of SHIFT_2.\nconst UTF8_2B_INDEX_2_OFFSET = INDEX_2_BMP_LENGTH;\nconst UTF8_2B_INDEX_2_LENGTH = 0x800 >> 6; // U+0800 is the first code point after 2-byte UTF-8\n\n// The index-1 table, only used for supplementary code points, at offset 2112=0x840.\n// Variable length, for code points up to highStart, where the last single-value range starts.\n// Maximum length 512=0x200=0x100000>>SHIFT_1.\n// (For 0x100000 supplementary code points U+10000..U+10ffff.)\n//\n// The part of the index-2 table for supplementary code points starts\n// after this index-1 table.\n//\n// Both the index-1 table and the following part of the index-2 table\n// are omitted completely if there is only BMP data.\nconst INDEX_1_OFFSET = UTF8_2B_INDEX_2_OFFSET + UTF8_2B_INDEX_2_LENGTH;\n\n// The alignment size of a data block. Also the granularity for compaction.\nconst DATA_GRANULARITY = 1 << INDEX_SHIFT;\n\nclass UnicodeTrie {\n constructor(data) {\n const isBuffer = (typeof data.readUInt32BE === 'function') && (typeof data.slice === 'function');\n\n if (isBuffer || data instanceof Uint8Array) {\n // read binary format\n let uncompressedLength;\n if (isBuffer) {\n this.highStart = data.readUInt32LE(0);\n this.errorValue = data.readUInt32LE(4);\n uncompressedLength = data.readUInt32LE(8);\n data = data.slice(12);\n } else {\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n this.highStart = view.getUint32(0, true);\n this.errorValue = view.getUint32(4, true);\n uncompressedLength = view.getUint32(8, true);\n data = data.subarray(12);\n }\n\n // inflate the actual trie data (raw deflate, matching builder)\n data = inflateSync(data, { out: new Uint8Array(uncompressedLength) });\n\n // swap bytes from little-endian\n swap32LE(data);\n\n this.data = new Uint32Array(data.buffer, data.byteOffset, data.byteLength >> 2);\n } else {\n // pre-parsed data\n ({ data: this.data, highStart: this.highStart, errorValue: this.errorValue } = data);\n }\n }\n\n get(codePoint) {\n let index;\n if ((codePoint < 0) || (codePoint > 0x10ffff)) {\n return this.errorValue;\n }\n\n if ((codePoint < 0xd800) || ((codePoint > 0xdbff) && (codePoint <= 0xffff))) {\n // Ordinary BMP code point, excluding leading surrogates.\n // BMP uses a single level lookup. BMP index starts at offset 0 in the index.\n // data is stored in the index array itself.\n index = (this.data[codePoint >> SHIFT_2] << INDEX_SHIFT) + (codePoint & DATA_MASK);\n return this.data[index];\n }\n\n if (codePoint <= 0xffff) {\n // Lead Surrogate Code Point. A Separate index section is stored for\n // lead surrogate code units and code points.\n // The main index has the code unit data.\n // For this function, we need the code point data.\n index = (this.data[LSCP_INDEX_2_OFFSET + ((codePoint - 0xd800) >> SHIFT_2)] << INDEX_SHIFT) + (codePoint & DATA_MASK);\n return this.data[index];\n }\n\n if (codePoint < this.highStart) {\n // Supplemental code point, use two-level lookup.\n index = this.data[(INDEX_1_OFFSET - OMITTED_BMP_INDEX_1_LENGTH) + (codePoint >> SHIFT_1)];\n index = this.data[index + ((codePoint >> SHIFT_2) & INDEX_2_MASK)];\n index = (index << INDEX_SHIFT) + (codePoint & DATA_MASK);\n return this.data[index];\n }\n\n return this.data[this.data.length - DATA_GRANULARITY];\n }\n}\n\nexport default UnicodeTrie;\n", "const isBigEndian = (new Uint8Array(new Uint32Array([0x12345678]).buffer)[0] === 0x12);\n\nconst swap = (b, n, m) => {\n let i = b[n];\n b[n] = b[m];\n b[m] = i;\n};\n\nconst swap32 = (array) => {\n const len = array.length;\n for (let i = 0; i < len; i += 4) {\n swap(array, i, i + 3);\n swap(array, i + 1, i + 2);\n }\n};\n\nexport const swap32LE = (array) => {\n if (isBigEndian) {\n swap32(array);\n }\n};\n", "export default { categories: ['Cc', 'Zs', 'Po', 'Sc', 'Ps', 'Pe', 'Sm', 'Pd', 'Nd', 'Lu', 'Sk', 'Pc', 'Ll', 'So', 'Lo', 'Pi', 'Cf', 'No', 'Pf', 'Lt', 'Lm', 'Mn', 'Me', 'Mc', 'Nl', 'Zl', 'Zp', 'Cs', 'Co'], combiningClasses: ['Not_Reordered', 'Above', 'Above_Right', 'Below', 'Attached_Above_Right', 'Attached_Below', 'Overlay', 'Iota_Subscript', 'Double_Below', 'Double_Above', 'Below_Right', 'Above_Left', 'CCC10', 'CCC11', 'CCC12', 'CCC13', 'CCC14', 'CCC15', 'CCC16', 'CCC17', 'CCC18', 'CCC19', 'CCC20', 'CCC21', 'CCC22', 'CCC23', 'CCC24', 'CCC25', 'CCC30', 'CCC31', 'CCC32', 'CCC27', 'CCC28', 'CCC29', 'CCC33', 'CCC34', 'CCC35', 'CCC36', 'Nukta', 'Virama', 'CCC84', 'CCC91', 'CCC103', 'CCC107', 'CCC118', 'CCC122', 'CCC129', 'CCC130', 'CCC132', 'Attached_Above', 'Below_Left', 'Left', 'Kana_Voicing', 'CCC26', 'Right'], scripts: ['Common', 'Latin', 'Bopomofo', 'Inherited', 'Greek', 'Coptic', 'Cyrillic', 'Armenian', 'Hebrew', 'Arabic', 'Syriac', 'Thaana', 'Nko', 'Samaritan', 'Mandaic', 'Devanagari', 'Bengali', 'Gurmukhi', 'Gujarati', 'Oriya', 'Tamil', 'Telugu', 'Kannada', 'Malayalam', 'Sinhala', 'Thai', 'Lao', 'Tibetan', 'Myanmar', 'Georgian', 'Hangul', 'Ethiopic', 'Cherokee', 'Canadian_Aboriginal', 'Ogham', 'Runic', 'Tagalog', 'Hanunoo', 'Buhid', 'Tagbanwa', 'Khmer', 'Mongolian', 'Limbu', 'Tai_Le', 'New_Tai_Lue', 'Buginese', 'Tai_Tham', 'Balinese', 'Sundanese', 'Batak', 'Lepcha', 'Ol_Chiki', 'Braille', 'Glagolitic', 'Tifinagh', 'Han', 'Hiragana', 'Katakana', 'Yi', 'Lisu', 'Vai', 'Bamum', 'Syloti_Nagri', 'Phags_Pa', 'Saurashtra', 'Kayah_Li', 'Rejang', 'Javanese', 'Cham', 'Tai_Viet', 'Meetei_Mayek', 'null', 'Linear_B', 'Lycian', 'Carian', 'Old_Italic', 'Gothic', 'Old_Permic', 'Ugaritic', 'Old_Persian', 'Deseret', 'Shavian', 'Osmanya', 'Osage', 'Elbasan', 'Caucasian_Albanian', 'Linear_A', 'Cypriot', 'Imperial_Aramaic', 'Palmyrene', 'Nabataean', 'Hatran', 'Phoenician', 'Lydian', 'Meroitic_Hieroglyphs', 'Meroitic_Cursive', 'Kharoshthi', 'Old_South_Arabian', 'Old_North_Arabian', 'Manichaean', 'Avestan', 'Inscriptional_Parthian', 'Inscriptional_Pahlavi', 'Psalter_Pahlavi', 'Old_Turkic', 'Old_Hungarian', 'Hanifi_Rohingya', 'Old_Sogdian', 'Sogdian', 'Elymaic', 'Brahmi', 'Kaithi', 'Sora_Sompeng', 'Chakma', 'Mahajani', 'Sharada', 'Khojki', 'Multani', 'Khudawadi', 'Grantha', 'Newa', 'Tirhuta', 'Siddham', 'Modi', 'Takri', 'Ahom', 'Dogra', 'Warang_Citi', 'Nandinagari', 'Zanabazar_Square', 'Soyombo', 'Pau_Cin_Hau', 'Bhaiksuki', 'Marchen', 'Masaram_Gondi', 'Gunjala_Gondi', 'Makasar', 'Cuneiform', 'Egyptian_Hieroglyphs', 'Anatolian_Hieroglyphs', 'Mro', 'Bassa_Vah', 'Pahawh_Hmong', 'Medefaidrin', 'Miao', 'Tangut', 'Nushu', 'Duployan', 'SignWriting', 'Nyiakeng_Puachue_Hmong', 'Wancho', 'Mende_Kikakui', 'Adlam'], eaw: ['N', 'Na', 'A', 'W', 'H', 'F'] };\n", "export default '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';\n", "import UnicodeTrie from '../unicode-trie/index.js';\nimport data from './data.js';\nimport trieBase64 from './data-trie.js';\n\nfunction decodeBase64(base64) {\n if (typeof Buffer !== 'undefined') {\n return new Uint8Array(Buffer.from(base64, 'base64'));\n }\n\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n\nconst trie = new UnicodeTrie(decodeBase64(trieBase64));\n\nconst log2 = Math.log2 || (n => Math.log(n) / Math.LN2);\nconst bits = n => ((log2(n) + 1) | 0);\n\n// compute the number of bits stored for each field\nconst CATEGORY_BITS = bits(data.categories.length - 1);\nconst COMBINING_BITS = bits(data.combiningClasses.length - 1);\nconst SCRIPT_BITS = bits(data.scripts.length - 1);\nconst EAW_BITS = bits(data.eaw.length - 1);\nconst NUMBER_BITS = 10;\n\n// compute shift and mask values for each field\nconst CATEGORY_SHIFT = COMBINING_BITS + SCRIPT_BITS + EAW_BITS + NUMBER_BITS;\nconst COMBINING_SHIFT = SCRIPT_BITS + EAW_BITS + NUMBER_BITS;\nconst SCRIPT_SHIFT = EAW_BITS + NUMBER_BITS;\nconst EAW_SHIFT = NUMBER_BITS;\nconst CATEGORY_MASK = (1 << CATEGORY_BITS) - 1;\nconst COMBINING_MASK = (1 << COMBINING_BITS) - 1;\nconst SCRIPT_MASK = (1 << SCRIPT_BITS) - 1;\nconst EAW_MASK = (1 << EAW_BITS) - 1;\nconst NUMBER_MASK = (1 << NUMBER_BITS) - 1;\n\nexport function getCategory(codePoint) {\n const val = trie.get(codePoint);\n return data.categories[(val >> CATEGORY_SHIFT) & CATEGORY_MASK];\n}\n\nexport function getCombiningClass(codePoint) {\n const val = trie.get(codePoint);\n return data.combiningClasses[(val >> COMBINING_SHIFT) & COMBINING_MASK];\n}\n\nexport function getScript(codePoint) {\n const val = trie.get(codePoint);\n return data.scripts[(val >> SCRIPT_SHIFT) & SCRIPT_MASK];\n}\n\nexport function getEastAsianWidth(codePoint) {\n const val = trie.get(codePoint);\n return data.eaw[(val >> EAW_SHIFT) & EAW_MASK];\n}\n\nexport function getNumericValue(codePoint) {\n let val = trie.get(codePoint);\n let num = val & NUMBER_MASK;\n\n if (num === 0) {\n return null;\n } else if (num <= 50) {\n return num - 1;\n } else if (num < 0x1e0) {\n const numerator = (num >> 4) - 12;\n const denominator = (num & 0xf) + 1;\n return numerator / denominator;\n } else if (num < 0x300) {\n val = (num >> 5) - 14;\n let exp = (num & 0x1f) + 2;\n\n while (exp > 0) {\n val *= 10;\n exp--;\n }\n return val;\n } else {\n val = (num >> 2) - 0xbf;\n let exp = (num & 3) + 1;\n while (exp > 0) {\n val *= 60;\n exp--;\n }\n return val;\n }\n}\n\nexport function isAlphabetic(codePoint) {\n const category = getCategory(codePoint);\n return (\n category === 'Lu'\n || category === 'Ll'\n || category === 'Lt'\n || category === 'Lm'\n || category === 'Lo'\n || category === 'Nl'\n );\n}\n\nexport function isDigit(codePoint) {\n return getCategory(codePoint) === 'Nd';\n}\n\nexport function isPunctuation(codePoint) {\n const category = getCategory(codePoint);\n return (\n category === 'Pc'\n || category === 'Pd'\n || category === 'Pe'\n || category === 'Pf'\n || category === 'Pi'\n || category === 'Po'\n || category === 'Ps'\n );\n}\n\nexport function isLowerCase(codePoint) {\n return getCategory(codePoint) === 'Ll';\n}\n\nexport function isUpperCase(codePoint) {\n return getCategory(codePoint) === 'Lu';\n}\n\nexport function isTitleCase(codePoint) {\n return getCategory(codePoint) === 'Lt';\n}\n\nexport function isWhiteSpace(codePoint) {\n const category = getCategory(codePoint);\n return (\n category === 'Zs'\n || category === 'Zl'\n || category === 'Zp'\n );\n}\n\nexport function isBaseForm(codePoint) {\n const category = getCategory(codePoint);\n return (\n category === 'Nd'\n || category === 'No'\n || category === 'Nl'\n || category === 'Lu'\n || category === 'Ll'\n || category === 'Lt'\n || category === 'Lm'\n || category === 'Lo'\n || category === 'Me'\n || category === 'Mc'\n );\n}\n\nexport function isMark(codePoint) {\n const category = getCategory(codePoint);\n return (\n category === 'Mn'\n || category === 'Me'\n || category === 'Mc'\n );\n}\n\n// Backwards compatibility.\nexport default {\n getCategory,\n getCombiningClass,\n getScript,\n getEastAsianWidth,\n getNumericValue,\n isAlphabetic,\n isDigit,\n isPunctuation,\n isLowerCase,\n isUpperCase,\n isTitleCase,\n isWhiteSpace,\n isBaseForm,\n isMark\n};\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { inflateSync } from 'fflate';\nimport { swap32LE } from './swap.js';\n\n/**\n * Pre-parsed trie payload (e.g. from UnicodeTrieBuilder.freeze).\n * @typedef {object} UnicodeTrieInit\n * @property {Int32Array | Uint32Array} data\n * @property {number} highStart\n * @property {number} errorValue\n */\n\n/**\n * Duck-type Node Buffer (has LE/BE readers + slice), matching prior runtime checks.\n * @param {unknown} value\n * @returns {value is Buffer}\n */\nfunction isNodeBuffer(value) {\n return (\n typeof value === 'object'\n && value !== null\n && 'readUInt32BE' in value\n && 'readUInt32LE' in value\n && 'slice' in value\n && typeof value.readUInt32BE === 'function'\n && typeof value.readUInt32LE === 'function'\n && typeof value.slice === 'function'\n );\n}\n\n// Shift size for getting the index-1 table offset.\nconst SHIFT_1 = 6 + 5;\n\n// Shift size for getting the index-2 table offset.\nconst SHIFT_2 = 5;\n\n// Difference between the two shift sizes,\n// for getting an index-1 offset from an index-2 offset. 6=11-5\nconst SHIFT_1_2 = SHIFT_1 - SHIFT_2;\n\n// Number of index-1 entries for the BMP. 32=0x20\n// This part of the index-1 table is omitted from the serialized form.\nconst OMITTED_BMP_INDEX_1_LENGTH = 0x10000 >> SHIFT_1;\n\n// Number of entries in an index-2 block. 64=0x40\nconst INDEX_2_BLOCK_LENGTH = 1 << SHIFT_1_2;\n\n// Mask for getting the lower bits for the in-index-2-block offset. */\nconst INDEX_2_MASK = INDEX_2_BLOCK_LENGTH - 1;\n\n// Shift size for shifting left the index array values.\n// Increases possible data size with 16-bit index values at the cost\n// of compactability.\n// This requires data blocks to be aligned by DATA_GRANULARITY.\nconst INDEX_SHIFT = 2;\n\n// Number of entries in a data block. 32=0x20\nconst DATA_BLOCK_LENGTH = 1 << SHIFT_2;\n\n// Mask for getting the lower bits for the in-data-block offset.\nconst DATA_MASK = DATA_BLOCK_LENGTH - 1;\n\n// The part of the index-2 table for U+D800..U+DBFF stores values for\n// lead surrogate code _units_ not code _points_.\n// Values for lead surrogate code _points_ are indexed with this portion of the table.\n// Length=32=0x20=0x400>>SHIFT_2. (There are 1024=0x400 lead surrogates.)\nconst LSCP_INDEX_2_OFFSET = 0x10000 >> SHIFT_2;\nconst LSCP_INDEX_2_LENGTH = 0x400 >> SHIFT_2;\n\n// Count the lengths of both BMP pieces. 2080=0x820\nconst INDEX_2_BMP_LENGTH = LSCP_INDEX_2_OFFSET + LSCP_INDEX_2_LENGTH;\n\n// The 2-byte UTF-8 version of the index-2 table follows at offset 2080=0x820.\n// Length 32=0x20 for lead bytes C0..DF, regardless of SHIFT_2.\nconst UTF8_2B_INDEX_2_OFFSET = INDEX_2_BMP_LENGTH;\nconst UTF8_2B_INDEX_2_LENGTH = 0x800 >> 6; // U+0800 is the first code point after 2-byte UTF-8\n\n// The index-1 table, only used for supplementary code points, at offset 2112=0x840.\n// Variable length, for code points up to highStart, where the last single-value range starts.\n// Maximum length 512=0x200=0x100000>>SHIFT_1.\n// (For 0x100000 supplementary code points U+10000..U+10ffff.)\n//\n// The part of the index-2 table for supplementary code points starts\n// after this index-1 table.\n//\n// Both the index-1 table and the following part of the index-2 table\n// are omitted completely if there is only BMP data.\nconst INDEX_1_OFFSET = UTF8_2B_INDEX_2_OFFSET + UTF8_2B_INDEX_2_LENGTH;\n\n// The alignment size of a data block. Also the granularity for compaction.\nconst DATA_GRANULARITY = 1 << INDEX_SHIFT;\n\nclass UnicodeTrie {\n /**\n * @param {Uint8Array | Buffer | UnicodeTrieInit} data\n */\n constructor(data) {\n if (isNodeBuffer(data) || data instanceof Uint8Array) {\n // read binary format\n /** @type {Uint8Array} */\n let bytes;\n let uncompressedLength;\n if (isNodeBuffer(data)) {\n this.highStart = data.readUInt32LE(0);\n this.errorValue = data.readUInt32LE(4);\n uncompressedLength = data.readUInt32LE(8);\n // View past the 12-byte header (avoids Buffer.slice \u2192 Uint8Array assignability issues).\n bytes = new Uint8Array(data.buffer, data.byteOffset + 12, data.byteLength - 12);\n } else {\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n this.highStart = view.getUint32(0, true);\n this.errorValue = view.getUint32(4, true);\n uncompressedLength = view.getUint32(8, true);\n bytes = data.subarray(12);\n }\n\n // inflate the actual trie data (raw deflate, matching builder)\n bytes = inflateSync(bytes, { out: new Uint8Array(uncompressedLength) });\n\n // swap bytes from little-endian\n swap32LE(bytes);\n\n /**\n * Compacted index + data table.\n * @type {Uint32Array | Int32Array}\n */\n this.data = new Uint32Array(bytes.buffer, bytes.byteOffset, bytes.byteLength >> 2);\n } else {\n // pre-parsed data\n /**\n * Compacted index + data table.\n * @type {Uint32Array | Int32Array}\n */\n this.data = data.data;\n /**\n * First code point of the final single-value range.\n * @type {number}\n */\n this.highStart = data.highStart;\n /**\n * Value returned for out-of-range code points.\n * @type {number}\n */\n this.errorValue = data.errorValue;\n }\n }\n\n /**\n * @param {number} codePoint\n * @returns {number}\n */\n get(codePoint) {\n let index;\n if ((codePoint < 0) || (codePoint > 0x10ffff)) {\n return this.errorValue;\n }\n\n if ((codePoint < 0xd800) || ((codePoint > 0xdbff) && (codePoint <= 0xffff))) {\n // Ordinary BMP code point, excluding leading surrogates.\n // BMP uses a single level lookup. BMP index starts at offset 0 in the index.\n // data is stored in the index array itself.\n index = (this.data[codePoint >> SHIFT_2] << INDEX_SHIFT) + (codePoint & DATA_MASK);\n return this.data[index];\n }\n\n if (codePoint <= 0xffff) {\n // Lead Surrogate Code Point. A Separate index section is stored for\n // lead surrogate code units and code points.\n // The main index has the code unit data.\n // For this function, we need the code point data.\n index = (this.data[LSCP_INDEX_2_OFFSET + ((codePoint - 0xd800) >> SHIFT_2)] << INDEX_SHIFT) + (codePoint & DATA_MASK);\n return this.data[index];\n }\n\n if (codePoint < this.highStart) {\n // Supplemental code point, use two-level lookup.\n index = this.data[(INDEX_1_OFFSET - OMITTED_BMP_INDEX_1_LENGTH) + (codePoint >> SHIFT_1)];\n index = this.data[index + ((codePoint >> SHIFT_2) & INDEX_2_MASK)];\n index = (index << INDEX_SHIFT) + (codePoint & DATA_MASK);\n return this.data[index];\n }\n\n return this.data[this.data.length - DATA_GRANULARITY];\n }\n}\n\nexport default UnicodeTrie;\n", "const isBigEndian = (new Uint8Array(new Uint32Array([0x12345678]).buffer)[0] === 0x12);\n\n/**\n * @param {Uint8Array} b\n * @param {number} n\n * @param {number} m\n */\nconst swap = (b, n, m) => {\n let i = b[n];\n b[n] = b[m];\n b[m] = i;\n};\n\n/**\n * @param {Uint8Array} array\n */\nconst swap32 = (array) => {\n const len = array.length;\n for (let i = 0; i < len; i += 4) {\n swap(array, i, i + 3);\n swap(array, i + 1, i + 2);\n }\n};\n\n/**\n * Swap byte order of each 32-bit word in-place when running on a big-endian host,\n * so the trie data is little-endian as expected by the runtime.\n * @param {Uint8Array} array\n */\nexport const swap32LE = (array) => {\n if (isBigEndian) {\n swap32(array);\n }\n};\n", "/**\n * Lookup tables packed into the unicode-properties trie.\n * @typedef {object} UnicodePropertiesTables\n * @property {string[]} categories\n * @property {string[]} combiningClasses\n * @property {string[]} scripts\n * @property {string[]} eaw\n */\n\n/**\n * @type {UnicodePropertiesTables}\n */\nexport default { categories: ['Cc', 'Zs', 'Po', 'Sc', 'Ps', 'Pe', 'Sm', 'Pd', 'Nd', 'Lu', 'Sk', 'Pc', 'Ll', 'So', 'Lo', 'Pi', 'Cf', 'No', 'Pf', 'Lt', 'Lm', 'Mn', 'Me', 'Mc', 'Nl', 'Zl', 'Zp', 'Cs', 'Co'], combiningClasses: ['Not_Reordered', 'Above', 'Above_Right', 'Below', 'Attached_Above_Right', 'Attached_Below', 'Overlay', 'Iota_Subscript', 'Double_Below', 'Double_Above', 'Below_Right', 'Above_Left', 'CCC10', 'CCC11', 'CCC12', 'CCC13', 'CCC14', 'CCC15', 'CCC16', 'CCC17', 'CCC18', 'CCC19', 'CCC20', 'CCC21', 'CCC22', 'CCC23', 'CCC24', 'CCC25', 'CCC30', 'CCC31', 'CCC32', 'CCC27', 'CCC28', 'CCC29', 'CCC33', 'CCC34', 'CCC35', 'CCC36', 'Nukta', 'Virama', 'CCC84', 'CCC91', 'CCC103', 'CCC107', 'CCC118', 'CCC122', 'CCC129', 'CCC130', 'CCC132', 'Attached_Above', 'Below_Left', 'Left', 'Kana_Voicing', 'CCC26', 'Right'], scripts: ['Common', 'Latin', 'Bopomofo', 'Inherited', 'Greek', 'Coptic', 'Cyrillic', 'Armenian', 'Hebrew', 'Arabic', 'Syriac', 'Thaana', 'Nko', 'Samaritan', 'Mandaic', 'Devanagari', 'Bengali', 'Gurmukhi', 'Gujarati', 'Oriya', 'Tamil', 'Telugu', 'Kannada', 'Malayalam', 'Sinhala', 'Thai', 'Lao', 'Tibetan', 'Myanmar', 'Georgian', 'Hangul', 'Ethiopic', 'Cherokee', 'Canadian_Aboriginal', 'Ogham', 'Runic', 'Tagalog', 'Hanunoo', 'Buhid', 'Tagbanwa', 'Khmer', 'Mongolian', 'Limbu', 'Tai_Le', 'New_Tai_Lue', 'Buginese', 'Tai_Tham', 'Balinese', 'Sundanese', 'Batak', 'Lepcha', 'Ol_Chiki', 'Braille', 'Glagolitic', 'Tifinagh', 'Han', 'Hiragana', 'Katakana', 'Yi', 'Lisu', 'Vai', 'Bamum', 'Syloti_Nagri', 'Phags_Pa', 'Saurashtra', 'Kayah_Li', 'Rejang', 'Javanese', 'Cham', 'Tai_Viet', 'Meetei_Mayek', 'null', 'Linear_B', 'Lycian', 'Carian', 'Old_Italic', 'Gothic', 'Old_Permic', 'Ugaritic', 'Old_Persian', 'Deseret', 'Shavian', 'Osmanya', 'Osage', 'Elbasan', 'Caucasian_Albanian', 'Linear_A', 'Cypriot', 'Imperial_Aramaic', 'Palmyrene', 'Nabataean', 'Hatran', 'Phoenician', 'Lydian', 'Meroitic_Hieroglyphs', 'Meroitic_Cursive', 'Kharoshthi', 'Old_South_Arabian', 'Old_North_Arabian', 'Manichaean', 'Avestan', 'Inscriptional_Parthian', 'Inscriptional_Pahlavi', 'Psalter_Pahlavi', 'Old_Turkic', 'Old_Hungarian', 'Hanifi_Rohingya', 'Old_Sogdian', 'Sogdian', 'Elymaic', 'Brahmi', 'Kaithi', 'Sora_Sompeng', 'Chakma', 'Mahajani', 'Sharada', 'Khojki', 'Multani', 'Khudawadi', 'Grantha', 'Newa', 'Tirhuta', 'Siddham', 'Modi', 'Takri', 'Ahom', 'Dogra', 'Warang_Citi', 'Nandinagari', 'Zanabazar_Square', 'Soyombo', 'Pau_Cin_Hau', 'Bhaiksuki', 'Marchen', 'Masaram_Gondi', 'Gunjala_Gondi', 'Makasar', 'Cuneiform', 'Egyptian_Hieroglyphs', 'Anatolian_Hieroglyphs', 'Mro', 'Bassa_Vah', 'Pahawh_Hmong', 'Medefaidrin', 'Miao', 'Tangut', 'Nushu', 'Duployan', 'SignWriting', 'Nyiakeng_Puachue_Hmong', 'Wancho', 'Mende_Kikakui', 'Adlam'], eaw: ['N', 'Na', 'A', 'W', 'H', 'F'] };\n", "/** @type {string} */\nexport default 'AAARAAAAAADwfAEA7d0LvCRVfeDx6q5+z71zHwMy+JqeEWQ0IKPrg/U1jYryiWhYNZ8lsu70wKL3E1EmxgeJxumBbOyoqxiJ70iPxHXQgfiIhihKDxNdTCBhGAigyd6+M6IEiCCzCRLiTn7/qjrdp6rr1d3VXU1yz/18P6ce513VXdXV1XU35AzjJJyK5+EV+BX8V2zDm3AR3oWdeB8+jI/jCnweV+Pr+DbauBG34E50cA8exM9h5A2jhHmsRxWbcTKejRfiZTgLr8PZOAdvwAV4M34T78al+AA+ik/jSuzBl/E1fAv78Vc4iB/iMO7DETwKs2AYFSzi8dhKGzcRPx3PwvPxQrwMZ+F1eD3Ow6/jbbgYDTRxGT6Gz+J/4xr8Ka7DX+Am3Ia/w2Hch5/hEWSKhlHGHI7DBpyEk/FsvBAvwyvxWpyL8/EmXARp+7uI34vfc+Y/RPwxfBZX4kv4Kr7prL+B+EbcgjvRwT14AEfwqMYs9VvjWHDi4zGHjc78k5z4JJyK52Gr4yX4ZbwyIWfjHNQdb8Rb8U68F7+HD+Ej+CR24yp8BX+Ob2E/vu+UdzNux9/jbtyLh/AwfoF82TBmcSzWo4rN2AIZW3Ea0y/AS/FKvBbn4nz8Ot6G38IuNHEZLsdn8MfYi6/hG/gOvoubcBvugrz+dCueZf/A/M/wCDIV9i/M4lg8CSfiFDwHL8IZeBV+FW/ABXgL3oHfwf/E/8Ll+DSuxJfwNXwL+/GXuNXxAxzC3fgxfop/wr8gu8ZeXiYuYQHH4AmOjdr003AKnoMX4Qy8Cr/qlPHfiP8HLsTb8R78Lj6IP8Cn0MIeXINv4Nv4bgTVD+VmZ9ltxD/0We91mDT34SE8gqNOe5XijGHMYB7rUdWchFPxXDwfNZyJsx3noI4l7IDsbxcT73Rcok17vR+X4RNoYQ+uwl78Kb6OP8P12A/1HnAj07fgTizjJ3gA/4RfONP5WfYxLOB4xxMgebyewvJVq1bF91So94+027Jq1apVq1atWrXqseMZeC5eOEVOxxk4C2fjnAhvwAWQa4dvIX4Hfsfxu/ggLodcC/kk8W58AX+Cr+KbuAF/iZtxO+7EMn6CB/DP+AXya/lciwUcj414Gk7F87AVr8Ar8Vqci/PxZlyEd+HdjkvxAejX11atWrVq1Xh9lPfdT+GP5D3buU6fls/ThjRdvWrVqkD6+fLXnfnriPfhe571f63Nnwh5ff8ty/4vfgz5nlrcy/RD2nyUh0n7ZL4flumjTr78HN+bYQHHo4rN0PM9g/nn4sV4OV6N1+JcnI83I+33n3+dtz1xge/w8Bn8HZ64yDwux20w1vH9FxpowziGeTTwZTyILceyDG/HXtyPkx/Hd4Jo4SbMHMdnC3wQN6HBNfQ2DL6Xq6EhsSxz4kNOrNvE91bnOc7HlfLdnCfNYZaZ7ANq/qVMX4r9MOn3SyGfAVqZZO13ynyU+AVsX5mWba+neQ/z0qbrnHjVqlWrVk3ev6b8HmzweSgtL+S4n3b9aX/+S9tvsv/9Ni6BzL+fWPkgLsdn8MfYi6/hW7ge+508ur9i2UHcgWX8BA/gYTwKkzFfg0Vn7B9PXMUJ2IwtOA2ybV6CX8bZeB3O9dle57MsyhvxVrzTJ/97WbYLv4+P4JPY7aS7ivgr+HMt3z6mv48DuAsruAcP4ueyP3PuKulKxHM4Do/HJjwdz8LznTTiJUyLM51lZxO/zjkXrmMJF2npw7zLJ91Olr0PH/JZ9zGWfRYtfAF/gj/Dt7Af38cB3IkOfoT78SB+DoPz8hJmoco8luknYSOehmfiebIer9DSKb/Cstfg9c6684jfiLf6pBXvZPm7camz/gPEH8bHcQW+gKvxdWf9t4m/G1CWuJl1t3rW/4D5Q7g3IN9DLP9n/H8U+CxSwSKOxwachFPxTERts/9Mmhfj5Xg1Xotf0/JtZ/oCvAXvwLtxaYxyrbEJSfdR1n0aV07Y5z1tupr5r+Pb+G5Ivptj9nlQt1Nu2n4wpr4N4hBtSMI/DNkX9Z3dKH5G3Y8gw7UAVW6e6QoW8Tg8GU/FM7Q0SXou5b4YL/eU/2rmxevwa9imrX8T0xf9B/cbYy7/t8a0vZO0izbKPdhBvujc4/37pLsMlw/gDx8D/f8j2qhciT2Qa3uTql+/L9/rWtohcduJ/w/x3+B2Z/6HxIcd9/m0+YiTTjzKtMm1SW+aNSxbxHF4Ek7EKXgO5vAinIFX4TU4ASrPWifP6zGDNzh5LsBb8A68B0vYgYuxE2/G+/BhfHxEV+BzTnwVvoxrffo5rdq09caQ9t7Cutvx9wP26W7S3/sYGIeHaKOfR5y2Z7h+XsY8xt2W9dRRxWatricyvSWk7tNYV8OZOBvnoO6kf1OMNl9EmrdDvU4vZrqBJuT1fxnxH0J+j/Rp5zuFLzjlXkP8DdzFe/R1xH/hU5/83kW+g5D4VuIfONOHiO91ph8i/hdnWveos8zkO4s1WMB6SJulrU9mWqWdY1qWqfkTmT/FWab3TU0/h3Uvgur7GU7aVxG/Bqr9r9fq+O/O9BuJL3Sm9bLfzrLf1vI+FqR9P964XOJsh7TbMQnvp69B606Ygval6Q9CxmYSPjUF7wfeNn1uwDGRfSjtPozii/T3qxrv+m+yLMh3pmD7jSrt+0nS9D22X+ohZ5Qwr1nvma9iszO9xYlPU+szOaOWhYkc8iigiBLKqEArT8pQ7GUnGGdOhN0XqVP6czbOseITjPpE2PVLv6X+LWlv+ikJJf7UfreeaTvOGUvW8hLbh4/JjNgO4outcSsZDSxZ207ikrGFZ180c3DS1528Vv6sLLfzX3aQ6QM4YqedZ4uc6WtzwPJB0tGuwPWyfDPtVKoeapk3jTd90HJh19+fX4/tttixmh80VvmjyhmkHjU+cfLb/fNfH1ZnbxsE96E3fuH9DKp/2HiQ/kfHQet6+0B0Pn3euyxunqA0cdsdt31+acQOn/bIMp2s/4SW33/auy8MFie3n/i3M2pMHstxkKD9KmhM4tfn9/48iFHzj0b26UnW14rEpboY5Dgux3c7lmUlZ53Eir7cPa3yuUl5Or0Oif3b219OzdGrK7jOQSxV9ySvhrqHLGv4LBctR9zlYdo+vGmi2t9x4qA8apkRsFzPo4+FzBtXETv6pgcf6wbvGw1eByqW/aLBdu3N26FhLZd0Ni7jW2m8QfLKfmGvs9Mo9vperOpoEo9KQth6vT6vZgKiyvGr192eoDa6t09Q3CJuDREHt2mLpw7/trZxoxMPQ/Kmqz6SthYPR8ZhGuIlo837gag7rHnjy4602zfOeNi8abd79FhCh+lJUKHDO0+HY4O/eurkuNXhmmGvvUuO9faC7Xu4Q9XDu+z0q/zT6en9+JVnlQWZ3kW8G/uwgswXWY7TsR27sNuxDyvIfAn0Z6PE3GV8OvF2Z1rVJdOSNypkuC41KZF102YxQKhmGn3kbKSa2aLhOptFtreaXrIxXqF2fcmo7sY+xtfKK+VLvdJOmefzTYrk/C5u2nrnS7wa9nIsQIPpFtqoMV+X5c6xgnPTKvuQ73joy7fvyVQztSxM5JBHAUWUUEYF2jZQnDY19qY+htPFGZuQfdLev332XbVtMrJPQC2XtO7tpuobYPvpbXReO0zXaO8wJNR4LdWkjN177TgNjEeN8bBiv2lFn/em0+eDYmu72UGvP/39bTT1qcX7WGw+x6Z4IdPg9QMTOeRRQBEllFGB0aCO1LEPBmI/tWLeN2xL4PN+l1xfsoOVlmOpaFHuWNAWF+rvW+a3PCCdCi36MiwJbdo2doyvokK7+54Z/71tHGEc7yFxyh1LX4LOcWIw5BjsPab6Tat5ZYVzyQznPBtFSP6AtnV4v+q5FjtS4tS/b68zL21RvO30a7dmRcpQ87x3O+eg6nzUnXeQ9sl2ss7TMx3ep2EihzwKKKKEMiogD58VeQ8ZdlyMrKDe7LU2CdayECoEzQ8qKq9ar4egNt2w11nm9Mci/dN0y9D6rM8fcsqICnpevzFxtdFVd8bI1rIwkUMeBRRRQhkVaPn5LJhdv2xkm3fgKA7iCBbAuiUnjaRlH9rU62eVem12e6uk8eMN3uVB+aJE5fXWFTRtzcv2tZZfq7H7199+9/LuOMj29aQLC0HtDQmZKtsXJnLIo4AiSiijAm3b6HXIfPzrCjXS2+ztW6OMKN50cfPFKStsfVDabl/YvvayazWqfz3+/XbSa9tXL3uY0Gtjr14C787Wn4kc8iigiBLKqIA8fH6U12VkHf19VPXViev0S9jzHHNCqBA0P6iovN66QtvE9rWXSX9UvyTu6bW312d9vu55/foFVXb/8qB2uurO1Nm6MJFDHgUUUUIZFZBnSfIfrGebB3AEy7gDRxHZThUa1N1w2iWxH3d69/I4adW0d5lfuqB6/JbH4Q0Nto1N+m1P+6+3l+vzDW37+5WtlxEzZBpsb5jIIY8CiiihjAqWd2WbHayA8vnM6YvPmnI89gkt+tuiXT0yvyOUnS94flCj5ldl9Poky6Qfit4/exvo673zrYjXcyt7tdHadLXvOPSnVet7dcn2bbF9YSKHPAooooQyKohoxzzlNCmnSTlNynFNs57vMKm7Tb1t+m2bd5YFkxA2P6hB8gelVaHN+7W9TPqi96vHLqO3zp5X61kesX31fMFpvG2V+nrbt832hYkc8iigiBLKqMBVxjChQ502Pvs5be5QVhhvmjh5xoLtYLHm7fbbVJ9sdvt6673zvTL63+PcdV570Uq2+XAn29xKfJj4LphM30bsSdurW7Znh+0JEznkUUARJZRRwTJldbCCg5R5AEewjDtw1K6H705Dto0VTPoprGmWJ0EPSZWplz1Iujjt0MNhn9esGiML20qx1qlYT+PDP2QMzqRhIoc8CiiihDIq8GnLYN+/SqjS13Tx+c41rXnp1Ta/8ef7/+Ay+f5M8p9PXp2r/PlMlXGGiRzyKKCIEsqoQNJa/EKN+oSa1pfpgpaPIqpOf3yWck1rLr3axnj3lvdeC8FtsL9fqF1JXp1ThhO4gmd9SpS/HPIooIgSyqggsL66hc8YXfMjUPm18s7nc49w1dGVqdN+mMghjwKKKKGMCg7UzebPsLDdbD4T/wW/gY/gKzggMet7derxpRJzN7TJnd/dmM95FjUG/iREpRmVN9T3X23UD4PtXDevcWIPWa+zltMfNf0UB/udtU3UvG8bfMoPYI9H/PTjYLfBd39y73cB69z5+/dj+X2brre8PzQYv+nBZ1cLn3ld/JZh/157HfuIpS//jkyD1ydM5JBHAUWUUEYFpOU7UV9x2+pdr7dVTy+8ZfgJKsuvrjjUOOptDqibfc9p3wDjp5ch+fmcj5bJfcxTQIKKvUFf3jK593pC5LusFsdJfdlNjHua2inrTAEJfsv8lvvlGzb/qPWPu3/DlDvu7WTVyXlBF+/ZEbIds2kihzwKKKKEMipYXjGbR7HhkNncim3YiStwPZbRYf0huN5LRu8Xn8VjCAw53sumQbc9vM/5cUI1dxp2TBnuhczx+S6Bsmo8RaBmxZNQxWbX7lBn+bRw7t0Qi/Vcex2OQYx8waHB+kH55+OcRfwo+rszPbTImwyuxwurfjVO0aFN3mRwvRiDhg55B+XNZ8/z3j1E/Uae/KmizRautXWn/cj6MHqasHIcd7OfWNPsJ11cc3HN8726tPHE3vUWg2/iYSKHPAooooQyKggabfI3yd8kf5P8TfI3yd8kf5P8TfI3yR/8vW6Vdgm1j6vpap7jgLOuh2tyXdbvNDJV2g8TOeRRQBEllFFBSP28L08NrkmmUG9Y8M+jtsGE2njBVYHtHNcxP26o0a602PVz/bSLe3lc+pf3t19P683vOOMqo8Z7Ru2C/vfjWt597lnjdQruwLTu8pEruDnIXwFFlFBGBUadfiRBhbB1cUKD9GkaV3sCQqbBdoKJHPIooIgSyqjYadzv4Q22uzBS1qJvY8M+32Kfb/EasPX2/xb7uWiTLn3cD0DberE/CW3OE9zpw/O403k56xmnMCq0L9iTabMvwUQOeRRQRAllVBC4v46Yn/bKNgvSClynQvc3lDq5l92Pvp7f5EvoMF5u3B/ANpyY73IvglWntx2qLSr2cpbffV1o+d7t1WF7wUQOeRRQRAllVEBersUE4hpHHOxrHV6vVhwkRjmuUGD/tXDsLNC/VEjdqh16e7TlP74OfAborrfyZgzusoWJHPIooIgSyqggsO7qtPgev6ehv1X6ZpNpRc2rdWA8RFSoFvhcoalRV7o43wrFeVgoLR1jpoea1T8XfiVj3Ykt37LnrDM09g/+iiihjAo85XTbm6mTHyZyyKOAIkooowKjTvrJ4Ck5vvjOE3Ge8RIWJv0dlbdOgz6Eigj6cUs+Z9d5XlbkscuznH+PYOcLwL8ccZF83mXddVZ5ap5yu23zP2dN7zl3bn7Ph5J9J87z6ZJmP+vLLV6awfvdHjLfpJ79N+5xdr0u/M4FfddfBe57kWU83y40X1J4Dl29Tr0W+xzcWs5z57ptk+eA8Jwfe2wn9RxNxU7n/5w13ZkR/POpEJSvt3489U9L+73P8PPG4+9/VP+i0n4iQvL53e3y9lfyyPMSZZ3EyqD5+/P5j0v/dg/LH2/79fL7bYe47bdDaQC9UmValKzndtlkukfOZeT56hfjMuvIL89n759Xz2FX6d34F1+4pVufm/1seD2fmta+m7Tq4dnuruX29DkOPa08d1/aJt+7essJI/lUmXHz2GPaz96CMWTkKZxybHNCnufWF1jGv8vm+xuD728Mvr8hjd0+xe7fZp6awTp5/r16Pv5A+SUMcxx2B/mtaLh5bVqe/x8nT3yjhe7xWp0/e4/j+rm1Wsa1JBfvMj29OtarZb7n86MEdV+p/D8Ce1rFsqw3L+8rMq/IvHtZyZp3l2XvL3o+pXc/q/0/Gtx12s+Y7c3bz0b35u/VL+t77fJ+TlHtUnn0duv7taL3T1F9scuRcx/iv+W1cSfuwq28dg7hNqZ/hP+HXMZo3k58LPEdrHsYx5WN5vOQldfeZqPN3d9t7vJo51FAESWUUcHy04z2DPEstm0y2p2NRrtOvEIcO3+V/PDmF9uZPkSszumKTrrzcJjlGflfGL3xcwf5HxL9etu0t23V2LrvZXYvC5r2E7Xeb98ahbv90k89HsZw7fLbX4PZ7ettG+86fZnf+rDlQcu8+0NQef77TnAdYWUH9Snu+IT1LWx5nPLjjk3Y/KiSLD/umI06dqO2Kx1Rr1917qTi4d4bZhxR71P+easIrnuyhn//TKbuSW//SfUhet/x24f0ef/9axBjD32fXVBECWVUsMy51gzxLNZiDvNYwCLW4RgclXOyhMvzPRdKgXzOS3oMrPPCQdvi3UeS7uug+2hS9Q3bDj39KP3yb0//+8Cg6bxpR+1v3O2Q3Plz/3vjjCPofTKs31GfK4KPy+6ygtrufW+OMuw4+21jv23gng4/rkQZpr1Jlaf3I06+Ycc3rKyw/SXqfSYoTZy8Qe8nYft1VLl6u/3S6sv06bjbMcnxH+c+GDSOg7YnbAzC0vTzfr6IFcc95ss1K1OuayEPv2vFy1zripvOt59pbV87r9+5tBqryX2O7P1fZf84qTY1Ckup8hvn/j6OGk/y83+adfvtq6O/pgY9ziVbbhJjEv+zctD7sN/xczxUGPf2ildPq8B9a1NCQqvAcxVSIiH6fx6H/a9iPb1fvrB7puy8w/7fweRiwX7hy5OW7ya7nGV+oSXPzeg50OK8oDs/wed3hD/bw36WiP89pb3lbe5hTVNYaHMfbTvGPaaB+bk/fRLPfwgLUfnHvV79z8a0eO9p6cX997v0T0eR+3i80978aj7qnMuvfLn3I+69Meq+oqA2Sj2D3J+jjBbu55x1EiZZV1Q7pmF8kgqDX19zh2M4+5thP+qR9rWId2TuL7S7361Fx6qOqHSnadNWviz1mMghjwKKKKGMirTjwto1xoXcO3wh9xFfWLvKuOn871js8qS9XlZ7lv+x0D6KDT+lDKdf3X6q88aZIsumkAoXNug7ZrjH0VKkHxbpy2nGycTTyB7nFtOK/zHxLLbJpEhI6llk2usvO8P1IeSQR+zX46T7Pur7R9IGDaPukzfxbKq0ELz7SQFFlFBGBcuzA+w/A5JrnvKd6IaK0dyKbdiJK3A9JM3jaMNxWI/j8Xg8AU/Ek/BkbFhrNKvEG7EJT8EJst+nOb4JjdGJ9OOpOAmbsZW+Pp34l3AyTsEzcCq24Jl4FraRbuT6Ty6mx359pduGqPG5n8+E0yBumFQ9QeEs3vOS1xpTucNx93dpasQJddo/Xlyl8sVvbdEgTbr4HaPVDmWk8jIN/oMXTOSQRwFFlFBGBd08SYc21wXt320PGnO9S66J8HuJHn4fHvdaiqTlXHv4+oeNpU447WgxplMg2yq2TeSQRwFFlFBGBRkYrZNos2Df8xMd5Hdn4yLXl6LYaUf/XWxSv7ON83vsoO8TossP7/OOhPsX9D1H2PcfUe23g195kw72eKnvY9T4ubV5Pdl4fXen8ROe26TP+6VJHM94skg9QqaXXDzhIPdlHMARuT8Dd+Co/fs/SSvkN3N9+bqhQ73p4nlDmshQ4hk8Fo5tqVD1x3QPz4QpyfcAUf2i76X5jMF/54SJHPIooAh+PFsro4Lg7Sn/0zoJgf+TWf6fs6Lm1bo9mSrth4kc8iigiBLKqMCoMpbjxbMWvJZ6rGeeMuY10iaHZwDFxjOD7ol+XpIearQ3qWt7g14HVKFO23t4fgz9Ts2N/G8aqw1Cb5dqm77cmWfM64zjoOzQytTZv2EihzwKKKKEMiro23aqnOD/DcLnBN91LgP8P5D+/BIajFv66K8v/neJxX8+TuivJ05bus9pzTTYvjCRQx4FFFFCGRVo9bFNddHbMELYfsA9eF0yr/7XS+//1bToU6o281lDxYL3Wtc6td4vn56XeNyhVz//A4ZtJ9rMx8f5GfuPTaaFlKHK4XOjheVyHhAzRN1vMer6YepW+aPWR382So79Gcn7vIr+dPIElF6eiBD0/zImZLD9b9zUPq3v39593bVvZ9q8f8JEDnnwTTfPi+X9E2VUEDj8YececUKbPEkZZ9nDtqFTujNV95Q6qRrguwXutwhdz70Tfcu4T2Ms36dwr0liZXHviCueNL9xG/p7n1HLCT8+DBY65PHyDXzWNXZfY8excM967LQaVVfQcn190HSEamI4Fo8giZBcXwan7qUcvZzR+jLuMHib+J/Qmd71xyVjz0jc9/J5qfvugq8jRj5DNID6/seuR+7JE+c44t5D2Guft71uqlzRWy6hP61+v2FQPUJ+Qy1p9d9Tq/LWu+qI2t7pv9ZUsJ+9dwzt7lnvma9iszO9xYlPU+szxxi1LEzkkEcBRZRQRgVaeVKGYi97Nt9tTILdF6lT+nM2zrHiZxv1ibDrl35L/RLbYztv/VWhpueNLVzbj0N+NRI37TipX7Pcwjl3WvQQlSbJ9XqwXz9Ctq/sY0vdZRLmmWfresiyQe511J+JqX6f54Qy7RnEMHnSKlsvb9Syhx2vpPKPa7z7QuBvQeL+Zv0oNmS5zxHbsBNX4HosoyO/ayeugi/fmnU00EJb1mOFNBnijTgd27ELu7FP1uOQ/I6eeBNegvNwCT6HG2Q9PF2I/N3nwYbRPoAsCth2Cc+CxHacB1m2vMte3iGWdSvEsj5o3SFIXlkn5Sqmh8rvtYG8UqZOyq86bfPS2yNp6U9THMIR8C7A9ezBZMjH2LjzDvc7XHfolZNWGPfviPup59VLqPI6nDQ91JhP2yiBsZzk+1J//bQ/Rdl6uVnA8vZyc9t55eD/QxrU5sboli8pt6PSdCSNX2ixfiyexndaHn6hTdo02HVzLwfTafKG6Dz8P/ly28TySrl9FB3E2u+sUOG+tFRxjXGMqhXeY1NUS4kTMvw3rSy4K4L/tyX/AVX+u1aF/7dV4f9tVWplyF/wexPbKEn95dcnyhsajFWaokKLNGkaJLQqce6nDg9t6pwWabY3qfEad+hQhx99fVi6pOh1eNvnml4zJhLWzGeNNZz7ruHcdw3nuGs4x13DeewaPj+v4fPxGv73CWnHh//zsGYpW6UNyCGPApY30hYYNdKlJSJka7QbOeQdBSyfTtvRwai7q1GnHUnRy/PrT532Y3k77UcHRoO0Y5BtUM8u6kEHJvM5uBrUWMMVXtJPgl9oUX+bdWnqjJknvHtlTfNAh+3grM8ybSKHPAooooQyKlgmz1FsOLSmuRXbsBNXQJXbYb3BfBU11NFAC210sEKaDPFGnI7t2IXd2CfrcYg0WeJNeAnOwyX4HG6Q9ThMGpP4KXgpzseluBL7ZT1+SLvvw6NYQ/on4JfwArwS5+LN0mZjhjGa4bOfIkGf9gZZfqGz/mSJJb/GShMyPy4qSJtuctroDffvzRozHA9mOB7McC1khmPCDMeEGY4JMxwTZvjtykzEe9oM51RRQkKVtk5YtjrT3LaJflVpW41lE5atMc6nM84w6iwLx/W/yDQjYh+p9+8f2foMxwfaup22ogPSc598gDihQX3TwN0m7gsP0CLtOKgxbvH6Qw55LO9mrNHBCvhPUxwXEuITsm3qRw55LO+jfnSwAqNDviSEhQ7jrBswZDv0ATnksbxCH9DBoGX1h1nanrYxhuosv/2cEsO1n2toUyIkZKuzfM6Z5XPOLMee2WaHeAVGje2bqlP4rZsmImRqs1yvm+V63SzX62a5XjfL9bpZrtfNcr1ulut1s1ytmw28XpetZvjsl+GzX4bPfhnGJNMsooQyKljemOGzYKa5YVOmuRXbsBNX4Hoso8N6g7iKGupooIW2rMcByjqIW3EIVgPq9HnCsvXZpokc8ihgefssx9TZ5obz2BeID7DMSh8VGqRJxFv4XZJgm3epebXOlm3Q3l20Fx2Qn2OjR1BoUde4xAntWX7/MMu9gVbMcXDipO4Y/pHfszOOQfqO2+xTyCGPAooooYwKlvexzbDhhtnmVmzDTlyB67GMDutXkGnzugZl8rsQXtegTH4XwusalMnvQoJf1/G2BX3s0FfbteDcYOKkXkW1RW8TpJ03S1s5H7E0tGnbIEHyd8Na9ttRBYeMsZavotfy+/S1/D59Lb9PX8vv09fy+/S1/D59Lb9PX8vv09cGb8fqM/j9tUJd6ZI2eF0bsBw/3WuRcagyDjCRQx4FFFFCGRWQjzsjXaReqaP7m9PQUCN9Yv56LzGfSS2h27kb6vTbxm+nyZMuaYOi2hWGdD/l99595fB50oW0jE0vX/f1l6mznWEihzwKKKKEMirQynWXT8gaJtdATK6BmFwDMbkfxOR+EJP7QUzuBzG5H8TkuojJdRGT+0FM7gcxuR/E5H4Qk/tBTO4HYT06rF9BrO2mQoP2JGH4svhtchfH+y5tGduowfjbyzne+7LPHVuUGUSt90sXlTfKYPmD37/brE8P5wGMeY/M+2BbtO33OW/ItHk9wEQOeRRQRAllVBDY/w7l2zgOOu+BHdoWppfXf35QUXm9dQWlqbc5hjNW9jK7P3rf9D7a5fjPd9j/9T4Fj53/McO/H566ON4GcZUVsT4yzNH+1NHvLtofykn3APu7vuxvZN5bLq9rt4wxx/nQHOdDc5wPzXE+NMf50BznQ3OcD81xPjTH+dCc83qQPCo+VerhXCB1nIt0cY7jS63T0+rpmWb8qoxZr1zOdWTMwkOmyvjBRA55FFBECWVUEFhAjTqmB8/06eJ6h6bXXj2Nno5pxrDGGNYYu/HxttndvjrL0sU5WxfnYqH0dMSMnz3NuVdX5D7o2h/r7I8wkUMeBRRRQhkVBBZQzbPfDyjJ0KC/04PzObZLL1bTPh7gHJB9X/KFbZ8G2wcmcsijgCJKKKOCRMdUDy3aNym9OrlfuOtah75MLfcsk2OaZ/xajB9M5JBHAUWUUEYFy7vn+J5ojv/rxGuoh2cQ0q50cd7axblqJNIxDm32rbY6/mqhM3dmynjOQHoyHfYHmMghjwKKKKGMCpZX2B+w4dAc92TMcU/GHPdkzHFPxlzzeixj4NdSR/bx+QgqRKUbCed7XRwLdd361TI9LR7kNWaVwb6lyppgqFJnlXbFI2nHiToYj/56OT/0bSfHvzAythGhRrk1yvLHOZVFXybpp0FQm8M4fWFcaoxPj5Snz9vSCHXakraw0GB9lLjpRsf5ENsziN2OoPXkZT+wy+H6mEfMkGnMcz41z/nUPOdT85xPzXM+Nc/51DznU/OcT81zPmWl4Z7Kee6pnG+SpkmaJmmapGmSpkkavsOb5zu8+eaGS+abW7ENO3EFrscyOqx3NaBFW22c8ySgVy7nP0Ow83IuFZpOX9+bjhPatDGIvj4q7Wg4L/Lhbqc9r69zpb+F8ymJ2QctTrlR+1ubfQkmcsijgCJKKKOCwAI61ONHXxeWLjlcX/Ow6+WamTMOvXWyjJhxUu0LGp8O4wMTOeRRQBEllFFB1DgPHxZoX2IYBwtjY+F9SQSHuUuyzYt2ZZsbMIeHG9nmA9jK9Kk4zPSy4y7cAZPlR4lvw0EccByBlGc0svw+PNR6j6j00YYJjSznPIzbNAgIZnWhnUMeBRRRQhmViHVBy7OIKtcvjZqPm09Pl30KMYLW6/M6Vb4i9ai6dH798fZBrdP7otLcikM4dmNv+g4cxO1OLA5oabduWmhvQ9BYWBuwyuvPa5AQcz8ZW6hR57Sw29OIFBbqlDMtJhEm8f9xwkKDfqaFkGkscC69wPn2AufbC5xvL3C+vcD59gLn2wucby9wvr3Qf3xv8DoVI48/7UhCt7wDnPt6DdDONmWl6pmcwwahH/24BurC871d7DQxQ6bN/gATOeRRQBEllFGBpF3et8D9dAvNQ/gRfox7cC/GNpbj3majhs4C11BTxXXU9GQ6C80sTOSQRwFFlFBGBcsrC80Z4lmsxRzmsYBFrMMxnrIon3sRNb5hkW04LfraxmcPax2fPaZFWLDaq+N/gQ3oZJwF9b+pJx1OZrzTNMn2DTU+nJ9Mw/9cHzaMWpb3/1VHhbMY5zR5Q51l08IvJFXOoOX10vN7Ut676rdiUY4Z8vlHN+kg52LjkET9E3rmX4PjDupttonDtb79nW4al75t5xb2vGz7mYLO8wVDnrU9tmcaeupLZ9sPHoZ4FuZ4MGZdY+6zFjI8GzHu8xNniGexFnPgzaa5gEWswzEYoglJ7icD7zdJPTvSrxxZJnFEE+R3spMgv2cdh3G0R8K465+W8fPrjwRVrwreab95ffmg/VFjHjX2g2ybJLZPUHlB/Y7T96g0g/YxidfPINvRuz+Msz//Hl5P42hnnHFPivzvkEmMVVg9j+V+jrNfg9TT3W847+J3LPwfFHDOwO9Y+D8o4NyD37EY/I6Fp6pi2tMZDT5/povz5amRVNvi9HmQ8VHTfKflMUrwa3vQ8rhGDa2n8n1YgKj1cQ1aV1DacYQW14bS5mrPs+hrEK6bB3FCprXI7ycW+f3EIr+fWOT3E4v8fmKR308s8vuJRX4/scjvJxat7+t8xmH0z9FtykkV46TJtBkPmMghjwKKKKGMCgL6st7oUGbanJDtLPLd1yLffS3yPdoi36Mt8j3aIt+jLfI92iLfoy3yndjbuJcvQKywjuPuVODYn4b/xDj5Oci9/uv6vq/KGOs47q/juL+O4/46jvvrOO6v47i/juP+Oo776zjur/PZv9ZxLBGjh8fi/xk6TBrTie9GPuCakLcfdHfpIPEBHLHn16t8Uq+UN8jYjfB/kpbijLmMo4yhjJmUK+2+Xb/Glfb/LtTrU9N62wZpT1h/vGV7g9+6oPzDtD9OeX75B9k2cfMkNbbDbm+/cY6qZ5z1DxKq/K9iMXxwX/OeGev19DjX2Cd+DT/B+pMqY7i89rYbqf5MifdmZGEihzwKKKKEMiqSjvdt4Ro9+d+QSVBtSro87z6RVPky9vp0HMP3ZRxhMq/3mWKv/8OEuGMbJk75w4Zh6kwy2HUN/r4RPWajj/vw22u8ZSc9VkFlT7r+OO3ym+8520f6+0Ga+6I+XtPQhlH2nST6kNhxYZzHnDGXH3e844xb2OvRnSZuGGacgvOH92m0+ocXHJI8NxguDN/2wcYv7fpHrSduGLze8bz/9perh0H2tTj74rj6kHTZo+4fUa/HUV+ro77u7y/sGJu06h8kDJMn6fanGUZseyWZvqdxX74K4feYj9uSsSdVo4Z7Sp1UBIR/Aw==';\n", "import UnicodeTrie from '../unicode-trie/index.js';\nimport data from './data.js';\nimport trieBase64 from './data-trie.js';\n\n/**\n * @param {string} base64\n * @returns {Uint8Array}\n */\nfunction decodeBase64(base64) {\n if (typeof Buffer !== 'undefined') {\n return new Uint8Array(Buffer.from(base64, 'base64'));\n }\n\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n\nconst trie = new UnicodeTrie(decodeBase64(trieBase64));\n\n/** @type {(n: number) => number} */\nconst log2 = Math.log2 || (n => Math.log(n) / Math.LN2);\n/**\n * @param {number} n\n * @returns {number}\n */\nconst bits = n => ((log2(n) + 1) | 0);\n\n// compute the number of bits stored for each field\nconst CATEGORY_BITS = bits(data.categories.length - 1);\nconst COMBINING_BITS = bits(data.combiningClasses.length - 1);\nconst SCRIPT_BITS = bits(data.scripts.length - 1);\nconst EAW_BITS = bits(data.eaw.length - 1);\nconst NUMBER_BITS = 10;\n\n// compute shift and mask values for each field\nconst CATEGORY_SHIFT = COMBINING_BITS + SCRIPT_BITS + EAW_BITS + NUMBER_BITS;\nconst COMBINING_SHIFT = SCRIPT_BITS + EAW_BITS + NUMBER_BITS;\nconst SCRIPT_SHIFT = EAW_BITS + NUMBER_BITS;\nconst EAW_SHIFT = NUMBER_BITS;\nconst CATEGORY_MASK = (1 << CATEGORY_BITS) - 1;\nconst COMBINING_MASK = (1 << COMBINING_BITS) - 1;\nconst SCRIPT_MASK = (1 << SCRIPT_BITS) - 1;\nconst EAW_MASK = (1 << EAW_BITS) - 1;\nconst NUMBER_MASK = (1 << NUMBER_BITS) - 1;\n\n/**\n * @param {number} codePoint\n * @returns {string}\n */\nexport function getCategory(codePoint) {\n const val = trie.get(codePoint);\n return data.categories[(val >> CATEGORY_SHIFT) & CATEGORY_MASK];\n}\n\n/**\n * @param {number} codePoint\n * @returns {string}\n */\nexport function getCombiningClass(codePoint) {\n const val = trie.get(codePoint);\n return data.combiningClasses[(val >> COMBINING_SHIFT) & COMBINING_MASK];\n}\n\n/**\n * @param {number} codePoint\n * @returns {string}\n */\nexport function getScript(codePoint) {\n const val = trie.get(codePoint);\n return data.scripts[(val >> SCRIPT_SHIFT) & SCRIPT_MASK];\n}\n\n/**\n * @param {number} codePoint\n * @returns {string}\n */\nexport function getEastAsianWidth(codePoint) {\n const val = trie.get(codePoint);\n return data.eaw[(val >> EAW_SHIFT) & EAW_MASK];\n}\n\n/**\n * @param {number} codePoint\n * @returns {number | null}\n */\nexport function getNumericValue(codePoint) {\n let val = trie.get(codePoint);\n let num = val & NUMBER_MASK;\n\n if (num === 0) {\n return null;\n } else if (num <= 50) {\n return num - 1;\n } else if (num < 0x1e0) {\n const numerator = (num >> 4) - 12;\n const denominator = (num & 0xf) + 1;\n return numerator / denominator;\n } else if (num < 0x300) {\n val = (num >> 5) - 14;\n let exp = (num & 0x1f) + 2;\n\n while (exp > 0) {\n val *= 10;\n exp--;\n }\n return val;\n } else {\n val = (num >> 2) - 0xbf;\n let exp = (num & 3) + 1;\n while (exp > 0) {\n val *= 60;\n exp--;\n }\n return val;\n }\n}\n\n/**\n * @param {number} codePoint\n * @returns {boolean}\n */\nexport function isAlphabetic(codePoint) {\n const category = getCategory(codePoint);\n return (\n category === 'Lu'\n || category === 'Ll'\n || category === 'Lt'\n || category === 'Lm'\n || category === 'Lo'\n || category === 'Nl'\n );\n}\n\n/**\n * @param {number} codePoint\n * @returns {boolean}\n */\nexport function isDigit(codePoint) {\n return getCategory(codePoint) === 'Nd';\n}\n\n/**\n * @param {number} codePoint\n * @returns {boolean}\n */\nexport function isPunctuation(codePoint) {\n const category = getCategory(codePoint);\n return (\n category === 'Pc'\n || category === 'Pd'\n || category === 'Pe'\n || category === 'Pf'\n || category === 'Pi'\n || category === 'Po'\n || category === 'Ps'\n );\n}\n\n/**\n * @param {number} codePoint\n * @returns {boolean}\n */\nexport function isLowerCase(codePoint) {\n return getCategory(codePoint) === 'Ll';\n}\n\n/**\n * @param {number} codePoint\n * @returns {boolean}\n */\nexport function isUpperCase(codePoint) {\n return getCategory(codePoint) === 'Lu';\n}\n\n/**\n * @param {number} codePoint\n * @returns {boolean}\n */\nexport function isTitleCase(codePoint) {\n return getCategory(codePoint) === 'Lt';\n}\n\n/**\n * @param {number} codePoint\n * @returns {boolean}\n */\nexport function isWhiteSpace(codePoint) {\n const category = getCategory(codePoint);\n return (\n category === 'Zs'\n || category === 'Zl'\n || category === 'Zp'\n );\n}\n\n/**\n * @param {number} codePoint\n * @returns {boolean}\n */\nexport function isBaseForm(codePoint) {\n const category = getCategory(codePoint);\n return (\n category === 'Nd'\n || category === 'No'\n || category === 'Nl'\n || category === 'Lu'\n || category === 'Ll'\n || category === 'Lt'\n || category === 'Lm'\n || category === 'Lo'\n || category === 'Me'\n || category === 'Mc'\n );\n}\n\n/**\n * @param {number} codePoint\n * @returns {boolean}\n */\nexport function isMark(codePoint) {\n const category = getCategory(codePoint);\n return (\n category === 'Mn'\n || category === 'Me'\n || category === 'Mc'\n );\n}\n\n// Backwards compatibility.\nexport default {\n getCategory,\n getCombiningClass,\n getScript,\n getEastAsianWidth,\n getNumericValue,\n isAlphabetic,\n isDigit,\n isPunctuation,\n isLowerCase,\n isUpperCase,\n isTitleCase,\n isWhiteSpace,\n isBaseForm,\n isMark\n};\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -2,6 +2,10 @@ import UnicodeTrie from '../unicode-trie/index.js';
2
2
  import data from './data.js';
3
3
  import trieBase64 from './data-trie.js';
4
4
 
5
+ /**
6
+ * @param {string} base64
7
+ * @returns {Uint8Array}
8
+ */
5
9
  function decodeBase64(base64) {
6
10
  if (typeof Buffer !== 'undefined') {
7
11
  return new Uint8Array(Buffer.from(base64, 'base64'));
@@ -17,7 +21,12 @@ function decodeBase64(base64) {
17
21
 
18
22
  const trie = new UnicodeTrie(decodeBase64(trieBase64));
19
23
 
24
+ /** @type {(n: number) => number} */
20
25
  const log2 = Math.log2 || (n => Math.log(n) / Math.LN2);
26
+ /**
27
+ * @param {number} n
28
+ * @returns {number}
29
+ */
21
30
  const bits = n => ((log2(n) + 1) | 0);
22
31
 
23
32
  // compute the number of bits stored for each field
@@ -38,26 +47,46 @@ const SCRIPT_MASK = (1 << SCRIPT_BITS) - 1;
38
47
  const EAW_MASK = (1 << EAW_BITS) - 1;
39
48
  const NUMBER_MASK = (1 << NUMBER_BITS) - 1;
40
49
 
50
+ /**
51
+ * @param {number} codePoint
52
+ * @returns {string}
53
+ */
41
54
  export function getCategory(codePoint) {
42
55
  const val = trie.get(codePoint);
43
56
  return data.categories[(val >> CATEGORY_SHIFT) & CATEGORY_MASK];
44
57
  }
45
58
 
59
+ /**
60
+ * @param {number} codePoint
61
+ * @returns {string}
62
+ */
46
63
  export function getCombiningClass(codePoint) {
47
64
  const val = trie.get(codePoint);
48
65
  return data.combiningClasses[(val >> COMBINING_SHIFT) & COMBINING_MASK];
49
66
  }
50
67
 
68
+ /**
69
+ * @param {number} codePoint
70
+ * @returns {string}
71
+ */
51
72
  export function getScript(codePoint) {
52
73
  const val = trie.get(codePoint);
53
74
  return data.scripts[(val >> SCRIPT_SHIFT) & SCRIPT_MASK];
54
75
  }
55
76
 
77
+ /**
78
+ * @param {number} codePoint
79
+ * @returns {string}
80
+ */
56
81
  export function getEastAsianWidth(codePoint) {
57
82
  const val = trie.get(codePoint);
58
83
  return data.eaw[(val >> EAW_SHIFT) & EAW_MASK];
59
84
  }
60
85
 
86
+ /**
87
+ * @param {number} codePoint
88
+ * @returns {number | null}
89
+ */
61
90
  export function getNumericValue(codePoint) {
62
91
  let val = trie.get(codePoint);
63
92
  let num = val & NUMBER_MASK;
@@ -90,6 +119,10 @@ export function getNumericValue(codePoint) {
90
119
  }
91
120
  }
92
121
 
122
+ /**
123
+ * @param {number} codePoint
124
+ * @returns {boolean}
125
+ */
93
126
  export function isAlphabetic(codePoint) {
94
127
  const category = getCategory(codePoint);
95
128
  return (
@@ -102,10 +135,18 @@ export function isAlphabetic(codePoint) {
102
135
  );
103
136
  }
104
137
 
138
+ /**
139
+ * @param {number} codePoint
140
+ * @returns {boolean}
141
+ */
105
142
  export function isDigit(codePoint) {
106
143
  return getCategory(codePoint) === 'Nd';
107
144
  }
108
145
 
146
+ /**
147
+ * @param {number} codePoint
148
+ * @returns {boolean}
149
+ */
109
150
  export function isPunctuation(codePoint) {
110
151
  const category = getCategory(codePoint);
111
152
  return (
@@ -119,18 +160,34 @@ export function isPunctuation(codePoint) {
119
160
  );
120
161
  }
121
162
 
163
+ /**
164
+ * @param {number} codePoint
165
+ * @returns {boolean}
166
+ */
122
167
  export function isLowerCase(codePoint) {
123
168
  return getCategory(codePoint) === 'Ll';
124
169
  }
125
170
 
171
+ /**
172
+ * @param {number} codePoint
173
+ * @returns {boolean}
174
+ */
126
175
  export function isUpperCase(codePoint) {
127
176
  return getCategory(codePoint) === 'Lu';
128
177
  }
129
178
 
179
+ /**
180
+ * @param {number} codePoint
181
+ * @returns {boolean}
182
+ */
130
183
  export function isTitleCase(codePoint) {
131
184
  return getCategory(codePoint) === 'Lt';
132
185
  }
133
186
 
187
+ /**
188
+ * @param {number} codePoint
189
+ * @returns {boolean}
190
+ */
134
191
  export function isWhiteSpace(codePoint) {
135
192
  const category = getCategory(codePoint);
136
193
  return (
@@ -140,6 +197,10 @@ export function isWhiteSpace(codePoint) {
140
197
  );
141
198
  }
142
199
 
200
+ /**
201
+ * @param {number} codePoint
202
+ * @returns {boolean}
203
+ */
143
204
  export function isBaseForm(codePoint) {
144
205
  const category = getCategory(codePoint);
145
206
  return (
@@ -156,6 +217,10 @@ export function isBaseForm(codePoint) {
156
217
  );
157
218
  }
158
219
 
220
+ /**
221
+ * @param {number} codePoint
222
+ * @returns {boolean}
223
+ */
159
224
  export function isMark(codePoint) {
160
225
  const category = getCategory(codePoint);
161
226
  return (
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cantoo/unicode-properties",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "description": "Fast access to unicode character properties (vendored for @cantoo/fontkit)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",