From 8ba20dbdb5c7a77f79409488fb4637f470ab107d Mon Sep 17 00:00:00 2001 From: Marcel van Lohuizen Date: Thu, 2 Feb 2012 13:55:53 +0100 Subject: [PATCH] exp/norm: a few minor changes in prepration for a table format change: - Unified bounary conditions for NFC and NFD and removed some indirections. This enforces boundaries at the character level, which is typically what the user expects. (NFD allows a boundary between 'a' and '`', for example, which may give unexpected results for collation. The current implementation is already stricter than the standard, so nothing much changes. This change just formalizes it. - Moved methods of qcflags to runeInfo. - Swapped YesC and YesMaybe bits in qcFlags. This is to aid future changes. - runeInfo return values use named fields in preperation for struct change. - Replaced some left-over uint32s with rune. R=r CC=golang-dev https://golang.org/cl/5607050 --- src/pkg/exp/norm/composition.go | 20 +- src/pkg/exp/norm/forminfo.go | 58 ++-- src/pkg/exp/norm/input.go | 10 +- src/pkg/exp/norm/maketables.go | 4 +- src/pkg/exp/norm/normalize.go | 26 +- src/pkg/exp/norm/tables.go | 488 ++++++++++++++++---------------- 6 files changed, 294 insertions(+), 312 deletions(-) diff --git a/src/pkg/exp/norm/composition.go b/src/pkg/exp/norm/composition.go index 7cad8a2ccd..5b48292cc3 100644 --- a/src/pkg/exp/norm/composition.go +++ b/src/pkg/exp/norm/composition.go @@ -98,10 +98,10 @@ func (rb *reorderBuffer) insertOrdered(info runeInfo) bool { func (rb *reorderBuffer) insert(src input, i int, info runeInfo) bool { if info.size == 3 { if rune := src.hangul(i); rune != 0 { - return rb.decomposeHangul(uint32(rune)) + return rb.decomposeHangul(rune) } } - if info.flags.hasDecomposition() { + if info.hasDecomposition() { dcomp := rb.f.decompose(src, i) rb.tmpBytes = inputBytes(dcomp) for i := 0; i < len(dcomp); { @@ -126,26 +126,26 @@ func (rb *reorderBuffer) insert(src input, i int, info runeInfo) bool { } // appendRune inserts a rune at the end of the buffer. It is used for Hangul. -func (rb *reorderBuffer) appendRune(r uint32) { +func (rb *reorderBuffer) appendRune(r rune) { bn := rb.nbyte sz := utf8.EncodeRune(rb.byte[bn:], rune(r)) rb.nbyte += utf8.UTFMax - rb.rune[rb.nrune] = runeInfo{bn, uint8(sz), 0, 0} + rb.rune[rb.nrune] = runeInfo{pos: bn, size: uint8(sz)} rb.nrune++ } // assignRune sets a rune at position pos. It is used for Hangul and recomposition. -func (rb *reorderBuffer) assignRune(pos int, r uint32) { +func (rb *reorderBuffer) assignRune(pos int, r rune) { bn := rb.rune[pos].pos sz := utf8.EncodeRune(rb.byte[bn:], rune(r)) - rb.rune[pos] = runeInfo{bn, uint8(sz), 0, 0} + rb.rune[pos] = runeInfo{pos: bn, size: uint8(sz)} } // runeAt returns the rune at position n. It is used for Hangul and recomposition. -func (rb *reorderBuffer) runeAt(n int) uint32 { +func (rb *reorderBuffer) runeAt(n int) rune { inf := rb.rune[n] r, _ := utf8.DecodeRune(rb.byte[inf.pos : inf.pos+inf.size]) - return uint32(r) + return r } // bytesAt returns the UTF-8 encoding of the rune at position n. @@ -237,7 +237,7 @@ func isHangulWithoutJamoT(b []byte) bool { // decomposeHangul algorithmically decomposes a Hangul rune into // its Jamo components. // See http://unicode.org/reports/tr15/#Hangul for details on decomposing Hangul. -func (rb *reorderBuffer) decomposeHangul(r uint32) bool { +func (rb *reorderBuffer) decomposeHangul(r rune) bool { b := rb.rune[:] n := rb.nrune if n+3 > len(b) { @@ -319,7 +319,7 @@ func (rb *reorderBuffer) compose() { // get the info for the combined character. This is more // expensive than using the filter. Using combinesBackward() // is safe. - if ii.flags.combinesBackward() { + if ii.combinesBackward() { cccB := b[k-1].ccc cccC := ii.ccc blocked := false // b[i] blocked by starter or greater or equal CCC? diff --git a/src/pkg/exp/norm/forminfo.go b/src/pkg/exp/norm/forminfo.go index b3b387b9b6..bf4443c991 100644 --- a/src/pkg/exp/norm/forminfo.go +++ b/src/pkg/exp/norm/forminfo.go @@ -14,7 +14,6 @@ type runeInfo struct { } // functions dispatchable per form -type boundaryFunc func(f *formInfo, info runeInfo) bool type lookupFunc func(b input, i int) runeInfo type decompFunc func(b input, i int) []byte @@ -24,10 +23,8 @@ type formInfo struct { composing, compatibility bool // form type - decompose decompFunc - info lookupFunc - boundaryBefore boundaryFunc - boundaryAfter boundaryFunc + decompose decompFunc + info lookupFunc } var formTable []*formInfo @@ -49,17 +46,17 @@ func init() { } if Form(i) == NFC || Form(i) == NFKC { f.composing = true - f.boundaryBefore = compBoundaryBefore - f.boundaryAfter = compBoundaryAfter - } else { - f.boundaryBefore = decompBoundary - f.boundaryAfter = decompBoundary } } } -func decompBoundary(f *formInfo, info runeInfo) bool { - if info.ccc == 0 && info.flags.isYesD() { // Implies isHangul(b) == true +// We do not distinguish between boundaries for NFC, NFD, etc. to avoid +// unexpected behavior for the user. For example, in NFD, there is a boundary +// after 'a'. However, a might combine with modifiers, so from the application's +// perspective it is not a good boundary. We will therefore always use the +// boundaries for the combining variants. +func (i runeInfo) boundaryBefore() bool { + if i.ccc == 0 && !i.combinesBackward() { return true } // We assume that the CCC of the first character in a decomposition @@ -68,25 +65,13 @@ func decompBoundary(f *formInfo, info runeInfo) bool { return false } -func compBoundaryBefore(f *formInfo, info runeInfo) bool { - if info.ccc == 0 && !info.flags.combinesBackward() { - return true - } - // We assume that the CCC of the first character in a decomposition - // is always non-zero if different from info.ccc and that we can return - // false at this point. This is verified by maketables. - return false -} - -func compBoundaryAfter(f *formInfo, info runeInfo) bool { - // This misses values where the last char in a decomposition is a - // boundary such as Hangul with JamoT. - return info.isInert() +func (i runeInfo) boundaryAfter() bool { + return i.isInert() } // We pack quick check data in 4 bits: // 0: NFD_QC Yes (0) or No (1). No also means there is a decomposition. -// 1..2: NFC_QC Yes(00), No (01), or Maybe (11) +// 1..2: NFC_QC Yes(00), No (10), or Maybe (11) // 3: Combines forward (0 == false, 1 == true) // // When all 4 bits are zero, the character is inert, meaning it is never @@ -95,15 +80,12 @@ func compBoundaryAfter(f *formInfo, info runeInfo) bool { // We pack the bits for both NFC/D and NFKC/D in one byte. type qcInfo uint8 -func (i qcInfo) isYesC() bool { return i&0x2 == 0 } -func (i qcInfo) isNoC() bool { return i&0x6 == 0x2 } -func (i qcInfo) isMaybe() bool { return i&0x4 != 0 } -func (i qcInfo) isYesD() bool { return i&0x1 == 0 } -func (i qcInfo) isNoD() bool { return i&0x1 != 0 } +func (i runeInfo) isYesC() bool { return i.flags&0x4 == 0 } +func (i runeInfo) isYesD() bool { return i.flags&0x1 == 0 } -func (i qcInfo) combinesForward() bool { return i&0x8 != 0 } -func (i qcInfo) combinesBackward() bool { return i&0x4 != 0 } // == isMaybe -func (i qcInfo) hasDecomposition() bool { return i&0x1 != 0 } // == isNoD +func (i runeInfo) combinesForward() bool { return i.flags&0x8 != 0 } +func (i runeInfo) combinesBackward() bool { return i.flags&0x2 != 0 } // == isMaybe +func (i runeInfo) hasDecomposition() bool { return i.flags&0x1 != 0 } // == isNoD func (r runeInfo) isInert() bool { return r.flags&0xf == 0 && r.ccc == 0 @@ -137,7 +119,7 @@ func decomposeNFKC(s input, i int) []byte { // Note that the recomposition map for NFC and NFKC are identical. // combine returns the combined rune or 0 if it doesn't exist. -func combine(a, b uint32) uint32 { +func combine(a, b rune) rune { key := uint32(uint16(a))<<16 + uint32(uint16(b)) return recompMap[key] } @@ -148,10 +130,10 @@ func combine(a, b uint32) uint32 { // 12..15 qcInfo for NFKC/NFKD func lookupInfoNFC(b input, i int) runeInfo { v, sz := b.charinfo(i) - return runeInfo{0, uint8(sz), uint8(v), qcInfo(v >> 8)} + return runeInfo{size: uint8(sz), ccc: uint8(v), flags: qcInfo(v >> 8)} } func lookupInfoNFKC(b input, i int) runeInfo { v, sz := b.charinfo(i) - return runeInfo{0, uint8(sz), uint8(v), qcInfo(v >> 12)} + return runeInfo{size: uint8(sz), ccc: uint8(v), flags: qcInfo(v >> 12)} } diff --git a/src/pkg/exp/norm/input.go b/src/pkg/exp/norm/input.go index 42e6f1b794..7276c66cc1 100644 --- a/src/pkg/exp/norm/input.go +++ b/src/pkg/exp/norm/input.go @@ -14,7 +14,7 @@ type input interface { charinfo(p int) (uint16, int) decomposeNFC(p int) uint16 decomposeNFKC(p int) uint16 - hangul(p int) uint32 + hangul(p int) rune } type inputString string @@ -54,12 +54,12 @@ func (s inputString) decomposeNFKC(p int) uint16 { return nfkcDecompTrie.lookupStringUnsafe(string(s[p:])) } -func (s inputString) hangul(p int) uint32 { +func (s inputString) hangul(p int) rune { if !isHangulString(string(s[p:])) { return 0 } rune, _ := utf8.DecodeRuneInString(string(s[p:])) - return uint32(rune) + return rune } type inputBytes []byte @@ -96,10 +96,10 @@ func (s inputBytes) decomposeNFKC(p int) uint16 { return nfkcDecompTrie.lookupUnsafe(s[p:]) } -func (s inputBytes) hangul(p int) uint32 { +func (s inputBytes) hangul(p int) rune { if !isHangul(s[p:]) { return 0 } rune, _ := utf8.DecodeRune(s[p:]) - return uint32(rune) + return rune } diff --git a/src/pkg/exp/norm/maketables.go b/src/pkg/exp/norm/maketables.go index 9a97831716..43e1429c1b 100644 --- a/src/pkg/exp/norm/maketables.go +++ b/src/pkg/exp/norm/maketables.go @@ -562,7 +562,7 @@ func makeEntry(f *FormInfo) uint16 { switch f.quickCheck[MComposed] { case QCYes: case QCNo: - e |= 0x2 + e |= 0x4 case QCMaybe: e |= 0x6 default: @@ -718,7 +718,7 @@ func makeTables() { sz := nrentries * 8 size += sz fmt.Printf("// recompMap: %d bytes (entries only)\n", sz) - fmt.Println("var recompMap = map[uint32]uint32{") + fmt.Println("var recompMap = map[uint32]rune{") for i, c := range chars { f := c.forms[FCanonical] d := f.decomp diff --git a/src/pkg/exp/norm/normalize.go b/src/pkg/exp/norm/normalize.go index 3bd40470d5..26bb4a0dc4 100644 --- a/src/pkg/exp/norm/normalize.go +++ b/src/pkg/exp/norm/normalize.go @@ -188,11 +188,11 @@ func doAppend(rb *reorderBuffer, out []byte, p int) []byte { var info runeInfo if p < n { info = fd.info(src, p) - if p == 0 && !fd.boundaryBefore(fd, info) { + if p == 0 && !info.boundaryBefore() { out = decomposeToLastBoundary(rb, out) } } - if info.size == 0 || fd.boundaryBefore(fd, info) { + if info.size == 0 || info.boundaryBefore() { if fd.composing { rb.compose() } @@ -257,11 +257,11 @@ func quickSpan(rb *reorderBuffer, i int) int { } cc := info.ccc if rb.f.composing { - if !info.flags.isYesC() { + if !info.isYesC() { break } } else { - if !info.flags.isYesD() { + if !info.isYesD() { break } } @@ -316,13 +316,13 @@ func firstBoundary(rb *reorderBuffer) int { } fd := &rb.f info := fd.info(src, i) - for n := 0; info.size != 0 && !fd.boundaryBefore(fd, info); { + for n := 0; info.size != 0 && !info.boundaryBefore(); { i += int(info.size) if n++; n >= maxCombiningChars { return i } if i >= nsrc { - if !fd.boundaryAfter(fd, info) { + if !info.boundaryAfter() { return -1 } return nsrc @@ -368,11 +368,11 @@ func lastBoundary(fd *formInfo, b []byte) int { if p+int(info.size) != i { // trailing non-starter bytes: illegal UTF-8 return i } - if fd.boundaryAfter(fd, info) { + if info.boundaryAfter() { return i } i = p - for n := 0; i >= 0 && !fd.boundaryBefore(fd, info); { + for n := 0; i >= 0 && !info.boundaryBefore(); { info, p = lastRuneStart(fd, b[:i]) if n++; n >= maxCombiningChars { return len(b) @@ -404,7 +404,7 @@ func decomposeSegment(rb *reorderBuffer, sp int) int { break } info = rb.f.info(rb.src, sp) - bound := rb.f.boundaryBefore(&rb.f, info) + bound := info.boundaryBefore() if bound || info.size == 0 { break } @@ -419,7 +419,7 @@ func lastRuneStart(fd *formInfo, buf []byte) (runeInfo, int) { for ; p >= 0 && !utf8.RuneStart(buf[p]); p-- { } if p < 0 { - return runeInfo{0, 0, 0, 0}, -1 + return runeInfo{}, -1 } return fd.info(inputBytes(buf), p), p } @@ -433,7 +433,7 @@ func decomposeToLastBoundary(rb *reorderBuffer, buf []byte) []byte { // illegal trailing continuation bytes return buf } - if rb.f.boundaryAfter(fd, info) { + if info.boundaryAfter() { return buf } var add [maxBackRunes]runeInfo // stores runeInfo in reverse order @@ -441,13 +441,13 @@ func decomposeToLastBoundary(rb *reorderBuffer, buf []byte) []byte { padd := 1 n := 1 p := len(buf) - int(info.size) - for ; p >= 0 && !rb.f.boundaryBefore(fd, info); p -= int(info.size) { + for ; p >= 0 && !info.boundaryBefore(); p -= int(info.size) { info, i = lastRuneStart(fd, buf[:p]) if int(info.size) != p-i { break } // Check that decomposition doesn't result in overflow. - if info.flags.hasDecomposition() { + if info.hasDecomposition() { dcomp := rb.f.decompose(inputBytes(buf), p-int(info.size)) for i := 0; i < len(dcomp); { inf := rb.f.info(inputBytes(dcomp), i) diff --git a/src/pkg/exp/norm/tables.go b/src/pkg/exp/norm/tables.go index 9044a72fd4..02a481b3b3 100644 --- a/src/pkg/exp/norm/tables.go +++ b/src/pkg/exp/norm/tables.go @@ -4661,7 +4661,7 @@ var nfkcDecompLookup = [960]uint8{ var nfkcDecompTrie = trie{nfkcDecompLookup[:], nfkcDecompValues[:], nfkcDecompSparseValues[:], nfkcDecompSparseOffset[:], 66} // recompMap: 7448 bytes (entries only) -var recompMap = map[uint32]uint32{ +var recompMap = map[uint32]rune{ 0x00410300: 0x00C0, 0x00410301: 0x00C1, 0x00410302: 0x00C2, @@ -5637,7 +5637,7 @@ var charInfoValues = [1024]uint16{ 0x0136: 0x0001, 0x0137: 0x0001, 0x0138: 0x6601, 0x0139: 0x00dc, 0x013a: 0x00dc, 0x013b: 0x00dc, 0x013c: 0x00dc, 0x013d: 0x00e6, 0x013e: 0x00e6, 0x013f: 0x00e6, // Block 0x5, offset 0x140 - 0x0140: 0x33e6, 0x0141: 0x33e6, 0x0142: 0x66e6, 0x0143: 0x33e6, 0x0144: 0x33e6, 0x0145: 0x66f0, + 0x0140: 0x55e6, 0x0141: 0x55e6, 0x0142: 0x66e6, 0x0143: 0x55e6, 0x0144: 0x55e6, 0x0145: 0x66f0, 0x0146: 0x00e6, 0x0147: 0x00dc, 0x0148: 0x00dc, 0x0149: 0x00dc, 0x014a: 0x00e6, 0x014b: 0x00e6, 0x014c: 0x00e6, 0x014d: 0x00dc, 0x014e: 0x00dc, 0x0150: 0x00e6, 0x0151: 0x00e6, 0x0152: 0x00e6, 0x0153: 0x00dc, 0x0154: 0x00dc, 0x0155: 0x00dc, 0x0156: 0x00dc, 0x0157: 0x00e6, @@ -5645,12 +5645,12 @@ var charInfoValues = [1024]uint16{ 0x015e: 0x00ea, 0x015f: 0x00e9, 0x0160: 0x00ea, 0x0161: 0x00ea, 0x0162: 0x00e9, 0x0163: 0x00e6, 0x0164: 0x00e6, 0x0165: 0x00e6, 0x0166: 0x00e6, 0x0167: 0x00e6, 0x0168: 0x00e6, 0x0169: 0x00e6, 0x016a: 0x00e6, 0x016b: 0x00e6, 0x016c: 0x00e6, 0x016d: 0x00e6, 0x016e: 0x00e6, 0x016f: 0x00e6, - 0x0174: 0x3300, - 0x017a: 0x3000, - 0x017e: 0x3300, + 0x0174: 0x5500, + 0x017a: 0x5000, + 0x017e: 0x5500, // Block 0x6, offset 0x180 - 0x0184: 0x3000, 0x0185: 0x3100, - 0x0186: 0x1100, 0x0187: 0x3300, 0x0188: 0x1100, 0x0189: 0x1100, 0x018a: 0x1100, + 0x0184: 0x5000, 0x0185: 0x5100, + 0x0186: 0x1100, 0x0187: 0x5500, 0x0188: 0x1100, 0x0189: 0x1100, 0x018a: 0x1100, 0x018c: 0x1100, 0x018e: 0x1100, 0x018f: 0x1100, 0x0190: 0x1100, 0x0191: 0x8800, 0x0195: 0x8800, 0x0197: 0x8800, 0x0199: 0x8800, @@ -5673,7 +5673,7 @@ var charInfoValues = [1024]uint16{ 0x01f6: 0x8800, 0x01f7: 0x8800, 0x01f8: 0x8800, 0x01f9: 0x1100, 0x01fa: 0x8800, 0x01fe: 0x8800, // Block 0x8, offset 0x200 - 0x0207: 0x3000, + 0x0207: 0x5000, 0x0211: 0x00dc, 0x0212: 0x00e6, 0x0213: 0x00e6, 0x0214: 0x00e6, 0x0215: 0x00e6, 0x0216: 0x00dc, 0x0217: 0x00e6, 0x0218: 0x00e6, 0x0219: 0x00e6, 0x021a: 0x00de, 0x021b: 0x00dc, 0x021c: 0x00e6, 0x021d: 0x00e6, @@ -5689,8 +5689,8 @@ var charInfoValues = [1024]uint16{ 0x0252: 0x0022, 0x0253: 0x66e6, 0x0254: 0x66e6, 0x0255: 0x66dc, 0x0256: 0x00dc, 0x0257: 0x00e6, 0x0258: 0x00e6, 0x0259: 0x00e6, 0x025a: 0x00e6, 0x025b: 0x00e6, 0x025c: 0x00dc, 0x025d: 0x00e6, 0x025e: 0x00e6, 0x025f: 0x00dc, - 0x0270: 0x0023, 0x0275: 0x3000, - 0x0276: 0x3000, 0x0277: 0x3000, 0x0278: 0x3000, + 0x0270: 0x0023, 0x0275: 0x5000, + 0x0276: 0x5000, 0x0277: 0x5000, 0x0278: 0x5000, // Block 0xa, offset 0x280 0x0280: 0x9900, 0x0281: 0x9900, 0x0282: 0x1100, 0x0283: 0x1100, 0x0284: 0x1100, 0x0285: 0x1100, 0x0288: 0x9900, 0x0289: 0x9900, 0x028a: 0x1100, 0x028b: 0x1100, @@ -5700,21 +5700,21 @@ var charInfoValues = [1024]uint16{ 0x029f: 0x1100, 0x02a0: 0x9900, 0x02a1: 0x9900, 0x02a2: 0x9900, 0x02a3: 0x9900, 0x02a4: 0x9900, 0x02a5: 0x9900, 0x02a6: 0x9900, 0x02a7: 0x9900, 0x02a8: 0x9900, 0x02a9: 0x9900, 0x02aa: 0x9900, 0x02ab: 0x9900, 0x02ac: 0x9900, 0x02ad: 0x9900, 0x02ae: 0x9900, 0x02af: 0x9900, - 0x02b0: 0x9900, 0x02b1: 0x3300, 0x02b2: 0x1100, 0x02b3: 0x3300, 0x02b4: 0x9900, 0x02b5: 0x3300, - 0x02b6: 0x1100, 0x02b7: 0x3300, 0x02b8: 0x1100, 0x02b9: 0x3300, 0x02ba: 0x1100, 0x02bb: 0x3300, - 0x02bc: 0x9900, 0x02bd: 0x3300, + 0x02b0: 0x9900, 0x02b1: 0x5500, 0x02b2: 0x1100, 0x02b3: 0x5500, 0x02b4: 0x9900, 0x02b5: 0x5500, + 0x02b6: 0x1100, 0x02b7: 0x5500, 0x02b8: 0x1100, 0x02b9: 0x5500, 0x02ba: 0x1100, 0x02bb: 0x5500, + 0x02bc: 0x9900, 0x02bd: 0x5500, // Block 0xb, offset 0x2c0 - 0x02c0: 0x3000, 0x02c1: 0x3100, 0x02c2: 0x1100, 0x02c3: 0x1100, 0x02c4: 0x1100, - 0x02c6: 0x9900, 0x02c7: 0x1100, 0x02c8: 0x1100, 0x02c9: 0x3300, 0x02ca: 0x1100, 0x02cb: 0x3300, - 0x02cc: 0x1100, 0x02cd: 0x3100, 0x02ce: 0x3100, 0x02cf: 0x3100, 0x02d0: 0x1100, 0x02d1: 0x1100, - 0x02d2: 0x1100, 0x02d3: 0x3300, 0x02d6: 0x1100, 0x02d7: 0x1100, - 0x02d8: 0x1100, 0x02d9: 0x1100, 0x02da: 0x1100, 0x02db: 0x3300, 0x02dd: 0x3100, - 0x02de: 0x3100, 0x02df: 0x3100, 0x02e0: 0x1100, 0x02e1: 0x1100, 0x02e2: 0x1100, 0x02e3: 0x3300, + 0x02c0: 0x5000, 0x02c1: 0x5100, 0x02c2: 0x1100, 0x02c3: 0x1100, 0x02c4: 0x1100, + 0x02c6: 0x9900, 0x02c7: 0x1100, 0x02c8: 0x1100, 0x02c9: 0x5500, 0x02ca: 0x1100, 0x02cb: 0x5500, + 0x02cc: 0x1100, 0x02cd: 0x5100, 0x02ce: 0x5100, 0x02cf: 0x5100, 0x02d0: 0x1100, 0x02d1: 0x1100, + 0x02d2: 0x1100, 0x02d3: 0x5500, 0x02d6: 0x1100, 0x02d7: 0x1100, + 0x02d8: 0x1100, 0x02d9: 0x1100, 0x02da: 0x1100, 0x02db: 0x5500, 0x02dd: 0x5100, + 0x02de: 0x5100, 0x02df: 0x5100, 0x02e0: 0x1100, 0x02e1: 0x1100, 0x02e2: 0x1100, 0x02e3: 0x5500, 0x02e4: 0x1100, 0x02e5: 0x1100, 0x02e6: 0x1100, 0x02e7: 0x1100, 0x02e8: 0x1100, 0x02e9: 0x1100, - 0x02ea: 0x1100, 0x02eb: 0x3300, 0x02ec: 0x1100, 0x02ed: 0x3100, 0x02ee: 0x3300, 0x02ef: 0x3300, + 0x02ea: 0x1100, 0x02eb: 0x5500, 0x02ec: 0x1100, 0x02ed: 0x5100, 0x02ee: 0x5500, 0x02ef: 0x5500, 0x02f2: 0x1100, 0x02f3: 0x1100, 0x02f4: 0x1100, - 0x02f6: 0x9900, 0x02f7: 0x1100, 0x02f8: 0x1100, 0x02f9: 0x3300, 0x02fa: 0x1100, 0x02fb: 0x3300, - 0x02fc: 0x1100, 0x02fd: 0x3300, 0x02fe: 0x3800, + 0x02f6: 0x9900, 0x02f7: 0x1100, 0x02f8: 0x1100, 0x02f9: 0x5500, 0x02fa: 0x1100, 0x02fb: 0x5500, + 0x02fc: 0x1100, 0x02fd: 0x5500, 0x02fe: 0x5800, // Block 0xc, offset 0x300 0x0301: 0x1100, 0x0303: 0x8800, 0x0304: 0x1100, 0x0305: 0x8800, 0x0307: 0x1100, 0x0308: 0x8800, 0x0309: 0x1100, @@ -5738,8 +5738,8 @@ var charInfoValues = [1024]uint16{ 0x037c: 0x1100, 0x037d: 0x1100, // Block 0xe, offset 0x380 0x0394: 0x1100, - 0x0399: 0x6608, 0x039a: 0x6608, 0x039b: 0x3000, 0x039c: 0x3000, 0x039d: 0x8800, - 0x039e: 0x1100, 0x039f: 0x3000, + 0x0399: 0x6608, 0x039a: 0x6608, 0x039b: 0x5000, 0x039c: 0x5000, 0x039d: 0x8800, + 0x039e: 0x1100, 0x039f: 0x5000, 0x03a6: 0x8800, 0x03ab: 0x8800, 0x03ac: 0x1100, 0x03ad: 0x8800, 0x03ae: 0x1100, 0x03af: 0x8800, 0x03b0: 0x1100, 0x03b1: 0x8800, 0x03b2: 0x1100, 0x03b3: 0x8800, 0x03b4: 0x1100, 0x03b5: 0x8800, @@ -5754,7 +5754,7 @@ var charInfoValues = [1024]uint16{ 0x03ef: 0x8800, 0x03f0: 0x8800, 0x03f1: 0x8800, 0x03f2: 0x8800, 0x03f4: 0x1100, 0x03f7: 0x1100, 0x03f8: 0x1100, 0x03f9: 0x1100, 0x03fa: 0x1100, - 0x03fd: 0x8800, 0x03fe: 0x1100, 0x03ff: 0x3000, + 0x03fd: 0x8800, 0x03fe: 0x1100, 0x03ff: 0x5000, } // charInfoSparseOffset: 156 entries, 312 bytes @@ -5764,13 +5764,13 @@ var charInfoSparseOffset = []uint16{0x0, 0x8, 0x13, 0x21, 0x25, 0x2f, 0x36, 0x39 var charInfoSparseValues = [757]valueRange{ // Block 0x0, offset 0x1 {value: 0x0000, lo: 0x07}, - {value: 0x3000, lo: 0xa0, hi: 0xa0}, - {value: 0x3800, lo: 0xa8, hi: 0xa8}, - {value: 0x3000, lo: 0xaa, hi: 0xaa}, - {value: 0x3000, lo: 0xaf, hi: 0xaf}, - {value: 0x3000, lo: 0xb2, hi: 0xb5}, - {value: 0x3000, lo: 0xb8, hi: 0xba}, - {value: 0x3000, lo: 0xbc, hi: 0xbe}, + {value: 0x5000, lo: 0xa0, hi: 0xa0}, + {value: 0x5800, lo: 0xa8, hi: 0xa8}, + {value: 0x5000, lo: 0xaa, hi: 0xaa}, + {value: 0x5000, lo: 0xaf, hi: 0xaf}, + {value: 0x5000, lo: 0xb2, hi: 0xb5}, + {value: 0x5000, lo: 0xb8, hi: 0xba}, + {value: 0x5000, lo: 0xbc, hi: 0xbe}, // Block 0x1, offset 0x2 {value: 0x0000, lo: 0x0a}, {value: 0x1100, lo: 0x80, hi: 0x81}, @@ -5779,15 +5779,15 @@ var charInfoSparseValues = [757]valueRange{ {value: 0x9900, lo: 0x92, hi: 0x93}, {value: 0x1100, lo: 0x94, hi: 0xa5}, {value: 0x1100, lo: 0xa8, hi: 0xb0}, - {value: 0x3000, lo: 0xb2, hi: 0xb3}, + {value: 0x5000, lo: 0xb2, hi: 0xb3}, {value: 0x1100, lo: 0xb4, hi: 0xb7}, {value: 0x1100, lo: 0xb9, hi: 0xbe}, - {value: 0x3000, lo: 0xbf, hi: 0xbf}, + {value: 0x5000, lo: 0xbf, hi: 0xbf}, // Block 0x2, offset 0x3 {value: 0x0000, lo: 0x0d}, - {value: 0x3000, lo: 0x80, hi: 0x80}, + {value: 0x5000, lo: 0x80, hi: 0x80}, {value: 0x1100, lo: 0x83, hi: 0x88}, - {value: 0x3000, lo: 0x89, hi: 0x89}, + {value: 0x5000, lo: 0x89, hi: 0x89}, {value: 0x9900, lo: 0x8c, hi: 0x8d}, {value: 0x1100, lo: 0x8e, hi: 0x91}, {value: 0x1100, lo: 0x94, hi: 0x99}, @@ -5797,7 +5797,7 @@ var charInfoSparseValues = [757]valueRange{ {value: 0x1100, lo: 0xa2, hi: 0xa5}, {value: 0x9900, lo: 0xa8, hi: 0xab}, {value: 0x1100, lo: 0xac, hi: 0xbe}, - {value: 0x3800, lo: 0xbf, hi: 0xbf}, + {value: 0x5800, lo: 0xbf, hi: 0xbf}, // Block 0x3, offset 0x4 {value: 0x0000, lo: 0x03}, {value: 0x9900, lo: 0xa0, hi: 0xa1}, @@ -5805,13 +5805,13 @@ var charInfoSparseValues = [757]valueRange{ {value: 0x8800, lo: 0xb7, hi: 0xb7}, // Block 0x4, offset 0x5 {value: 0x0000, lo: 0x09}, - {value: 0x3000, lo: 0x84, hi: 0x8c}, + {value: 0x5000, lo: 0x84, hi: 0x8c}, {value: 0x1100, lo: 0x8d, hi: 0x9c}, {value: 0x1100, lo: 0x9e, hi: 0xa3}, {value: 0x1100, lo: 0xa6, hi: 0xa9}, {value: 0x9900, lo: 0xaa, hi: 0xab}, {value: 0x1100, lo: 0xac, hi: 0xb0}, - {value: 0x3000, lo: 0xb1, hi: 0xb3}, + {value: 0x5000, lo: 0xb1, hi: 0xb3}, {value: 0x1100, lo: 0xb4, hi: 0xb5}, {value: 0x1100, lo: 0xb8, hi: 0xbf}, // Block 0x5, offset 0x6 @@ -5825,11 +5825,11 @@ var charInfoSparseValues = [757]valueRange{ // Block 0x6, offset 0x7 {value: 0x0000, lo: 0x02}, {value: 0x8800, lo: 0x92, hi: 0x92}, - {value: 0x3000, lo: 0xb0, hi: 0xb8}, + {value: 0x5000, lo: 0xb0, hi: 0xb8}, // Block 0x7, offset 0x8 {value: 0x0000, lo: 0x02}, - {value: 0x3000, lo: 0x98, hi: 0x9d}, - {value: 0x3000, lo: 0xa0, hi: 0xa4}, + {value: 0x5000, lo: 0x98, hi: 0x9d}, + {value: 0x5000, lo: 0xa0, hi: 0xa4}, // Block 0x8, offset 0x9 {value: 0x0000, lo: 0x0d}, {value: 0x8800, lo: 0x81, hi: 0x81}, @@ -5838,13 +5838,13 @@ var charInfoSparseValues = [757]valueRange{ {value: 0x9900, lo: 0x8a, hi: 0x8b}, {value: 0x1100, lo: 0x8c, hi: 0x8d}, {value: 0x9900, lo: 0x8e, hi: 0x8e}, - {value: 0x3000, lo: 0x90, hi: 0x91}, - {value: 0x3800, lo: 0x92, hi: 0x92}, - {value: 0x3100, lo: 0x93, hi: 0x94}, - {value: 0x3000, lo: 0x95, hi: 0x96}, - {value: 0x3000, lo: 0xb0, hi: 0xb2}, - {value: 0x3000, lo: 0xb4, hi: 0xb5}, - {value: 0x3000, lo: 0xb9, hi: 0xb9}, + {value: 0x5000, lo: 0x90, hi: 0x91}, + {value: 0x5800, lo: 0x92, hi: 0x92}, + {value: 0x5100, lo: 0x93, hi: 0x94}, + {value: 0x5000, lo: 0x95, hi: 0x96}, + {value: 0x5000, lo: 0xb0, hi: 0xb2}, + {value: 0x5000, lo: 0xb4, hi: 0xb5}, + {value: 0x5000, lo: 0xb9, hi: 0xb9}, // Block 0x9, offset 0xa {value: 0x0000, lo: 0x0b}, {value: 0x8800, lo: 0x83, hi: 0x83}, @@ -5954,7 +5954,7 @@ var charInfoSparseValues = [757]valueRange{ {value: 0x00e6, lo: 0x91, hi: 0x91}, {value: 0x00dc, lo: 0x92, hi: 0x92}, {value: 0x00e6, lo: 0x93, hi: 0x94}, - {value: 0x3300, lo: 0x98, hi: 0x9f}, + {value: 0x5500, lo: 0x98, hi: 0x9f}, // Block 0x16, offset 0x17 {value: 0x0000, lo: 0x02}, {value: 0x0007, lo: 0xbc, hi: 0xbc}, @@ -5965,18 +5965,18 @@ var charInfoSparseValues = [757]valueRange{ {value: 0x1100, lo: 0x8b, hi: 0x8c}, {value: 0x0009, lo: 0x8d, hi: 0x8d}, {value: 0x6600, lo: 0x97, hi: 0x97}, - {value: 0x3300, lo: 0x9c, hi: 0x9d}, - {value: 0x3300, lo: 0x9f, hi: 0x9f}, + {value: 0x5500, lo: 0x9c, hi: 0x9d}, + {value: 0x5500, lo: 0x9f, hi: 0x9f}, // Block 0x18, offset 0x19 {value: 0x0000, lo: 0x03}, - {value: 0x3300, lo: 0xb3, hi: 0xb3}, - {value: 0x3300, lo: 0xb6, hi: 0xb6}, + {value: 0x5500, lo: 0xb3, hi: 0xb3}, + {value: 0x5500, lo: 0xb6, hi: 0xb6}, {value: 0x0007, lo: 0xbc, hi: 0xbc}, // Block 0x19, offset 0x1a {value: 0x0000, lo: 0x03}, {value: 0x0009, lo: 0x8d, hi: 0x8d}, - {value: 0x3300, lo: 0x99, hi: 0x9b}, - {value: 0x3300, lo: 0x9e, hi: 0x9e}, + {value: 0x5500, lo: 0x99, hi: 0x9b}, + {value: 0x5500, lo: 0x9e, hi: 0x9e}, // Block 0x1a, offset 0x1b {value: 0x0000, lo: 0x01}, {value: 0x0007, lo: 0xbc, hi: 0xbc}, @@ -5990,7 +5990,7 @@ var charInfoSparseValues = [757]valueRange{ {value: 0x1100, lo: 0x8b, hi: 0x8c}, {value: 0x0009, lo: 0x8d, hi: 0x8d}, {value: 0x6600, lo: 0x96, hi: 0x97}, - {value: 0x3300, lo: 0x9c, hi: 0x9d}, + {value: 0x5500, lo: 0x9c, hi: 0x9d}, // Block 0x1d, offset 0x1e {value: 0x0000, lo: 0x03}, {value: 0x8800, lo: 0x92, hi: 0x92}, @@ -6036,7 +6036,7 @@ var charInfoSparseValues = [757]valueRange{ {value: 0x6600, lo: 0x9f, hi: 0x9f}, // Block 0x24, offset 0x25 {value: 0x0000, lo: 0x03}, - {value: 0x3000, lo: 0xb3, hi: 0xb3}, + {value: 0x5000, lo: 0xb3, hi: 0xb3}, {value: 0x0067, lo: 0xb8, hi: 0xb9}, {value: 0x0009, lo: 0xba, hi: 0xba}, // Block 0x25, offset 0x26 @@ -6044,49 +6044,49 @@ var charInfoSparseValues = [757]valueRange{ {value: 0x006b, lo: 0x88, hi: 0x8b}, // Block 0x26, offset 0x27 {value: 0x0000, lo: 0x02}, - {value: 0x3000, lo: 0xb3, hi: 0xb3}, + {value: 0x5000, lo: 0xb3, hi: 0xb3}, {value: 0x0076, lo: 0xb8, hi: 0xb9}, // Block 0x27, offset 0x28 {value: 0x0000, lo: 0x02}, {value: 0x007a, lo: 0x88, hi: 0x8b}, - {value: 0x3000, lo: 0x9c, hi: 0x9d}, + {value: 0x5000, lo: 0x9c, hi: 0x9d}, // Block 0x28, offset 0x29 {value: 0x0000, lo: 0x05}, - {value: 0x3000, lo: 0x8c, hi: 0x8c}, + {value: 0x5000, lo: 0x8c, hi: 0x8c}, {value: 0x00dc, lo: 0x98, hi: 0x99}, {value: 0x00dc, lo: 0xb5, hi: 0xb5}, {value: 0x00dc, lo: 0xb7, hi: 0xb7}, {value: 0x00d8, lo: 0xb9, hi: 0xb9}, // Block 0x29, offset 0x2a {value: 0x0000, lo: 0x0f}, - {value: 0x3300, lo: 0x83, hi: 0x83}, - {value: 0x3300, lo: 0x8d, hi: 0x8d}, - {value: 0x3300, lo: 0x92, hi: 0x92}, - {value: 0x3300, lo: 0x97, hi: 0x97}, - {value: 0x3300, lo: 0x9c, hi: 0x9c}, - {value: 0x3300, lo: 0xa9, hi: 0xa9}, + {value: 0x5500, lo: 0x83, hi: 0x83}, + {value: 0x5500, lo: 0x8d, hi: 0x8d}, + {value: 0x5500, lo: 0x92, hi: 0x92}, + {value: 0x5500, lo: 0x97, hi: 0x97}, + {value: 0x5500, lo: 0x9c, hi: 0x9c}, + {value: 0x5500, lo: 0xa9, hi: 0xa9}, {value: 0x0081, lo: 0xb1, hi: 0xb1}, {value: 0x0082, lo: 0xb2, hi: 0xb2}, - {value: 0x3300, lo: 0xb3, hi: 0xb3}, + {value: 0x5500, lo: 0xb3, hi: 0xb3}, {value: 0x0084, lo: 0xb4, hi: 0xb4}, - {value: 0x3300, lo: 0xb5, hi: 0xb6}, - {value: 0x3000, lo: 0xb7, hi: 0xb7}, - {value: 0x3300, lo: 0xb8, hi: 0xb8}, - {value: 0x3000, lo: 0xb9, hi: 0xb9}, + {value: 0x5500, lo: 0xb5, hi: 0xb6}, + {value: 0x5000, lo: 0xb7, hi: 0xb7}, + {value: 0x5500, lo: 0xb8, hi: 0xb8}, + {value: 0x5000, lo: 0xb9, hi: 0xb9}, {value: 0x0082, lo: 0xba, hi: 0xbd}, // Block 0x2a, offset 0x2b {value: 0x0000, lo: 0x0b}, {value: 0x0082, lo: 0x80, hi: 0x80}, - {value: 0x3300, lo: 0x81, hi: 0x81}, + {value: 0x5500, lo: 0x81, hi: 0x81}, {value: 0x00e6, lo: 0x82, hi: 0x83}, {value: 0x0009, lo: 0x84, hi: 0x84}, {value: 0x00e6, lo: 0x86, hi: 0x87}, - {value: 0x3300, lo: 0x93, hi: 0x93}, - {value: 0x3300, lo: 0x9d, hi: 0x9d}, - {value: 0x3300, lo: 0xa2, hi: 0xa2}, - {value: 0x3300, lo: 0xa7, hi: 0xa7}, - {value: 0x3300, lo: 0xac, hi: 0xac}, - {value: 0x3300, lo: 0xb9, hi: 0xb9}, + {value: 0x5500, lo: 0x93, hi: 0x93}, + {value: 0x5500, lo: 0x9d, hi: 0x9d}, + {value: 0x5500, lo: 0xa2, hi: 0xa2}, + {value: 0x5500, lo: 0xa7, hi: 0xa7}, + {value: 0x5500, lo: 0xac, hi: 0xac}, + {value: 0x5500, lo: 0xb9, hi: 0xb9}, // Block 0x2b, offset 0x2c {value: 0x0000, lo: 0x01}, {value: 0x00dc, lo: 0x86, hi: 0x86}, @@ -6102,7 +6102,7 @@ var charInfoSparseValues = [757]valueRange{ {value: 0x00dc, lo: 0x8d, hi: 0x8d}, // Block 0x2e, offset 0x2f {value: 0x0000, lo: 0x01}, - {value: 0x3000, lo: 0xbc, hi: 0xbc}, + {value: 0x5000, lo: 0xbc, hi: 0xbc}, // Block 0x2f, offset 0x30 {value: 0x0000, lo: 0x01}, {value: 0x8800, lo: 0x80, hi: 0x92}, @@ -6189,17 +6189,17 @@ var charInfoSparseValues = [757]valueRange{ {value: 0x00dc, lo: 0xad, hi: 0xad}, // Block 0x40, offset 0x41 {value: 0x0000, lo: 0x03}, - {value: 0x3000, lo: 0xac, hi: 0xae}, - {value: 0x3000, lo: 0xb0, hi: 0xba}, - {value: 0x3000, lo: 0xbc, hi: 0xbf}, + {value: 0x5000, lo: 0xac, hi: 0xae}, + {value: 0x5000, lo: 0xb0, hi: 0xba}, + {value: 0x5000, lo: 0xbc, hi: 0xbf}, // Block 0x41, offset 0x42 {value: 0x0000, lo: 0x03}, - {value: 0x3000, lo: 0x80, hi: 0x8d}, - {value: 0x3000, lo: 0x8f, hi: 0xaa}, - {value: 0x3000, lo: 0xb8, hi: 0xb8}, + {value: 0x5000, lo: 0x80, hi: 0x8d}, + {value: 0x5000, lo: 0x8f, hi: 0xaa}, + {value: 0x5000, lo: 0xb8, hi: 0xb8}, // Block 0x42, offset 0x43 {value: 0x0000, lo: 0x01}, - {value: 0x3000, lo: 0x9b, hi: 0xbf}, + {value: 0x5000, lo: 0x9b, hi: 0xbf}, // Block 0x43, offset 0x44 {value: 0x0000, lo: 0x0e}, {value: 0x00e6, lo: 0x80, hi: 0x81}, @@ -6231,8 +6231,8 @@ var charInfoSparseValues = [757]valueRange{ // Block 0x46, offset 0x47 {value: 0x0000, lo: 0x07}, {value: 0x1100, lo: 0x80, hi: 0x99}, - {value: 0x3000, lo: 0x9a, hi: 0x9a}, - {value: 0x3100, lo: 0x9b, hi: 0x9b}, + {value: 0x5000, lo: 0x9a, hi: 0x9a}, + {value: 0x5100, lo: 0x9b, hi: 0x9b}, {value: 0x9900, lo: 0xa0, hi: 0xa1}, {value: 0x1100, lo: 0xa2, hi: 0xb7}, {value: 0x9900, lo: 0xb8, hi: 0xb9}, @@ -6257,35 +6257,35 @@ var charInfoSparseValues = [757]valueRange{ {value: 0x1100, lo: 0x80, hi: 0xb4}, {value: 0x9900, lo: 0xb6, hi: 0xb6}, {value: 0x1100, lo: 0xb7, hi: 0xba}, - {value: 0x3300, lo: 0xbb, hi: 0xbb}, + {value: 0x5500, lo: 0xbb, hi: 0xbb}, {value: 0x1100, lo: 0xbc, hi: 0xbc}, - {value: 0x3000, lo: 0xbd, hi: 0xbd}, - {value: 0x3300, lo: 0xbe, hi: 0xbe}, - {value: 0x3800, lo: 0xbf, hi: 0xbf}, + {value: 0x5000, lo: 0xbd, hi: 0xbd}, + {value: 0x5500, lo: 0xbe, hi: 0xbe}, + {value: 0x5800, lo: 0xbf, hi: 0xbf}, // Block 0x4a, offset 0x4b {value: 0x0000, lo: 0x0a}, - {value: 0x3300, lo: 0x80, hi: 0x81}, - {value: 0x3000, lo: 0x82, hi: 0x8a}, - {value: 0x3000, lo: 0x91, hi: 0x91}, - {value: 0x3000, lo: 0x97, hi: 0x97}, - {value: 0x3000, lo: 0xa4, hi: 0xa6}, - {value: 0x3000, lo: 0xaf, hi: 0xaf}, - {value: 0x3000, lo: 0xb3, hi: 0xb4}, - {value: 0x3000, lo: 0xb6, hi: 0xb7}, - {value: 0x3000, lo: 0xbc, hi: 0xbc}, - {value: 0x3000, lo: 0xbe, hi: 0xbe}, + {value: 0x5500, lo: 0x80, hi: 0x81}, + {value: 0x5000, lo: 0x82, hi: 0x8a}, + {value: 0x5000, lo: 0x91, hi: 0x91}, + {value: 0x5000, lo: 0x97, hi: 0x97}, + {value: 0x5000, lo: 0xa4, hi: 0xa6}, + {value: 0x5000, lo: 0xaf, hi: 0xaf}, + {value: 0x5000, lo: 0xb3, hi: 0xb4}, + {value: 0x5000, lo: 0xb6, hi: 0xb7}, + {value: 0x5000, lo: 0xbc, hi: 0xbc}, + {value: 0x5000, lo: 0xbe, hi: 0xbe}, // Block 0x4b, offset 0x4c {value: 0x0000, lo: 0x05}, - {value: 0x3000, lo: 0x87, hi: 0x89}, - {value: 0x3000, lo: 0x97, hi: 0x97}, - {value: 0x3000, lo: 0x9f, hi: 0x9f}, - {value: 0x3000, lo: 0xb0, hi: 0xb1}, - {value: 0x3000, lo: 0xb4, hi: 0xbf}, + {value: 0x5000, lo: 0x87, hi: 0x89}, + {value: 0x5000, lo: 0x97, hi: 0x97}, + {value: 0x5000, lo: 0x9f, hi: 0x9f}, + {value: 0x5000, lo: 0xb0, hi: 0xb1}, + {value: 0x5000, lo: 0xb4, hi: 0xbf}, // Block 0x4c, offset 0x4d {value: 0x0000, lo: 0x03}, - {value: 0x3000, lo: 0x80, hi: 0x8e}, - {value: 0x3000, lo: 0x90, hi: 0x9c}, - {value: 0x3000, lo: 0xa8, hi: 0xa8}, + {value: 0x5000, lo: 0x80, hi: 0x8e}, + {value: 0x5000, lo: 0x90, hi: 0x9c}, + {value: 0x5000, lo: 0xa8, hi: 0xa8}, // Block 0x4d, offset 0x4e {value: 0x0000, lo: 0x0d}, {value: 0x00e6, lo: 0x90, hi: 0x91}, @@ -6303,28 +6303,28 @@ var charInfoSparseValues = [757]valueRange{ {value: 0x00e6, lo: 0xb0, hi: 0xb0}, // Block 0x4e, offset 0x4f {value: 0x0000, lo: 0x0e}, - {value: 0x3000, lo: 0x80, hi: 0x83}, - {value: 0x3000, lo: 0x85, hi: 0x87}, - {value: 0x3000, lo: 0x89, hi: 0x93}, - {value: 0x3000, lo: 0x95, hi: 0x96}, - {value: 0x3000, lo: 0x99, hi: 0x9d}, - {value: 0x3000, lo: 0xa0, hi: 0xa2}, - {value: 0x3000, lo: 0xa4, hi: 0xa4}, - {value: 0x3300, lo: 0xa6, hi: 0xa6}, - {value: 0x3000, lo: 0xa8, hi: 0xa8}, - {value: 0x3300, lo: 0xaa, hi: 0xab}, - {value: 0x3000, lo: 0xac, hi: 0xad}, - {value: 0x3000, lo: 0xaf, hi: 0xb1}, - {value: 0x3000, lo: 0xb3, hi: 0xb9}, - {value: 0x3000, lo: 0xbb, hi: 0xbf}, + {value: 0x5000, lo: 0x80, hi: 0x83}, + {value: 0x5000, lo: 0x85, hi: 0x87}, + {value: 0x5000, lo: 0x89, hi: 0x93}, + {value: 0x5000, lo: 0x95, hi: 0x96}, + {value: 0x5000, lo: 0x99, hi: 0x9d}, + {value: 0x5000, lo: 0xa0, hi: 0xa2}, + {value: 0x5000, lo: 0xa4, hi: 0xa4}, + {value: 0x5500, lo: 0xa6, hi: 0xa6}, + {value: 0x5000, lo: 0xa8, hi: 0xa8}, + {value: 0x5500, lo: 0xaa, hi: 0xab}, + {value: 0x5000, lo: 0xac, hi: 0xad}, + {value: 0x5000, lo: 0xaf, hi: 0xb1}, + {value: 0x5000, lo: 0xb3, hi: 0xb9}, + {value: 0x5000, lo: 0xbb, hi: 0xbf}, // Block 0x4f, offset 0x50 {value: 0x0000, lo: 0x03}, - {value: 0x3000, lo: 0x80, hi: 0x80}, - {value: 0x3000, lo: 0x85, hi: 0x89}, - {value: 0x3000, lo: 0x90, hi: 0xbf}, + {value: 0x5000, lo: 0x80, hi: 0x80}, + {value: 0x5000, lo: 0x85, hi: 0x89}, + {value: 0x5000, lo: 0x90, hi: 0xbf}, // Block 0x50, offset 0x51 {value: 0x0000, lo: 0x06}, - {value: 0x3000, lo: 0x89, hi: 0x89}, + {value: 0x5000, lo: 0x89, hi: 0x89}, {value: 0x8800, lo: 0x90, hi: 0x90}, {value: 0x8800, lo: 0x92, hi: 0x92}, {value: 0x8800, lo: 0x94, hi: 0x94}, @@ -6348,8 +6348,8 @@ var charInfoSparseValues = [757]valueRange{ {value: 0x1100, lo: 0xa4, hi: 0xa4}, {value: 0x8800, lo: 0xa5, hi: 0xa5}, {value: 0x1100, lo: 0xa6, hi: 0xa6}, - {value: 0x3000, lo: 0xac, hi: 0xad}, - {value: 0x3000, lo: 0xaf, hi: 0xb0}, + {value: 0x5000, lo: 0xac, hi: 0xad}, + {value: 0x5000, lo: 0xaf, hi: 0xb0}, {value: 0x8800, lo: 0xbc, hi: 0xbc}, // Block 0x53, offset 0x54 {value: 0x0000, lo: 0x0b}, @@ -6370,75 +6370,75 @@ var charInfoSparseValues = [757]valueRange{ {value: 0x1100, lo: 0xaa, hi: 0xad}, // Block 0x55, offset 0x56 {value: 0x0000, lo: 0x01}, - {value: 0x3300, lo: 0xa9, hi: 0xaa}, + {value: 0x5500, lo: 0xa9, hi: 0xaa}, // Block 0x56, offset 0x57 {value: 0x0000, lo: 0x01}, - {value: 0x3000, lo: 0xa0, hi: 0xbf}, + {value: 0x5000, lo: 0xa0, hi: 0xbf}, // Block 0x57, offset 0x58 {value: 0x0000, lo: 0x01}, - {value: 0x3000, lo: 0x80, hi: 0xbf}, + {value: 0x5000, lo: 0x80, hi: 0xbf}, // Block 0x58, offset 0x59 {value: 0x0000, lo: 0x01}, - {value: 0x3000, lo: 0x80, hi: 0xaa}, + {value: 0x5000, lo: 0x80, hi: 0xaa}, // Block 0x59, offset 0x5a {value: 0x0000, lo: 0x01}, - {value: 0x3000, lo: 0x8c, hi: 0x8c}, + {value: 0x5000, lo: 0x8c, hi: 0x8c}, // Block 0x5a, offset 0x5b {value: 0x0000, lo: 0x01}, - {value: 0x3000, lo: 0xb4, hi: 0xb6}, + {value: 0x5000, lo: 0xb4, hi: 0xb6}, // Block 0x5b, offset 0x5c {value: 0x0000, lo: 0x01}, - {value: 0x3300, lo: 0x9c, hi: 0x9c}, + {value: 0x5500, lo: 0x9c, hi: 0x9c}, // Block 0x5c, offset 0x5d {value: 0x0000, lo: 0x01}, - {value: 0x3000, lo: 0xbc, hi: 0xbd}, + {value: 0x5000, lo: 0xbc, hi: 0xbd}, // Block 0x5d, offset 0x5e {value: 0x0000, lo: 0x01}, {value: 0x00e6, lo: 0xaf, hi: 0xb1}, // Block 0x5e, offset 0x5f {value: 0x0000, lo: 0x02}, - {value: 0x3000, lo: 0xaf, hi: 0xaf}, + {value: 0x5000, lo: 0xaf, hi: 0xaf}, {value: 0x0009, lo: 0xbf, hi: 0xbf}, // Block 0x5f, offset 0x60 {value: 0x0000, lo: 0x01}, {value: 0x00e6, lo: 0xa0, hi: 0xbf}, // Block 0x60, offset 0x61 {value: 0x0000, lo: 0x01}, - {value: 0x3000, lo: 0x9f, hi: 0x9f}, + {value: 0x5000, lo: 0x9f, hi: 0x9f}, // Block 0x61, offset 0x62 {value: 0x0000, lo: 0x01}, - {value: 0x3000, lo: 0xb3, hi: 0xb3}, + {value: 0x5000, lo: 0xb3, hi: 0xb3}, // Block 0x62, offset 0x63 {value: 0x0000, lo: 0x01}, - {value: 0x3000, lo: 0x80, hi: 0x95}, + {value: 0x5000, lo: 0x80, hi: 0x95}, // Block 0x63, offset 0x64 {value: 0x0000, lo: 0x08}, - {value: 0x3000, lo: 0x80, hi: 0x80}, + {value: 0x5000, lo: 0x80, hi: 0x80}, {value: 0x00da, lo: 0xaa, hi: 0xaa}, {value: 0x00e4, lo: 0xab, hi: 0xab}, {value: 0x00e8, lo: 0xac, hi: 0xac}, {value: 0x00de, lo: 0xad, hi: 0xad}, {value: 0x00e0, lo: 0xae, hi: 0xaf}, - {value: 0x3000, lo: 0xb6, hi: 0xb6}, - {value: 0x3000, lo: 0xb8, hi: 0xba}, + {value: 0x5000, lo: 0xb6, hi: 0xb6}, + {value: 0x5000, lo: 0xb8, hi: 0xba}, // Block 0x64, offset 0x65 {value: 0x0000, lo: 0x01}, - {value: 0x3000, lo: 0xb1, hi: 0xbf}, + {value: 0x5000, lo: 0xb1, hi: 0xbf}, // Block 0x65, offset 0x66 {value: 0x0000, lo: 0x02}, - {value: 0x3000, lo: 0x80, hi: 0x8e}, - {value: 0x3000, lo: 0x92, hi: 0x9f}, + {value: 0x5000, lo: 0x80, hi: 0x8e}, + {value: 0x5000, lo: 0x92, hi: 0x9f}, // Block 0x66, offset 0x67 {value: 0x0000, lo: 0x02}, - {value: 0x3000, lo: 0x80, hi: 0x9e}, - {value: 0x3000, lo: 0xa0, hi: 0xbf}, + {value: 0x5000, lo: 0x80, hi: 0x9e}, + {value: 0x5000, lo: 0xa0, hi: 0xbf}, // Block 0x67, offset 0x68 {value: 0x0000, lo: 0x02}, - {value: 0x3000, lo: 0x80, hi: 0x87}, - {value: 0x3000, lo: 0x90, hi: 0xbe}, + {value: 0x5000, lo: 0x80, hi: 0x87}, + {value: 0x5000, lo: 0x90, hi: 0xbe}, // Block 0x68, offset 0x69 {value: 0x0000, lo: 0x01}, - {value: 0x3000, lo: 0x80, hi: 0xbe}, + {value: 0x5000, lo: 0x80, hi: 0xbe}, // Block 0x69, offset 0x6a {value: 0x0000, lo: 0x02}, {value: 0x00e6, lo: 0xaf, hi: 0xaf}, @@ -6448,7 +6448,7 @@ var charInfoSparseValues = [757]valueRange{ {value: 0x00e6, lo: 0xb0, hi: 0xb1}, // Block 0x6b, offset 0x6c {value: 0x0000, lo: 0x01}, - {value: 0x3000, lo: 0xb0, hi: 0xb0}, + {value: 0x5000, lo: 0xb0, hi: 0xb0}, // Block 0x6c, offset 0x6d {value: 0x0000, lo: 0x01}, {value: 0x0009, lo: 0x86, hi: 0x86}, @@ -6489,90 +6489,90 @@ var charInfoSparseValues = [757]valueRange{ {value: 0x1100, lo: 0x80, hi: 0xa3}, // Block 0x77, offset 0x78 {value: 0x0000, lo: 0x01}, - {value: 0x3300, lo: 0x80, hi: 0xbf}, + {value: 0x5500, lo: 0x80, hi: 0xbf}, // Block 0x78, offset 0x79 {value: 0x0000, lo: 0x09}, - {value: 0x3300, lo: 0x80, hi: 0x8d}, - {value: 0x3300, lo: 0x90, hi: 0x90}, - {value: 0x3300, lo: 0x92, hi: 0x92}, - {value: 0x3300, lo: 0x95, hi: 0x9e}, - {value: 0x3300, lo: 0xa0, hi: 0xa0}, - {value: 0x3300, lo: 0xa2, hi: 0xa2}, - {value: 0x3300, lo: 0xa5, hi: 0xa6}, - {value: 0x3300, lo: 0xaa, hi: 0xad}, - {value: 0x3300, lo: 0xb0, hi: 0xbf}, + {value: 0x5500, lo: 0x80, hi: 0x8d}, + {value: 0x5500, lo: 0x90, hi: 0x90}, + {value: 0x5500, lo: 0x92, hi: 0x92}, + {value: 0x5500, lo: 0x95, hi: 0x9e}, + {value: 0x5500, lo: 0xa0, hi: 0xa0}, + {value: 0x5500, lo: 0xa2, hi: 0xa2}, + {value: 0x5500, lo: 0xa5, hi: 0xa6}, + {value: 0x5500, lo: 0xaa, hi: 0xad}, + {value: 0x5500, lo: 0xb0, hi: 0xbf}, // Block 0x79, offset 0x7a {value: 0x0000, lo: 0x02}, - {value: 0x3300, lo: 0x80, hi: 0xad}, - {value: 0x3300, lo: 0xb0, hi: 0xbf}, + {value: 0x5500, lo: 0x80, hi: 0xad}, + {value: 0x5500, lo: 0xb0, hi: 0xbf}, // Block 0x7a, offset 0x7b {value: 0x0000, lo: 0x01}, - {value: 0x3300, lo: 0x80, hi: 0x99}, + {value: 0x5500, lo: 0x80, hi: 0x99}, // Block 0x7b, offset 0x7c {value: 0x0000, lo: 0x09}, - {value: 0x3000, lo: 0x80, hi: 0x86}, - {value: 0x3000, lo: 0x93, hi: 0x97}, - {value: 0x3300, lo: 0x9d, hi: 0x9d}, + {value: 0x5000, lo: 0x80, hi: 0x86}, + {value: 0x5000, lo: 0x93, hi: 0x97}, + {value: 0x5500, lo: 0x9d, hi: 0x9d}, {value: 0x001a, lo: 0x9e, hi: 0x9e}, - {value: 0x3300, lo: 0x9f, hi: 0x9f}, - {value: 0x3000, lo: 0xa0, hi: 0xa9}, - {value: 0x3300, lo: 0xaa, hi: 0xb6}, - {value: 0x3300, lo: 0xb8, hi: 0xbc}, - {value: 0x3300, lo: 0xbe, hi: 0xbe}, + {value: 0x5500, lo: 0x9f, hi: 0x9f}, + {value: 0x5000, lo: 0xa0, hi: 0xa9}, + {value: 0x5500, lo: 0xaa, hi: 0xb6}, + {value: 0x5500, lo: 0xb8, hi: 0xbc}, + {value: 0x5500, lo: 0xbe, hi: 0xbe}, // Block 0x7c, offset 0x7d {value: 0x0000, lo: 0x04}, - {value: 0x3300, lo: 0x80, hi: 0x81}, - {value: 0x3300, lo: 0x83, hi: 0x84}, - {value: 0x3300, lo: 0x86, hi: 0x8e}, - {value: 0x3000, lo: 0x8f, hi: 0xbf}, + {value: 0x5500, lo: 0x80, hi: 0x81}, + {value: 0x5500, lo: 0x83, hi: 0x84}, + {value: 0x5500, lo: 0x86, hi: 0x8e}, + {value: 0x5000, lo: 0x8f, hi: 0xbf}, // Block 0x7d, offset 0x7e {value: 0x0000, lo: 0x01}, - {value: 0x3000, lo: 0x80, hi: 0xb1}, + {value: 0x5000, lo: 0x80, hi: 0xb1}, // Block 0x7e, offset 0x7f {value: 0x0000, lo: 0x01}, - {value: 0x3000, lo: 0x93, hi: 0xbf}, + {value: 0x5000, lo: 0x93, hi: 0xbf}, // Block 0x7f, offset 0x80 {value: 0x0000, lo: 0x01}, - {value: 0x3000, lo: 0x80, hi: 0xbd}, + {value: 0x5000, lo: 0x80, hi: 0xbd}, // Block 0x80, offset 0x81 {value: 0x0000, lo: 0x01}, - {value: 0x3000, lo: 0x90, hi: 0xbf}, + {value: 0x5000, lo: 0x90, hi: 0xbf}, // Block 0x81, offset 0x82 {value: 0x0000, lo: 0x02}, - {value: 0x3000, lo: 0x80, hi: 0x8f}, - {value: 0x3000, lo: 0x92, hi: 0xbf}, + {value: 0x5000, lo: 0x80, hi: 0x8f}, + {value: 0x5000, lo: 0x92, hi: 0xbf}, // Block 0x82, offset 0x83 {value: 0x0000, lo: 0x02}, - {value: 0x3000, lo: 0x80, hi: 0x87}, - {value: 0x3000, lo: 0xb0, hi: 0xbc}, + {value: 0x5000, lo: 0x80, hi: 0x87}, + {value: 0x5000, lo: 0xb0, hi: 0xbc}, // Block 0x83, offset 0x84 {value: 0x0000, lo: 0x03}, - {value: 0x3000, lo: 0x90, hi: 0x99}, + {value: 0x5000, lo: 0x90, hi: 0x99}, {value: 0x00e6, lo: 0xa0, hi: 0xa6}, - {value: 0x3000, lo: 0xb0, hi: 0xbf}, + {value: 0x5000, lo: 0xb0, hi: 0xbf}, // Block 0x84, offset 0x85 {value: 0x0000, lo: 0x07}, - {value: 0x3000, lo: 0x80, hi: 0x84}, - {value: 0x3000, lo: 0x87, hi: 0x92}, - {value: 0x3000, lo: 0x94, hi: 0xa6}, - {value: 0x3000, lo: 0xa8, hi: 0xab}, - {value: 0x3000, lo: 0xb0, hi: 0xb2}, - {value: 0x3000, lo: 0xb4, hi: 0xb4}, - {value: 0x3000, lo: 0xb6, hi: 0xbf}, + {value: 0x5000, lo: 0x80, hi: 0x84}, + {value: 0x5000, lo: 0x87, hi: 0x92}, + {value: 0x5000, lo: 0x94, hi: 0xa6}, + {value: 0x5000, lo: 0xa8, hi: 0xab}, + {value: 0x5000, lo: 0xb0, hi: 0xb2}, + {value: 0x5000, lo: 0xb4, hi: 0xb4}, + {value: 0x5000, lo: 0xb6, hi: 0xbf}, // Block 0x85, offset 0x86 {value: 0x0000, lo: 0x01}, - {value: 0x3000, lo: 0x80, hi: 0xbc}, + {value: 0x5000, lo: 0x80, hi: 0xbc}, // Block 0x86, offset 0x87 {value: 0x0000, lo: 0x01}, - {value: 0x3000, lo: 0x81, hi: 0xbf}, + {value: 0x5000, lo: 0x81, hi: 0xbf}, // Block 0x87, offset 0x88 {value: 0x0000, lo: 0x06}, - {value: 0x3000, lo: 0x82, hi: 0x87}, - {value: 0x3000, lo: 0x8a, hi: 0x8f}, - {value: 0x3000, lo: 0x92, hi: 0x97}, - {value: 0x3000, lo: 0x9a, hi: 0x9c}, - {value: 0x3000, lo: 0xa0, hi: 0xa6}, - {value: 0x3000, lo: 0xa8, hi: 0xae}, + {value: 0x5000, lo: 0x82, hi: 0x87}, + {value: 0x5000, lo: 0x8a, hi: 0x8f}, + {value: 0x5000, lo: 0x92, hi: 0x97}, + {value: 0x5000, lo: 0x9a, hi: 0x9c}, + {value: 0x5000, lo: 0xa0, hi: 0xa6}, + {value: 0x5000, lo: 0xa8, hi: 0xae}, // Block 0x88, offset 0x89 {value: 0x0000, lo: 0x01}, {value: 0x00dc, lo: 0xbd, hi: 0xbd}, @@ -6594,7 +6594,7 @@ var charInfoSparseValues = [757]valueRange{ {value: 0x0009, lo: 0xb9, hi: 0xba}, // Block 0x8b, offset 0x8c {value: 0x0000, lo: 0x06}, - {value: 0x3300, lo: 0x9e, hi: 0xa4}, + {value: 0x5500, lo: 0x9e, hi: 0xa4}, {value: 0x00d8, lo: 0xa5, hi: 0xa6}, {value: 0x0001, lo: 0xa7, hi: 0xa9}, {value: 0x00e2, lo: 0xad, hi: 0xad}, @@ -6606,75 +6606,75 @@ var charInfoSparseValues = [757]valueRange{ {value: 0x00e6, lo: 0x85, hi: 0x89}, {value: 0x00dc, lo: 0x8a, hi: 0x8b}, {value: 0x00e6, lo: 0xaa, hi: 0xad}, - {value: 0x3300, lo: 0xbb, hi: 0xbf}, + {value: 0x5500, lo: 0xbb, hi: 0xbf}, // Block 0x8d, offset 0x8e {value: 0x0000, lo: 0x01}, - {value: 0x3300, lo: 0x80, hi: 0x80}, + {value: 0x5500, lo: 0x80, hi: 0x80}, // Block 0x8e, offset 0x8f {value: 0x0000, lo: 0x01}, {value: 0x00e6, lo: 0x82, hi: 0x84}, // Block 0x8f, offset 0x90 {value: 0x0000, lo: 0x02}, - {value: 0x3000, lo: 0x80, hi: 0x94}, - {value: 0x3000, lo: 0x96, hi: 0xbf}, + {value: 0x5000, lo: 0x80, hi: 0x94}, + {value: 0x5000, lo: 0x96, hi: 0xbf}, // Block 0x90, offset 0x91 {value: 0x0000, lo: 0x08}, - {value: 0x3000, lo: 0x80, hi: 0x9c}, - {value: 0x3000, lo: 0x9e, hi: 0x9f}, - {value: 0x3000, lo: 0xa2, hi: 0xa2}, - {value: 0x3000, lo: 0xa5, hi: 0xa6}, - {value: 0x3000, lo: 0xa9, hi: 0xac}, - {value: 0x3000, lo: 0xae, hi: 0xb9}, - {value: 0x3000, lo: 0xbb, hi: 0xbb}, - {value: 0x3000, lo: 0xbd, hi: 0xbf}, + {value: 0x5000, lo: 0x80, hi: 0x9c}, + {value: 0x5000, lo: 0x9e, hi: 0x9f}, + {value: 0x5000, lo: 0xa2, hi: 0xa2}, + {value: 0x5000, lo: 0xa5, hi: 0xa6}, + {value: 0x5000, lo: 0xa9, hi: 0xac}, + {value: 0x5000, lo: 0xae, hi: 0xb9}, + {value: 0x5000, lo: 0xbb, hi: 0xbb}, + {value: 0x5000, lo: 0xbd, hi: 0xbf}, // Block 0x91, offset 0x92 {value: 0x0000, lo: 0x02}, - {value: 0x3000, lo: 0x80, hi: 0x83}, - {value: 0x3000, lo: 0x85, hi: 0xbf}, + {value: 0x5000, lo: 0x80, hi: 0x83}, + {value: 0x5000, lo: 0x85, hi: 0xbf}, // Block 0x92, offset 0x93 {value: 0x0000, lo: 0x06}, - {value: 0x3000, lo: 0x80, hi: 0x85}, - {value: 0x3000, lo: 0x87, hi: 0x8a}, - {value: 0x3000, lo: 0x8d, hi: 0x94}, - {value: 0x3000, lo: 0x96, hi: 0x9c}, - {value: 0x3000, lo: 0x9e, hi: 0xb9}, - {value: 0x3000, lo: 0xbb, hi: 0xbe}, + {value: 0x5000, lo: 0x80, hi: 0x85}, + {value: 0x5000, lo: 0x87, hi: 0x8a}, + {value: 0x5000, lo: 0x8d, hi: 0x94}, + {value: 0x5000, lo: 0x96, hi: 0x9c}, + {value: 0x5000, lo: 0x9e, hi: 0xb9}, + {value: 0x5000, lo: 0xbb, hi: 0xbe}, // Block 0x93, offset 0x94 {value: 0x0000, lo: 0x04}, - {value: 0x3000, lo: 0x80, hi: 0x84}, - {value: 0x3000, lo: 0x86, hi: 0x86}, - {value: 0x3000, lo: 0x8a, hi: 0x90}, - {value: 0x3000, lo: 0x92, hi: 0xbf}, + {value: 0x5000, lo: 0x80, hi: 0x84}, + {value: 0x5000, lo: 0x86, hi: 0x86}, + {value: 0x5000, lo: 0x8a, hi: 0x90}, + {value: 0x5000, lo: 0x92, hi: 0xbf}, // Block 0x94, offset 0x95 {value: 0x0000, lo: 0x02}, - {value: 0x3000, lo: 0x80, hi: 0xa5}, - {value: 0x3000, lo: 0xa8, hi: 0xbf}, + {value: 0x5000, lo: 0x80, hi: 0xa5}, + {value: 0x5000, lo: 0xa8, hi: 0xbf}, // Block 0x95, offset 0x96 {value: 0x0000, lo: 0x02}, - {value: 0x3000, lo: 0x80, hi: 0x8b}, - {value: 0x3000, lo: 0x8e, hi: 0xbf}, + {value: 0x5000, lo: 0x80, hi: 0x8b}, + {value: 0x5000, lo: 0x8e, hi: 0xbf}, // Block 0x96, offset 0x97 {value: 0x0000, lo: 0x03}, - {value: 0x3000, lo: 0x80, hi: 0x8a}, - {value: 0x3000, lo: 0x90, hi: 0xae}, - {value: 0x3000, lo: 0xb0, hi: 0xbf}, + {value: 0x5000, lo: 0x80, hi: 0x8a}, + {value: 0x5000, lo: 0x90, hi: 0xae}, + {value: 0x5000, lo: 0xb0, hi: 0xbf}, // Block 0x97, offset 0x98 {value: 0x0000, lo: 0x01}, - {value: 0x3000, lo: 0x80, hi: 0x8f}, + {value: 0x5000, lo: 0x80, hi: 0x8f}, // Block 0x98, offset 0x99 {value: 0x0000, lo: 0x01}, - {value: 0x3000, lo: 0x90, hi: 0x90}, + {value: 0x5000, lo: 0x90, hi: 0x90}, // Block 0x99, offset 0x9a {value: 0x0000, lo: 0x02}, - {value: 0x3000, lo: 0x80, hi: 0x82}, - {value: 0x3000, lo: 0x90, hi: 0xba}, + {value: 0x5000, lo: 0x80, hi: 0x82}, + {value: 0x5000, lo: 0x90, hi: 0xba}, // Block 0x9a, offset 0x9b {value: 0x0000, lo: 0x02}, - {value: 0x3000, lo: 0x80, hi: 0x88}, - {value: 0x3000, lo: 0x90, hi: 0x91}, + {value: 0x5000, lo: 0x80, hi: 0x88}, + {value: 0x5000, lo: 0x90, hi: 0x91}, // Block 0x9b, offset 0x9c {value: 0x0000, lo: 0x01}, - {value: 0x3300, lo: 0x80, hi: 0x9d}, + {value: 0x5500, lo: 0x80, hi: 0x9d}, } // charInfoLookup: 1152 bytes