From 8fe905a02fe99189b37b49ff4a6e12b01d791bd9 Mon Sep 17 00:00:00 2001 From: Jake Jackson Date: Tue, 15 Sep 2026 08:47:26 +1000 Subject: [PATCH] Read a GSUB subtable's record offsets unsigned, so a subtable over 32 KB still resolves (#100) Multiple, Alternate and Ligature Substitution each hold one record per covered glyph, reached through an array of Offset16 from the start of the subtable. Offset16 is unsigned and the counts beside those arrays are uint16, but eight fields in the shaper and the same twelve in the dump were read signed. A subtable larger than 32,767 bytes has entries at or past 0x8000, which came back negative: the reader then seeked 65,536 bytes short of the record it wanted and decoded whatever the table holds there - another glyph's replacement, with a glyph count belonging to neither. Noto Sans Duployan's 'dist' Multiple Substitutions are about 40 KB each, so roughly a quarter of the 1,185 sequences in each sits past the boundary. A font that shapes by expansion then matches and expands what it was handed, so a wrong glyph count is not one wrong glyph: U+1BC44..U+1BC47 came out as 102,109 glyphs and 52 seconds of shaping, and is now 343 glyphs and 0.13s. Rendering the whole Duployan block four characters at a time exhausted 2 GB, and does not now. The residual gap to HarfBuzz's 359 glyphs on that run is #102, whose carry markers are emitted by lookups reachable only as nested lookups. Test font: NotoSans-GSUB2-BigSubtable-Synthetic, built for this - 1,000 covered glyphs each replaced by a run of fifteen markers, whose Sequence array is 36,072 bytes so the last 95 entries sit past the boundary. Co-Authored-By: Claude Opus 5 (1M context) --- src/Otl.php | 22 +- src/OtlDump.php | 24 +- tests/Mpdf/LargeSubtableTest.php | 126 ++ tests/Snapshots/LargeSubtableSnapshotTest.php | 142 +++ .../NotoSans-GSUB2-BigSubtable-Synthetic.json | 1053 +++++++++++++++++ .../NotoSans-GSUB2-BigSubtable-Synthetic.txt | 21 + tests/data/snapshots/large-subtable.pdf | Bin 0 -> 32824 bytes .../NotoSans-GSUB2-BigSubtable-Synthetic.ttf | Bin 0 -> 41172 bytes 8 files changed, 1365 insertions(+), 23 deletions(-) create mode 100644 tests/Mpdf/LargeSubtableTest.php create mode 100644 tests/Snapshots/LargeSubtableSnapshotTest.php create mode 100644 tests/data/fontcache/NotoSans-GSUB2-BigSubtable-Synthetic.json create mode 100644 tests/data/otldump/NotoSans-GSUB2-BigSubtable-Synthetic.txt create mode 100644 tests/data/snapshots/large-subtable.pdf create mode 100644 tests/data/ttf/NotoSans-GSUB2-BigSubtable-Synthetic.ttf diff --git a/src/Otl.php b/src/Otl.php index 0237092b0..98795c4f6 100644 --- a/src/Otl.php +++ b/src/Otl.php @@ -1642,13 +1642,13 @@ function _applyGSUBsubtableSpecial($lookupID, $subtable, $ptr, $currGlyph, $curr //////////////////////////////////////////////////////////////////////////////// $Coverage = $subtable_offset + $this->reader->readUInt16(); $NextGlyphPos = $LuCoverage[$nextGID]; - $LigSetCount = $this->reader->readInt16(); + $LigSetCount = $this->reader->readUInt16(); $this->reader->skip($NextGlyphPos * 2); - $LigSet = $subtable_offset + $this->reader->readInt16(); + $LigSet = $subtable_offset + $this->reader->readUInt16(); $this->reader->seek($LigSet); - $LigCount = $this->reader->readInt16(); + $LigCount = $this->reader->readUInt16(); // LigatureSet i.e. all starting with the same Glyph $nextGlyph [Consonant] $LigatureOffset = []; for ($g = 0; $g < $LigCount; $g++) { @@ -1824,10 +1824,10 @@ private function _applyGSUBmultipleSubst($lookupID, $subtable, $ptr, $currGlyph, $GlyphPos = $LuCoverage[$currGID]; $this->reader->skip(2); $this->reader->skip($GlyphPos * 2); - $Sequences = $subtable_offset + $this->reader->readInt16(); + $Sequences = $subtable_offset + $this->reader->readUInt16(); $this->reader->seek($Sequences); - $GlyphCount = $this->reader->readInt16(); + $GlyphCount = $this->reader->readUInt16(); $SubstituteGlyphs = []; for ($g = 0; $g < $GlyphCount; $g++) { $sgid = $this->reader->readUInt16(); @@ -1861,7 +1861,7 @@ private function _applyGSUBalternateSubst($lookupID, $subtable, $ptr, $currGlyph return 0; } $Coverage = $subtable_offset + $this->reader->readUInt16(); - $AlternateSetCount = $this->reader->readInt16(); + $AlternateSetCount = $this->reader->readUInt16(); ///////////////////////////////////////////////////////////////////////////////!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // Need to set alternate IF set by CSS3 font-feature for a tag // i.e. if this is 'salt' alternate may be set to 2 @@ -1878,10 +1878,10 @@ private function _applyGSUBalternateSubst($lookupID, $subtable, $ptr, $currGlyph $GlyphPos = $LuCoverage[$currGID]; $this->reader->skip($GlyphPos * 2); - $AlternateSets = $subtable_offset + $this->reader->readInt16(); + $AlternateSets = $subtable_offset + $this->reader->readUInt16(); $this->reader->seek($AlternateSets); - $AlternateGlyphCount = $this->reader->readInt16(); + $AlternateGlyphCount = $this->reader->readUInt16(); if ($alt > $AlternateGlyphCount) { return 0; } // If specified alternate not present, cancel [ or could default $alt = 1 ?] @@ -1919,13 +1919,13 @@ private function _applyGSUBligatureSubst($lookupID, $subtable, $ptr, $currGlyph, $Coverage = $subtable_offset + $this->reader->readUInt16(); $FirstGlyphPos = $LuCoverage[$currGID]; - $LigSetCount = $this->reader->readInt16(); + $LigSetCount = $this->reader->readUInt16(); $this->reader->skip($FirstGlyphPos * 2); - $LigSet = $subtable_offset + $this->reader->readInt16(); + $LigSet = $subtable_offset + $this->reader->readUInt16(); $this->reader->seek($LigSet); - $LigCount = $this->reader->readInt16(); + $LigCount = $this->reader->readUInt16(); // LigatureSet i.e. all starting with the same first Glyph $currGlyph $LigatureOffset = []; for ($g = 0; $g < $LigCount; $g++) { diff --git a/src/OtlDump.php b/src/OtlDump.php index 0023678e4..2c7e01c85 100644 --- a/src/OtlDump.php +++ b/src/OtlDump.php @@ -1205,14 +1205,14 @@ function _getGSUBtables() else { if ($Lookup[$i]['Type'] == 2) { $Lookup[$i]['Subtable'][$c]['CoverageTableOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->reader->readUInt16(); - $Lookup[$i]['Subtable'][$c]['SequenceCount'] = $SequenceCount = $this->reader->readInt16(); + $Lookup[$i]['Subtable'][$c]['SequenceCount'] = $SequenceCount = $this->reader->readUInt16(); for ($s = 0; $s < $SequenceCount; $s++) { - $Lookup[$i]['Subtable'][$c]['Sequences'][$s]['Offset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->reader->readInt16(); + $Lookup[$i]['Subtable'][$c]['Sequences'][$s]['Offset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->reader->readUInt16(); } for ($s = 0; $s < $SequenceCount; $s++) { // Sequence Tables $this->reader->seek($Lookup[$i]['Subtable'][$c]['Sequences'][$s]['Offset']); - $Lookup[$i]['Subtable'][$c]['Sequences'][$s]['GlyphCount'] = $this->reader->readInt16(); + $Lookup[$i]['Subtable'][$c]['Sequences'][$s]['GlyphCount'] = $this->reader->readUInt16(); for ($g = 0; $g < $Lookup[$i]['Subtable'][$c]['Sequences'][$s]['GlyphCount']; $g++) { $Lookup[$i]['Subtable'][$c]['Sequences'][$s]['SubstituteGlyphID'][] = $this->reader->readUInt16(); } @@ -1221,15 +1221,15 @@ function _getGSUBtables() else { if ($Lookup[$i]['Type'] == 3) { $Lookup[$i]['Subtable'][$c]['CoverageTableOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->reader->readUInt16(); - $Lookup[$i]['Subtable'][$c]['AlternateSetCount'] = $AlternateSetCount = $this->reader->readInt16(); + $Lookup[$i]['Subtable'][$c]['AlternateSetCount'] = $AlternateSetCount = $this->reader->readUInt16(); for ($s = 0; $s < $AlternateSetCount; $s++) { - $Lookup[$i]['Subtable'][$c]['AlternateSets'][$s]['Offset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->reader->readInt16(); + $Lookup[$i]['Subtable'][$c]['AlternateSets'][$s]['Offset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->reader->readUInt16(); } for ($s = 0; $s < $AlternateSetCount; $s++) { // AlternateSet Tables $this->reader->seek($Lookup[$i]['Subtable'][$c]['AlternateSets'][$s]['Offset']); - $Lookup[$i]['Subtable'][$c]['AlternateSets'][$s]['GlyphCount'] = $this->reader->readInt16(); + $Lookup[$i]['Subtable'][$c]['AlternateSets'][$s]['GlyphCount'] = $this->reader->readUInt16(); for ($g = 0; $g < $Lookup[$i]['Subtable'][$c]['AlternateSets'][$s]['GlyphCount']; $g++) { $Lookup[$i]['Subtable'][$c]['AlternateSets'][$s]['SubstituteGlyphID'][] = $this->reader->readUInt16(); } @@ -1238,14 +1238,14 @@ function _getGSUBtables() else { if ($Lookup[$i]['Type'] == 4) { $Lookup[$i]['Subtable'][$c]['CoverageTableOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->reader->readUInt16(); - $Lookup[$i]['Subtable'][$c]['LigSetCount'] = $LigSetCount = $this->reader->readInt16(); + $Lookup[$i]['Subtable'][$c]['LigSetCount'] = $LigSetCount = $this->reader->readUInt16(); for ($s = 0; $s < $LigSetCount; $s++) { - $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['Offset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->reader->readInt16(); + $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['Offset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->reader->readUInt16(); } for ($s = 0; $s < $LigSetCount; $s++) { // LigatureSet Tables $this->reader->seek($Lookup[$i]['Subtable'][$c]['LigSet'][$s]['Offset']); - $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['LigCount'] = $this->reader->readInt16(); + $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['LigCount'] = $this->reader->readUInt16(); for ($g = 0; $g < $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['LigCount']; $g++) { $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['LigatureOffset'][$g] = $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['Offset'] + $this->reader->readUInt16(); } @@ -1267,14 +1267,14 @@ function _getGSUBtables() // Format 1: Context Substitution if ($SubstFormat == 1) { $Lookup[$i]['Subtable'][$c]['CoverageTableOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->reader->readUInt16(); - $Lookup[$i]['Subtable'][$c]['SubRuleSetCount'] = $SubRuleSetCount = $this->reader->readInt16(); + $Lookup[$i]['Subtable'][$c]['SubRuleSetCount'] = $SubRuleSetCount = $this->reader->readUInt16(); for ($s = 0; $s < $SubRuleSetCount; $s++) { - $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['Offset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->reader->readInt16(); + $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['Offset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->reader->readUInt16(); } for ($s = 0; $s < $SubRuleSetCount; $s++) { // SubRuleSet Tables $this->reader->seek($Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['Offset']); - $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRuleCount'] = $this->reader->readInt16(); + $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRuleCount'] = $this->reader->readUInt16(); for ($g = 0; $g < $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRuleCount']; $g++) { $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRuleOffset'][$g] = $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['Offset'] + $this->reader->readUInt16(); } diff --git a/tests/Mpdf/LargeSubtableTest.php b/tests/Mpdf/LargeSubtableTest.php new file mode 100644 index 000000000..ad5c78c37 --- /dev/null +++ b/tests/Mpdf/LargeSubtableTest.php @@ -0,0 +1,126 @@ + 'utf-8', + 'fontDir' => [__DIR__ . '/../data/ttf'], + 'fontdata' => ['bigsubtable' => [ + 'R' => 'NotoSans-GSUB2-BigSubtable-Synthetic.ttf', + 'useOTL' => 0xFF, + ]], + 'default_font' => 'bigsubtable', + ]); + $mpdf->WriteHTML('

' . $html . '

'); + + return array_values(unpack('N*', mb_convert_encoding($mpdf->drawnText[0], 'UTF-32BE', 'UTF-8'))); + } + + /** + * The control: a glyph whose Sequence is well inside the first 32 KB was always read correctly. + * The markers have no codepoints of their own, so the run is read by its shape rather than by + * naming them. + */ + public function testAGlyphBeforeTheBoundaryExpandsIntoItsOwnRun() + { + $drawn = $this->drawn([self::EARLY]); + + $this->assertCount(self::SEQUENCE_LENGTH, $drawn); + $this->assertSame(self::EARLY, $drawn[self::SELF_POSITION]); + } + + /** + * The first glyph past the boundary. Read signed, its offset was negative: the shaper seeked + * before the subtable, read a glyph count of its own and replaced the character with eight glyphs + * belonging to another - the character typed was not on the page at all. + */ + public function testAGlyphPastTheBoundaryExpandsIntoItsOwnRun() + { + $drawn = $this->drawn([self::FIRST_PAST_BOUNDARY]); + + $this->assertCount(self::SEQUENCE_LENGTH, $drawn); + $this->assertSame(self::FIRST_PAST_BOUNDARY, $drawn[self::SELF_POSITION]); + } + + /** + * Every covered glyph is given the same markers, so the two runs have to agree everywhere but the + * middle. Run against the last glyph of the subtable, 3 KB further past the boundary, so that a + * glyph past it is read from its own Sequence rather than from one that happens to be as long. + */ + public function testTheRunPastTheBoundaryIsTheSameRunAsTheOneBeforeIt() + { + $early = $this->drawn([self::EARLY]); + $late = $this->drawn([self::LAST]); + + unset($early[self::SELF_POSITION], $late[self::SELF_POSITION]); + + $this->assertSame($early, $late); + } + + /** + * Four of them in one run. A font that shapes this way feeds the markers to chaining rules that + * compute on them, so a Sequence read from the wrong place is not one wrong glyph but a run those + * rules then match against and expand again: Noto Sans Duployan turned four characters into + * 102,109 glyphs and 52 seconds of shaping. + */ + public function testEachGlyphOfARunExpandsOnce() + { + $run = [self::LAST - 3, self::LAST - 2, self::LAST - 1, self::LAST]; + $drawn = $this->drawn($run); + + $this->assertCount(count($run) * self::SEQUENCE_LENGTH, $drawn); + foreach ($run as $i => $codepoint) { + $this->assertSame( + $codepoint, + $drawn[$i * self::SEQUENCE_LENGTH + self::SELF_POSITION], + sprintf('the character at position %d is not in the run it expanded into', $i) + ); + } + } + +} diff --git a/tests/Snapshots/LargeSubtableSnapshotTest.php b/tests/Snapshots/LargeSubtableSnapshotTest.php new file mode 100644 index 000000000..b5a0fe6cb --- /dev/null +++ b/tests/Snapshots/LargeSubtableSnapshotTest.php @@ -0,0 +1,142 @@ +mpdf and + * loading it with content + * + * @return void + * @internal Don't call any $this->mpdf->Output*() method + */ + public function generatePdf() + { + $this->mpdf = $this->createMpdf($this->config()); + $this->mpdf->WriteHTML($this->style() . $this->samples()); + } + + private function config() + { + return [ + 'mode' => 'utf-8', + 'fontDir' => [__DIR__ . '/../data/ttf'], + 'fontdata' => [ + 'bigsubtable' => [ + 'R' => 'NotoSans-GSUB2-BigSubtable-Synthetic.ttf', + 'useOTL' => 0xFF, + ], + ], + ]; + } + + private function style() + { + ob_start(); + ?> + + +

mPDF

+

A substitution subtable over 32 KB

+

Each of these characters is replaced by a run of fifteen markers with the + character itself in the middle. The markers draw nothing, so a row shows the shape of the + character that was typed - unless the record was read from the wrong place, in which case the + character is gone and the row is blank.

+ '; + foreach (self::SAMPLES as $sample) { + list($name, $codepoint, $where) = $sample; + $html .= '' . $name . ' U+' . sprintf('%04X', $codepoint) + . ' - ' . $where . '' + . '' . sprintf('&#x%04X;', $codepoint) . ''; + } + + return $html . ''; + } + + /** + * The font comes from the inline style rather than from the stylesheet, so the sample stands on + * its own and the run is the first thing drawn. + * + * @return int[] the codepoints the sample was drawn with + */ + private function drawn($codepoint) + { + $mpdf = new TextRecordingMpdf($this->config()); + $mpdf->WriteHTML(sprintf('

&#x%04X;

', $codepoint)); + + return array_values(unpack('N*', mb_convert_encoding($mpdf->drawnText[0], 'UTF-32BE', 'UTF-8'))); + } + + /** + * The document only shows anything if each row draws the character that was typed. The markers + * around it have no codepoints of their own, so the run is read by where the character sits in it + * rather than by naming them. + */ + public function testEveryRowDrawsTheCharacterThatWasTyped() + { + foreach (self::SAMPLES as $sample) { + list($name, $codepoint) = $sample; + $drawn = $this->drawn($codepoint); + + $this->assertCount(self::SEQUENCE_LENGTH, $drawn, $name . ' was not replaced by a run of sixteen'); + $this->assertSame($codepoint, $drawn[self::SELF_POSITION], $name . ' is not in the run it expanded into'); + } + } +} diff --git a/tests/data/fontcache/NotoSans-GSUB2-BigSubtable-Synthetic.json b/tests/data/fontcache/NotoSans-GSUB2-BigSubtable-Synthetic.json new file mode 100644 index 000000000..f84eebd60 --- /dev/null +++ b/tests/data/fontcache/NotoSans-GSUB2-BigSubtable-Synthetic.json @@ -0,0 +1,1053 @@ +{ + "_": "Generated by composer fontcache:update. See tests/Mpdf/Fonts/ParserGoldenMaster.php.", + "fullName": "NotoSans-GSUB2-BigSubtable-Synthetic", + "mtx": { + "GSUBScriptLang": { + "DFLT": "DFLT " + }, + "GSUBFeatures": { + "DFLT": { + "DFLT": { + "ccmp": [ + 0 + ] + } + } + }, + "GSUBLookups": [ + { + "Type": 2, + "Flag": 0, + "SubtableCount": 1, + "Subtables": [ + 56 + ], + "MarkFilteringSet": "" + } + ], + "GPOSScriptLang": [], + "GPOSFeatures": [], + "GPOSLookups": [], + "MarkGlyphSets": [], + "rtlPUAstr": "", + "haskernGPOS": false, + "hassmallcapsGSUB": false + }, + "cache": { + "GDEFdata.json": { + "GlyphClassBases": " 0E000| 0E001| 0E002| 0E003| 0E004| 0E005| 0E006| 0E007| 0E008| 0E009| 0E00A| 0E00B| 0E00C| 0E00D| 0E00E| 0E00F| 0E010| 0E011| 0E012| 0E013| 0E014| 0E015| 0E016| 0E017| 0E018| 0E019| 0E01A| 0E01B| 0E01C| 0E01D| 0E01E| 0E01F| 0E020| 0E021| 0E022| 0E023| 0E024| 0E025| 0E026| 0E027| 0E028| 0E029| 0E02A| 0E02B| 0E02C| 0E02D| 0E02E| 0E02F| 0E030| 0E031| 0E032| 0E033| 0E034| 0E035| 0E036| 0E037| 0E038| 0E039| 0E03A| 0E03B| 0E03C| 0E03D| 0E03E| 0E03F| 0E040| 0E041| 0E042| 0E043| 0E044| 0E045| 0E046| 0E047| 0E048| 0E049| 0E04A| 0E04B| 0E04C| 0E04D| 0E04E| 0E04F| 0E050| 0E051| 0E052| 0E053| 0E054| 0E055| 0E056| 0E057| 0E058| 0E059| 0E05A| 0E05B| 0E05C| 0E05D| 0E05E| 0E05F| 0E060| 0E061| 0E062| 0E063| 0E064| 0E065| 0E066| 0E067| 0E068| 0E069| 0E06A| 0E06B| 0E06C| 0E06D| 0E06E| 0E06F| 0E070| 0E071| 0E072| 0E073| 0E074| 0E075| 0E076| 0E077| 0E078| 0E079| 0E07A| 0E07B| 0E07C| 0E07D| 0E07E| 0E07F| 0E080| 0E081| 0E082| 0E083| 0E084| 0E085| 0E086| 0E087| 0E088| 0E089| 0E08A| 0E08B| 0E08C| 0E08D| 0E08E| 0E08F| 0E090| 0E091| 0E092| 0E093| 0E094| 0E095| 0E096| 0E097| 0E098| 0E099| 0E09A| 0E09B| 0E09C| 0E09D| 0E09E| 0E09F| 0E0A0| 0E0A1| 0E0A2| 0E0A3| 0E0A4| 0E0A5| 0E0A6| 0E0A7| 0E0A8| 0E0A9| 0E0AA| 0E0AB| 0E0AC| 0E0AD| 0E0AE| 0E0AF| 0E0B0| 0E0B1| 0E0B2| 0E0B3| 0E0B4| 0E0B5| 0E0B6| 0E0B7| 0E0B8| 0E0B9| 0E0BA| 0E0BB| 0E0BC| 0E0BD| 0E0BE| 0E0BF| 0E0C0| 0E0C1| 0E0C2| 0E0C3| 0E0C4| 0E0C5| 0E0C6| 0E0C7| 0E0C8| 0E0C9| 0E0CA| 0E0CB| 0E0CC| 0E0CD| 0E0CE| 0E0CF| 0E0D0| 0E0D1| 0E0D2| 0E0D3| 0E0D4| 0E0D5| 0E0D6| 0E0D7| 0E0D8| 0E0D9| 0E0DA| 0E0DB| 0E0DC| 0E0DD| 0E0DE| 0E0DF| 0E0E0| 0E0E1| 0E0E2| 0E0E3| 0E0E4| 0E0E5| 0E0E6| 0E0E7| 0E0E8| 0E0E9| 0E0EA| 0E0EB| 0E0EC| 0E0ED| 0E0EE| 0E0EF| 0E0F0| 0E0F1| 0E0F2| 0E0F3| 0E0F4| 0E0F5| 0E0F6| 0E0F7| 0E0F8| 0E0F9| 0E0FA| 0E0FB| 0E0FC| 0E0FD| 0E0FE| 0E0FF| 0E100| 0E101| 0E102| 0E103| 0E104| 0E105| 0E106| 0E107| 0E108| 0E109| 0E10A| 0E10B| 0E10C| 0E10D| 0E10E| 0E10F| 0E110| 0E111| 0E112| 0E113| 0E114| 0E115| 0E116| 0E117| 0E118| 0E119| 0E11A| 0E11B| 0E11C| 0E11D| 0E11E| 0E11F| 0E120| 0E121| 0E122| 0E123| 0E124| 0E125| 0E126| 0E127| 0E128| 0E129| 0E12A| 0E12B| 0E12C| 0E12D| 0E12E| 0E12F| 0E130| 0E131| 0E132| 0E133| 0E134| 0E135| 0E136| 0E137| 0E138| 0E139| 0E13A| 0E13B| 0E13C| 0E13D| 0E13E| 0E13F| 0E140| 0E141| 0E142| 0E143| 0E144| 0E145| 0E146| 0E147| 0E148| 0E149| 0E14A| 0E14B| 0E14C| 0E14D| 0E14E| 0E14F| 0E150| 0E151| 0E152| 0E153| 0E154| 0E155| 0E156| 0E157| 0E158| 0E159| 0E15A| 0E15B| 0E15C| 0E15D| 0E15E| 0E15F| 0E160| 0E161| 0E162| 0E163| 0E164| 0E165| 0E166| 0E167| 0E168| 0E169| 0E16A| 0E16B| 0E16C| 0E16D| 0E16E| 0E16F| 0E170| 0E171| 0E172| 0E173| 0E174| 0E175| 0E176| 0E177| 0E178| 0E179| 0E17A| 0E17B| 0E17C| 0E17D| 0E17E| 0E17F| 0E180| 0E181| 0E182| 0E183| 0E184| 0E185| 0E186| 0E187| 0E188| 0E189| 0E18A| 0E18B| 0E18C| 0E18D| 0E18E| 0E18F| 0E190| 0E191| 0E192| 0E193| 0E194| 0E195| 0E196| 0E197| 0E198| 0E199| 0E19A| 0E19B| 0E19C| 0E19D| 0E19E| 0E19F| 0E1A0| 0E1A1| 0E1A2| 0E1A3| 0E1A4| 0E1A5| 0E1A6| 0E1A7| 0E1A8| 0E1A9| 0E1AA| 0E1AB| 0E1AC| 0E1AD| 0E1AE| 0E1AF| 0E1B0| 0E1B1| 0E1B2| 0E1B3| 0E1B4| 0E1B5| 0E1B6| 0E1B7| 0E1B8| 0E1B9| 0E1BA| 0E1BB| 0E1BC| 0E1BD| 0E1BE| 0E1BF| 0E1C0| 0E1C1| 0E1C2| 0E1C3| 0E1C4| 0E1C5| 0E1C6| 0E1C7| 0E1C8| 0E1C9| 0E1CA| 0E1CB| 0E1CC| 0E1CD| 0E1CE| 0E1CF| 0E1D0| 0E1D1| 0E1D2| 0E1D3| 0E1D4| 0E1D5| 0E1D6| 0E1D7| 0E1D8| 0E1D9| 0E1DA| 0E1DB| 0E1DC| 0E1DD| 0E1DE| 0E1DF| 0E1E0| 0E1E1| 0E1E2| 0E1E3| 0E1E4| 0E1E5| 0E1E6| 0E1E7| 0E1E8| 0E1E9| 0E1EA| 0E1EB| 0E1EC| 0E1ED| 0E1EE| 0E1EF| 0E1F0| 0E1F1| 0E1F2| 0E1F3| 0E1F4| 0E1F5| 0E1F6| 0E1F7| 0E1F8| 0E1F9| 0E1FA| 0E1FB| 0E1FC| 0E1FD| 0E1FE| 0E1FF| 0E200| 0E201| 0E202| 0E203| 0E204| 0E205| 0E206| 0E207| 0E208| 0E209| 0E20A| 0E20B| 0E20C| 0E20D| 0E20E| 0E20F| 0E210| 0E211| 0E212| 0E213| 0E214| 0E215| 0E216| 0E217| 0E218| 0E219| 0E21A| 0E21B| 0E21C| 0E21D| 0E21E| 0E21F| 0E220| 0E221| 0E222| 0E223| 0E224| 0E225| 0E226| 0E227| 0E228| 0E229| 0E22A| 0E22B| 0E22C| 0E22D| 0E22E| 0E22F| 0E230| 0E231| 0E232| 0E233| 0E234| 0E235| 0E236| 0E237| 0E238| 0E239| 0E23A| 0E23B| 0E23C| 0E23D| 0E23E| 0E23F| 0E240| 0E241| 0E242| 0E243| 0E244| 0E245| 0E246| 0E247| 0E248| 0E249| 0E24A| 0E24B| 0E24C| 0E24D| 0E24E| 0E24F| 0E250| 0E251| 0E252| 0E253| 0E254| 0E255| 0E256| 0E257| 0E258| 0E259| 0E25A| 0E25B| 0E25C| 0E25D| 0E25E| 0E25F| 0E260| 0E261| 0E262| 0E263| 0E264| 0E265| 0E266| 0E267| 0E268| 0E269| 0E26A| 0E26B| 0E26C| 0E26D| 0E26E| 0E26F| 0E270| 0E271| 0E272| 0E273| 0E274| 0E275| 0E276| 0E277| 0E278| 0E279| 0E27A| 0E27B| 0E27C| 0E27D| 0E27E| 0E27F| 0E280| 0E281| 0E282| 0E283| 0E284| 0E285| 0E286| 0E287| 0E288| 0E289| 0E28A| 0E28B| 0E28C| 0E28D| 0E28E| 0E28F| 0E290| 0E291| 0E292| 0E293| 0E294| 0E295| 0E296| 0E297| 0E298| 0E299| 0E29A| 0E29B| 0E29C| 0E29D| 0E29E| 0E29F| 0E2A0| 0E2A1| 0E2A2| 0E2A3| 0E2A4| 0E2A5| 0E2A6| 0E2A7| 0E2A8| 0E2A9| 0E2AA| 0E2AB| 0E2AC| 0E2AD| 0E2AE| 0E2AF| 0E2B0| 0E2B1| 0E2B2| 0E2B3| 0E2B4| 0E2B5| 0E2B6| 0E2B7| 0E2B8| 0E2B9| 0E2BA| 0E2BB| 0E2BC| 0E2BD| 0E2BE| 0E2BF| 0E2C0| 0E2C1| 0E2C2| 0E2C3| 0E2C4| 0E2C5| 0E2C6| 0E2C7| 0E2C8| 0E2C9| 0E2CA| 0E2CB| 0E2CC| 0E2CD| 0E2CE| 0E2CF| 0E2D0| 0E2D1| 0E2D2| 0E2D3| 0E2D4| 0E2D5| 0E2D6| 0E2D7| 0E2D8| 0E2D9| 0E2DA| 0E2DB| 0E2DC| 0E2DD| 0E2DE| 0E2DF| 0E2E0| 0E2E1| 0E2E2| 0E2E3| 0E2E4| 0E2E5| 0E2E6| 0E2E7| 0E2E8| 0E2E9| 0E2EA| 0E2EB| 0E2EC| 0E2ED| 0E2EE| 0E2EF| 0E2F0| 0E2F1| 0E2F2| 0E2F3| 0E2F4| 0E2F5| 0E2F6| 0E2F7| 0E2F8| 0E2F9| 0E2FA| 0E2FB| 0E2FC| 0E2FD| 0E2FE| 0E2FF| 0E300| 0E301| 0E302| 0E303| 0E304| 0E305| 0E306| 0E307| 0E308| 0E309| 0E30A| 0E30B| 0E30C| 0E30D| 0E30E| 0E30F| 0E310| 0E311| 0E312| 0E313| 0E314| 0E315| 0E316| 0E317| 0E318| 0E319| 0E31A| 0E31B| 0E31C| 0E31D| 0E31E| 0E31F| 0E320| 0E321| 0E322| 0E323| 0E324| 0E325| 0E326| 0E327| 0E328| 0E329| 0E32A| 0E32B| 0E32C| 0E32D| 0E32E| 0E32F| 0E330| 0E331| 0E332| 0E333| 0E334| 0E335| 0E336| 0E337| 0E338| 0E339| 0E33A| 0E33B| 0E33C| 0E33D| 0E33E| 0E33F| 0E340| 0E341| 0E342| 0E343| 0E344| 0E345| 0E346| 0E347| 0E348| 0E349| 0E34A| 0E34B| 0E34C| 0E34D| 0E34E| 0E34F| 0E350| 0E351| 0E352| 0E353| 0E354| 0E355| 0E356| 0E357| 0E358| 0E359| 0E35A| 0E35B| 0E35C| 0E35D| 0E35E| 0E35F| 0E360| 0E361| 0E362| 0E363| 0E364| 0E365| 0E366| 0E367| 0E368| 0E369| 0E36A| 0E36B| 0E36C| 0E36D| 0E36E| 0E36F| 0E370| 0E371| 0E372| 0E373| 0E374| 0E375| 0E376| 0E377| 0E378| 0E379| 0E37A| 0E37B| 0E37C| 0E37D| 0E37E| 0E37F| 0E380| 0E381| 0E382| 0E383| 0E384| 0E385| 0E386| 0E387| 0E388| 0E389| 0E38A| 0E38B| 0E38C| 0E38D| 0E38E| 0E38F| 0E390| 0E391| 0E392| 0E393| 0E394| 0E395| 0E396| 0E397| 0E398| 0E399| 0E39A| 0E39B| 0E39C| 0E39D| 0E39E| 0E39F| 0E3A0| 0E3A1| 0E3A2| 0E3A3| 0E3A4| 0E3A5| 0E3A6| 0E3A7| 0E3A8| 0E3A9| 0E3AA| 0E3AB| 0E3AC| 0E3AD| 0E3AE| 0E3AF| 0E3B0| 0E3B1| 0E3B2| 0E3B3| 0E3B4| 0E3B5| 0E3B6| 0E3B7| 0E3B8| 0E3B9| 0E3BA| 0E3BB| 0E3BC| 0E3BD| 0E3BE| 0E3BF| 0E3C0| 0E3C1| 0E3C2| 0E3C3| 0E3C4| 0E3C5| 0E3C6| 0E3C7| 0E3C8| 0E3C9| 0E3CA| 0E3CB| 0E3CC| 0E3CD| 0E3CE| 0E3CF| 0E3D0| 0E3D1| 0E3D2| 0E3D3| 0E3D4| 0E3D5| 0E3D6| 0E3D7| 0E3D8| 0E3D9| 0E3DA| 0E3DB| 0E3DC| 0E3DD| 0E3DE| 0E3DF| 0E3E0| 0E3E1| 0E3E2| 0E3E3| 0E3E4| 0E3E5| 0E3E6| 0E3E7", + "GlyphClassMarks": " 0E3E8| 0E3E9| 0E3EA| 0E3EB| 0E3EC| 0E3ED| 0E3EE| 0E3EF| 0E3F0| 0E3F1| 0E3F2| 0E3F3| 0E3F4| 0E3F5| 0E3F6", + "GlyphClassLigatures": "", + "GlyphClassComponents": "", + "MarkGlyphSets": [], + "MarkAttachmentType": [] + }, + "GSUB.dat": "36072 bytes, sha256 6fc0558b0e4e9a4348e45908fbd9ddbb728fb0603b84b36ac717f1ec265d7e18", + "GSUBdata.json": [ + [ + { + "57344": 0, + "57345": 1, + "57346": 2, + "57347": 3, + "57348": 4, + "57349": 5, + "57350": 6, + "57351": 7, + "57352": 8, + "57353": 9, + "57354": 10, + "57355": 11, + "57356": 12, + "57357": 13, + "57358": 14, + "57359": 15, + "57360": 16, + "57361": 17, + "57362": 18, + "57363": 19, + "57364": 20, + "57365": 21, + "57366": 22, + "57367": 23, + "57368": 24, + "57369": 25, + "57370": 26, + "57371": 27, + "57372": 28, + "57373": 29, + "57374": 30, + "57375": 31, + "57376": 32, + "57377": 33, + "57378": 34, + "57379": 35, + "57380": 36, + "57381": 37, + "57382": 38, + "57383": 39, + "57384": 40, + "57385": 41, + "57386": 42, + "57387": 43, + "57388": 44, + "57389": 45, + "57390": 46, + "57391": 47, + "57392": 48, + "57393": 49, + "57394": 50, + "57395": 51, + "57396": 52, + "57397": 53, + "57398": 54, + "57399": 55, + "57400": 56, + "57401": 57, + "57402": 58, + "57403": 59, + "57404": 60, + "57405": 61, + "57406": 62, + "57407": 63, + "57408": 64, + "57409": 65, + "57410": 66, + "57411": 67, + "57412": 68, + "57413": 69, + "57414": 70, + "57415": 71, + "57416": 72, + "57417": 73, + "57418": 74, + "57419": 75, + "57420": 76, + "57421": 77, + "57422": 78, + "57423": 79, + "57424": 80, + "57425": 81, + "57426": 82, + "57427": 83, + "57428": 84, + "57429": 85, + "57430": 86, + "57431": 87, + "57432": 88, + "57433": 89, + "57434": 90, + "57435": 91, + "57436": 92, + "57437": 93, + "57438": 94, + "57439": 95, + "57440": 96, + "57441": 97, + "57442": 98, + "57443": 99, + "57444": 100, + "57445": 101, + "57446": 102, + "57447": 103, + "57448": 104, + "57449": 105, + "57450": 106, + "57451": 107, + "57452": 108, + "57453": 109, + "57454": 110, + "57455": 111, + "57456": 112, + "57457": 113, + "57458": 114, + "57459": 115, + "57460": 116, + "57461": 117, + "57462": 118, + "57463": 119, + "57464": 120, + "57465": 121, + "57466": 122, + "57467": 123, + "57468": 124, + "57469": 125, + "57470": 126, + "57471": 127, + "57472": 128, + "57473": 129, + "57474": 130, + "57475": 131, + "57476": 132, + "57477": 133, + "57478": 134, + "57479": 135, + "57480": 136, + "57481": 137, + "57482": 138, + "57483": 139, + "57484": 140, + "57485": 141, + "57486": 142, + "57487": 143, + "57488": 144, + "57489": 145, + "57490": 146, + "57491": 147, + "57492": 148, + "57493": 149, + "57494": 150, + "57495": 151, + "57496": 152, + "57497": 153, + "57498": 154, + "57499": 155, + "57500": 156, + "57501": 157, + "57502": 158, + "57503": 159, + "57504": 160, + "57505": 161, + "57506": 162, + "57507": 163, + "57508": 164, + "57509": 165, + "57510": 166, + "57511": 167, + "57512": 168, + "57513": 169, + "57514": 170, + "57515": 171, + "57516": 172, + "57517": 173, + "57518": 174, + "57519": 175, + "57520": 176, + "57521": 177, + "57522": 178, + "57523": 179, + "57524": 180, + "57525": 181, + "57526": 182, + "57527": 183, + "57528": 184, + "57529": 185, + "57530": 186, + "57531": 187, + "57532": 188, + "57533": 189, + "57534": 190, + "57535": 191, + "57536": 192, + "57537": 193, + "57538": 194, + "57539": 195, + "57540": 196, + "57541": 197, + "57542": 198, + "57543": 199, + "57544": 200, + "57545": 201, + "57546": 202, + "57547": 203, + "57548": 204, + "57549": 205, + "57550": 206, + "57551": 207, + "57552": 208, + "57553": 209, + "57554": 210, + "57555": 211, + "57556": 212, + "57557": 213, + "57558": 214, + "57559": 215, + "57560": 216, + "57561": 217, + "57562": 218, + "57563": 219, + "57564": 220, + "57565": 221, + "57566": 222, + "57567": 223, + "57568": 224, + "57569": 225, + "57570": 226, + "57571": 227, + "57572": 228, + "57573": 229, + "57574": 230, + "57575": 231, + "57576": 232, + "57577": 233, + "57578": 234, + "57579": 235, + "57580": 236, + "57581": 237, + "57582": 238, + "57583": 239, + "57584": 240, + "57585": 241, + "57586": 242, + "57587": 243, + "57588": 244, + "57589": 245, + "57590": 246, + "57591": 247, + "57592": 248, + "57593": 249, + "57594": 250, + "57595": 251, + "57596": 252, + "57597": 253, + "57598": 254, + "57599": 255, + "57600": 256, + "57601": 257, + "57602": 258, + "57603": 259, + "57604": 260, + "57605": 261, + "57606": 262, + "57607": 263, + "57608": 264, + "57609": 265, + "57610": 266, + "57611": 267, + "57612": 268, + "57613": 269, + "57614": 270, + "57615": 271, + "57616": 272, + "57617": 273, + "57618": 274, + "57619": 275, + "57620": 276, + "57621": 277, + "57622": 278, + "57623": 279, + "57624": 280, + "57625": 281, + "57626": 282, + "57627": 283, + "57628": 284, + "57629": 285, + "57630": 286, + "57631": 287, + "57632": 288, + "57633": 289, + "57634": 290, + "57635": 291, + "57636": 292, + "57637": 293, + "57638": 294, + "57639": 295, + "57640": 296, + "57641": 297, + "57642": 298, + "57643": 299, + "57644": 300, + "57645": 301, + "57646": 302, + "57647": 303, + "57648": 304, + "57649": 305, + "57650": 306, + "57651": 307, + "57652": 308, + "57653": 309, + "57654": 310, + "57655": 311, + "57656": 312, + "57657": 313, + "57658": 314, + "57659": 315, + "57660": 316, + "57661": 317, + "57662": 318, + "57663": 319, + "57664": 320, + "57665": 321, + "57666": 322, + "57667": 323, + "57668": 324, + "57669": 325, + "57670": 326, + "57671": 327, + "57672": 328, + "57673": 329, + "57674": 330, + "57675": 331, + "57676": 332, + "57677": 333, + "57678": 334, + "57679": 335, + "57680": 336, + "57681": 337, + "57682": 338, + "57683": 339, + "57684": 340, + "57685": 341, + "57686": 342, + "57687": 343, + "57688": 344, + "57689": 345, + "57690": 346, + "57691": 347, + "57692": 348, + "57693": 349, + "57694": 350, + "57695": 351, + "57696": 352, + "57697": 353, + "57698": 354, + "57699": 355, + "57700": 356, + "57701": 357, + "57702": 358, + "57703": 359, + "57704": 360, + "57705": 361, + "57706": 362, + "57707": 363, + "57708": 364, + "57709": 365, + "57710": 366, + "57711": 367, + "57712": 368, + "57713": 369, + "57714": 370, + "57715": 371, + "57716": 372, + "57717": 373, + "57718": 374, + "57719": 375, + "57720": 376, + "57721": 377, + "57722": 378, + "57723": 379, + "57724": 380, + "57725": 381, + "57726": 382, + "57727": 383, + "57728": 384, + "57729": 385, + "57730": 386, + "57731": 387, + "57732": 388, + "57733": 389, + "57734": 390, + "57735": 391, + "57736": 392, + "57737": 393, + "57738": 394, + "57739": 395, + "57740": 396, + "57741": 397, + "57742": 398, + "57743": 399, + "57744": 400, + "57745": 401, + "57746": 402, + "57747": 403, + "57748": 404, + "57749": 405, + "57750": 406, + "57751": 407, + "57752": 408, + "57753": 409, + "57754": 410, + "57755": 411, + "57756": 412, + "57757": 413, + "57758": 414, + "57759": 415, + "57760": 416, + "57761": 417, + "57762": 418, + "57763": 419, + "57764": 420, + "57765": 421, + "57766": 422, + "57767": 423, + "57768": 424, + "57769": 425, + "57770": 426, + "57771": 427, + "57772": 428, + "57773": 429, + "57774": 430, + "57775": 431, + "57776": 432, + "57777": 433, + "57778": 434, + "57779": 435, + "57780": 436, + "57781": 437, + "57782": 438, + "57783": 439, + "57784": 440, + "57785": 441, + "57786": 442, + "57787": 443, + "57788": 444, + "57789": 445, + "57790": 446, + "57791": 447, + "57792": 448, + "57793": 449, + "57794": 450, + "57795": 451, + "57796": 452, + "57797": 453, + "57798": 454, + "57799": 455, + "57800": 456, + "57801": 457, + "57802": 458, + "57803": 459, + "57804": 460, + "57805": 461, + "57806": 462, + "57807": 463, + "57808": 464, + "57809": 465, + "57810": 466, + "57811": 467, + "57812": 468, + "57813": 469, + "57814": 470, + "57815": 471, + "57816": 472, + "57817": 473, + "57818": 474, + "57819": 475, + "57820": 476, + "57821": 477, + "57822": 478, + "57823": 479, + "57824": 480, + "57825": 481, + "57826": 482, + "57827": 483, + "57828": 484, + "57829": 485, + "57830": 486, + "57831": 487, + "57832": 488, + "57833": 489, + "57834": 490, + "57835": 491, + "57836": 492, + "57837": 493, + "57838": 494, + "57839": 495, + "57840": 496, + "57841": 497, + "57842": 498, + "57843": 499, + "57844": 500, + "57845": 501, + "57846": 502, + "57847": 503, + "57848": 504, + "57849": 505, + "57850": 506, + "57851": 507, + "57852": 508, + "57853": 509, + "57854": 510, + "57855": 511, + "57856": 512, + "57857": 513, + "57858": 514, + "57859": 515, + "57860": 516, + "57861": 517, + "57862": 518, + "57863": 519, + "57864": 520, + "57865": 521, + "57866": 522, + "57867": 523, + "57868": 524, + "57869": 525, + "57870": 526, + "57871": 527, + "57872": 528, + "57873": 529, + "57874": 530, + "57875": 531, + "57876": 532, + "57877": 533, + "57878": 534, + "57879": 535, + "57880": 536, + "57881": 537, + "57882": 538, + "57883": 539, + "57884": 540, + "57885": 541, + "57886": 542, + "57887": 543, + "57888": 544, + "57889": 545, + "57890": 546, + "57891": 547, + "57892": 548, + "57893": 549, + "57894": 550, + "57895": 551, + "57896": 552, + "57897": 553, + "57898": 554, + "57899": 555, + "57900": 556, + "57901": 557, + "57902": 558, + "57903": 559, + "57904": 560, + "57905": 561, + "57906": 562, + "57907": 563, + "57908": 564, + "57909": 565, + "57910": 566, + "57911": 567, + "57912": 568, + "57913": 569, + "57914": 570, + "57915": 571, + "57916": 572, + "57917": 573, + "57918": 574, + "57919": 575, + "57920": 576, + "57921": 577, + "57922": 578, + "57923": 579, + "57924": 580, + "57925": 581, + "57926": 582, + "57927": 583, + "57928": 584, + "57929": 585, + "57930": 586, + "57931": 587, + "57932": 588, + "57933": 589, + "57934": 590, + "57935": 591, + "57936": 592, + "57937": 593, + "57938": 594, + "57939": 595, + "57940": 596, + "57941": 597, + "57942": 598, + "57943": 599, + "57944": 600, + "57945": 601, + "57946": 602, + "57947": 603, + "57948": 604, + "57949": 605, + "57950": 606, + "57951": 607, + "57952": 608, + "57953": 609, + "57954": 610, + "57955": 611, + "57956": 612, + "57957": 613, + "57958": 614, + "57959": 615, + "57960": 616, + "57961": 617, + "57962": 618, + "57963": 619, + "57964": 620, + "57965": 621, + "57966": 622, + "57967": 623, + "57968": 624, + "57969": 625, + "57970": 626, + "57971": 627, + "57972": 628, + "57973": 629, + "57974": 630, + "57975": 631, + "57976": 632, + "57977": 633, + "57978": 634, + "57979": 635, + "57980": 636, + "57981": 637, + "57982": 638, + "57983": 639, + "57984": 640, + "57985": 641, + "57986": 642, + "57987": 643, + "57988": 644, + "57989": 645, + "57990": 646, + "57991": 647, + "57992": 648, + "57993": 649, + "57994": 650, + "57995": 651, + "57996": 652, + "57997": 653, + "57998": 654, + "57999": 655, + "58000": 656, + "58001": 657, + "58002": 658, + "58003": 659, + "58004": 660, + "58005": 661, + "58006": 662, + "58007": 663, + "58008": 664, + "58009": 665, + "58010": 666, + "58011": 667, + "58012": 668, + "58013": 669, + "58014": 670, + "58015": 671, + "58016": 672, + "58017": 673, + "58018": 674, + "58019": 675, + "58020": 676, + "58021": 677, + "58022": 678, + "58023": 679, + "58024": 680, + "58025": 681, + "58026": 682, + "58027": 683, + "58028": 684, + "58029": 685, + "58030": 686, + "58031": 687, + "58032": 688, + "58033": 689, + "58034": 690, + "58035": 691, + "58036": 692, + "58037": 693, + "58038": 694, + "58039": 695, + "58040": 696, + "58041": 697, + "58042": 698, + "58043": 699, + "58044": 700, + "58045": 701, + "58046": 702, + "58047": 703, + "58048": 704, + "58049": 705, + "58050": 706, + "58051": 707, + "58052": 708, + "58053": 709, + "58054": 710, + "58055": 711, + "58056": 712, + "58057": 713, + "58058": 714, + "58059": 715, + "58060": 716, + "58061": 717, + "58062": 718, + "58063": 719, + "58064": 720, + "58065": 721, + "58066": 722, + "58067": 723, + "58068": 724, + "58069": 725, + "58070": 726, + "58071": 727, + "58072": 728, + "58073": 729, + "58074": 730, + "58075": 731, + "58076": 732, + "58077": 733, + "58078": 734, + "58079": 735, + "58080": 736, + "58081": 737, + "58082": 738, + "58083": 739, + "58084": 740, + "58085": 741, + "58086": 742, + "58087": 743, + "58088": 744, + "58089": 745, + "58090": 746, + "58091": 747, + "58092": 748, + "58093": 749, + "58094": 750, + "58095": 751, + "58096": 752, + "58097": 753, + "58098": 754, + "58099": 755, + "58100": 756, + "58101": 757, + "58102": 758, + "58103": 759, + "58104": 760, + "58105": 761, + "58106": 762, + "58107": 763, + "58108": 764, + "58109": 765, + "58110": 766, + "58111": 767, + "58112": 768, + "58113": 769, + "58114": 770, + "58115": 771, + "58116": 772, + "58117": 773, + "58118": 774, + "58119": 775, + "58120": 776, + "58121": 777, + "58122": 778, + "58123": 779, + "58124": 780, + "58125": 781, + "58126": 782, + "58127": 783, + "58128": 784, + "58129": 785, + "58130": 786, + "58131": 787, + "58132": 788, + "58133": 789, + "58134": 790, + "58135": 791, + "58136": 792, + "58137": 793, + "58138": 794, + "58139": 795, + "58140": 796, + "58141": 797, + "58142": 798, + "58143": 799, + "58144": 800, + "58145": 801, + "58146": 802, + "58147": 803, + "58148": 804, + "58149": 805, + "58150": 806, + "58151": 807, + "58152": 808, + "58153": 809, + "58154": 810, + "58155": 811, + "58156": 812, + "58157": 813, + "58158": 814, + "58159": 815, + "58160": 816, + "58161": 817, + "58162": 818, + "58163": 819, + "58164": 820, + "58165": 821, + "58166": 822, + "58167": 823, + "58168": 824, + "58169": 825, + "58170": 826, + "58171": 827, + "58172": 828, + "58173": 829, + "58174": 830, + "58175": 831, + "58176": 832, + "58177": 833, + "58178": 834, + "58179": 835, + "58180": 836, + "58181": 837, + "58182": 838, + "58183": 839, + "58184": 840, + "58185": 841, + "58186": 842, + "58187": 843, + "58188": 844, + "58189": 845, + "58190": 846, + "58191": 847, + "58192": 848, + "58193": 849, + "58194": 850, + "58195": 851, + "58196": 852, + "58197": 853, + "58198": 854, + "58199": 855, + "58200": 856, + "58201": 857, + "58202": 858, + "58203": 859, + "58204": 860, + "58205": 861, + "58206": 862, + "58207": 863, + "58208": 864, + "58209": 865, + "58210": 866, + "58211": 867, + "58212": 868, + "58213": 869, + "58214": 870, + "58215": 871, + "58216": 872, + "58217": 873, + "58218": 874, + "58219": 875, + "58220": 876, + "58221": 877, + "58222": 878, + "58223": 879, + "58224": 880, + "58225": 881, + "58226": 882, + "58227": 883, + "58228": 884, + "58229": 885, + "58230": 886, + "58231": 887, + "58232": 888, + "58233": 889, + "58234": 890, + "58235": 891, + "58236": 892, + "58237": 893, + "58238": 894, + "58239": 895, + "58240": 896, + "58241": 897, + "58242": 898, + "58243": 899, + "58244": 900, + "58245": 901, + "58246": 902, + "58247": 903, + "58248": 904, + "58249": 905, + "58250": 906, + "58251": 907, + "58252": 908, + "58253": 909, + "58254": 910, + "58255": 911, + "58256": 912, + "58257": 913, + "58258": 914, + "58259": 915, + "58260": 916, + "58261": 917, + "58262": 918, + "58263": 919, + "58264": 920, + "58265": 921, + "58266": 922, + "58267": 923, + "58268": 924, + "58269": 925, + "58270": 926, + "58271": 927, + "58272": 928, + "58273": 929, + "58274": 930, + "58275": 931, + "58276": 932, + "58277": 933, + "58278": 934, + "58279": 935, + "58280": 936, + "58281": 937, + "58282": 938, + "58283": 939, + "58284": 940, + "58285": 941, + "58286": 942, + "58287": 943, + "58288": 944, + "58289": 945, + "58290": 946, + "58291": 947, + "58292": 948, + "58293": 949, + "58294": 950, + "58295": 951, + "58296": 952, + "58297": 953, + "58298": 954, + "58299": 955, + "58300": 956, + "58301": 957, + "58302": 958, + "58303": 959, + "58304": 960, + "58305": 961, + "58306": 962, + "58307": 963, + "58308": 964, + "58309": 965, + "58310": 966, + "58311": 967, + "58312": 968, + "58313": 969, + "58314": 970, + "58315": 971, + "58316": 972, + "58317": 973, + "58318": 974, + "58319": 975, + "58320": 976, + "58321": 977, + "58322": 978, + "58323": 979, + "58324": 980, + "58325": 981, + "58326": 982, + "58327": 983, + "58328": 984, + "58329": 985, + "58330": 986, + "58331": 987, + "58332": 988, + "58333": 989, + "58334": 990, + "58335": 991, + "58336": 992, + "58337": 993, + "58338": 994, + "58339": 995, + "58340": 996, + "58341": 997, + "58342": 998, + "58343": 999 + } + ] + ] + } +} diff --git a/tests/data/otldump/NotoSans-GSUB2-BigSubtable-Synthetic.txt b/tests/data/otldump/NotoSans-GSUB2-BigSubtable-Synthetic.txt new file mode 100644 index 000000000..0b83983f0 --- /dev/null +++ b/tests/data/otldump/NotoSans-GSUB2-BigSubtable-Synthetic.txt @@ -0,0 +1,21 @@ +

GDEF table

+

Glyph classes

+

Glyph class 1

+
Base glyph (single character, spacing glyph)
+
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
+

Glyph class 3

+
Mark glyph (non-spacing combining glyph)
+
◌ ◌ ◌ ◌ ◌ ◌ ◌ ◌ ◌ ◌ ◌ ◌ ◌ ◌ ◌
+

GSUB Tables

+

GSUB Scripts & Languages

+
+
DFLT
DFLT: ccmp
+
+
GPOS table not defined
+ +=== detail: script DFLT language DFLT === +609403 bytes, sha256 e4a58d9c2a74c1d25ba00f10bb4440b33d7e8a52eb0fbe1ab9b170916316b4a6 +first 8192 bytes: +

GSUB Tables

+
Lookup #0 [tag: ccmp]
Subtable #0
LookupType 2: Multiple Substitution Subtable
M+E000     » »   ◌ ◌ ◌ ◌ ◌ ◌ ◌ ◌  ◌ ◌ ◌ ◌ ◌ ◌ ◌  M+E3E8, M+E3E9, M+E3EA, M+E3EB, M+E3EC, M+E3ED, M+E3EE, M+E3EF, M+E000, M+E3F0, M+E3F1, M+E3F2, M+E3F3, M+E3F4, M+E3F5, M+E3F6
M+E001     » »   ◌ ◌ ◌ ◌ ◌ ◌ ◌ ◌  ◌ ◌ ◌ ◌ ◌ ◌ ◌  M+E3E8, M+E3E9, M+E3EA, M+E3EB, M+E3EC, M+E3ED, M+E3EE, M+E3EF, M+E001, M+E3F0, M+E3F1, M+E3F2, M+E3F3, M+E3F4, M+E3F5, M+E3F6
M+E002     » »   ◌ ◌ ◌ ◌ ◌ ◌ ◌ ◌  ◌ ◌ ◌ ◌ ◌ ◌ ◌  M+E3E8, M+E3E9, M+E3EA, M+E3EB, M+E3EC, M+E3ED, M+E3EE, M+E3EF, M+E002, M+E3F0, M+E3F1, M+E3F2, M+E3F3, M+E3F4, M+E3F5, M+E3F6
M+E003     » »   ◌ ◌ ◌ ◌ ◌ ◌ ◌ ◌  ◌ ◌ ◌ ◌ ◌ ◌ ◌  M+E3E8, M+E3E9, M+E3EA, M+E3EB, M+E3EC, M+E3ED, M+E3EE, M+E3EF, M+E003, M+E3F0, M+E3F1, M+E3F2, M+E3F3, M+E3F4, M+E3F5, M+E3F6
M+E004     » »   ◌ ◌ ◌ ◌ ◌ ◌ ◌ ◌  ◌ ◌ ◌ ◌ ◌ ◌ ◌  M+E3E8, M+E3E9, M+E3EA, M+E3EB, M+E3EC, M+E3ED, M+E3EE, M+E3EF, M+E004, M+E3F0, M+E3F1, M+E3F2, M+E3F3, M+E3F4, M+E3F5, M+E3F6
M+E005     » »   ◌ ◌ ◌ ◌ ◌ ◌ ◌ ◌  ◌ ◌ ◌ ◌ ◌ ◌ ◌  M+E3E8, M+E3E9, M+E3EA, M+E3EB, M+E3EC, M+E3ED, M+E3EE, M+E3EF, M+E005, M+E3F0, M+E3F1, M+E3F2, M+E3F3, M+E3F4, M+E3F5, M+E3F6
M+E006     » »   ◌ ◌ ◌ ◌ ◌ ◌ ◌ ◌  ◌ ◌ ◌ ◌ ◌ ◌ ◌  M+E3E8, M+E3E9, M+E3EA, M+E3EB, M+E3EC, M+E3ED, M+E3EE, M+E3EF, M+E006, M+E3F0, M+E3F1, M+E3F2, M+E3F3, M+E3F4, M+E3F5, M+E3F6
M+E007     » »   ◌ ◌ ◌ ◌ ◌ ◌ ◌ ◌  ◌ ◌ ◌ ◌ ◌ ◌ ◌  M+E3E8, M+E3E9, M+E3EA, M+E3EB, M+E3EC, M+E3ED, M+E3EE, M+E3EF, M+E007, M+E3F0, M+E3F1, M+E3F2, M+E3F3, M+E3F4, M+E3F5, M+E3F6
M+E008     » »   ◌ ◌ ◌ ◌ ◌ ◌ ◌ ◌  ◌ ◌ ◌ ◌ ◌ ◌ ◌  M+E3E8, M+E3E9, M+E3EA, M+E3EB, M+E3EC, M+E3ED, M+E3EE, M+E3EF, M+E008, M+E3F0, M+E3F1, M+E3F2, M+E3F3, M+E3F4, M+E3F5, M+E3F6
M+E009     » »   ◌ ◌ ◌ ◌ ◌ ◌ ◌ ◌  ◌ ◌ ◌ ◌ ◌ ◌ ◌  M+E3E8, M+E3E9, M+E3EA, M+E3EB, M+E3EC, M+E3ED, M+E3EE, M+E3EF, M+E009, M+E3F0, M+E3F1, M+E3F2, M+E3F3, M+E3F4, M+E3F5, M+E3F6
M+E00A     » »   ◌ ◌ ◌ ◌ ◌ ◌ ◌ ◌  ◌ ◌ ◌ ◌ ◌ ◌ ◌  M+E3E8, M+E3E9, M+E3EA, M+E3EB, M+E3EC, M+E3ED, M+E3EE, M+E3EF, M+E00A, M+E3F0, M+E3F1, M+E3F2, M+E3F3, M+E3F4, M+E3F5, M+E3F6
M+E00B     » »   ◌ ◌ ◌ ◌ ◌ ◌ ◌ ◌  ◌ ◌ ◌ ◌ ◌ ◌ ◌  M+E3E8, M+E3E9, M+E3EA, M+E3EB, M+E3EC, M+E3ED, M+E3EE, M+E3EF, M+E00B, M+E3F0, M+E3F1, M+E3F2, M+E3F3, M+E3F4, M+E3F5, M+E3F6
M+E00C     » »   ◌ ◌ ◌ ◌ ◌ ◌ ◌ ◌  ◌ ◌ ◌ ◌ ◌ ◌ ◌  M+E3E8, M+E3E9, M+E3EA, M+E3EB, M+E3EC, M+E3ED, M+E3EE + diff --git a/tests/data/snapshots/large-subtable.pdf b/tests/data/snapshots/large-subtable.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5cceb70b024031505b6a43a901fd7b64b8eac1f6 GIT binary patch literal 32824 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 literal 0 HcmV?d00001 diff --git a/tests/data/ttf/NotoSans-GSUB2-BigSubtable-Synthetic.ttf b/tests/data/ttf/NotoSans-GSUB2-BigSubtable-Synthetic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..861ed1bc27ffe2d6d73417abd68d4369bb05d38b GIT binary patch literal 41172 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 JLoxEN;%}TVc!mG~ literal 0 HcmV?d00001