aboutsummaryrefslogtreecommitdiffhomepage
path: root/vendor/golang.org/x/text/cases
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/golang.org/x/text/cases')
-rw-r--r--vendor/golang.org/x/text/cases/cases.go162
-rw-r--r--vendor/golang.org/x/text/cases/context.go376
-rw-r--r--vendor/golang.org/x/text/cases/context_test.go438
-rw-r--r--vendor/golang.org/x/text/cases/example_test.go53
-rw-r--r--vendor/golang.org/x/text/cases/fold.go34
-rw-r--r--vendor/golang.org/x/text/cases/fold_test.go51
-rw-r--r--vendor/golang.org/x/text/cases/gen.go839
-rw-r--r--vendor/golang.org/x/text/cases/gen_trieval.go219
-rw-r--r--vendor/golang.org/x/text/cases/icu.go61
-rw-r--r--vendor/golang.org/x/text/cases/icu_test.go210
-rw-r--r--vendor/golang.org/x/text/cases/info.go82
-rw-r--r--vendor/golang.org/x/text/cases/map.go816
-rw-r--r--vendor/golang.org/x/text/cases/map_test.go950
-rw-r--r--vendor/golang.org/x/text/cases/tables.go2251
-rw-r--r--vendor/golang.org/x/text/cases/tables_test.go1158
-rw-r--r--vendor/golang.org/x/text/cases/trieval.go215
16 files changed, 7915 insertions, 0 deletions
diff --git a/vendor/golang.org/x/text/cases/cases.go b/vendor/golang.org/x/text/cases/cases.go
new file mode 100644
index 0000000..736c0c3
--- /dev/null
+++ b/vendor/golang.org/x/text/cases/cases.go
@@ -0,0 +1,162 @@
+// Copyright 2014 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+//go:generate go run gen.go gen_trieval.go
+
+// Package cases provides general and language-specific case mappers.
+package cases // import "golang.org/x/text/cases"
+
+import (
+ "golang.org/x/text/language"
+ "golang.org/x/text/transform"
+)
+
+// References:
+// - Unicode Reference Manual Chapter 3.13, 4.2, and 5.18.
+// - http://www.unicode.org/reports/tr29/
+// - http://www.unicode.org/Public/6.3.0/ucd/CaseFolding.txt
+// - http://www.unicode.org/Public/6.3.0/ucd/SpecialCasing.txt
+// - http://www.unicode.org/Public/6.3.0/ucd/DerivedCoreProperties.txt
+// - http://www.unicode.org/Public/6.3.0/ucd/auxiliary/WordBreakProperty.txt
+// - http://www.unicode.org/Public/6.3.0/ucd/auxiliary/WordBreakTest.txt
+// - http://userguide.icu-project.org/transforms/casemappings
+
+// TODO:
+// - Case folding
+// - Wide and Narrow?
+// - Segmenter option for title casing.
+// - ASCII fast paths
+// - Encode Soft-Dotted property within trie somehow.
+
+// A Caser transforms given input to a certain case. It implements
+// transform.Transformer.
+//
+// A Caser may be stateful and should therefore not be shared between
+// goroutines.
+type Caser struct {
+ t transform.SpanningTransformer
+}
+
+// Bytes returns a new byte slice with the result of converting b to the case
+// form implemented by c.
+func (c Caser) Bytes(b []byte) []byte {
+ b, _, _ = transform.Bytes(c.t, b)
+ return b
+}
+
+// String returns a string with the result of transforming s to the case form
+// implemented by c.
+func (c Caser) String(s string) string {
+ s, _, _ = transform.String(c.t, s)
+ return s
+}
+
+// Reset resets the Caser to be reused for new input after a previous call to
+// Transform.
+func (c Caser) Reset() { c.t.Reset() }
+
+// Transform implements the transform.Transformer interface and transforms the
+// given input to the case form implemented by c.
+func (c Caser) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
+ return c.t.Transform(dst, src, atEOF)
+}
+
+// Span implements the transform.SpanningTransformer interface.
+func (c Caser) Span(src []byte, atEOF bool) (n int, err error) {
+ return c.t.Span(src, atEOF)
+}
+
+// Upper returns a Caser for language-specific uppercasing.
+func Upper(t language.Tag, opts ...Option) Caser {
+ return Caser{makeUpper(t, getOpts(opts...))}
+}
+
+// Lower returns a Caser for language-specific lowercasing.
+func Lower(t language.Tag, opts ...Option) Caser {
+ return Caser{makeLower(t, getOpts(opts...))}
+}
+
+// Title returns a Caser for language-specific title casing. It uses an
+// approximation of the default Unicode Word Break algorithm.
+func Title(t language.Tag, opts ...Option) Caser {
+ return Caser{makeTitle(t, getOpts(opts...))}
+}
+
+// Fold returns a Caser that implements Unicode case folding. The returned Caser
+// is stateless and safe to use concurrently by multiple goroutines.
+//
+// Case folding does not normalize the input and may not preserve a normal form.
+// Use the collate or search package for more convenient and linguistically
+// sound comparisons. Use golang.org/x/text/secure/precis for string comparisons
+// where security aspects are a concern.
+func Fold(opts ...Option) Caser {
+ return Caser{makeFold(getOpts(opts...))}
+}
+
+// An Option is used to modify the behavior of a Caser.
+type Option func(o options) options
+
+// TODO: consider these options to take a boolean as well, like FinalSigma.
+// The advantage of using this approach is that other providers of a lower-case
+// algorithm could set different defaults by prefixing a user-provided slice
+// of options with their own. This is handy, for instance, for the precis
+// package which would override the default to not handle the Greek final sigma.
+
+var (
+ // NoLower disables the lowercasing of non-leading letters for a title
+ // caser.
+ NoLower Option = noLower
+
+ // Compact omits mappings in case folding for characters that would grow the
+ // input. (Unimplemented.)
+ Compact Option = compact
+)
+
+// TODO: option to preserve a normal form, if applicable?
+
+type options struct {
+ noLower bool
+ simple bool
+
+ // TODO: segmenter, max ignorable, alternative versions, etc.
+
+ ignoreFinalSigma bool
+}
+
+func getOpts(o ...Option) (res options) {
+ for _, f := range o {
+ res = f(res)
+ }
+ return
+}
+
+func noLower(o options) options {
+ o.noLower = true
+ return o
+}
+
+func compact(o options) options {
+ o.simple = true
+ return o
+}
+
+// HandleFinalSigma specifies whether the special handling of Greek final sigma
+// should be enabled. Unicode prescribes handling the Greek final sigma for all
+// locales, but standards like IDNA and PRECIS override this default.
+func HandleFinalSigma(enable bool) Option {
+ if enable {
+ return handleFinalSigma
+ }
+ return ignoreFinalSigma
+}
+
+func ignoreFinalSigma(o options) options {
+ o.ignoreFinalSigma = true
+ return o
+}
+
+func handleFinalSigma(o options) options {
+ o.ignoreFinalSigma = false
+ return o
+}
diff --git a/vendor/golang.org/x/text/cases/context.go b/vendor/golang.org/x/text/cases/context.go
new file mode 100644
index 0000000..e9aa9e1
--- /dev/null
+++ b/vendor/golang.org/x/text/cases/context.go
@@ -0,0 +1,376 @@
+// Copyright 2014 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package cases
+
+import "golang.org/x/text/transform"
+
+// A context is used for iterating over source bytes, fetching case info and
+// writing to a destination buffer.
+//
+// Casing operations may need more than one rune of context to decide how a rune
+// should be cased. Casing implementations should call checkpoint on context
+// whenever it is known to be safe to return the runes processed so far.
+//
+// It is recommended for implementations to not allow for more than 30 case
+// ignorables as lookahead (analogous to the limit in norm) and to use state if
+// unbounded lookahead is needed for cased runes.
+type context struct {
+ dst, src []byte
+ atEOF bool
+
+ pDst int // pDst points past the last written rune in dst.
+ pSrc int // pSrc points to the start of the currently scanned rune.
+
+ // checkpoints safe to return in Transform, where nDst <= pDst and nSrc <= pSrc.
+ nDst, nSrc int
+ err error
+
+ sz int // size of current rune
+ info info // case information of currently scanned rune
+
+ // State preserved across calls to Transform.
+ isMidWord bool // false if next cased letter needs to be title-cased.
+}
+
+func (c *context) Reset() {
+ c.isMidWord = false
+}
+
+// ret returns the return values for the Transform method. It checks whether
+// there were insufficient bytes in src to complete and introduces an error
+// accordingly, if necessary.
+func (c *context) ret() (nDst, nSrc int, err error) {
+ if c.err != nil || c.nSrc == len(c.src) {
+ return c.nDst, c.nSrc, c.err
+ }
+ // This point is only reached by mappers if there was no short destination
+ // buffer. This means that the source buffer was exhausted and that c.sz was
+ // set to 0 by next.
+ if c.atEOF && c.pSrc == len(c.src) {
+ return c.pDst, c.pSrc, nil
+ }
+ return c.nDst, c.nSrc, transform.ErrShortSrc
+}
+
+// retSpan returns the return values for the Span method. It checks whether
+// there were insufficient bytes in src to complete and introduces an error
+// accordingly, if necessary.
+func (c *context) retSpan() (n int, err error) {
+ _, nSrc, err := c.ret()
+ return nSrc, err
+}
+
+// checkpoint sets the return value buffer points for Transform to the current
+// positions.
+func (c *context) checkpoint() {
+ if c.err == nil {
+ c.nDst, c.nSrc = c.pDst, c.pSrc+c.sz
+ }
+}
+
+// unreadRune causes the last rune read by next to be reread on the next
+// invocation of next. Only one unreadRune may be called after a call to next.
+func (c *context) unreadRune() {
+ c.sz = 0
+}
+
+func (c *context) next() bool {
+ c.pSrc += c.sz
+ if c.pSrc == len(c.src) || c.err != nil {
+ c.info, c.sz = 0, 0
+ return false
+ }
+ v, sz := trie.lookup(c.src[c.pSrc:])
+ c.info, c.sz = info(v), sz
+ if c.sz == 0 {
+ if c.atEOF {
+ // A zero size means we have an incomplete rune. If we are atEOF,
+ // this means it is an illegal rune, which we will consume one
+ // byte at a time.
+ c.sz = 1
+ } else {
+ c.err = transform.ErrShortSrc
+ return false
+ }
+ }
+ return true
+}
+
+// writeBytes adds bytes to dst.
+func (c *context) writeBytes(b []byte) bool {
+ if len(c.dst)-c.pDst < len(b) {
+ c.err = transform.ErrShortDst
+ return false
+ }
+ // This loop is faster than using copy.
+ for _, ch := range b {
+ c.dst[c.pDst] = ch
+ c.pDst++
+ }
+ return true
+}
+
+// writeString writes the given string to dst.
+func (c *context) writeString(s string) bool {
+ if len(c.dst)-c.pDst < len(s) {
+ c.err = transform.ErrShortDst
+ return false
+ }
+ // This loop is faster than using copy.
+ for i := 0; i < len(s); i++ {
+ c.dst[c.pDst] = s[i]
+ c.pDst++
+ }
+ return true
+}
+
+// copy writes the current rune to dst.
+func (c *context) copy() bool {
+ return c.writeBytes(c.src[c.pSrc : c.pSrc+c.sz])
+}
+
+// copyXOR copies the current rune to dst and modifies it by applying the XOR
+// pattern of the case info. It is the responsibility of the caller to ensure
+// that this is a rune with a XOR pattern defined.
+func (c *context) copyXOR() bool {
+ if !c.copy() {
+ return false
+ }
+ if c.info&xorIndexBit == 0 {
+ // Fast path for 6-bit XOR pattern, which covers most cases.
+ c.dst[c.pDst-1] ^= byte(c.info >> xorShift)
+ } else {
+ // Interpret XOR bits as an index.
+ // TODO: test performance for unrolling this loop. Verify that we have
+ // at least two bytes and at most three.
+ idx := c.info >> xorShift
+ for p := c.pDst - 1; ; p-- {
+ c.dst[p] ^= xorData[idx]
+ idx--
+ if xorData[idx] == 0 {
+ break
+ }
+ }
+ }
+ return true
+}
+
+// hasPrefix returns true if src[pSrc:] starts with the given string.
+func (c *context) hasPrefix(s string) bool {
+ b := c.src[c.pSrc:]
+ if len(b) < len(s) {
+ return false
+ }
+ for i, c := range b[:len(s)] {
+ if c != s[i] {
+ return false
+ }
+ }
+ return true
+}
+
+// caseType returns an info with only the case bits, normalized to either
+// cLower, cUpper, cTitle or cUncased.
+func (c *context) caseType() info {
+ cm := c.info & 0x7
+ if cm < 4 {
+ return cm
+ }
+ if cm >= cXORCase {
+ // xor the last bit of the rune with the case type bits.
+ b := c.src[c.pSrc+c.sz-1]
+ return info(b&1) ^ cm&0x3
+ }
+ if cm == cIgnorableCased {
+ return cLower
+ }
+ return cUncased
+}
+
+// lower writes the lowercase version of the current rune to dst.
+func lower(c *context) bool {
+ ct := c.caseType()
+ if c.info&hasMappingMask == 0 || ct == cLower {
+ return c.copy()
+ }
+ if c.info&exceptionBit == 0 {
+ return c.copyXOR()
+ }
+ e := exceptions[c.info>>exceptionShift:]
+ offset := 2 + e[0]&lengthMask // size of header + fold string
+ if nLower := (e[1] >> lengthBits) & lengthMask; nLower != noChange {
+ return c.writeString(e[offset : offset+nLower])
+ }
+ return c.copy()
+}
+
+func isLower(c *context) bool {
+ ct := c.caseType()
+ if c.info&hasMappingMask == 0 || ct == cLower {
+ return true
+ }
+ if c.info&exceptionBit == 0 {
+ c.err = transform.ErrEndOfSpan
+ return false
+ }
+ e := exceptions[c.info>>exceptionShift:]
+ if nLower := (e[1] >> lengthBits) & lengthMask; nLower != noChange {
+ c.err = transform.ErrEndOfSpan
+ return false
+ }
+ return true
+}
+
+// upper writes the uppercase version of the current rune to dst.
+func upper(c *context) bool {
+ ct := c.caseType()
+ if c.info&hasMappingMask == 0 || ct == cUpper {
+ return c.copy()
+ }
+ if c.info&exceptionBit == 0 {
+ return c.copyXOR()
+ }
+ e := exceptions[c.info>>exceptionShift:]
+ offset := 2 + e[0]&lengthMask // size of header + fold string
+ // Get length of first special case mapping.
+ n := (e[1] >> lengthBits) & lengthMask
+ if ct == cTitle {
+ // The first special case mapping is for lower. Set n to the second.
+ if n == noChange {
+ n = 0
+ }
+ n, e = e[1]&lengthMask, e[n:]
+ }
+ if n != noChange {
+ return c.writeString(e[offset : offset+n])
+ }
+ return c.copy()
+}
+
+// isUpper writes the isUppercase version of the current rune to dst.
+func isUpper(c *context) bool {
+ ct := c.caseType()
+ if c.info&hasMappingMask == 0 || ct == cUpper {
+ return true
+ }
+ if c.info&exceptionBit == 0 {
+ c.err = transform.ErrEndOfSpan
+ return false
+ }
+ e := exceptions[c.info>>exceptionShift:]
+ // Get length of first special case mapping.
+ n := (e[1] >> lengthBits) & lengthMask
+ if ct == cTitle {
+ n = e[1] & lengthMask
+ }
+ if n != noChange {
+ c.err = transform.ErrEndOfSpan
+ return false
+ }
+ return true
+}
+
+// title writes the title case version of the current rune to dst.
+func title(c *context) bool {
+ ct := c.caseType()
+ if c.info&hasMappingMask == 0 || ct == cTitle {
+ return c.copy()
+ }
+ if c.info&exceptionBit == 0 {
+ if ct == cLower {
+ return c.copyXOR()
+ }
+ return c.copy()
+ }
+ // Get the exception data.
+ e := exceptions[c.info>>exceptionShift:]
+ offset := 2 + e[0]&lengthMask // size of header + fold string
+
+ nFirst := (e[1] >> lengthBits) & lengthMask
+ if nTitle := e[1] & lengthMask; nTitle != noChange {
+ if nFirst != noChange {
+ e = e[nFirst:]
+ }
+ return c.writeString(e[offset : offset+nTitle])
+ }
+ if ct == cLower && nFirst != noChange {
+ // Use the uppercase version instead.
+ return c.writeString(e[offset : offset+nFirst])
+ }
+ // Already in correct case.
+ return c.copy()
+}
+
+// isTitle reports whether the current rune is in title case.
+func isTitle(c *context) bool {
+ ct := c.caseType()
+ if c.info&hasMappingMask == 0 || ct == cTitle {
+ return true
+ }
+ if c.info&exceptionBit == 0 {
+ if ct == cLower {
+ c.err = transform.ErrEndOfSpan
+ return false
+ }
+ return true
+ }
+ // Get the exception data.
+ e := exceptions[c.info>>exceptionShift:]
+ if nTitle := e[1] & lengthMask; nTitle != noChange {
+ c.err = transform.ErrEndOfSpan
+ return false
+ }
+ nFirst := (e[1] >> lengthBits) & lengthMask
+ if ct == cLower && nFirst != noChange {
+ c.err = transform.ErrEndOfSpan
+ return false
+ }
+ return true
+}
+
+// foldFull writes the foldFull version of the current rune to dst.
+func foldFull(c *context) bool {
+ if c.info&hasMappingMask == 0 {
+ return c.copy()
+ }
+ ct := c.caseType()
+ if c.info&exceptionBit == 0 {
+ if ct != cLower || c.info&inverseFoldBit != 0 {
+ return c.copyXOR()
+ }
+ return c.copy()
+ }
+ e := exceptions[c.info>>exceptionShift:]
+ n := e[0] & lengthMask
+ if n == 0 {
+ if ct == cLower {
+ return c.copy()
+ }
+ n = (e[1] >> lengthBits) & lengthMask
+ }
+ return c.writeString(e[2 : 2+n])
+}
+
+// isFoldFull reports whether the current run is mapped to foldFull
+func isFoldFull(c *context) bool {
+ if c.info&hasMappingMask == 0 {
+ return true
+ }
+ ct := c.caseType()
+ if c.info&exceptionBit == 0 {
+ if ct != cLower || c.info&inverseFoldBit != 0 {
+ c.err = transform.ErrEndOfSpan
+ return false
+ }
+ return true
+ }
+ e := exceptions[c.info>>exceptionShift:]
+ n := e[0] & lengthMask
+ if n == 0 && ct == cLower {
+ return true
+ }
+ c.err = transform.ErrEndOfSpan
+ return false
+}
diff --git a/vendor/golang.org/x/text/cases/context_test.go b/vendor/golang.org/x/text/cases/context_test.go
new file mode 100644
index 0000000..f590878
--- /dev/null
+++ b/vendor/golang.org/x/text/cases/context_test.go
@@ -0,0 +1,438 @@
+// Copyright 2014 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package cases
+
+import (
+ "strings"
+ "testing"
+ "unicode"
+
+ "golang.org/x/text/internal/testtext"
+ "golang.org/x/text/language"
+ "golang.org/x/text/transform"
+ "golang.org/x/text/unicode/norm"
+ "golang.org/x/text/unicode/rangetable"
+)
+
+// The following definitions are taken directly from Chapter 3 of The Unicode
+// Standard.
+
+func propCased(r rune) bool {
+ return propLower(r) || propUpper(r) || unicode.IsTitle(r)
+}
+
+func propLower(r rune) bool {
+ return unicode.IsLower(r) || unicode.Is(unicode.Other_Lowercase, r)
+}
+
+func propUpper(r rune) bool {
+ return unicode.IsUpper(r) || unicode.Is(unicode.Other_Uppercase, r)
+}
+
+func propIgnore(r rune) bool {
+ if unicode.In(r, unicode.Mn, unicode.Me, unicode.Cf, unicode.Lm, unicode.Sk) {
+ return true
+ }
+ return caseIgnorable[r]
+}
+
+func hasBreakProp(r rune) bool {
+ // binary search over ranges
+ lo := 0
+ hi := len(breakProp)
+ for lo < hi {
+ m := lo + (hi-lo)/2
+ bp := &breakProp[m]
+ if bp.lo <= r && r <= bp.hi {
+ return true
+ }
+ if r < bp.lo {
+ hi = m
+ } else {
+ lo = m + 1
+ }
+ }
+ return false
+}
+
+func contextFromRune(r rune) *context {
+ c := context{dst: make([]byte, 128), src: []byte(string(r)), atEOF: true}
+ c.next()
+ return &c
+}
+
+func TestCaseProperties(t *testing.T) {
+ if unicode.Version != UnicodeVersion {
+ // Properties of existing code points may change by Unicode version, so
+ // we need to skip.
+ t.Skipf("Skipping as core Unicode version %s different than %s", unicode.Version, UnicodeVersion)
+ }
+ assigned := rangetable.Assigned(UnicodeVersion)
+ coreVersion := rangetable.Assigned(unicode.Version)
+ for r := rune(0); r <= lastRuneForTesting; r++ {
+ if !unicode.In(r, assigned) || !unicode.In(r, coreVersion) {
+ continue
+ }
+ c := contextFromRune(r)
+ if got, want := c.info.isCaseIgnorable(), propIgnore(r); got != want {
+ t.Errorf("caseIgnorable(%U): got %v; want %v (%x)", r, got, want, c.info)
+ }
+ // New letters may change case types, but existing case pairings should
+ // not change. See Case Pair Stability in
+ // http://unicode.org/policies/stability_policy.html.
+ if rf := unicode.SimpleFold(r); rf != r && unicode.In(rf, assigned) {
+ if got, want := c.info.isCased(), propCased(r); got != want {
+ t.Errorf("cased(%U): got %v; want %v (%x)", r, got, want, c.info)
+ }
+ if got, want := c.caseType() == cUpper, propUpper(r); got != want {
+ t.Errorf("upper(%U): got %v; want %v (%x)", r, got, want, c.info)
+ }
+ if got, want := c.caseType() == cLower, propLower(r); got != want {
+ t.Errorf("lower(%U): got %v; want %v (%x)", r, got, want, c.info)
+ }
+ }
+ if got, want := c.info.isBreak(), hasBreakProp(r); got != want {
+ t.Errorf("isBreak(%U): got %v; want %v (%x)", r, got, want, c.info)
+ }
+ }
+ // TODO: get title case from unicode file.
+}
+
+func TestMapping(t *testing.T) {
+ assigned := rangetable.Assigned(UnicodeVersion)
+ coreVersion := rangetable.Assigned(unicode.Version)
+ if coreVersion == nil {
+ coreVersion = assigned
+ }
+ apply := func(r rune, f func(c *context) bool) string {
+ c := contextFromRune(r)
+ f(c)
+ return string(c.dst[:c.pDst])
+ }
+
+ for r, tt := range special {
+ if got, want := apply(r, lower), tt.toLower; got != want {
+ t.Errorf("lowerSpecial:(%U): got %+q; want %+q", r, got, want)
+ }
+ if got, want := apply(r, title), tt.toTitle; got != want {
+ t.Errorf("titleSpecial:(%U): got %+q; want %+q", r, got, want)
+ }
+ if got, want := apply(r, upper), tt.toUpper; got != want {
+ t.Errorf("upperSpecial:(%U): got %+q; want %+q", r, got, want)
+ }
+ }
+
+ for r := rune(0); r <= lastRuneForTesting; r++ {
+ if !unicode.In(r, assigned) || !unicode.In(r, coreVersion) {
+ continue
+ }
+ if rf := unicode.SimpleFold(r); rf == r || !unicode.In(rf, assigned) {
+ continue
+ }
+ if _, ok := special[r]; ok {
+ continue
+ }
+ want := string(unicode.ToLower(r))
+ if got := apply(r, lower); got != want {
+ t.Errorf("lower:%q (%U): got %q %U; want %q %U", r, r, got, []rune(got), want, []rune(want))
+ }
+
+ want = string(unicode.ToUpper(r))
+ if got := apply(r, upper); got != want {
+ t.Errorf("upper:%q (%U): got %q %U; want %q %U", r, r, got, []rune(got), want, []rune(want))
+ }
+
+ want = string(unicode.ToTitle(r))
+ if got := apply(r, title); got != want {
+ t.Errorf("title:%q (%U): got %q %U; want %q %U", r, r, got, []rune(got), want, []rune(want))
+ }
+ }
+}
+
+func runeFoldData(r rune) (x struct{ simple, full, special string }) {
+ x = foldMap[r]
+ if x.simple == "" {
+ x.simple = string(unicode.ToLower(r))
+ }
+ if x.full == "" {
+ x.full = string(unicode.ToLower(r))
+ }
+ if x.special == "" {
+ x.special = x.full
+ }
+ return
+}
+
+func TestFoldData(t *testing.T) {
+ assigned := rangetable.Assigned(UnicodeVersion)
+ coreVersion := rangetable.Assigned(unicode.Version)
+ if coreVersion == nil {
+ coreVersion = assigned
+ }
+ apply := func(r rune, f func(c *context) bool) (string, info) {
+ c := contextFromRune(r)
+ f(c)
+ return string(c.dst[:c.pDst]), c.info.cccType()
+ }
+ for r := rune(0); r <= lastRuneForTesting; r++ {
+ if !unicode.In(r, assigned) || !unicode.In(r, coreVersion) {
+ continue
+ }
+ x := runeFoldData(r)
+ if got, info := apply(r, foldFull); got != x.full {
+ t.Errorf("full:%q (%U): got %q %U; want %q %U (ccc=%x)", r, r, got, []rune(got), x.full, []rune(x.full), info)
+ }
+ // TODO: special and simple.
+ }
+}
+
+func TestCCC(t *testing.T) {
+ assigned := rangetable.Assigned(UnicodeVersion)
+ normVersion := rangetable.Assigned(norm.Version)
+ for r := rune(0); r <= lastRuneForTesting; r++ {
+ if !unicode.In(r, assigned) || !unicode.In(r, normVersion) {
+ continue
+ }
+ c := contextFromRune(r)
+
+ p := norm.NFC.PropertiesString(string(r))
+ want := cccOther
+ switch p.CCC() {
+ case 0:
+ want = cccZero
+ case above:
+ want = cccAbove
+ }
+ if got := c.info.cccType(); got != want {
+ t.Errorf("%U: got %x; want %x", r, got, want)
+ }
+ }
+}
+
+func TestWordBreaks(t *testing.T) {
+ for _, tt := range breakTest {
+ testtext.Run(t, tt, func(t *testing.T) {
+ parts := strings.Split(tt, "|")
+ want := ""
+ for _, s := range parts {
+ found := false
+ // This algorithm implements title casing given word breaks
+ // as defined in the Unicode standard 3.13 R3.
+ for _, r := range s {
+ title := unicode.ToTitle(r)
+ lower := unicode.ToLower(r)
+ if !found && title != lower {
+ found = true
+ want += string(title)
+ } else {
+ want += string(lower)
+ }
+ }
+ }
+ src := strings.Join(parts, "")
+ got := Title(language.Und).String(src)
+ if got != want {
+ t.Errorf("got %q; want %q", got, want)
+ }
+ })
+ }
+}
+
+func TestContext(t *testing.T) {
+ tests := []struct {
+ desc string
+ dstSize int
+ atEOF bool
+ src string
+ out string
+ nSrc int
+ err error
+ ops string
+ prefixArg string
+ prefixWant bool
+ }{{
+ desc: "next: past end, atEOF, no checkpoint",
+ dstSize: 10,
+ atEOF: true,
+ src: "12",
+ out: "",
+ nSrc: 2,
+ ops: "next;next;next",
+ // Test that calling prefix with a non-empty argument when the buffer
+ // is depleted returns false.
+ prefixArg: "x",
+ prefixWant: false,
+ }, {
+ desc: "next: not at end, atEOF, no checkpoint",
+ dstSize: 10,
+ atEOF: false,
+ src: "12",
+ out: "",
+ nSrc: 0,
+ err: transform.ErrShortSrc,
+ ops: "next;next",
+ prefixArg: "",
+ prefixWant: true,
+ }, {
+ desc: "next: past end, !atEOF, no checkpoint",
+ dstSize: 10,
+ atEOF: false,
+ src: "12",
+ out: "",
+ nSrc: 0,
+ err: transform.ErrShortSrc,
+ ops: "next;next;next",
+ prefixArg: "",
+ prefixWant: true,
+ }, {
+ desc: "next: past end, !atEOF, checkpoint",
+ dstSize: 10,
+ atEOF: false,
+ src: "12",
+ out: "",
+ nSrc: 2,
+ ops: "next;next;checkpoint;next",
+ prefixArg: "",
+ prefixWant: true,
+ }, {
+ desc: "copy: exact count, atEOF, no checkpoint",
+ dstSize: 2,
+ atEOF: true,
+ src: "12",
+ out: "12",
+ nSrc: 2,
+ ops: "next;copy;next;copy;next",
+ prefixArg: "",
+ prefixWant: true,
+ }, {
+ desc: "copy: past end, !atEOF, no checkpoint",
+ dstSize: 2,
+ atEOF: false,
+ src: "12",
+ out: "",
+ nSrc: 0,
+ err: transform.ErrShortSrc,
+ ops: "next;copy;next;copy;next",
+ prefixArg: "",
+ prefixWant: true,
+ }, {
+ desc: "copy: past end, !atEOF, checkpoint",
+ dstSize: 2,
+ atEOF: false,
+ src: "12",
+ out: "12",
+ nSrc: 2,
+ ops: "next;copy;next;copy;checkpoint;next",
+ prefixArg: "",
+ prefixWant: true,
+ }, {
+ desc: "copy: short dst",
+ dstSize: 1,
+ atEOF: false,
+ src: "12",
+ out: "",
+ nSrc: 0,
+ err: transform.ErrShortDst,
+ ops: "next;copy;next;copy;checkpoint;next",
+ prefixArg: "12",
+ prefixWant: false,
+ }, {
+ desc: "copy: short dst, checkpointed",
+ dstSize: 1,
+ atEOF: false,
+ src: "12",
+ out: "1",
+ nSrc: 1,
+ err: transform.ErrShortDst,
+ ops: "next;copy;checkpoint;next;copy;next",
+ prefixArg: "",
+ prefixWant: true,
+ }, {
+ desc: "writeString: simple",
+ dstSize: 3,
+ atEOF: true,
+ src: "1",
+ out: "1ab",
+ nSrc: 1,
+ ops: "next;copy;writeab;next",
+ prefixArg: "",
+ prefixWant: true,
+ }, {
+ desc: "writeString: short dst",
+ dstSize: 2,
+ atEOF: true,
+ src: "12",
+ out: "",
+ nSrc: 0,
+ err: transform.ErrShortDst,
+ ops: "next;copy;writeab;next",
+ prefixArg: "2",
+ prefixWant: true,
+ }, {
+ desc: "writeString: simple",
+ dstSize: 3,
+ atEOF: true,
+ src: "12",
+ out: "1ab",
+ nSrc: 2,
+ ops: "next;copy;next;writeab;next",
+ prefixArg: "",
+ prefixWant: true,
+ }, {
+ desc: "writeString: short dst",
+ dstSize: 2,
+ atEOF: true,
+ src: "12",
+ out: "",
+ nSrc: 0,
+ err: transform.ErrShortDst,
+ ops: "next;copy;next;writeab;next",
+ prefixArg: "1",
+ prefixWant: false,
+ }, {
+ desc: "prefix",
+ dstSize: 2,
+ atEOF: true,
+ src: "12",
+ out: "",
+ nSrc: 0,
+ // Context will assign an ErrShortSrc if the input wasn't exhausted.
+ err: transform.ErrShortSrc,
+ prefixArg: "12",
+ prefixWant: true,
+ }}
+ for _, tt := range tests {
+ c := context{dst: make([]byte, tt.dstSize), src: []byte(tt.src), atEOF: tt.atEOF}
+
+ for _, op := range strings.Split(tt.ops, ";") {
+ switch op {
+ case "next":
+ c.next()
+ case "checkpoint":
+ c.checkpoint()
+ case "writeab":
+ c.writeString("ab")
+ case "copy":
+ c.copy()
+ case "":
+ default:
+ t.Fatalf("unknown op %q", op)
+ }
+ }
+ if got := c.hasPrefix(tt.prefixArg); got != tt.prefixWant {
+ t.Errorf("%s:\nprefix was %v; want %v", tt.desc, got, tt.prefixWant)
+ }
+ nDst, nSrc, err := c.ret()
+ if err != tt.err {
+ t.Errorf("%s:\nerror was %v; want %v", tt.desc, err, tt.err)
+ }
+ if out := string(c.dst[:nDst]); out != tt.out {
+ t.Errorf("%s:\nout was %q; want %q", tt.desc, out, tt.out)
+ }
+ if nSrc != tt.nSrc {
+ t.Errorf("%s:\nnSrc was %d; want %d", tt.desc, nSrc, tt.nSrc)
+ }
+ }
+}
diff --git a/vendor/golang.org/x/text/cases/example_test.go b/vendor/golang.org/x/text/cases/example_test.go
new file mode 100644
index 0000000..56e6e33
--- /dev/null
+++ b/vendor/golang.org/x/text/cases/example_test.go
@@ -0,0 +1,53 @@
+// Copyright 2014 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package cases_test
+
+import (
+ "fmt"
+
+ "golang.org/x/text/cases"
+ "golang.org/x/text/language"
+)
+
+func Example() {
+ src := []string{
+ "hello world!",
+ "i with dot",
+ "'n ijsberg",
+ "here comes O'Brian",
+ }
+ for _, c := range []cases.Caser{
+ cases.Lower(language.Und),
+ cases.Upper(language.Turkish),
+ cases.Title(language.Dutch),
+ cases.Title(language.Und, cases.NoLower),
+ } {
+ fmt.Println()
+ for _, s := range src {
+ fmt.Println(c.String(s))
+ }
+ }
+
+ // Output:
+ // hello world!
+ // i with dot
+ // 'n ijsberg
+ // here comes o'brian
+ //
+ // HELLO WORLD!
+ // İ WİTH DOT
+ // 'N İJSBERG
+ // HERE COMES O'BRİAN
+ //
+ // Hello World!
+ // I With Dot
+ // 'n IJsberg
+ // Here Comes O'brian
+ //
+ // Hello World!
+ // I With Dot
+ // 'N Ijsberg
+ // Here Comes O'Brian
+}
diff --git a/vendor/golang.org/x/text/cases/fold.go b/vendor/golang.org/x/text/cases/fold.go
new file mode 100644
index 0000000..85cc434
--- /dev/null
+++ b/vendor/golang.org/x/text/cases/fold.go
@@ -0,0 +1,34 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package cases
+
+import "golang.org/x/text/transform"
+
+type caseFolder struct{ transform.NopResetter }
+
+// caseFolder implements the Transformer interface for doing case folding.
+func (t *caseFolder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
+ c := context{dst: dst, src: src, atEOF: atEOF}
+ for c.next() {
+ foldFull(&c)
+ c.checkpoint()
+ }
+ return c.ret()
+}
+
+func (t *caseFolder) Span(src []byte, atEOF bool) (n int, err error) {
+ c := context{src: src, atEOF: atEOF}
+ for c.next() && isFoldFull(&c) {
+ c.checkpoint()
+ }
+ return c.retSpan()
+}
+
+func makeFold(o options) transform.SpanningTransformer {
+ // TODO: Special case folding, through option Language, Special/Turkic, or
+ // both.
+ // TODO: Implement Compact options.
+ return &caseFolder{}
+}
diff --git a/vendor/golang.org/x/text/cases/fold_test.go b/vendor/golang.org/x/text/cases/fold_test.go
new file mode 100644
index 0000000..ca939c7
--- /dev/null
+++ b/vendor/golang.org/x/text/cases/fold_test.go
@@ -0,0 +1,51 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package cases
+
+import (
+ "testing"
+
+ "golang.org/x/text/internal/testtext"
+)
+
+var foldTestCases = []string{
+ "βß\u13f8", // "βssᏰ"
+ "ab\u13fc\uab7aꭰ", // abᏴᎪᎠ
+ "affifflast", // affifflast
+ "Iİiı\u0345", // ii̇iıι
+ "µµΜΜςσΣΣ", // μμμμσσσσ
+}
+
+func TestFold(t *testing.T) {
+ for _, tc := range foldTestCases {
+ testEntry := func(name string, c Caser, m func(r rune) string) {
+ want := ""
+ for _, r := range tc {
+ want += m(r)
+ }
+ if got := c.String(tc); got != want {
+ t.Errorf("%s(%s) = %+q; want %+q", name, tc, got, want)
+ }
+ dst := make([]byte, 256) // big enough to hold any result
+ src := []byte(tc)
+ v := testtext.AllocsPerRun(20, func() {
+ c.Transform(dst, src, true)
+ })
+ if v > 0 {
+ t.Errorf("%s(%s): number of allocs was %f; want 0", name, tc, v)
+ }
+ }
+ testEntry("FullFold", Fold(), func(r rune) string {
+ return runeFoldData(r).full
+ })
+ // TODO:
+ // testEntry("SimpleFold", Fold(Compact), func(r rune) string {
+ // return runeFoldData(r).simple
+ // })
+ // testEntry("SpecialFold", Fold(Turkic), func(r rune) string {
+ // return runeFoldData(r).special
+ // })
+ }
+}
diff --git a/vendor/golang.org/x/text/cases/gen.go b/vendor/golang.org/x/text/cases/gen.go
new file mode 100644
index 0000000..24b7230
--- /dev/null
+++ b/vendor/golang.org/x/text/cases/gen.go
@@ -0,0 +1,839 @@
+// Copyright 2014 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build ignore
+
+// This program generates the trie for casing operations. The Unicode casing
+// algorithm requires the lookup of various properties and mappings for each
+// rune. The table generated by this generator combines several of the most
+// frequently used of these into a single trie so that they can be accessed
+// with a single lookup.
+package main
+
+import (
+ "bytes"
+ "fmt"
+ "io"
+ "io/ioutil"
+ "log"
+ "reflect"
+ "strconv"
+ "strings"
+ "unicode"
+
+ "golang.org/x/text/internal/gen"
+ "golang.org/x/text/internal/triegen"
+ "golang.org/x/text/internal/ucd"
+ "golang.org/x/text/unicode/norm"
+)
+
+func main() {
+ gen.Init()
+ genTables()
+ genTablesTest()
+ gen.Repackage("gen_trieval.go", "trieval.go", "cases")
+}
+
+// runeInfo contains all information for a rune that we care about for casing
+// operations.
+type runeInfo struct {
+ Rune rune
+
+ entry info // trie value for this rune.
+
+ CaseMode info
+
+ // Simple case mappings.
+ Simple [1 + maxCaseMode][]rune
+
+ // Special casing
+ HasSpecial bool
+ Conditional bool
+ Special [1 + maxCaseMode][]rune
+
+ // Folding
+ FoldSimple rune
+ FoldSpecial rune
+ FoldFull []rune
+
+ // TODO: FC_NFKC, or equivalent data.
+
+ // Properties
+ SoftDotted bool
+ CaseIgnorable bool
+ Cased bool
+ DecomposeGreek bool
+ BreakType string
+ BreakCat breakCategory
+
+ // We care mostly about 0, Above, and IotaSubscript.
+ CCC byte
+}
+
+type breakCategory int
+
+const (
+ breakBreak breakCategory = iota
+ breakLetter
+ breakMid
+)
+
+// mapping returns the case mapping for the given case type.
+func (r *runeInfo) mapping(c info) string {
+ if r.HasSpecial {
+ return string(r.Special[c])
+ }
+ if len(r.Simple[c]) != 0 {
+ return string(r.Simple[c])
+ }
+ return string(r.Rune)
+}
+
+func parse(file string, f func(p *ucd.Parser)) {
+ ucd.Parse(gen.OpenUCDFile(file), f)
+}
+
+func parseUCD() []runeInfo {
+ chars := make([]runeInfo, unicode.MaxRune)
+
+ get := func(r rune) *runeInfo {
+ c := &chars[r]
+ c.Rune = r
+ return c
+ }
+
+ parse("UnicodeData.txt", func(p *ucd.Parser) {
+ ri := get(p.Rune(0))
+ ri.CCC = byte(p.Int(ucd.CanonicalCombiningClass))
+ ri.Simple[cLower] = p.Runes(ucd.SimpleLowercaseMapping)
+ ri.Simple[cUpper] = p.Runes(ucd.SimpleUppercaseMapping)
+ ri.Simple[cTitle] = p.Runes(ucd.SimpleTitlecaseMapping)
+ if p.String(ucd.GeneralCategory) == "Lt" {
+ ri.CaseMode = cTitle
+ }
+ })
+
+ // <code>; <property>
+ parse("PropList.txt", func(p *ucd.Parser) {
+ if p.String(1) == "Soft_Dotted" {
+ chars[p.Rune(0)].SoftDotted = true
+ }
+ })
+
+ // <code>; <word break type>
+ parse("DerivedCoreProperties.txt", func(p *ucd.Parser) {
+ ri := get(p.Rune(0))
+ switch p.String(1) {
+ case "Case_Ignorable":
+ ri.CaseIgnorable = true
+ case "Cased":
+ ri.Cased = true
+ case "Lowercase":
+ ri.CaseMode = cLower
+ case "Uppercase":
+ ri.CaseMode = cUpper
+ }
+ })
+
+ // <code>; <lower> ; <title> ; <upper> ; (<condition_list> ;)?
+ parse("SpecialCasing.txt", func(p *ucd.Parser) {
+ // We drop all conditional special casing and deal with them manually in
+ // the language-specific case mappers. Rune 0x03A3 is the only one with
+ // a conditional formatting that is not language-specific. However,
+ // dealing with this letter is tricky, especially in a streaming
+ // context, so we deal with it in the Caser for Greek specifically.
+ ri := get(p.Rune(0))
+ if p.String(4) == "" {
+ ri.HasSpecial = true
+ ri.Special[cLower] = p.Runes(1)
+ ri.Special[cTitle] = p.Runes(2)
+ ri.Special[cUpper] = p.Runes(3)
+ } else {
+ ri.Conditional = true
+ }
+ })
+
+ // TODO: Use text breaking according to UAX #29.
+ // <code>; <word break type>
+ parse("auxiliary/WordBreakProperty.txt", func(p *ucd.Parser) {
+ ri := get(p.Rune(0))
+ ri.BreakType = p.String(1)
+
+ // We collapse the word breaking properties onto the categories we need.
+ switch p.String(1) { // TODO: officially we need to canonicalize.
+ case "MidLetter", "MidNumLet", "Single_Quote":
+ ri.BreakCat = breakMid
+ if !ri.CaseIgnorable {
+ // finalSigma relies on the fact that all breakMid runes are
+ // also a Case_Ignorable. Revisit this code when this changes.
+ log.Fatalf("Rune %U, which has a break category mid, is not a case ignorable", ri)
+ }
+ case "ALetter", "Hebrew_Letter", "Numeric", "Extend", "ExtendNumLet", "Format", "ZWJ":
+ ri.BreakCat = breakLetter
+ }
+ })
+
+ // <code>; <type>; <mapping>
+ parse("CaseFolding.txt", func(p *ucd.Parser) {
+ ri := get(p.Rune(0))
+ switch p.String(1) {
+ case "C":
+ ri.FoldSimple = p.Rune(2)
+ ri.FoldFull = p.Runes(2)
+ case "S":
+ ri.FoldSimple = p.Rune(2)
+ case "T":
+ ri.FoldSpecial = p.Rune(2)
+ case "F":
+ ri.FoldFull = p.Runes(2)
+ default:
+ log.Fatalf("%U: unknown type: %s", p.Rune(0), p.String(1))
+ }
+ })
+
+ return chars
+}
+
+func genTables() {
+ chars := parseUCD()
+ verifyProperties(chars)
+
+ t := triegen.NewTrie("case")
+ for i := range chars {
+ c := &chars[i]
+ makeEntry(c)
+ t.Insert(rune(i), uint64(c.entry))
+ }
+
+ w := gen.NewCodeWriter()
+ defer w.WriteGoFile("tables.go", "cases")
+
+ gen.WriteUnicodeVersion(w)
+
+ // TODO: write CLDR version after adding a mechanism to detect that the
+ // tables on which the manually created locale-sensitive casing code is
+ // based hasn't changed.
+
+ w.WriteVar("xorData", string(xorData))
+ w.WriteVar("exceptions", string(exceptionData))
+
+ sz, err := t.Gen(w, triegen.Compact(&sparseCompacter{}))
+ if err != nil {
+ log.Fatal(err)
+ }
+ w.Size += sz
+}
+
+func makeEntry(ri *runeInfo) {
+ if ri.CaseIgnorable {
+ if ri.Cased {
+ ri.entry = cIgnorableCased
+ } else {
+ ri.entry = cIgnorableUncased
+ }
+ } else {
+ ri.entry = ri.CaseMode
+ }
+
+ // TODO: handle soft-dotted.
+
+ ccc := cccOther
+ switch ri.CCC {
+ case 0: // Not_Reordered
+ ccc = cccZero
+ case above: // Above
+ ccc = cccAbove
+ }
+ switch ri.BreakCat {
+ case breakBreak:
+ ccc = cccBreak
+ case breakMid:
+ ri.entry |= isMidBit
+ }
+
+ ri.entry |= ccc
+
+ if ri.CaseMode == cUncased {
+ return
+ }
+
+ // Need to do something special.
+ if ri.CaseMode == cTitle || ri.HasSpecial || ri.mapping(cTitle) != ri.mapping(cUpper) {
+ makeException(ri)
+ return
+ }
+ if f := string(ri.FoldFull); len(f) > 0 && f != ri.mapping(cUpper) && f != ri.mapping(cLower) {
+ makeException(ri)
+ return
+ }
+
+ // Rune is either lowercase or uppercase.
+
+ orig := string(ri.Rune)
+ mapped := ""
+ if ri.CaseMode == cUpper {
+ mapped = ri.mapping(cLower)
+ } else {
+ mapped = ri.mapping(cUpper)
+ }
+
+ if len(orig) != len(mapped) {
+ makeException(ri)
+ return
+ }
+
+ if string(ri.FoldFull) == ri.mapping(cUpper) {
+ ri.entry |= inverseFoldBit
+ }
+
+ n := len(orig)
+
+ // Create per-byte XOR mask.
+ var b []byte
+ for i := 0; i < n; i++ {
+ b = append(b, orig[i]^mapped[i])
+ }
+
+ // Remove leading 0 bytes, but keep at least one byte.
+ for ; len(b) > 1 && b[0] == 0; b = b[1:] {
+ }
+
+ if len(b) == 1 && b[0]&0xc0 == 0 {
+ ri.entry |= info(b[0]) << xorShift
+ return
+ }
+
+ key := string(b)
+ x, ok := xorCache[key]
+ if !ok {
+ xorData = append(xorData, 0) // for detecting start of sequence
+ xorData = append(xorData, b...)
+
+ x = len(xorData) - 1
+ xorCache[key] = x
+ }
+ ri.entry |= info(x<<xorShift) | xorIndexBit
+}
+
+var xorCache = map[string]int{}
+
+// xorData contains byte-wise XOR data for the least significant bytes of a
+// UTF-8 encoded rune. An index points to the last byte. The sequence starts
+// with a zero terminator.
+var xorData = []byte{}
+
+// See the comments in gen_trieval.go re "the exceptions slice".
+var exceptionData = []byte{0}
+
+// makeException encodes case mappings that cannot be expressed in a simple
+// XOR diff.
+func makeException(ri *runeInfo) {
+ ccc := ri.entry & cccMask
+ // Set exception bit and retain case type.
+ ri.entry &= 0x0007
+ ri.entry |= exceptionBit
+
+ if len(exceptionData) >= 1<<numExceptionBits {
+ log.Fatalf("%U:exceptionData too large %x > %d bits", ri.Rune, len(exceptionData), numExceptionBits)
+ }
+
+ // Set the offset in the exceptionData array.
+ ri.entry |= info(len(exceptionData) << exceptionShift)
+
+ orig := string(ri.Rune)
+ tc := ri.mapping(cTitle)
+ uc := ri.mapping(cUpper)
+ lc := ri.mapping(cLower)
+ ff := string(ri.FoldFull)
+
+ // addString sets the length of a string and adds it to the expansions array.
+ addString := func(s string, b *byte) {
+ if len(s) == 0 {
+ // Zero-length mappings exist, but only for conditional casing,
+ // which we are representing outside of this table.
+ log.Fatalf("%U: has zero-length mapping.", ri.Rune)
+ }
+ *b <<= 3
+ if s != orig {
+ n := len(s)
+ if n > 7 {
+ log.Fatalf("%U: mapping larger than 7 (%d)", ri.Rune, n)
+ }
+ *b |= byte(n)
+ exceptionData = append(exceptionData, s...)
+ }
+ }
+
+ // byte 0:
+ exceptionData = append(exceptionData, byte(ccc)|byte(len(ff)))
+
+ // byte 1:
+ p := len(exceptionData)
+ exceptionData = append(exceptionData, 0)
+
+ if len(ff) > 7 { // May be zero-length.
+ log.Fatalf("%U: fold string larger than 7 (%d)", ri.Rune, len(ff))
+ }
+ exceptionData = append(exceptionData, ff...)
+ ct := ri.CaseMode
+ if ct != cLower {
+ addString(lc, &exceptionData[p])
+ }
+ if ct != cUpper {
+ addString(uc, &exceptionData[p])
+ }
+ if ct != cTitle {
+ // If title is the same as upper, we set it to the original string so
+ // that it will be marked as not present. This implies title case is
+ // the same as upper case.
+ if tc == uc {
+ tc = orig
+ }
+ addString(tc, &exceptionData[p])
+ }
+}
+
+// sparseCompacter is a trie value block Compacter. There are many cases where
+// successive runes alternate between lower- and upper-case. This Compacter
+// exploits this by adding a special case type where the case value is obtained
+// from or-ing it with the least-significant bit of the rune, creating large
+// ranges of equal case values that compress well.
+type sparseCompacter struct {
+ sparseBlocks [][]uint16
+ sparseOffsets []uint16
+ sparseCount int
+}
+
+// makeSparse returns the number of elements that compact block would contain
+// as well as the modified values.
+func makeSparse(vals []uint64) ([]uint16, int) {
+ // Copy the values.
+ values := make([]uint16, len(vals))
+ for i, v := range vals {
+ values[i] = uint16(v)
+ }
+
+ alt := func(i int, v uint16) uint16 {
+ if cm := info(v & fullCasedMask); cm == cUpper || cm == cLower {
+ // Convert cLower or cUpper to cXORCase value, which has the form 11x.
+ xor := v
+ xor &^= 1
+ xor |= uint16(i&1) ^ (v & 1)
+ xor |= 0x4
+ return xor
+ }
+ return v
+ }
+
+ var count int
+ var previous uint16
+ for i, v := range values {
+ if v != 0 {
+ // Try if the unmodified value is equal to the previous.
+ if v == previous {
+ continue
+ }
+
+ // Try if the xor-ed value is equal to the previous value.
+ a := alt(i, v)
+ if a == previous {
+ values[i] = a
+ continue
+ }
+
+ // This is a new value.
+ count++
+
+ // Use the xor-ed value if it will be identical to the next value.
+ if p := i + 1; p < len(values) && alt(p, values[p]) == a {
+ values[i] = a
+ v = a
+ }
+ }
+ previous = v
+ }
+ return values, count
+}
+
+func (s *sparseCompacter) Size(v []uint64) (int, bool) {
+ _, n := makeSparse(v)
+
+ // We limit using this method to having 16 entries.
+ if n > 16 {
+ return 0, false
+ }
+
+ return 2 + int(reflect.TypeOf(valueRange{}).Size())*n, true
+}
+
+func (s *sparseCompacter) Store(v []uint64) uint32 {
+ h := uint32(len(s.sparseOffsets))
+ values, sz := makeSparse(v)
+ s.sparseBlocks = append(s.sparseBlocks, values)
+ s.sparseOffsets = append(s.sparseOffsets, uint16(s.sparseCount))
+ s.sparseCount += sz
+ return h
+}
+
+func (s *sparseCompacter) Handler() string {
+ // The sparse global variable and its lookup method is defined in gen_trieval.go.
+ return "sparse.lookup"
+}
+
+func (s *sparseCompacter) Print(w io.Writer) (retErr error) {
+ p := func(format string, args ...interface{}) {
+ _, err := fmt.Fprintf(w, format, args...)
+ if retErr == nil && err != nil {
+ retErr = err
+ }
+ }
+
+ ls := len(s.sparseBlocks)
+ if ls == len(s.sparseOffsets) {
+ s.sparseOffsets = append(s.sparseOffsets, uint16(s.sparseCount))
+ }
+ p("// sparseOffsets: %d entries, %d bytes\n", ls+1, (ls+1)*2)
+ p("var sparseOffsets = %#v\n\n", s.sparseOffsets)
+
+ ns := s.sparseCount
+ p("// sparseValues: %d entries, %d bytes\n", ns, ns*4)
+ p("var sparseValues = [%d]valueRange {", ns)
+ for i, values := range s.sparseBlocks {
+ p("\n// Block %#x, offset %#x", i, s.sparseOffsets[i])
+ var v uint16
+ for i, nv := range values {
+ if nv != v {
+ if v != 0 {
+ p(",hi:%#02x},", 0x80+i-1)
+ }
+ if nv != 0 {
+ p("\n{value:%#04x,lo:%#02x", nv, 0x80+i)
+ }
+ }
+ v = nv
+ }
+ if v != 0 {
+ p(",hi:%#02x},", 0x80+len(values)-1)
+ }
+ }
+ p("\n}\n\n")
+ return
+}
+
+// verifyProperties that properties of the runes that are relied upon in the
+// implementation. Each property is marked with an identifier that is referred
+// to in the places where it is used.
+func verifyProperties(chars []runeInfo) {
+ for i, c := range chars {
+ r := rune(i)
+
+ // Rune properties.
+
+ // A.1: modifier never changes on lowercase. [ltLower]
+ if c.CCC > 0 && unicode.ToLower(r) != r {
+ log.Fatalf("%U: non-starter changes when lowercased", r)
+ }
+
+ // A.2: properties of decompositions starting with I or J. [ltLower]
+ d := norm.NFD.PropertiesString(string(r)).Decomposition()
+ if len(d) > 0 {
+ if d[0] == 'I' || d[0] == 'J' {
+ // A.2.1: we expect at least an ASCII character and a modifier.
+ if len(d) < 3 {
+ log.Fatalf("%U: length of decomposition was %d; want >= 3", r, len(d))
+ }
+
+ // All subsequent runes are modifiers and all have the same CCC.
+ runes := []rune(string(d[1:]))
+ ccc := chars[runes[0]].CCC
+
+ for _, mr := range runes[1:] {
+ mc := chars[mr]
+
+ // A.2.2: all modifiers have a CCC of Above or less.
+ if ccc == 0 || ccc > above {
+ log.Fatalf("%U: CCC of successive rune (%U) was %d; want (0,230]", r, mr, ccc)
+ }
+
+ // A.2.3: a sequence of modifiers all have the same CCC.
+ if mc.CCC != ccc {
+ log.Fatalf("%U: CCC of follow-up modifier (%U) was %d; want %d", r, mr, mc.CCC, ccc)
+ }
+
+ // A.2.4: for each trailing r, r in [0x300, 0x311] <=> CCC == Above.
+ if (ccc == above) != (0x300 <= mr && mr <= 0x311) {
+ log.Fatalf("%U: modifier %U in [U+0300, U+0311] != ccc(%U) == 230", r, mr, mr)
+ }
+
+ if i += len(string(mr)); i >= len(d) {
+ break
+ }
+ }
+ }
+ }
+
+ // A.3: no U+0307 in decomposition of Soft-Dotted rune. [ltUpper]
+ if unicode.Is(unicode.Soft_Dotted, r) && strings.Contains(string(d), "\u0307") {
+ log.Fatalf("%U: decomposition of soft-dotted rune may not contain U+0307", r)
+ }
+
+ // A.4: only rune U+0345 may be of CCC Iota_Subscript. [elUpper]
+ if c.CCC == iotaSubscript && r != 0x0345 {
+ log.Fatalf("%U: only rune U+0345 may have CCC Iota_Subscript", r)
+ }
+
+ // A.5: soft-dotted runes do not have exceptions.
+ if c.SoftDotted && c.entry&exceptionBit != 0 {
+ log.Fatalf("%U: soft-dotted has exception", r)
+ }
+
+ // A.6: Greek decomposition. [elUpper]
+ if unicode.Is(unicode.Greek, r) {
+ if b := norm.NFD.PropertiesString(string(r)).Decomposition(); b != nil {
+ runes := []rune(string(b))
+ // A.6.1: If a Greek rune decomposes and the first rune of the
+ // decomposition is greater than U+00FF, the rune is always
+ // great and not a modifier.
+ if f := runes[0]; unicode.IsMark(f) || f > 0xFF && !unicode.Is(unicode.Greek, f) {
+ log.Fatalf("%U: expected first rune of Greek decomposition to be letter, found %U", r, f)
+ }
+ // A.6.2: Any follow-up rune in a Greek decomposition is a
+ // modifier of which the first should be gobbled in
+ // decomposition.
+ for _, m := range runes[1:] {
+ switch m {
+ case 0x0313, 0x0314, 0x0301, 0x0300, 0x0306, 0x0342, 0x0308, 0x0304, 0x345:
+ default:
+ log.Fatalf("%U: modifier %U is outside of expected Greek modifier set", r, m)
+ }
+ }
+ }
+ }
+
+ // Breaking properties.
+
+ // B.1: all runes with CCC > 0 are of break type Extend.
+ if c.CCC > 0 && c.BreakType != "Extend" {
+ log.Fatalf("%U: CCC == %d, but got break type %s; want Extend", r, c.CCC, c.BreakType)
+ }
+
+ // B.2: all cased runes with c.CCC == 0 are of break type ALetter.
+ if c.CCC == 0 && c.Cased && c.BreakType != "ALetter" {
+ log.Fatalf("%U: cased, but got break type %s; want ALetter", r, c.BreakType)
+ }
+
+ // B.3: letter category.
+ if c.CCC == 0 && c.BreakCat != breakBreak && !c.CaseIgnorable {
+ if c.BreakCat != breakLetter {
+ log.Fatalf("%U: check for letter break type gave %d; want %d", r, c.BreakCat, breakLetter)
+ }
+ }
+ }
+}
+
+func genTablesTest() {
+ w := &bytes.Buffer{}
+
+ fmt.Fprintln(w, "var (")
+ printProperties(w, "DerivedCoreProperties.txt", "Case_Ignorable", verifyIgnore)
+
+ // We discard the output as we know we have perfect functions. We run them
+ // just to verify the properties are correct.
+ n := printProperties(ioutil.Discard, "DerivedCoreProperties.txt", "Cased", verifyCased)
+ n += printProperties(ioutil.Discard, "DerivedCoreProperties.txt", "Lowercase", verifyLower)
+ n += printProperties(ioutil.Discard, "DerivedCoreProperties.txt", "Uppercase", verifyUpper)
+ if n > 0 {
+ log.Fatalf("One of the discarded properties does not have a perfect filter.")
+ }
+
+ // <code>; <lower> ; <title> ; <upper> ; (<condition_list> ;)?
+ fmt.Fprintln(w, "\tspecial = map[rune]struct{ toLower, toTitle, toUpper string }{")
+ parse("SpecialCasing.txt", func(p *ucd.Parser) {
+ // Skip conditional entries.
+ if p.String(4) != "" {
+ return
+ }
+ r := p.Rune(0)
+ fmt.Fprintf(w, "\t\t0x%04x: {%q, %q, %q},\n",
+ r, string(p.Runes(1)), string(p.Runes(2)), string(p.Runes(3)))
+ })
+ fmt.Fprint(w, "\t}\n\n")
+
+ // <code>; <type>; <runes>
+ table := map[rune]struct{ simple, full, special string }{}
+ parse("CaseFolding.txt", func(p *ucd.Parser) {
+ r := p.Rune(0)
+ t := p.String(1)
+ v := string(p.Runes(2))
+ if t != "T" && v == string(unicode.ToLower(r)) {
+ return
+ }
+ x := table[r]
+ switch t {
+ case "C":
+ x.full = v
+ x.simple = v
+ case "S":
+ x.simple = v
+ case "F":
+ x.full = v
+ case "T":
+ x.special = v
+ }
+ table[r] = x
+ })
+ fmt.Fprintln(w, "\tfoldMap = map[rune]struct{ simple, full, special string }{")
+ for r := rune(0); r < 0x10FFFF; r++ {
+ x, ok := table[r]
+ if !ok {
+ continue
+ }
+ fmt.Fprintf(w, "\t\t0x%04x: {%q, %q, %q},\n", r, x.simple, x.full, x.special)
+ }
+ fmt.Fprint(w, "\t}\n\n")
+
+ // Break property
+ notBreak := map[rune]bool{}
+ parse("auxiliary/WordBreakProperty.txt", func(p *ucd.Parser) {
+ switch p.String(1) {
+ case "Extend", "Format", "MidLetter", "MidNumLet", "Single_Quote",
+ "ALetter", "Hebrew_Letter", "Numeric", "ExtendNumLet", "ZWJ":
+ notBreak[p.Rune(0)] = true
+ }
+ })
+
+ fmt.Fprintln(w, "\tbreakProp = []struct{ lo, hi rune }{")
+ inBreak := false
+ for r := rune(0); r <= lastRuneForTesting; r++ {
+ if isBreak := !notBreak[r]; isBreak != inBreak {
+ if isBreak {
+ fmt.Fprintf(w, "\t\t{0x%x, ", r)
+ } else {
+ fmt.Fprintf(w, "0x%x},\n", r-1)
+ }
+ inBreak = isBreak
+ }
+ }
+ if inBreak {
+ fmt.Fprintf(w, "0x%x},\n", lastRuneForTesting)
+ }
+ fmt.Fprint(w, "\t}\n\n")
+
+ // Word break test
+ // Filter out all samples that do not contain cased characters.
+ cased := map[rune]bool{}
+ parse("DerivedCoreProperties.txt", func(p *ucd.Parser) {
+ if p.String(1) == "Cased" {
+ cased[p.Rune(0)] = true
+ }
+ })
+
+ fmt.Fprintln(w, "\tbreakTest = []string{")
+ parse("auxiliary/WordBreakTest.txt", func(p *ucd.Parser) {
+ c := strings.Split(p.String(0), " ")
+
+ const sep = '|'
+ numCased := 0
+ test := ""
+ for ; len(c) >= 2; c = c[2:] {
+ if c[0] == "÷" && test != "" {
+ test += string(sep)
+ }
+ i, err := strconv.ParseUint(c[1], 16, 32)
+ r := rune(i)
+ if err != nil {
+ log.Fatalf("Invalid rune %q.", c[1])
+ }
+ if r == sep {
+ log.Fatalf("Separator %q not allowed in test data. Pick another one.", sep)
+ }
+ if cased[r] {
+ numCased++
+ }
+ test += string(r)
+ }
+ if numCased > 1 {
+ fmt.Fprintf(w, "\t\t%q,\n", test)
+ }
+ })
+ fmt.Fprintln(w, "\t}")
+
+ fmt.Fprintln(w, ")")
+
+ gen.WriteGoFile("tables_test.go", "cases", w.Bytes())
+}
+
+// These functions are just used for verification that their definition have not
+// changed in the Unicode Standard.
+
+func verifyCased(r rune) bool {
+ return verifyLower(r) || verifyUpper(r) || unicode.IsTitle(r)
+}
+
+func verifyLower(r rune) bool {
+ return unicode.IsLower(r) || unicode.Is(unicode.Other_Lowercase, r)
+}
+
+func verifyUpper(r rune) bool {
+ return unicode.IsUpper(r) || unicode.Is(unicode.Other_Uppercase, r)
+}
+
+// verifyIgnore is an approximation of the Case_Ignorable property using the
+// core unicode package. It is used to reduce the size of the test data.
+func verifyIgnore(r rune) bool {
+ props := []*unicode.RangeTable{
+ unicode.Mn,
+ unicode.Me,
+ unicode.Cf,
+ unicode.Lm,
+ unicode.Sk,
+ }
+ for _, p := range props {
+ if unicode.Is(p, r) {
+ return true
+ }
+ }
+ return false
+}
+
+// printProperties prints tables of rune properties from the given UCD file.
+// A filter func f can be given to exclude certain values. A rune r will have
+// the indicated property if it is in the generated table or if f(r).
+func printProperties(w io.Writer, file, property string, f func(r rune) bool) int {
+ verify := map[rune]bool{}
+ n := 0
+ varNameParts := strings.Split(property, "_")
+ varNameParts[0] = strings.ToLower(varNameParts[0])
+ fmt.Fprintf(w, "\t%s = map[rune]bool{\n", strings.Join(varNameParts, ""))
+ parse(file, func(p *ucd.Parser) {
+ if p.String(1) == property {
+ r := p.Rune(0)
+ verify[r] = true
+ if !f(r) {
+ n++
+ fmt.Fprintf(w, "\t\t0x%.4x: true,\n", r)
+ }
+ }
+ })
+ fmt.Fprint(w, "\t}\n\n")
+
+ // Verify that f is correct, that is, it represents a subset of the property.
+ for r := rune(0); r <= lastRuneForTesting; r++ {
+ if !verify[r] && f(r) {
+ log.Fatalf("Incorrect filter func for property %q.", property)
+ }
+ }
+ return n
+}
+
+// The newCaseTrie, sparseValues and sparseOffsets definitions below are
+// placeholders referred to by gen_trieval.go. The real definitions are
+// generated by this program and written to tables.go.
+
+func newCaseTrie(int) int { return 0 }
+
+var (
+ sparseValues [0]valueRange
+ sparseOffsets [0]uint16
+)
diff --git a/vendor/golang.org/x/text/cases/gen_trieval.go b/vendor/golang.org/x/text/cases/gen_trieval.go
new file mode 100644
index 0000000..376d22c
--- /dev/null
+++ b/vendor/golang.org/x/text/cases/gen_trieval.go
@@ -0,0 +1,219 @@
+// Copyright 2014 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build ignore
+
+package main
+
+// This file contains definitions for interpreting the trie value of the case
+// trie generated by "go run gen*.go". It is shared by both the generator
+// program and the resultant package. Sharing is achieved by the generator
+// copying gen_trieval.go to trieval.go and changing what's above this comment.
+
+// info holds case information for a single rune. It is the value returned
+// by a trie lookup. Most mapping information can be stored in a single 16-bit
+// value. If not, for example when a rune is mapped to multiple runes, the value
+// stores some basic case data and an index into an array with additional data.
+//
+// The per-rune values have the following format:
+//
+// if (exception) {
+// 15..5 unsigned exception index
+// 4 unused
+// } else {
+// 15..8 XOR pattern or index to XOR pattern for case mapping
+// Only 13..8 are used for XOR patterns.
+// 7 inverseFold (fold to upper, not to lower)
+// 6 index: interpret the XOR pattern as an index
+// or isMid if case mode is cIgnorableUncased.
+// 5..4 CCC: zero (normal or break), above or other
+// }
+// 3 exception: interpret this value as an exception index
+// (TODO: is this bit necessary? Probably implied from case mode.)
+// 2..0 case mode
+//
+// For the non-exceptional cases, a rune must be either uncased, lowercase or
+// uppercase. If the rune is cased, the XOR pattern maps either a lowercase
+// rune to uppercase or an uppercase rune to lowercase (applied to the 10
+// least-significant bits of the rune).
+//
+// See the definitions below for a more detailed description of the various
+// bits.
+type info uint16
+
+const (
+ casedMask = 0x0003
+ fullCasedMask = 0x0007
+ ignorableMask = 0x0006
+ ignorableValue = 0x0004
+
+ inverseFoldBit = 1 << 7
+ isMidBit = 1 << 6
+
+ exceptionBit = 1 << 3
+ exceptionShift = 5
+ numExceptionBits = 11
+
+ xorIndexBit = 1 << 6
+ xorShift = 8
+
+ // There is no mapping if all xor bits and the exception bit are zero.
+ hasMappingMask = 0xff80 | exceptionBit
+)
+
+// The case mode bits encodes the case type of a rune. This includes uncased,
+// title, upper and lower case and case ignorable. (For a definition of these
+// terms see Chapter 3 of The Unicode Standard Core Specification.) In some rare
+// cases, a rune can be both cased and case-ignorable. This is encoded by
+// cIgnorableCased. A rune of this type is always lower case. Some runes are
+// cased while not having a mapping.
+//
+// A common pattern for scripts in the Unicode standard is for upper and lower
+// case runes to alternate for increasing rune values (e.g. the accented Latin
+// ranges starting from U+0100 and U+1E00 among others and some Cyrillic
+// characters). We use this property by defining a cXORCase mode, where the case
+// mode (always upper or lower case) is derived from the rune value. As the XOR
+// pattern for case mappings is often identical for successive runes, using
+// cXORCase can result in large series of identical trie values. This, in turn,
+// allows us to better compress the trie blocks.
+const (
+ cUncased info = iota // 000
+ cTitle // 001
+ cLower // 010
+ cUpper // 011
+ cIgnorableUncased // 100
+ cIgnorableCased // 101 // lower case if mappings exist
+ cXORCase // 11x // case is cLower | ((rune&1) ^ x)
+
+ maxCaseMode = cUpper
+)
+
+func (c info) isCased() bool {
+ return c&casedMask != 0
+}
+
+func (c info) isCaseIgnorable() bool {
+ return c&ignorableMask == ignorableValue
+}
+
+func (c info) isNotCasedAndNotCaseIgnorable() bool {
+ return c&fullCasedMask == 0
+}
+
+func (c info) isCaseIgnorableAndNotCased() bool {
+ return c&fullCasedMask == cIgnorableUncased
+}
+
+func (c info) isMid() bool {
+ return c&(fullCasedMask|isMidBit) == isMidBit|cIgnorableUncased
+}
+
+// The case mapping implementation will need to know about various Canonical
+// Combining Class (CCC) values. We encode two of these in the trie value:
+// cccZero (0) and cccAbove (230). If the value is cccOther, it means that
+// CCC(r) > 0, but not 230. A value of cccBreak means that CCC(r) == 0 and that
+// the rune also has the break category Break (see below).
+const (
+ cccBreak info = iota << 4
+ cccZero
+ cccAbove
+ cccOther
+
+ cccMask = cccBreak | cccZero | cccAbove | cccOther
+)
+
+const (
+ starter = 0
+ above = 230
+ iotaSubscript = 240
+)
+
+// The exceptions slice holds data that does not fit in a normal info entry.
+// The entry is pointed to by the exception index in an entry. It has the
+// following format:
+//
+// Header
+// byte 0:
+// 7..6 unused
+// 5..4 CCC type (same bits as entry)
+// 3 unused
+// 2..0 length of fold
+//
+// byte 1:
+// 7..6 unused
+// 5..3 length of 1st mapping of case type
+// 2..0 length of 2nd mapping of case type
+//
+// case 1st 2nd
+// lower -> upper, title
+// upper -> lower, title
+// title -> lower, upper
+//
+// Lengths with the value 0x7 indicate no value and implies no change.
+// A length of 0 indicates a mapping to zero-length string.
+//
+// Body bytes:
+// case folding bytes
+// lowercase mapping bytes
+// uppercase mapping bytes
+// titlecase mapping bytes
+// closure mapping bytes (for NFKC_Casefold). (TODO)
+//
+// Fallbacks:
+// missing fold -> lower
+// missing title -> upper
+// all missing -> original rune
+//
+// exceptions starts with a dummy byte to enforce that there is no zero index
+// value.
+const (
+ lengthMask = 0x07
+ lengthBits = 3
+ noChange = 0
+)
+
+// References to generated trie.
+
+var trie = newCaseTrie(0)
+
+var sparse = sparseBlocks{
+ values: sparseValues[:],
+ offsets: sparseOffsets[:],
+}
+
+// Sparse block lookup code.
+
+// valueRange is an entry in a sparse block.
+type valueRange struct {
+ value uint16
+ lo, hi byte
+}
+
+type sparseBlocks struct {
+ values []valueRange
+ offsets []uint16
+}
+
+// lookup returns the value from values block n for byte b using binary search.
+func (s *sparseBlocks) lookup(n uint32, b byte) uint16 {
+ lo := s.offsets[n]
+ hi := s.offsets[n+1]
+ for lo < hi {
+ m := lo + (hi-lo)/2
+ r := s.values[m]
+ if r.lo <= b && b <= r.hi {
+ return r.value
+ }
+ if b < r.lo {
+ hi = m
+ } else {
+ lo = m + 1
+ }
+ }
+ return 0
+}
+
+// lastRuneForTesting is the last rune used for testing. Everything after this
+// is boring.
+const lastRuneForTesting = rune(0x1FFFF)
diff --git a/vendor/golang.org/x/text/cases/icu.go b/vendor/golang.org/x/text/cases/icu.go
new file mode 100644
index 0000000..46530d1
--- /dev/null
+++ b/vendor/golang.org/x/text/cases/icu.go
@@ -0,0 +1,61 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build icu
+
+package cases
+
+// Ideally these functions would be defined in a test file, but go test doesn't
+// allow CGO in tests. The build tag should ensure either way that these
+// functions will not end up in the package.
+
+// TODO: Ensure that the correct ICU version is set.
+
+/*
+#cgo LDFLAGS: -licui18n.57 -licuuc.57
+#include <stdlib.h>
+#include <unicode/ustring.h>
+#include <unicode/utypes.h>
+#include <unicode/localpointer.h>
+#include <unicode/ucasemap.h>
+*/
+import "C"
+
+import "unsafe"
+
+func doICU(tag, caser, input string) string {
+ err := C.UErrorCode(0)
+ loc := C.CString(tag)
+ cm := C.ucasemap_open(loc, C.uint32_t(0), &err)
+
+ buf := make([]byte, len(input)*4)
+ dst := (*C.char)(unsafe.Pointer(&buf[0]))
+ src := C.CString(input)
+
+ cn := C.int32_t(0)
+
+ switch caser {
+ case "fold":
+ cn = C.ucasemap_utf8FoldCase(cm,
+ dst, C.int32_t(len(buf)),
+ src, C.int32_t(len(input)),
+ &err)
+ case "lower":
+ cn = C.ucasemap_utf8ToLower(cm,
+ dst, C.int32_t(len(buf)),
+ src, C.int32_t(len(input)),
+ &err)
+ case "upper":
+ cn = C.ucasemap_utf8ToUpper(cm,
+ dst, C.int32_t(len(buf)),
+ src, C.int32_t(len(input)),
+ &err)
+ case "title":
+ cn = C.ucasemap_utf8ToTitle(cm,
+ dst, C.int32_t(len(buf)),
+ src, C.int32_t(len(input)),
+ &err)
+ }
+ return string(buf[:cn])
+}
diff --git a/vendor/golang.org/x/text/cases/icu_test.go b/vendor/golang.org/x/text/cases/icu_test.go
new file mode 100644
index 0000000..3d07e25
--- /dev/null
+++ b/vendor/golang.org/x/text/cases/icu_test.go
@@ -0,0 +1,210 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build icu
+
+package cases
+
+import (
+ "path"
+ "strings"
+ "testing"
+
+ "golang.org/x/text/internal/testtext"
+ "golang.org/x/text/language"
+ "golang.org/x/text/unicode/norm"
+)
+
+func TestICUConformance(t *testing.T) {
+ // Build test set.
+ input := []string{
+ "a.a a_a",
+ "a\u05d0a",
+ "\u05d0'a",
+ "a\u03084a",
+ "a\u0308a",
+ "a3\u30a3a",
+ "a\u303aa",
+ "a_\u303a_a",
+ "1_a..a",
+ "1_a.a",
+ "a..a.",
+ "a--a-",
+ "a-a-",
+ "a\u200ba",
+ "a\u200b\u200ba",
+ "a\u00ad\u00ada", // Format
+ "a\u00ada",
+ "a''a", // SingleQuote
+ "a'a",
+ "a::a", // MidLetter
+ "a:a",
+ "a..a", // MidNumLet
+ "a.a",
+ "a;;a", // MidNum
+ "a;a",
+ "a__a", // ExtendNumlet
+ "a_a",
+ "ΟΣ''a",
+ }
+ add := func(x interface{}) {
+ switch v := x.(type) {
+ case string:
+ input = append(input, v)
+ case []string:
+ for _, s := range v {
+ input = append(input, s)
+ }
+ }
+ }
+ for _, tc := range testCases {
+ add(tc.src)
+ add(tc.lower)
+ add(tc.upper)
+ add(tc.title)
+ }
+ for _, tc := range bufferTests {
+ add(tc.src)
+ }
+ for _, tc := range breakTest {
+ add(strings.Replace(tc, "|", "", -1))
+ }
+ for _, tc := range foldTestCases {
+ add(tc)
+ }
+
+ // Compare ICU to Go.
+ for _, c := range []string{"lower", "upper", "title", "fold"} {
+ for _, tag := range []string{
+ "und", "af", "az", "el", "lt", "nl", "tr",
+ } {
+ for _, s := range input {
+ if exclude(c, tag, s) {
+ continue
+ }
+ testtext.Run(t, path.Join(c, tag, s), func(t *testing.T) {
+ want := doICU(tag, c, s)
+ got := doGo(tag, c, s)
+ if norm.NFC.String(got) != norm.NFC.String(want) {
+ t.Errorf("\n in %[3]q (%+[3]q)\n got %[1]q (%+[1]q)\n want %[2]q (%+[2]q)", got, want, s)
+ }
+ })
+ }
+ }
+ }
+}
+
+// exclude indicates if a string should be excluded from testing.
+func exclude(cm, tag, s string) bool {
+ list := []struct{ cm, tags, pattern string }{
+ // TODO: Go does not handle certain esoteric breaks correctly. This will be
+ // fixed once we have a real word break iterator. Alternatively, it
+ // seems like we're not too far off from making it work, so we could
+ // fix these last steps. But first verify that using a separate word
+ // breaker does not hurt performance.
+ {"title", "af nl", "a''a"},
+ {"", "", "א'a"},
+
+ // All the exclusions below seem to be issues with the ICU
+ // implementation (at version 57) and thus are not marked as TODO.
+
+ // ICU does not handle leading apostrophe for Dutch and
+ // Afrikaans correctly. See http://unicode.org/cldr/trac/ticket/7078.
+ {"title", "af nl", "'n"},
+ {"title", "af nl", "'N"},
+
+ // Go terminates the final sigma check after a fixed number of
+ // ignorables have been found. This ensures that the algorithm can make
+ // progress in a streaming scenario.
+ {"lower title", "", "\u039f\u03a3...............................a"},
+ // This also applies to upper in Greek.
+ // NOTE: we could fix the following two cases by adding state to elUpper
+ // and aztrLower. However, considering a modifier to not belong to the
+ // preceding letter after the maximum modifiers count is reached is
+ // consistent with the behavior of unicode/norm.
+ {"upper", "el", "\u03bf" + strings.Repeat("\u0321", 29) + "\u0313"},
+ {"lower", "az tr lt", "I" + strings.Repeat("\u0321", 30) + "\u0307\u0300"},
+ {"upper", "lt", "i" + strings.Repeat("\u0321", 30) + "\u0307\u0300"},
+ {"lower", "lt", "I" + strings.Repeat("\u0321", 30) + "\u0300"},
+
+ // ICU title case seems to erroneously removes \u0307 from an upper case
+ // I unconditionally, instead of only when lowercasing. The ICU
+ // transform algorithm transforms these cases consistently with our
+ // implementation.
+ {"title", "az tr", "\u0307"},
+
+ // The spec says to remove \u0307 after Soft-Dotted characters. ICU
+ // transforms conform but ucasemap_utf8ToUpper does not.
+ {"upper title", "lt", "i\u0307"},
+ {"upper title", "lt", "i" + strings.Repeat("\u0321", 29) + "\u0307\u0300"},
+
+ // Both Unicode and CLDR prescribe an extra explicit dot above after a
+ // Soft_Dotted character if there are other modifiers.
+ // ucasemap_utf8ToUpper does not do this; ICU transforms do.
+ // The issue with ucasemap_utf8ToUpper seems to be that it does not
+ // consider the modifiers that are part of composition in the evaluation
+ // of More_Above. For instance, according to the More_Above rule for lt,
+ // a dotted capital I (U+0130) becomes i\u0307\u0307 (an small i with
+ // two additional dots). This seems odd, but is correct. ICU is
+ // definitely not correct as it produces different results for different
+ // normal forms. For instance, for an İ:
+ // \u0130 (NFC) -> i\u0307 (incorrect)
+ // I\u0307 (NFD) -> i\u0307\u0307 (correct)
+ // We could argue that we should not add a \u0307 if there already is
+ // one, but this may be hard to get correct and is not conform the
+ // standard.
+ {"lower title", "lt", "\u0130"},
+ {"lower title", "lt", "\u00cf"},
+
+ // We are conform ICU ucasemap_utf8ToUpper if we remove support for
+ // elUpper. However, this is clearly not conform the spec. Moreover, the
+ // ICU transforms _do_ implement this transform and produces results
+ // consistent with our implementation. Note that we still prefer to use
+ // ucasemap_utf8ToUpper instead of transforms as the latter have
+ // inconsistencies in the word breaking algorithm.
+ {"upper", "el", "\u0386"}, // GREEK CAPITAL LETTER ALPHA WITH TONOS
+ {"upper", "el", "\u0389"}, // GREEK CAPITAL LETTER ETA WITH TONOS
+ {"upper", "el", "\u038A"}, // GREEK CAPITAL LETTER IOTA WITH TONOS
+
+ {"upper", "el", "\u0391"}, // GREEK CAPITAL LETTER ALPHA
+ {"upper", "el", "\u0397"}, // GREEK CAPITAL LETTER ETA
+ {"upper", "el", "\u0399"}, // GREEK CAPITAL LETTER IOTA
+
+ {"upper", "el", "\u03AC"}, // GREEK SMALL LETTER ALPHA WITH TONOS
+ {"upper", "el", "\u03AE"}, // GREEK SMALL LETTER ALPHA WITH ETA
+ {"upper", "el", "\u03AF"}, // GREEK SMALL LETTER ALPHA WITH IOTA
+
+ {"upper", "el", "\u03B1"}, // GREEK SMALL LETTER ALPHA
+ {"upper", "el", "\u03B7"}, // GREEK SMALL LETTER ETA
+ {"upper", "el", "\u03B9"}, // GREEK SMALL LETTER IOTA
+ }
+ for _, x := range list {
+ if x.cm != "" && strings.Index(x.cm, cm) == -1 {
+ continue
+ }
+ if x.tags != "" && strings.Index(x.tags, tag) == -1 {
+ continue
+ }
+ if strings.Index(s, x.pattern) != -1 {
+ return true
+ }
+ }
+ return false
+}
+
+func doGo(tag, caser, input string) string {
+ var c Caser
+ t := language.MustParse(tag)
+ switch caser {
+ case "lower":
+ c = Lower(t)
+ case "upper":
+ c = Upper(t)
+ case "title":
+ c = Title(t)
+ case "fold":
+ c = Fold()
+ }
+ return c.String(input)
+}
diff --git a/vendor/golang.org/x/text/cases/info.go b/vendor/golang.org/x/text/cases/info.go
new file mode 100644
index 0000000..3b51f03
--- /dev/null
+++ b/vendor/golang.org/x/text/cases/info.go
@@ -0,0 +1,82 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package cases
+
+func (c info) cccVal() info {
+ if c&exceptionBit != 0 {
+ return info(exceptions[c>>exceptionShift]) & cccMask
+ }
+ return c & cccMask
+}
+
+func (c info) cccType() info {
+ ccc := c.cccVal()
+ if ccc <= cccZero {
+ return cccZero
+ }
+ return ccc
+}
+
+// TODO: Implement full Unicode breaking algorithm:
+// 1) Implement breaking in separate package.
+// 2) Use the breaker here.
+// 3) Compare table size and performance of using the more generic breaker.
+//
+// Note that we can extend the current algorithm to be much more accurate. This
+// only makes sense, though, if the performance and/or space penalty of using
+// the generic breaker is big. Extra data will only be needed for non-cased
+// runes, which means there are sufficient bits left in the caseType.
+// ICU prohibits breaking in such cases as well.
+
+// For the purpose of title casing we use an approximation of the Unicode Word
+// Breaking algorithm defined in Annex #29:
+// http://www.unicode.org/reports/tr29/#Default_Grapheme_Cluster_Table.
+//
+// For our approximation, we group the Word Break types into the following
+// categories, with associated rules:
+//
+// 1) Letter:
+// ALetter, Hebrew_Letter, Numeric, ExtendNumLet, Extend, Format_FE, ZWJ.
+// Rule: Never break between consecutive runes of this category.
+//
+// 2) Mid:
+// MidLetter, MidNumLet, Single_Quote.
+// (Cf. case-ignorable: MidLetter, MidNumLet, Single_Quote or cat is Mn,
+// Me, Cf, Lm or Sk).
+// Rule: Don't break between Letter and Mid, but break between two Mids.
+//
+// 3) Break:
+// Any other category: NewLine, MidNum, CR, LF, Double_Quote, Katakana, and
+// Other.
+// These categories should always result in a break between two cased letters.
+// Rule: Always break.
+//
+// Note 1: the Katakana and MidNum categories can, in esoteric cases, result in
+// preventing a break between two cased letters. For now we will ignore this
+// (e.g. [ALetter] [ExtendNumLet] [Katakana] [ExtendNumLet] [ALetter] and
+// [ALetter] [Numeric] [MidNum] [Numeric] [ALetter].)
+//
+// Note 2: the rule for Mid is very approximate, but works in most cases. To
+// improve, we could store the categories in the trie value and use a FA to
+// manage breaks. See TODO comment above.
+//
+// Note 3: according to the spec, it is possible for the Extend category to
+// introduce breaks between other categories grouped in Letter. However, this
+// is undesirable for our purposes. ICU prevents breaks in such cases as well.
+
+// isBreak returns whether this rune should introduce a break.
+func (c info) isBreak() bool {
+ return c.cccVal() == cccBreak
+}
+
+// isLetter returns whether the rune is of break type ALetter, Hebrew_Letter,
+// Numeric, ExtendNumLet, or Extend.
+func (c info) isLetter() bool {
+ ccc := c.cccVal()
+ if ccc == cccZero {
+ return !c.isCaseIgnorable()
+ }
+ return ccc != cccBreak
+}
diff --git a/vendor/golang.org/x/text/cases/map.go b/vendor/golang.org/x/text/cases/map.go
new file mode 100644
index 0000000..4baebaa
--- /dev/null
+++ b/vendor/golang.org/x/text/cases/map.go
@@ -0,0 +1,816 @@
+// Copyright 2014 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package cases
+
+// This file contains the definitions of case mappings for all supported
+// languages. The rules for the language-specific tailorings were taken and
+// modified from the CLDR transform definitions in common/transforms.
+
+import (
+ "strings"
+ "unicode"
+ "unicode/utf8"
+
+ "golang.org/x/text/internal"
+ "golang.org/x/text/language"
+ "golang.org/x/text/transform"
+ "golang.org/x/text/unicode/norm"
+)
+
+// A mapFunc takes a context set to the current rune and writes the mapped
+// version to the same context. It may advance the context to the next rune. It
+// returns whether a checkpoint is possible: whether the pDst bytes written to
+// dst so far won't need changing as we see more source bytes.
+type mapFunc func(*context) bool
+
+// A spanFunc takes a context set to the current rune and returns whether this
+// rune would be altered when written to the output. It may advance the context
+// to the next rune. It returns whether a checkpoint is possible.
+type spanFunc func(*context) bool
+
+// maxIgnorable defines the maximum number of ignorables to consider for
+// lookahead operations.
+const maxIgnorable = 30
+
+// supported lists the language tags for which we have tailorings.
+const supported = "und af az el lt nl tr"
+
+func init() {
+ tags := []language.Tag{}
+ for _, s := range strings.Split(supported, " ") {
+ tags = append(tags, language.MustParse(s))
+ }
+ matcher = internal.NewInheritanceMatcher(tags)
+ Supported = language.NewCoverage(tags)
+}
+
+var (
+ matcher *internal.InheritanceMatcher
+
+ Supported language.Coverage
+
+ // We keep the following lists separate, instead of having a single per-
+ // language struct, to give the compiler a chance to remove unused code.
+
+ // Some uppercase mappers are stateless, so we can precompute the
+ // Transformers and save a bit on runtime allocations.
+ upperFunc = []struct {
+ upper mapFunc
+ span spanFunc
+ }{
+ {nil, nil}, // und
+ {nil, nil}, // af
+ {aztrUpper(upper), isUpper}, // az
+ {elUpper, noSpan}, // el
+ {ltUpper(upper), noSpan}, // lt
+ {nil, nil}, // nl
+ {aztrUpper(upper), isUpper}, // tr
+ }
+
+ undUpper transform.SpanningTransformer = &undUpperCaser{}
+ undLower transform.SpanningTransformer = &undLowerCaser{}
+ undLowerIgnoreSigma transform.SpanningTransformer = &undLowerIgnoreSigmaCaser{}
+
+ lowerFunc = []mapFunc{
+ nil, // und
+ nil, // af
+ aztrLower, // az
+ nil, // el
+ ltLower, // lt
+ nil, // nl
+ aztrLower, // tr
+ }
+
+ titleInfos = []struct {
+ title mapFunc
+ lower mapFunc
+ titleSpan spanFunc
+ rewrite func(*context)
+ }{
+ {title, lower, isTitle, nil}, // und
+ {title, lower, isTitle, afnlRewrite}, // af
+ {aztrUpper(title), aztrLower, isTitle, nil}, // az
+ {title, lower, isTitle, nil}, // el
+ {ltUpper(title), ltLower, noSpan, nil}, // lt
+ {nlTitle, lower, nlTitleSpan, afnlRewrite}, // nl
+ {aztrUpper(title), aztrLower, isTitle, nil}, // tr
+ }
+)
+
+func makeUpper(t language.Tag, o options) transform.SpanningTransformer {
+ _, i, _ := matcher.Match(t)
+ f := upperFunc[i].upper
+ if f == nil {
+ return undUpper
+ }
+ return &simpleCaser{f: f, span: upperFunc[i].span}
+}
+
+func makeLower(t language.Tag, o options) transform.SpanningTransformer {
+ _, i, _ := matcher.Match(t)
+ f := lowerFunc[i]
+ if f == nil {
+ if o.ignoreFinalSigma {
+ return undLowerIgnoreSigma
+ }
+ return undLower
+ }
+ if o.ignoreFinalSigma {
+ return &simpleCaser{f: f, span: isLower}
+ }
+ return &lowerCaser{
+ first: f,
+ midWord: finalSigma(f),
+ }
+}
+
+func makeTitle(t language.Tag, o options) transform.SpanningTransformer {
+ _, i, _ := matcher.Match(t)
+ x := &titleInfos[i]
+ lower := x.lower
+ if o.noLower {
+ lower = (*context).copy
+ } else if !o.ignoreFinalSigma {
+ lower = finalSigma(lower)
+ }
+ return &titleCaser{
+ title: x.title,
+ lower: lower,
+ titleSpan: x.titleSpan,
+ rewrite: x.rewrite,
+ }
+}
+
+func noSpan(c *context) bool {
+ c.err = transform.ErrEndOfSpan
+ return false
+}
+
+// TODO: consider a similar special case for the fast majority lower case. This
+// is a bit more involved so will require some more precise benchmarking to
+// justify it.
+
+type undUpperCaser struct{ transform.NopResetter }
+
+// undUpperCaser implements the Transformer interface for doing an upper case
+// mapping for the root locale (und). It eliminates the need for an allocation
+// as it prevents escaping by not using function pointers.
+func (t undUpperCaser) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
+ c := context{dst: dst, src: src, atEOF: atEOF}
+ for c.next() {
+ upper(&c)
+ c.checkpoint()
+ }
+ return c.ret()
+}
+
+func (t undUpperCaser) Span(src []byte, atEOF bool) (n int, err error) {
+ c := context{src: src, atEOF: atEOF}
+ for c.next() && isUpper(&c) {
+ c.checkpoint()
+ }
+ return c.retSpan()
+}
+
+// undLowerIgnoreSigmaCaser implements the Transformer interface for doing
+// a lower case mapping for the root locale (und) ignoring final sigma
+// handling. This casing algorithm is used in some performance-critical packages
+// like secure/precis and x/net/http/idna, which warrants its special-casing.
+type undLowerIgnoreSigmaCaser struct{ transform.NopResetter }
+
+func (t undLowerIgnoreSigmaCaser) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
+ c := context{dst: dst, src: src, atEOF: atEOF}
+ for c.next() && lower(&c) {
+ c.checkpoint()
+ }
+ return c.ret()
+
+}
+
+// Span implements a generic lower-casing. This is possible as isLower works
+// for all lowercasing variants. All lowercase variants only vary in how they
+// transform a non-lowercase letter. They will never change an already lowercase
+// letter. In addition, there is no state.
+func (t undLowerIgnoreSigmaCaser) Span(src []byte, atEOF bool) (n int, err error) {
+ c := context{src: src, atEOF: atEOF}
+ for c.next() && isLower(&c) {
+ c.checkpoint()
+ }
+ return c.retSpan()
+}
+
+type simpleCaser struct {
+ context
+ f mapFunc
+ span spanFunc
+}
+
+// simpleCaser implements the Transformer interface for doing a case operation
+// on a rune-by-rune basis.
+func (t *simpleCaser) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
+ c := context{dst: dst, src: src, atEOF: atEOF}
+ for c.next() && t.f(&c) {
+ c.checkpoint()
+ }
+ return c.ret()
+}
+
+func (t *simpleCaser) Span(src []byte, atEOF bool) (n int, err error) {
+ c := context{src: src, atEOF: atEOF}
+ for c.next() && t.span(&c) {
+ c.checkpoint()
+ }
+ return c.retSpan()
+}
+
+// undLowerCaser implements the Transformer interface for doing a lower case
+// mapping for the root locale (und) ignoring final sigma handling. This casing
+// algorithm is used in some performance-critical packages like secure/precis
+// and x/net/http/idna, which warrants its special-casing.
+type undLowerCaser struct{ transform.NopResetter }
+
+func (t undLowerCaser) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
+ c := context{dst: dst, src: src, atEOF: atEOF}
+
+ for isInterWord := true; c.next(); {
+ if isInterWord {
+ if c.info.isCased() {
+ if !lower(&c) {
+ break
+ }
+ isInterWord = false
+ } else if !c.copy() {
+ break
+ }
+ } else {
+ if c.info.isNotCasedAndNotCaseIgnorable() {
+ if !c.copy() {
+ break
+ }
+ isInterWord = true
+ } else if !c.hasPrefix("Σ") {
+ if !lower(&c) {
+ break
+ }
+ } else if !finalSigmaBody(&c) {
+ break
+ }
+ }
+ c.checkpoint()
+ }
+ return c.ret()
+}
+
+func (t undLowerCaser) Span(src []byte, atEOF bool) (n int, err error) {
+ c := context{src: src, atEOF: atEOF}
+ for c.next() && isLower(&c) {
+ c.checkpoint()
+ }
+ return c.retSpan()
+}
+
+// lowerCaser implements the Transformer interface. The default Unicode lower
+// casing requires different treatment for the first and subsequent characters
+// of a word, most notably to handle the Greek final Sigma.
+type lowerCaser struct {
+ undLowerIgnoreSigmaCaser
+
+ context
+
+ first, midWord mapFunc
+}
+
+func (t *lowerCaser) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
+ t.context = context{dst: dst, src: src, atEOF: atEOF}
+ c := &t.context
+
+ for isInterWord := true; c.next(); {
+ if isInterWord {
+ if c.info.isCased() {
+ if !t.first(c) {
+ break
+ }
+ isInterWord = false
+ } else if !c.copy() {
+ break
+ }
+ } else {
+ if c.info.isNotCasedAndNotCaseIgnorable() {
+ if !c.copy() {
+ break
+ }
+ isInterWord = true
+ } else if !t.midWord(c) {
+ break
+ }
+ }
+ c.checkpoint()
+ }
+ return c.ret()
+}
+
+// titleCaser implements the Transformer interface. Title casing algorithms
+// distinguish between the first letter of a word and subsequent letters of the
+// same word. It uses state to avoid requiring a potentially infinite lookahead.
+type titleCaser struct {
+ context
+
+ // rune mappings used by the actual casing algorithms.
+ title mapFunc
+ lower mapFunc
+ titleSpan spanFunc
+
+ rewrite func(*context)
+}
+
+// Transform implements the standard Unicode title case algorithm as defined in
+// Chapter 3 of The Unicode Standard:
+// toTitlecase(X): Find the word boundaries in X according to Unicode Standard
+// Annex #29, "Unicode Text Segmentation." For each word boundary, find the
+// first cased character F following the word boundary. If F exists, map F to
+// Titlecase_Mapping(F); then map all characters C between F and the following
+// word boundary to Lowercase_Mapping(C).
+func (t *titleCaser) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
+ t.context = context{dst: dst, src: src, atEOF: atEOF, isMidWord: t.isMidWord}
+ c := &t.context
+
+ if !c.next() {
+ return c.ret()
+ }
+
+ for {
+ p := c.info
+ if t.rewrite != nil {
+ t.rewrite(c)
+ }
+
+ wasMid := p.isMid()
+ // Break out of this loop on failure to ensure we do not modify the
+ // state incorrectly.
+ if p.isCased() {
+ if !c.isMidWord {
+ if !t.title(c) {
+ break
+ }
+ c.isMidWord = true
+ } else if !t.lower(c) {
+ break
+ }
+ } else if !c.copy() {
+ break
+ } else if p.isBreak() {
+ c.isMidWord = false
+ }
+
+ // As we save the state of the transformer, it is safe to call
+ // checkpoint after any successful write.
+ if !(c.isMidWord && wasMid) {
+ c.checkpoint()
+ }
+
+ if !c.next() {
+ break
+ }
+ if wasMid && c.info.isMid() {
+ c.isMidWord = false
+ }
+ }
+ return c.ret()
+}
+
+func (t *titleCaser) Span(src []byte, atEOF bool) (n int, err error) {
+ t.context = context{src: src, atEOF: atEOF, isMidWord: t.isMidWord}
+ c := &t.context
+
+ if !c.next() {
+ return c.retSpan()
+ }
+
+ for {
+ p := c.info
+ if t.rewrite != nil {
+ t.rewrite(c)
+ }
+
+ wasMid := p.isMid()
+ // Break out of this loop on failure to ensure we do not modify the
+ // state incorrectly.
+ if p.isCased() {
+ if !c.isMidWord {
+ if !t.titleSpan(c) {
+ break
+ }
+ c.isMidWord = true
+ } else if !isLower(c) {
+ break
+ }
+ } else if p.isBreak() {
+ c.isMidWord = false
+ }
+ // As we save the state of the transformer, it is safe to call
+ // checkpoint after any successful write.
+ if !(c.isMidWord && wasMid) {
+ c.checkpoint()
+ }
+
+ if !c.next() {
+ break
+ }
+ if wasMid && c.info.isMid() {
+ c.isMidWord = false
+ }
+ }
+ return c.retSpan()
+}
+
+// finalSigma adds Greek final Sigma handing to another casing function. It
+// determines whether a lowercased sigma should be σ or ς, by looking ahead for
+// case-ignorables and a cased letters.
+func finalSigma(f mapFunc) mapFunc {
+ return func(c *context) bool {
+ if !c.hasPrefix("Σ") {
+ return f(c)
+ }
+ return finalSigmaBody(c)
+ }
+}
+
+func finalSigmaBody(c *context) bool {
+ // Current rune must be ∑.
+
+ // ::NFD();
+ // # 03A3; 03C2; 03A3; 03A3; Final_Sigma; # GREEK CAPITAL LETTER SIGMA
+ // Σ } [:case-ignorable:]* [:cased:] → σ;
+ // [:cased:] [:case-ignorable:]* { Σ → ς;
+ // ::Any-Lower;
+ // ::NFC();
+
+ p := c.pDst
+ c.writeString("ς")
+
+ // TODO: we should do this here, but right now this will never have an
+ // effect as this is called when the prefix is Sigma, whereas Dutch and
+ // Afrikaans only test for an apostrophe.
+ //
+ // if t.rewrite != nil {
+ // t.rewrite(c)
+ // }
+
+ // We need to do one more iteration after maxIgnorable, as a cased
+ // letter is not an ignorable and may modify the result.
+ wasMid := false
+ for i := 0; i < maxIgnorable+1; i++ {
+ if !c.next() {
+ return false
+ }
+ if !c.info.isCaseIgnorable() {
+ // All Midword runes are also case ignorable, so we are
+ // guaranteed to have a letter or word break here. As we are
+ // unreading the run, there is no need to unset c.isMidWord;
+ // the title caser will handle this.
+ if c.info.isCased() {
+ // p+1 is guaranteed to be in bounds: if writing ς was
+ // successful, p+1 will contain the second byte of ς. If not,
+ // this function will have returned after c.next returned false.
+ c.dst[p+1]++ // ς → σ
+ }
+ c.unreadRune()
+ return true
+ }
+ // A case ignorable may also introduce a word break, so we may need
+ // to continue searching even after detecting a break.
+ isMid := c.info.isMid()
+ if (wasMid && isMid) || c.info.isBreak() {
+ c.isMidWord = false
+ }
+ wasMid = isMid
+ c.copy()
+ }
+ return true
+}
+
+// finalSigmaSpan would be the same as isLower.
+
+// elUpper implements Greek upper casing, which entails removing a predefined
+// set of non-blocked modifiers. Note that these accents should not be removed
+// for title casing!
+// Example: "Οδός" -> "ΟΔΟΣ".
+func elUpper(c *context) bool {
+ // From CLDR:
+ // [:Greek:] [^[:ccc=Not_Reordered:][:ccc=Above:]]*? { [\u0313\u0314\u0301\u0300\u0306\u0342\u0308\u0304] → ;
+ // [:Greek:] [^[:ccc=Not_Reordered:][:ccc=Iota_Subscript:]]*? { \u0345 → ;
+
+ r, _ := utf8.DecodeRune(c.src[c.pSrc:])
+ oldPDst := c.pDst
+ if !upper(c) {
+ return false
+ }
+ if !unicode.Is(unicode.Greek, r) {
+ return true
+ }
+ i := 0
+ // Take the properties of the uppercased rune that is already written to the
+ // destination. This saves us the trouble of having to uppercase the
+ // decomposed rune again.
+ if b := norm.NFD.Properties(c.dst[oldPDst:]).Decomposition(); b != nil {
+ // Restore the destination position and process the decomposed rune.
+ r, sz := utf8.DecodeRune(b)
+ if r <= 0xFF { // See A.6.1
+ return true
+ }
+ c.pDst = oldPDst
+ // Insert the first rune and ignore the modifiers. See A.6.2.
+ c.writeBytes(b[:sz])
+ i = len(b[sz:]) / 2 // Greek modifiers are always of length 2.
+ }
+
+ for ; i < maxIgnorable && c.next(); i++ {
+ switch r, _ := utf8.DecodeRune(c.src[c.pSrc:]); r {
+ // Above and Iota Subscript
+ case 0x0300, // U+0300 COMBINING GRAVE ACCENT
+ 0x0301, // U+0301 COMBINING ACUTE ACCENT
+ 0x0304, // U+0304 COMBINING MACRON
+ 0x0306, // U+0306 COMBINING BREVE
+ 0x0308, // U+0308 COMBINING DIAERESIS
+ 0x0313, // U+0313 COMBINING COMMA ABOVE
+ 0x0314, // U+0314 COMBINING REVERSED COMMA ABOVE
+ 0x0342, // U+0342 COMBINING GREEK PERISPOMENI
+ 0x0345: // U+0345 COMBINING GREEK YPOGEGRAMMENI
+ // No-op. Gobble the modifier.
+
+ default:
+ switch v, _ := trie.lookup(c.src[c.pSrc:]); info(v).cccType() {
+ case cccZero:
+ c.unreadRune()
+ return true
+
+ // We don't need to test for IotaSubscript as the only rune that
+ // qualifies (U+0345) was already excluded in the switch statement
+ // above. See A.4.
+
+ case cccAbove:
+ return c.copy()
+ default:
+ // Some other modifier. We're still allowed to gobble Greek
+ // modifiers after this.
+ c.copy()
+ }
+ }
+ }
+ return i == maxIgnorable
+}
+
+// TODO: implement elUpperSpan (low-priority: complex and infrequent).
+
+func ltLower(c *context) bool {
+ // From CLDR:
+ // # Introduce an explicit dot above when lowercasing capital I's and J's
+ // # whenever there are more accents above.
+ // # (of the accents used in Lithuanian: grave, acute, tilde above, and ogonek)
+ // # 0049; 0069 0307; 0049; 0049; lt More_Above; # LATIN CAPITAL LETTER I
+ // # 004A; 006A 0307; 004A; 004A; lt More_Above; # LATIN CAPITAL LETTER J
+ // # 012E; 012F 0307; 012E; 012E; lt More_Above; # LATIN CAPITAL LETTER I WITH OGONEK
+ // # 00CC; 0069 0307 0300; 00CC; 00CC; lt; # LATIN CAPITAL LETTER I WITH GRAVE
+ // # 00CD; 0069 0307 0301; 00CD; 00CD; lt; # LATIN CAPITAL LETTER I WITH ACUTE
+ // # 0128; 0069 0307 0303; 0128; 0128; lt; # LATIN CAPITAL LETTER I WITH TILDE
+ // ::NFD();
+ // I } [^[:ccc=Not_Reordered:][:ccc=Above:]]* [:ccc=Above:] → i \u0307;
+ // J } [^[:ccc=Not_Reordered:][:ccc=Above:]]* [:ccc=Above:] → j \u0307;
+ // I \u0328 (Į) } [^[:ccc=Not_Reordered:][:ccc=Above:]]* [:ccc=Above:] → i \u0328 \u0307;
+ // I \u0300 (Ì) → i \u0307 \u0300;
+ // I \u0301 (Í) → i \u0307 \u0301;
+ // I \u0303 (Ĩ) → i \u0307 \u0303;
+ // ::Any-Lower();
+ // ::NFC();
+
+ i := 0
+ if r := c.src[c.pSrc]; r < utf8.RuneSelf {
+ lower(c)
+ if r != 'I' && r != 'J' {
+ return true
+ }
+ } else {
+ p := norm.NFD.Properties(c.src[c.pSrc:])
+ if d := p.Decomposition(); len(d) >= 3 && (d[0] == 'I' || d[0] == 'J') {
+ // UTF-8 optimization: the decomposition will only have an above
+ // modifier if the last rune of the decomposition is in [U+300-U+311].
+ // In all other cases, a decomposition starting with I is always
+ // an I followed by modifiers that are not cased themselves. See A.2.
+ if d[1] == 0xCC && d[2] <= 0x91 { // A.2.4.
+ if !c.writeBytes(d[:1]) {
+ return false
+ }
+ c.dst[c.pDst-1] += 'a' - 'A' // lower
+
+ // Assumption: modifier never changes on lowercase. See A.1.
+ // Assumption: all modifiers added have CCC = Above. See A.2.3.
+ return c.writeString("\u0307") && c.writeBytes(d[1:])
+ }
+ // In all other cases the additional modifiers will have a CCC
+ // that is less than 230 (Above). We will insert the U+0307, if
+ // needed, after these modifiers so that a string in FCD form
+ // will remain so. See A.2.2.
+ lower(c)
+ i = 1
+ } else {
+ return lower(c)
+ }
+ }
+
+ for ; i < maxIgnorable && c.next(); i++ {
+ switch c.info.cccType() {
+ case cccZero:
+ c.unreadRune()
+ return true
+ case cccAbove:
+ return c.writeString("\u0307") && c.copy() // See A.1.
+ default:
+ c.copy() // See A.1.
+ }
+ }
+ return i == maxIgnorable
+}
+
+// ltLowerSpan would be the same as isLower.
+
+func ltUpper(f mapFunc) mapFunc {
+ return func(c *context) bool {
+ // Unicode:
+ // 0307; 0307; ; ; lt After_Soft_Dotted; # COMBINING DOT ABOVE
+ //
+ // From CLDR:
+ // # Remove \u0307 following soft-dotteds (i, j, and the like), with possible
+ // # intervening non-230 marks.
+ // ::NFD();
+ // [:Soft_Dotted:] [^[:ccc=Not_Reordered:][:ccc=Above:]]* { \u0307 → ;
+ // ::Any-Upper();
+ // ::NFC();
+
+ // TODO: See A.5. A soft-dotted rune never has an exception. This would
+ // allow us to overload the exception bit and encode this property in
+ // info. Need to measure performance impact of this.
+ r, _ := utf8.DecodeRune(c.src[c.pSrc:])
+ oldPDst := c.pDst
+ if !f(c) {
+ return false
+ }
+ if !unicode.Is(unicode.Soft_Dotted, r) {
+ return true
+ }
+
+ // We don't need to do an NFD normalization, as a soft-dotted rune never
+ // contains U+0307. See A.3.
+
+ i := 0
+ for ; i < maxIgnorable && c.next(); i++ {
+ switch c.info.cccType() {
+ case cccZero:
+ c.unreadRune()
+ return true
+ case cccAbove:
+ if c.hasPrefix("\u0307") {
+ // We don't do a full NFC, but rather combine runes for
+ // some of the common cases. (Returning NFC or
+ // preserving normal form is neither a requirement nor
+ // a possibility anyway).
+ if !c.next() {
+ return false
+ }
+ if c.dst[oldPDst] == 'I' && c.pDst == oldPDst+1 && c.src[c.pSrc] == 0xcc {
+ s := ""
+ switch c.src[c.pSrc+1] {
+ case 0x80: // U+0300 COMBINING GRAVE ACCENT
+ s = "\u00cc" // U+00CC LATIN CAPITAL LETTER I WITH GRAVE
+ case 0x81: // U+0301 COMBINING ACUTE ACCENT
+ s = "\u00cd" // U+00CD LATIN CAPITAL LETTER I WITH ACUTE
+ case 0x83: // U+0303 COMBINING TILDE
+ s = "\u0128" // U+0128 LATIN CAPITAL LETTER I WITH TILDE
+ case 0x88: // U+0308 COMBINING DIAERESIS
+ s = "\u00cf" // U+00CF LATIN CAPITAL LETTER I WITH DIAERESIS
+ default:
+ }
+ if s != "" {
+ c.pDst = oldPDst
+ return c.writeString(s)
+ }
+ }
+ }
+ return c.copy()
+ default:
+ c.copy()
+ }
+ }
+ return i == maxIgnorable
+ }
+}
+
+// TODO: implement ltUpperSpan (low priority: complex and infrequent).
+
+func aztrUpper(f mapFunc) mapFunc {
+ return func(c *context) bool {
+ // i→İ;
+ if c.src[c.pSrc] == 'i' {
+ return c.writeString("İ")
+ }
+ return f(c)
+ }
+}
+
+func aztrLower(c *context) (done bool) {
+ // From CLDR:
+ // # I and i-dotless; I-dot and i are case pairs in Turkish and Azeri
+ // # 0130; 0069; 0130; 0130; tr; # LATIN CAPITAL LETTER I WITH DOT ABOVE
+ // İ→i;
+ // # When lowercasing, remove dot_above in the sequence I + dot_above, which will turn into i.
+ // # This matches the behavior of the canonically equivalent I-dot_above
+ // # 0307; ; 0307; 0307; tr After_I; # COMBINING DOT ABOVE
+ // # When lowercasing, unless an I is before a dot_above, it turns into a dotless i.
+ // # 0049; 0131; 0049; 0049; tr Not_Before_Dot; # LATIN CAPITAL LETTER I
+ // I([^[:ccc=Not_Reordered:][:ccc=Above:]]*)\u0307 → i$1 ;
+ // I→ı ;
+ // ::Any-Lower();
+ if c.hasPrefix("\u0130") { // İ
+ return c.writeString("i")
+ }
+ if c.src[c.pSrc] != 'I' {
+ return lower(c)
+ }
+
+ // We ignore the lower-case I for now, but insert it later when we know
+ // which form we need.
+ start := c.pSrc + c.sz
+
+ i := 0
+Loop:
+ // We check for up to n ignorables before \u0307. As \u0307 is an
+ // ignorable as well, n is maxIgnorable-1.
+ for ; i < maxIgnorable && c.next(); i++ {
+ switch c.info.cccType() {
+ case cccAbove:
+ if c.hasPrefix("\u0307") {
+ return c.writeString("i") && c.writeBytes(c.src[start:c.pSrc]) // ignore U+0307
+ }
+ done = true
+ break Loop
+ case cccZero:
+ c.unreadRune()
+ done = true
+ break Loop
+ default:
+ // We'll write this rune after we know which starter to use.
+ }
+ }
+ if i == maxIgnorable {
+ done = true
+ }
+ return c.writeString("ı") && c.writeBytes(c.src[start:c.pSrc+c.sz]) && done
+}
+
+// aztrLowerSpan would be the same as isLower.
+
+func nlTitle(c *context) bool {
+ // From CLDR:
+ // # Special titlecasing for Dutch initial "ij".
+ // ::Any-Title();
+ // # Fix up Ij at the beginning of a "word" (per Any-Title, notUAX #29)
+ // [:^WB=ALetter:] [:WB=Extend:]* [[:WB=MidLetter:][:WB=MidNumLet:]]? { Ij } → IJ ;
+ if c.src[c.pSrc] != 'I' && c.src[c.pSrc] != 'i' {
+ return title(c)
+ }
+
+ if !c.writeString("I") || !c.next() {
+ return false
+ }
+ if c.src[c.pSrc] == 'j' || c.src[c.pSrc] == 'J' {
+ return c.writeString("J")
+ }
+ c.unreadRune()
+ return true
+}
+
+func nlTitleSpan(c *context) bool {
+ // From CLDR:
+ // # Special titlecasing for Dutch initial "ij".
+ // ::Any-Title();
+ // # Fix up Ij at the beginning of a "word" (per Any-Title, notUAX #29)
+ // [:^WB=ALetter:] [:WB=Extend:]* [[:WB=MidLetter:][:WB=MidNumLet:]]? { Ij } → IJ ;
+ if c.src[c.pSrc] != 'I' {
+ return isTitle(c)
+ }
+ if !c.next() || c.src[c.pSrc] == 'j' {
+ return false
+ }
+ if c.src[c.pSrc] != 'J' {
+ c.unreadRune()
+ }
+ return true
+}
+
+// Not part of CLDR, but see http://unicode.org/cldr/trac/ticket/7078.
+func afnlRewrite(c *context) {
+ if c.hasPrefix("'") || c.hasPrefix("’") {
+ c.isMidWord = true
+ }
+}
diff --git a/vendor/golang.org/x/text/cases/map_test.go b/vendor/golang.org/x/text/cases/map_test.go
new file mode 100644
index 0000000..8ac3911
--- /dev/null
+++ b/vendor/golang.org/x/text/cases/map_test.go
@@ -0,0 +1,950 @@
+// Copyright 2014 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package cases
+
+import (
+ "bytes"
+ "fmt"
+ "path"
+ "strings"
+ "testing"
+ "unicode/utf8"
+
+ "golang.org/x/text/internal/testtext"
+ "golang.org/x/text/language"
+ "golang.org/x/text/transform"
+ "golang.org/x/text/unicode/norm"
+)
+
+type testCase struct {
+ lang string
+ src interface{} // string, []string, or nil to skip test
+ title interface{} // string, []string, or nil to skip test
+ lower interface{} // string, []string, or nil to skip test
+ upper interface{} // string, []string, or nil to skip test
+ opts options
+}
+
+var testCases = []testCase{
+ 0: {
+ lang: "und",
+ src: "abc aBc ABC abC İsıI ΕΣΆΣ",
+ title: "Abc Abc Abc Abc İsıi Εσάσ",
+ lower: "abc abc abc abc i\u0307sıi εσάσ",
+ upper: "ABC ABC ABC ABC İSII ΕΣΆΣ",
+ opts: getOpts(HandleFinalSigma(false)),
+ },
+
+ 1: {
+ lang: "und",
+ src: "abc aBc ABC abC İsıI ΕΣΆΣ Σ _Σ -Σ",
+ title: "Abc Abc Abc Abc İsıi Εσάς Σ _Σ -Σ",
+ lower: "abc abc abc abc i\u0307sıi εσάς σ _σ -σ",
+ upper: "ABC ABC ABC ABC İSII ΕΣΆΣ Σ _Σ -Σ",
+ opts: getOpts(HandleFinalSigma(true)),
+ },
+
+ 2: { // Title cased runes.
+ lang: supported,
+ src: "DžA",
+ title: "Dža",
+ lower: "dža",
+ upper: "DŽA",
+ },
+
+ 3: {
+ // Title breaking.
+ lang: supported,
+ src: []string{
+ "FOO CASE TEST",
+ "DON'T DO THiS",
+ "χωΡΊΣ χωΡΊΣ^a χωΡΊΣ:a χωΡΊΣ:^a χωΡΊΣ^ όμΩΣ Σ",
+ "with-hyphens",
+ "49ers 49ers",
+ `"capitalize a^a -hyphen 0X _u a_u:a`,
+ "MidNumLet a.b\u2018c\u2019d\u2024e\ufe52f\uff07f\uff0eg",
+ "MidNum a,b;c\u037ed\u0589e\u060cf\u2044g\ufe50h",
+ "\u0345 x\u3031x x\u05d0x \u05d0x a'.a a.a a4,a",
+ },
+ title: []string{
+ "Foo Case Test",
+ "Don't Do This",
+ "Χωρίς Χωρίσ^A Χωρίσ:a Χωρίσ:^A Χωρίς^ Όμως Σ",
+ "With-Hyphens",
+ // Note that 49Ers is correct according to the spec.
+ // TODO: provide some option to the user to treat different
+ // characters as cased.
+ "49Ers 49Ers",
+ `"Capitalize A^A -Hyphen 0X _U A_u:a`,
+ "Midnumlet A.b\u2018c\u2019d\u2024e\ufe52f\uff07f\uff0eg",
+ "Midnum A,B;C\u037eD\u0589E\u060cF\u2044G\ufe50H",
+ "\u0399 X\u3031X X\u05d0x \u05d0X A'.A A.a A4,A",
+ },
+ },
+
+ // TODO: These are known deviations from the options{} Unicode Word Breaking
+ // Algorithm.
+ // {
+ // "und",
+ // "x_\u3031_x a4,4a",
+ // "X_\u3031_x A4,4a", // Currently is "X_\U3031_X A4,4A".
+ // "x_\u3031_x a4,4a",
+ // "X_\u3031_X A4,4A",
+ // options{},
+ // },
+
+ 4: {
+ // Tests title options
+ lang: "und",
+ src: "abc aBc ABC abC İsıI o'Brien",
+ title: "Abc ABc ABC AbC İsıI O'Brien",
+ opts: getOpts(NoLower),
+ },
+
+ 5: {
+ lang: "el",
+ src: "aBc ΟΔΌΣ Οδός Σο ΣΟ Σ oΣ ΟΣ σ ἕξ \u03ac",
+ title: "Abc Οδός Οδός Σο Σο Σ Oς Ος Σ Ἕξ \u0386",
+ lower: "abc οδός οδός σο σο σ oς ος σ ἕξ \u03ac",
+ upper: "ABC ΟΔΟΣ ΟΔΟΣ ΣΟ ΣΟ Σ OΣ ΟΣ Σ ΕΞ \u0391", // Uppercase removes accents
+ },
+
+ 6: {
+ lang: "tr az",
+ src: "Isiİ İsıI I\u0307sIiİ İsıI\u0307 I\u0300\u0307",
+ title: "Isii İsıı I\u0307sıii İsıi I\u0300\u0307",
+ lower: "ısii isıı isıii isıi \u0131\u0300\u0307",
+ upper: "ISİİ İSII I\u0307SIİİ İSII\u0307 I\u0300\u0307",
+ },
+
+ 7: {
+ lang: "lt",
+ src: "I Ï J J̈ Į Į̈ Ì Í Ĩ xi̇̈ xj̇̈ xį̇̈ xi̇̀ xi̇́ xi̇̃ XI XÏ XJ XJ̈ XĮ XĮ̈ XI̟̤",
+ title: "I Ï J J̈ Į Į̈ Ì Í Ĩ Xi̇̈ Xj̇̈ Xį̇̈ Xi̇̀ Xi̇́ Xi̇̃ Xi Xi̇̈ Xj Xj̇̈ Xį Xį̇̈ Xi̟̤",
+ lower: "i i̇̈ j j̇̈ į į̇̈ i̇̀ i̇́ i̇̃ xi̇̈ xj̇̈ xį̇̈ xi̇̀ xi̇́ xi̇̃ xi xi̇̈ xj xj̇̈ xį xį̇̈ xi̟̤",
+ upper: "I Ï J J̈ Į Į̈ Ì Í Ĩ XÏ XJ̈ XĮ̈ XÌ XÍ XĨ XI XÏ XJ XJ̈ XĮ XĮ̈ XI̟̤",
+ },
+
+ 8: {
+ lang: "lt",
+ src: "\u012e\u0300 \u00cc i\u0307\u0300 i\u0307\u0301 i\u0307\u0303 i\u0307\u0308 i\u0300\u0307",
+ title: "\u012e\u0300 \u00cc \u00cc \u00cd \u0128 \u00cf I\u0300\u0307",
+ lower: "\u012f\u0307\u0300 i\u0307\u0300 i\u0307\u0300 i\u0307\u0301 i\u0307\u0303 i\u0307\u0308 i\u0300\u0307",
+ upper: "\u012e\u0300 \u00cc \u00cc \u00cd \u0128 \u00cf I\u0300\u0307",
+ },
+
+ 9: {
+ lang: "nl",
+ src: "ijs IJs Ij Ijs İJ İJs aa aA 'ns 'S",
+ title: "IJs IJs IJ IJs İj İjs Aa Aa 'ns 's",
+ },
+
+ // Note: this specification is not currently part of CLDR. The same holds
+ // for the leading apostrophe handling for Dutch.
+ // See http://unicode.org/cldr/trac/ticket/7078.
+ 10: {
+ lang: "af",
+ src: "wag 'n bietjie",
+ title: "Wag 'n Bietjie",
+ lower: "wag 'n bietjie",
+ upper: "WAG 'N BIETJIE",
+ },
+}
+
+func TestCaseMappings(t *testing.T) {
+ for i, tt := range testCases {
+ src, ok := tt.src.([]string)
+ if !ok {
+ src = strings.Split(tt.src.(string), " ")
+ }
+
+ for _, lang := range strings.Split(tt.lang, " ") {
+ tag := language.MustParse(lang)
+ testEntry := func(name string, mk func(language.Tag, options) transform.SpanningTransformer, gold interface{}) {
+ c := Caser{mk(tag, tt.opts)}
+ if gold != nil {
+ wants, ok := gold.([]string)
+ if !ok {
+ wants = strings.Split(gold.(string), " ")
+ }
+ for j, want := range wants {
+ if got := c.String(src[j]); got != want {
+ t.Errorf("%d:%s:\n%s.String(%+q):\ngot %+q;\nwant %+q", i, lang, name, src[j], got, want)
+ }
+ }
+ }
+ dst := make([]byte, 256) // big enough to hold any result
+ src := []byte(strings.Join(src, " "))
+ v := testtext.AllocsPerRun(20, func() {
+ c.Transform(dst, src, true)
+ })
+ if v > 1.1 {
+ t.Errorf("%d:%s:\n%s: number of allocs was %f; want 0", i, lang, name, v)
+ }
+ }
+ testEntry("Upper", makeUpper, tt.upper)
+ testEntry("Lower", makeLower, tt.lower)
+ testEntry("Title", makeTitle, tt.title)
+ }
+ }
+}
+
+// TestAlloc tests that some mapping methods should not cause any allocation.
+func TestAlloc(t *testing.T) {
+ dst := make([]byte, 256) // big enough to hold any result
+ src := []byte(txtNonASCII)
+
+ for i, f := range []func() Caser{
+ func() Caser { return Upper(language.Und) },
+ func() Caser { return Lower(language.Und) },
+ func() Caser { return Lower(language.Und, HandleFinalSigma(false)) },
+ // TODO: use a shared copy for these casers as well, in order of
+ // importance, starting with the most important:
+ // func() Caser { return Title(language.Und) },
+ // func() Caser { return Title(language.Und, HandleFinalSigma(false)) },
+ } {
+ testtext.Run(t, "", func(t *testing.T) {
+ var c Caser
+ v := testtext.AllocsPerRun(10, func() {
+ c = f()
+ })
+ if v > 0 {
+ // TODO: Right now only Upper has 1 allocation. Special-case Lower
+ // and Title as well to have less allocations for the root locale.
+ t.Errorf("%d:init: number of allocs was %f; want 0", i, v)
+ }
+ v = testtext.AllocsPerRun(2, func() {
+ c.Transform(dst, src, true)
+ })
+ if v > 0 {
+ t.Errorf("%d:transform: number of allocs was %f; want 0", i, v)
+ }
+ })
+ }
+}
+
+func testHandover(t *testing.T, c Caser, src string) {
+ want := c.String(src)
+ // Find the common prefix.
+ pSrc := 0
+ for ; pSrc < len(src) && pSrc < len(want) && want[pSrc] == src[pSrc]; pSrc++ {
+ }
+
+ // Test handover for each substring of the prefix.
+ for i := 0; i < pSrc; i++ {
+ testtext.Run(t, fmt.Sprint("interleave/", i), func(t *testing.T) {
+ dst := make([]byte, 4*len(src))
+ c.Reset()
+ nSpan, _ := c.Span([]byte(src[:i]), false)
+ copy(dst, src[:nSpan])
+ nTransform, _, _ := c.Transform(dst[nSpan:], []byte(src[nSpan:]), true)
+ got := string(dst[:nSpan+nTransform])
+ if got != want {
+ t.Errorf("full string: got %q; want %q", got, want)
+ }
+ })
+ }
+}
+
+func TestHandover(t *testing.T) {
+ testCases := []struct {
+ desc string
+ t Caser
+ first, second string
+ }{{
+ "title/nosigma/single midword",
+ Title(language.Und, HandleFinalSigma(false)),
+ "A.", "a",
+ }, {
+ "title/nosigma/single midword",
+ Title(language.Und, HandleFinalSigma(false)),
+ "A", ".a",
+ }, {
+ "title/nosigma/double midword",
+ Title(language.Und, HandleFinalSigma(false)),
+ "A..", "a",
+ }, {
+ "title/nosigma/double midword",
+ Title(language.Und, HandleFinalSigma(false)),
+ "A.", ".a",
+ }, {
+ "title/nosigma/double midword",
+ Title(language.Und, HandleFinalSigma(false)),
+ "A", "..a",
+ }, {
+ "title/sigma/single midword",
+ Title(language.Und),
+ "ΟΣ.", "a",
+ }, {
+ "title/sigma/single midword",
+ Title(language.Und),
+ "ΟΣ", ".a",
+ }, {
+ "title/sigma/double midword",
+ Title(language.Und),
+ "ΟΣ..", "a",
+ }, {
+ "title/sigma/double midword",
+ Title(language.Und),
+ "ΟΣ.", ".a",
+ }, {
+ "title/sigma/double midword",
+ Title(language.Und),
+ "ΟΣ", "..a",
+ }, {
+ "title/af/leading apostrophe",
+ Title(language.Afrikaans),
+ "'", "n bietje",
+ }}
+ for _, tc := range testCases {
+ testtext.Run(t, tc.desc, func(t *testing.T) {
+ src := tc.first + tc.second
+ want := tc.t.String(src)
+ tc.t.Reset()
+ n, _ := tc.t.Span([]byte(tc.first), false)
+
+ dst := make([]byte, len(want))
+ copy(dst, tc.first[:n])
+
+ nDst, _, _ := tc.t.Transform(dst[n:], []byte(src[n:]), true)
+ got := string(dst[:n+nDst])
+ if got != want {
+ t.Errorf("got %q; want %q", got, want)
+ }
+ })
+ }
+}
+
+// minBufSize is the size of the buffer by which the casing operation in
+// this package are guaranteed to make progress.
+const minBufSize = norm.MaxSegmentSize
+
+type bufferTest struct {
+ desc, src, want string
+ firstErr error
+ dstSize, srcSize int
+ t transform.SpanningTransformer
+}
+
+var bufferTests []bufferTest
+
+func init() {
+ bufferTests = []bufferTest{{
+ desc: "und/upper/short dst",
+ src: "abcdefg",
+ want: "ABCDEFG",
+ firstErr: transform.ErrShortDst,
+ dstSize: 3,
+ srcSize: minBufSize,
+ t: Upper(language.Und),
+ }, {
+ desc: "und/upper/short src",
+ src: "123é56",
+ want: "123É56",
+ firstErr: transform.ErrShortSrc,
+ dstSize: 4,
+ srcSize: 4,
+ t: Upper(language.Und),
+ }, {
+ desc: "und/upper/no error on short",
+ src: "12",
+ want: "12",
+ firstErr: nil,
+ dstSize: 1,
+ srcSize: 1,
+ t: Upper(language.Und),
+ }, {
+ desc: "und/lower/short dst",
+ src: "ABCDEFG",
+ want: "abcdefg",
+ firstErr: transform.ErrShortDst,
+ dstSize: 3,
+ srcSize: minBufSize,
+ t: Lower(language.Und),
+ }, {
+ desc: "und/lower/short src",
+ src: "123É56",
+ want: "123é56",
+ firstErr: transform.ErrShortSrc,
+ dstSize: 4,
+ srcSize: 4,
+ t: Lower(language.Und),
+ }, {
+ desc: "und/lower/no error on short",
+ src: "12",
+ want: "12",
+ firstErr: nil,
+ dstSize: 1,
+ srcSize: 1,
+ t: Lower(language.Und),
+ }, {
+ desc: "und/lower/simple (no final sigma)",
+ src: "ΟΣ ΟΣΣ",
+ want: "οσ οσσ",
+ dstSize: minBufSize,
+ srcSize: minBufSize,
+ t: Lower(language.Und, HandleFinalSigma(false)),
+ }, {
+ desc: "und/title/simple (no final sigma)",
+ src: "ΟΣ ΟΣΣ",
+ want: "Οσ Οσσ",
+ dstSize: minBufSize,
+ srcSize: minBufSize,
+ t: Title(language.Und, HandleFinalSigma(false)),
+ }, {
+ desc: "und/title/final sigma: no error",
+ src: "ΟΣ",
+ want: "Ος",
+ dstSize: minBufSize,
+ srcSize: minBufSize,
+ t: Title(language.Und),
+ }, {
+ desc: "und/title/final sigma: short source",
+ src: "ΟΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣ",
+ want: "Οσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσς",
+ firstErr: transform.ErrShortSrc,
+ dstSize: minBufSize,
+ srcSize: 10,
+ t: Title(language.Und),
+ }, {
+ desc: "und/title/final sigma: short destination 1",
+ src: "ΟΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣ",
+ want: "Οσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσς",
+ firstErr: transform.ErrShortDst,
+ dstSize: 10,
+ srcSize: minBufSize,
+ t: Title(language.Und),
+ }, {
+ desc: "und/title/final sigma: short destination 2",
+ src: "ΟΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣ",
+ want: "Οσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσς",
+ firstErr: transform.ErrShortDst,
+ dstSize: 9,
+ srcSize: minBufSize,
+ t: Title(language.Und),
+ }, {
+ desc: "und/title/final sigma: short destination 3",
+ src: "ΟΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣ",
+ want: "Οσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσς",
+ firstErr: transform.ErrShortDst,
+ dstSize: 8,
+ srcSize: minBufSize,
+ t: Title(language.Und),
+ }, {
+ desc: "und/title/clipped UTF-8 rune",
+ src: "σσσσσσσσσσσ",
+ want: "Σσσσσσσσσσσ",
+ firstErr: transform.ErrShortSrc,
+ dstSize: minBufSize,
+ srcSize: 5,
+ t: Title(language.Und),
+ }, {
+ desc: "und/title/clipped UTF-8 rune atEOF",
+ src: "σσσ" + string([]byte{0xCF}),
+ want: "Σσσ" + string([]byte{0xCF}),
+ dstSize: minBufSize,
+ srcSize: minBufSize,
+ t: Title(language.Und),
+ }, {
+ // Note: the choice to change the final sigma at the end in case of
+ // too many case ignorables is arbitrary. The main reason for this
+ // choice is that it results in simpler code.
+ desc: "und/title/final sigma: max ignorables",
+ src: "ΟΣ" + strings.Repeat(".", maxIgnorable) + "a",
+ want: "Οσ" + strings.Repeat(".", maxIgnorable) + "A",
+ dstSize: minBufSize,
+ srcSize: minBufSize,
+ t: Title(language.Und),
+ }, {
+ // Note: the choice to change the final sigma at the end in case of
+ // too many case ignorables is arbitrary. The main reason for this
+ // choice is that it results in simpler code.
+ desc: "und/title/long string",
+ src: "AA" + strings.Repeat(".", maxIgnorable+1) + "a",
+ want: "Aa" + strings.Repeat(".", maxIgnorable+1) + "A",
+ dstSize: minBufSize,
+ srcSize: len("AA" + strings.Repeat(".", maxIgnorable+1)),
+ t: Title(language.Und),
+ }, {
+ // Note: the choice to change the final sigma at the end in case of
+ // too many case ignorables is arbitrary. The main reason for this
+ // choice is that it results in simpler code.
+ desc: "und/title/final sigma: too many ignorables",
+ src: "ΟΣ" + strings.Repeat(".", maxIgnorable+1) + "a",
+ want: "Ος" + strings.Repeat(".", maxIgnorable+1) + "A",
+ dstSize: minBufSize,
+ srcSize: len("ΟΣ" + strings.Repeat(".", maxIgnorable+1)),
+ t: Title(language.Und),
+ }, {
+ desc: "und/title/final sigma: apostrophe",
+ src: "ΟΣ''a",
+ want: "Οσ''A",
+ dstSize: minBufSize,
+ srcSize: minBufSize,
+ t: Title(language.Und),
+ }, {
+ desc: "el/upper/max ignorables",
+ src: "ο" + strings.Repeat("\u0321", maxIgnorable-1) + "\u0313",
+ want: "Ο" + strings.Repeat("\u0321", maxIgnorable-1),
+ dstSize: minBufSize,
+ srcSize: minBufSize,
+ t: Upper(language.Greek),
+ }, {
+ desc: "el/upper/too many ignorables",
+ src: "ο" + strings.Repeat("\u0321", maxIgnorable) + "\u0313",
+ want: "Ο" + strings.Repeat("\u0321", maxIgnorable) + "\u0313",
+ dstSize: minBufSize,
+ srcSize: len("ο" + strings.Repeat("\u0321", maxIgnorable)),
+ t: Upper(language.Greek),
+ }, {
+ desc: "el/upper/short dst",
+ src: "123ο",
+ want: "123Ο",
+ firstErr: transform.ErrShortDst,
+ dstSize: 3,
+ srcSize: minBufSize,
+ t: Upper(language.Greek),
+ }, {
+ desc: "lt/lower/max ignorables",
+ src: "I" + strings.Repeat("\u0321", maxIgnorable-1) + "\u0300",
+ want: "i" + strings.Repeat("\u0321", maxIgnorable-1) + "\u0307\u0300",
+ dstSize: minBufSize,
+ srcSize: minBufSize,
+ t: Lower(language.Lithuanian),
+ }, {
+ desc: "lt/lower/too many ignorables",
+ src: "I" + strings.Repeat("\u0321", maxIgnorable) + "\u0300",
+ want: "i" + strings.Repeat("\u0321", maxIgnorable) + "\u0300",
+ dstSize: minBufSize,
+ srcSize: len("I" + strings.Repeat("\u0321", maxIgnorable)),
+ t: Lower(language.Lithuanian),
+ }, {
+ desc: "lt/lower/decomposition with short dst buffer 1",
+ src: "aaaaa\u00cc", // U+00CC LATIN CAPITAL LETTER I GRAVE
+ firstErr: transform.ErrShortDst,
+ want: "aaaaai\u0307\u0300",
+ dstSize: 5,
+ srcSize: minBufSize,
+ t: Lower(language.Lithuanian),
+ }, {
+ desc: "lt/lower/decomposition with short dst buffer 2",
+ src: "aaaa\u00cc", // U+00CC LATIN CAPITAL LETTER I GRAVE
+ firstErr: transform.ErrShortDst,
+ want: "aaaai\u0307\u0300",
+ dstSize: 5,
+ srcSize: minBufSize,
+ t: Lower(language.Lithuanian),
+ }, {
+ desc: "lt/upper/max ignorables",
+ src: "i" + strings.Repeat("\u0321", maxIgnorable-1) + "\u0307\u0300",
+ want: "I" + strings.Repeat("\u0321", maxIgnorable-1) + "\u0300",
+ dstSize: minBufSize,
+ srcSize: minBufSize,
+ t: Upper(language.Lithuanian),
+ }, {
+ desc: "lt/upper/too many ignorables",
+ src: "i" + strings.Repeat("\u0321", maxIgnorable) + "\u0307\u0300",
+ want: "I" + strings.Repeat("\u0321", maxIgnorable) + "\u0307\u0300",
+ dstSize: minBufSize,
+ srcSize: len("i" + strings.Repeat("\u0321", maxIgnorable)),
+ t: Upper(language.Lithuanian),
+ }, {
+ desc: "lt/upper/short dst",
+ src: "12i\u0307\u0300",
+ want: "12\u00cc",
+ firstErr: transform.ErrShortDst,
+ dstSize: 3,
+ srcSize: minBufSize,
+ t: Upper(language.Lithuanian),
+ }, {
+ desc: "aztr/lower/max ignorables",
+ src: "I" + strings.Repeat("\u0321", maxIgnorable-1) + "\u0307\u0300",
+ want: "i" + strings.Repeat("\u0321", maxIgnorable-1) + "\u0300",
+ dstSize: minBufSize,
+ srcSize: minBufSize,
+ t: Lower(language.Turkish),
+ }, {
+ desc: "aztr/lower/too many ignorables",
+ src: "I" + strings.Repeat("\u0321", maxIgnorable) + "\u0307\u0300",
+ want: "\u0131" + strings.Repeat("\u0321", maxIgnorable) + "\u0307\u0300",
+ dstSize: minBufSize,
+ srcSize: len("I" + strings.Repeat("\u0321", maxIgnorable)),
+ t: Lower(language.Turkish),
+ }, {
+ desc: "nl/title/pre-IJ cutoff",
+ src: " ij",
+ want: " IJ",
+ firstErr: transform.ErrShortDst,
+ dstSize: 2,
+ srcSize: minBufSize,
+ t: Title(language.Dutch),
+ }, {
+ desc: "nl/title/mid-IJ cutoff",
+ src: " ij",
+ want: " IJ",
+ firstErr: transform.ErrShortDst,
+ dstSize: 3,
+ srcSize: minBufSize,
+ t: Title(language.Dutch),
+ }, {
+ desc: "af/title/apostrophe",
+ src: "'n bietje",
+ want: "'n Bietje",
+ firstErr: transform.ErrShortDst,
+ dstSize: 3,
+ srcSize: minBufSize,
+ t: Title(language.Afrikaans),
+ }}
+}
+
+func TestShortBuffersAndOverflow(t *testing.T) {
+ for i, tt := range bufferTests {
+ testtext.Run(t, tt.desc, func(t *testing.T) {
+ buf := make([]byte, tt.dstSize)
+ got := []byte{}
+ var nSrc, nDst int
+ var err error
+ for p := 0; p < len(tt.src); p += nSrc {
+ q := p + tt.srcSize
+ if q > len(tt.src) {
+ q = len(tt.src)
+ }
+ nDst, nSrc, err = tt.t.Transform(buf, []byte(tt.src[p:q]), q == len(tt.src))
+ got = append(got, buf[:nDst]...)
+
+ if p == 0 && err != tt.firstErr {
+ t.Errorf("%d:%s:\n error was %v; want %v", i, tt.desc, err, tt.firstErr)
+ break
+ }
+ }
+ if string(got) != tt.want {
+ t.Errorf("%d:%s:\ngot %+q;\nwant %+q", i, tt.desc, got, tt.want)
+ }
+ testHandover(t, Caser{tt.t}, tt.src)
+ })
+ }
+}
+
+func TestSpan(t *testing.T) {
+ for _, tt := range []struct {
+ desc string
+ src string
+ want string
+ atEOF bool
+ err error
+ t Caser
+ }{{
+ desc: "und/upper/basic",
+ src: "abcdefg",
+ want: "",
+ atEOF: true,
+ err: transform.ErrEndOfSpan,
+ t: Upper(language.Und),
+ }, {
+ desc: "und/upper/short src",
+ src: "123É"[:4],
+ want: "123",
+ atEOF: false,
+ err: transform.ErrShortSrc,
+ t: Upper(language.Und),
+ }, {
+ desc: "und/upper/no error on short",
+ src: "12",
+ want: "12",
+ atEOF: false,
+ t: Upper(language.Und),
+ }, {
+ desc: "und/lower/basic",
+ src: "ABCDEFG",
+ want: "",
+ atEOF: true,
+ err: transform.ErrEndOfSpan,
+ t: Lower(language.Und),
+ }, {
+ desc: "und/lower/short src num",
+ src: "123é"[:4],
+ want: "123",
+ atEOF: false,
+ err: transform.ErrShortSrc,
+ t: Lower(language.Und),
+ }, {
+ desc: "und/lower/short src greek",
+ src: "αβγé"[:7],
+ want: "αβγ",
+ atEOF: false,
+ err: transform.ErrShortSrc,
+ t: Lower(language.Und),
+ }, {
+ desc: "und/lower/no error on short",
+ src: "12",
+ want: "12",
+ atEOF: false,
+ t: Lower(language.Und),
+ }, {
+ desc: "und/lower/simple (no final sigma)",
+ src: "ος οσσ",
+ want: "οσ οσσ",
+ atEOF: true,
+ t: Lower(language.Und, HandleFinalSigma(false)),
+ }, {
+ desc: "und/title/simple (no final sigma)",
+ src: "Οσ Οσσ",
+ want: "Οσ Οσσ",
+ atEOF: true,
+ t: Title(language.Und, HandleFinalSigma(false)),
+ }, {
+ desc: "und/lower/final sigma: no error",
+ src: "οΣ", // Oς
+ want: "ο", // Oς
+ err: transform.ErrEndOfSpan,
+ t: Lower(language.Und),
+ }, {
+ desc: "und/title/final sigma: no error",
+ src: "ΟΣ", // Oς
+ want: "Ο", // Oς
+ err: transform.ErrEndOfSpan,
+ t: Title(language.Und),
+ }, {
+ desc: "und/title/final sigma: no short source!",
+ src: "ΟσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσΣ",
+ want: "Οσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσ",
+ err: transform.ErrEndOfSpan,
+ t: Title(language.Und),
+ }, {
+ desc: "und/title/clipped UTF-8 rune",
+ src: "Σσ" + string([]byte{0xCF}),
+ want: "Σσ",
+ atEOF: false,
+ err: transform.ErrShortSrc,
+ t: Title(language.Und),
+ }, {
+ desc: "und/title/clipped UTF-8 rune atEOF",
+ src: "Σσσ" + string([]byte{0xCF}),
+ want: "Σσσ" + string([]byte{0xCF}),
+ atEOF: true,
+ t: Title(language.Und),
+ }, {
+ // Note: the choice to change the final sigma at the end in case of
+ // too many case ignorables is arbitrary. The main reason for this
+ // choice is that it results in simpler code.
+ desc: "und/title/long string",
+ src: "A" + strings.Repeat("a", maxIgnorable+5),
+ want: "A" + strings.Repeat("a", maxIgnorable+5),
+ t: Title(language.Und),
+ }, {
+ // Note: the choice to change the final sigma at the end in case of
+ // too many case ignorables is arbitrary. The main reason for this
+ // choice is that it results in simpler code.
+ desc: "und/title/cyrillic",
+ src: "При",
+ want: "При",
+ atEOF: true,
+ t: Title(language.Und, HandleFinalSigma(false)),
+ }, {
+ // Note: the choice to change the final sigma at the end in case of
+ // too many case ignorables is arbitrary. The main reason for this
+ // choice is that it results in simpler code.
+ desc: "und/title/final sigma: max ignorables",
+ src: "Οσ" + strings.Repeat(".", maxIgnorable) + "A",
+ want: "Οσ" + strings.Repeat(".", maxIgnorable) + "A",
+ t: Title(language.Und),
+ }, {
+ desc: "el/upper/max ignorables - not implemented",
+ src: "Ο" + strings.Repeat("\u0321", maxIgnorable-1) + "\u0313",
+ want: "",
+ err: transform.ErrEndOfSpan,
+ t: Upper(language.Greek),
+ }, {
+ desc: "el/upper/too many ignorables - not implemented",
+ src: "Ο" + strings.Repeat("\u0321", maxIgnorable) + "\u0313",
+ want: "",
+ err: transform.ErrEndOfSpan,
+ t: Upper(language.Greek),
+ }, {
+ desc: "el/upper/short dst",
+ src: "123ο",
+ want: "",
+ err: transform.ErrEndOfSpan,
+ t: Upper(language.Greek),
+ }, {
+ desc: "lt/lower/max ignorables",
+ src: "i" + strings.Repeat("\u0321", maxIgnorable-1) + "\u0307\u0300",
+ want: "i" + strings.Repeat("\u0321", maxIgnorable-1) + "\u0307\u0300",
+ t: Lower(language.Lithuanian),
+ }, {
+ desc: "lt/lower/isLower",
+ src: "I" + strings.Repeat("\u0321", maxIgnorable) + "\u0300",
+ want: "",
+ err: transform.ErrEndOfSpan,
+ t: Lower(language.Lithuanian),
+ }, {
+ desc: "lt/lower/not identical",
+ src: "aaaaa\u00cc", // U+00CC LATIN CAPITAL LETTER I GRAVE
+ err: transform.ErrEndOfSpan,
+ want: "aaaaa",
+ t: Lower(language.Lithuanian),
+ }, {
+ desc: "lt/lower/identical",
+ src: "aaaai\u0307\u0300", // U+00CC LATIN CAPITAL LETTER I GRAVE
+ want: "aaaai\u0307\u0300",
+ t: Lower(language.Lithuanian),
+ }, {
+ desc: "lt/upper/not implemented",
+ src: "I" + strings.Repeat("\u0321", maxIgnorable-1) + "\u0300",
+ want: "",
+ err: transform.ErrEndOfSpan,
+ t: Upper(language.Lithuanian),
+ }, {
+ desc: "lt/upper/not implemented, ascii",
+ src: "AB",
+ want: "",
+ err: transform.ErrEndOfSpan,
+ t: Upper(language.Lithuanian),
+ }, {
+ desc: "nl/title/pre-IJ cutoff",
+ src: " IJ",
+ want: " IJ",
+ t: Title(language.Dutch),
+ }, {
+ desc: "nl/title/mid-IJ cutoff",
+ src: " Ia",
+ want: " Ia",
+ t: Title(language.Dutch),
+ }, {
+ desc: "af/title/apostrophe",
+ src: "'n Bietje",
+ want: "'n Bietje",
+ t: Title(language.Afrikaans),
+ }, {
+ desc: "af/title/apostrophe-incorrect",
+ src: "'N Bietje",
+ // The Single_Quote (a MidWord), needs to be retained as unspanned so
+ // that a successive call to Transform can detect that N should not be
+ // capitalized.
+ want: "",
+ err: transform.ErrEndOfSpan,
+ t: Title(language.Afrikaans),
+ }} {
+ testtext.Run(t, tt.desc, func(t *testing.T) {
+ for p := 0; p < len(tt.want); p += utf8.RuneLen([]rune(tt.src[p:])[0]) {
+ tt.t.Reset()
+ n, err := tt.t.Span([]byte(tt.src[:p]), false)
+ if err != nil && err != transform.ErrShortSrc {
+ t.Errorf("early failure:Span(%+q): %v (%d < %d)", tt.src[:p], err, n, len(tt.want))
+ break
+ }
+ }
+ tt.t.Reset()
+ n, err := tt.t.Span([]byte(tt.src), tt.atEOF)
+ if n != len(tt.want) || err != tt.err {
+ t.Errorf("Span(%+q, %v): got %d, %v; want %d, %v", tt.src, tt.atEOF, n, err, len(tt.want), tt.err)
+ }
+ testHandover(t, tt.t, tt.src)
+ })
+ }
+}
+
+var txtASCII = strings.Repeat("The quick brown fox jumps over the lazy dog. ", 50)
+
+// Taken from http://creativecommons.org/licenses/by-sa/3.0/vn/
+const txt_vn = `Với các điều kiện sau: Ghi nhận công của tác giả. Nếu bạn sử
+dụng, chuyển đổi, hoặc xây dựng dự án từ nội dung được chia sẻ này, bạn phải áp
+dụng giấy phép này hoặc một giấy phép khác có các điều khoản tương tự như giấy
+phép này cho dự án của bạn. Hiểu rằng: Miễn — Bất kỳ các điều kiện nào trên đây
+cũng có thể được miễn bỏ nếu bạn được sự cho phép của người sở hữu bản quyền.
+Phạm vi công chúng — Khi tác phẩm hoặc bất kỳ chương nào của tác phẩm đã trong
+vùng dành cho công chúng theo quy định của pháp luật thì tình trạng của nó không
+bị ảnh hưởng bởi giấy phép trong bất kỳ trường hợp nào.`
+
+// http://creativecommons.org/licenses/by-sa/2.5/cn/
+const txt_cn = `您可以自由: 复制、发行、展览、表演、放映、
+广播或通过信息网络传播本作品 创作演绎作品
+对本作品进行商业性使用 惟须遵守下列条件:
+署名 — 您必须按照作者或者许可人指定的方式对作品进行署名。
+相同方式共享 — 如果您改变、转换本作品或者以本作品为基础进行创作,
+您只能采用与本协议相同的许可协议发布基于本作品的演绎作品。`
+
+// Taken from http://creativecommons.org/licenses/by-sa/1.0/deed.ru
+const txt_ru = `При обязательном соблюдении следующих условий: Attribution — Вы
+должны атрибутировать произведение (указывать автора и источник) в порядке,
+предусмотренном автором или лицензиаром (но только так, чтобы никоим образом не
+подразумевалось, что они поддерживают вас или использование вами данного
+произведения). Υπό τις ακόλουθες προϋποθέσεις:`
+
+// Taken from http://creativecommons.org/licenses/by-sa/3.0/gr/
+const txt_gr = `Αναφορά Δημιουργού — Θα πρέπει να κάνετε την αναφορά στο έργο με
+τον τρόπο που έχει οριστεί από το δημιουργό ή το χορηγούντο την άδεια (χωρίς
+όμως να εννοείται με οποιονδήποτε τρόπο ότι εγκρίνουν εσάς ή τη χρήση του έργου
+από εσάς). Παρόμοια Διανομή — Εάν αλλοιώσετε, τροποποιήσετε ή δημιουργήσετε
+περαιτέρω βασισμένοι στο έργο θα μπορείτε να διανέμετε το έργο που θα προκύψει
+μόνο με την ίδια ή παρόμοια άδεια.`
+
+const txtNonASCII = txt_vn + txt_cn + txt_ru + txt_gr
+
+// TODO: Improve ASCII performance.
+
+func BenchmarkCasers(b *testing.B) {
+ for _, s := range []struct{ name, text string }{
+ {"ascii", txtASCII},
+ {"nonASCII", txtNonASCII},
+ {"short", "При"},
+ } {
+ src := []byte(s.text)
+ // Measure case mappings in bytes package for comparison.
+ for _, f := range []struct {
+ name string
+ fn func(b []byte) []byte
+ }{
+ {"lower", bytes.ToLower},
+ {"title", bytes.ToTitle},
+ {"upper", bytes.ToUpper},
+ } {
+ testtext.Bench(b, path.Join(s.name, "bytes", f.name), func(b *testing.B) {
+ b.SetBytes(int64(len(src)))
+ for i := 0; i < b.N; i++ {
+ f.fn(src)
+ }
+ })
+ }
+ for _, t := range []struct {
+ name string
+ caser transform.SpanningTransformer
+ }{
+ {"fold/default", Fold()},
+ {"upper/default", Upper(language.Und)},
+ {"lower/sigma", Lower(language.Und)},
+ {"lower/simple", Lower(language.Und, HandleFinalSigma(false))},
+ {"title/sigma", Title(language.Und)},
+ {"title/simple", Title(language.Und, HandleFinalSigma(false))},
+ } {
+ c := Caser{t.caser}
+ dst := make([]byte, len(src))
+ testtext.Bench(b, path.Join(s.name, t.name, "transform"), func(b *testing.B) {
+ b.SetBytes(int64(len(src)))
+ for i := 0; i < b.N; i++ {
+ c.Reset()
+ c.Transform(dst, src, true)
+ }
+ })
+ // No need to check span for simple cases, as they will be the same
+ // as sigma.
+ if strings.HasSuffix(t.name, "/simple") {
+ continue
+ }
+ spanSrc := c.Bytes(src)
+ testtext.Bench(b, path.Join(s.name, t.name, "span"), func(b *testing.B) {
+ c.Reset()
+ if n, _ := c.Span(spanSrc, true); n < len(spanSrc) {
+ b.Fatalf("spanner is not recognizing text %q as done (at %d)", spanSrc, n)
+ }
+ b.SetBytes(int64(len(spanSrc)))
+ for i := 0; i < b.N; i++ {
+ c.Reset()
+ c.Span(spanSrc, true)
+ }
+ })
+ }
+ }
+}
diff --git a/vendor/golang.org/x/text/cases/tables.go b/vendor/golang.org/x/text/cases/tables.go
new file mode 100644
index 0000000..cf73781
--- /dev/null
+++ b/vendor/golang.org/x/text/cases/tables.go
@@ -0,0 +1,2251 @@
+// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
+
+package cases
+
+// UnicodeVersion is the Unicode version from which the tables in this package are derived.
+const UnicodeVersion = "10.0.0"
+
+var xorData string = "" + // Size: 185 bytes
+ "\x00\x06\x07\x00\x01?\x00\x0f\x03\x00\x0f\x12\x00\x0f\x1f\x00\x0f\x1d" +
+ "\x00\x01\x13\x00\x0f\x16\x00\x0f\x0b\x00\x0f3\x00\x0f7\x00\x01#\x00\x0f?" +
+ "\x00\x0e'\x00\x0f/\x00\x0e>\x00\x0f*\x00\x0c&\x00\x0c*\x00\x0c;\x00\x0c9" +
+ "\x00\x0c%\x00\x01\x08\x00\x03\x0d\x00\x03\x09\x00\x02\x06\x00\x02\x02" +
+ "\x00\x02\x0c\x00\x01\x00\x00\x01\x03\x00\x01\x01\x00\x01 \x00\x01\x0c" +
+ "\x00\x01\x10\x00\x03\x10\x00\x036 \x00\x037 \x00\x0b#\x10\x00\x0b 0\x00" +
+ "\x0b!\x10\x00\x0b!0\x00\x0b(\x04\x00\x03\x04\x1e\x00\x03\x0a\x00\x02:" +
+ "\x00\x02>\x00\x02,\x00\x02\x00\x00\x02\x10\x00\x01<\x00\x01&\x00\x01*" +
+ "\x00\x01.\x00\x010\x003 \x00\x01\x18\x00\x01(\x00\x01\x1e\x00\x01\x22"
+
+var exceptions string = "" + // Size: 1852 bytes
+ "\x00\x12\x10μΜ\x12\x12ssSSSs\x13\x18i̇i̇\x10\x08I\x13\x18ʼnʼN\x11\x08sS" +
+ "\x12\x12dždžDž\x12\x12dždžDŽ\x10\x12DŽDž\x12\x12ljljLj\x12\x12ljljLJ\x10\x12LJLj\x12\x12" +
+ "njnjNj\x12\x12njnjNJ\x10\x12NJNj\x13\x18ǰJ̌\x12\x12dzdzDz\x12\x12dzdzDZ\x10\x12DZDz" +
+ "\x13\x18ⱥⱥ\x13\x18ⱦⱦ\x10\x18Ȿ\x10\x18Ɀ\x10\x18Ɐ\x10\x18Ɑ\x10\x18Ɒ\x10" +
+ "\x18Ɜ\x10\x18Ɡ\x10\x18Ɥ\x10\x18Ɦ\x10\x18Ɪ\x10\x18Ɫ\x10\x18Ɬ\x10\x18Ɱ\x10" +
+ "\x18Ɽ\x10\x18Ʇ\x10\x18Ʝ\x10\x18Ʞ2\x10ιΙ\x160ΐΪ́\x160ΰΫ́\x12\x10σΣ" +
+ "\x12\x10βΒ\x12\x10θΘ\x12\x10φΦ\x12\x10πΠ\x12\x10κΚ\x12\x10ρΡ\x12\x10εΕ" +
+ "\x14$եւԵՒԵւ\x12\x10вВ\x12\x10дД\x12\x10оО\x12\x10сС\x12\x10тТ\x12\x10тТ" +
+ "\x12\x10ъЪ\x12\x10ѣѢ\x13\x18ꙋꙊ\x13\x18ẖH̱\x13\x18ẗT̈\x13\x18ẘW̊\x13" +
+ "\x18ẙY̊\x13\x18aʾAʾ\x13\x18ṡṠ\x12\x10ssß\x14 ὐΥ̓\x160ὒΥ̓̀\x160ὔΥ̓́" +
+ "\x160ὖΥ̓͂\x15+ἀιἈΙᾈ\x15+ἁιἉΙᾉ\x15+ἂιἊΙᾊ\x15+ἃιἋΙᾋ\x15+ἄιἌΙᾌ\x15+ἅιἍΙᾍ" +
+ "\x15+ἆιἎΙᾎ\x15+ἇιἏΙᾏ\x15\x1dἀιᾀἈΙ\x15\x1dἁιᾁἉΙ\x15\x1dἂιᾂἊΙ\x15\x1dἃιᾃἋΙ" +
+ "\x15\x1dἄιᾄἌΙ\x15\x1dἅιᾅἍΙ\x15\x1dἆιᾆἎΙ\x15\x1dἇιᾇἏΙ\x15+ἠιἨΙᾘ\x15+ἡιἩΙᾙ" +
+ "\x15+ἢιἪΙᾚ\x15+ἣιἫΙᾛ\x15+ἤιἬΙᾜ\x15+ἥιἭΙᾝ\x15+ἦιἮΙᾞ\x15+ἧιἯΙᾟ\x15\x1dἠιᾐἨ" +
+ "Ι\x15\x1dἡιᾑἩΙ\x15\x1dἢιᾒἪΙ\x15\x1dἣιᾓἫΙ\x15\x1dἤιᾔἬΙ\x15\x1dἥιᾕἭΙ\x15" +
+ "\x1dἦιᾖἮΙ\x15\x1dἧιᾗἯΙ\x15+ὠιὨΙᾨ\x15+ὡιὩΙᾩ\x15+ὢιὪΙᾪ\x15+ὣιὫΙᾫ\x15+ὤιὬΙᾬ" +
+ "\x15+ὥιὭΙᾭ\x15+ὦιὮΙᾮ\x15+ὧιὯΙᾯ\x15\x1dὠιᾠὨΙ\x15\x1dὡιᾡὩΙ\x15\x1dὢιᾢὪΙ" +
+ "\x15\x1dὣιᾣὫΙ\x15\x1dὤιᾤὬΙ\x15\x1dὥιᾥὭΙ\x15\x1dὦιᾦὮΙ\x15\x1dὧιᾧὯΙ\x15-ὰι" +
+ "ᾺΙᾺͅ\x14#αιΑΙᾼ\x14$άιΆΙΆͅ\x14 ᾶΑ͂\x166ᾶιΑ͂Ιᾼ͂\x14\x1cαιᾳΑΙ\x12\x10ι" +
+ "Ι\x15-ὴιῊΙῊͅ\x14#ηιΗΙῌ\x14$ήιΉΙΉͅ\x14 ῆΗ͂\x166ῆιΗ͂Ιῌ͂\x14\x1cηιῃΗΙ" +
+ "\x160ῒΪ̀\x160ΐΪ́\x14 ῖΙ͂\x160ῗΪ͂\x160ῢΫ̀\x160ΰΫ́\x14 ῤΡ" +
+ "̓\x14 ῦΥ͂\x160ῧΫ͂\x15-ὼιῺΙῺͅ\x14#ωιΩΙῼ\x14$ώιΏΙΏͅ\x14 ῶΩ͂\x166ῶιΩ" +
+ "͂Ιῼ͂\x14\x1cωιῳΩΙ\x12\x10ωω\x11\x08kk\x12\x10åå\x12\x10ɫɫ\x12\x10ɽɽ" +
+ "\x10\x10Ⱥ\x10\x10Ⱦ\x12\x10ɑɑ\x12\x10ɱɱ\x12\x10ɐɐ\x12\x10ɒɒ\x12\x10ȿȿ\x12" +
+ "\x10ɀɀ\x12\x10ɥɥ\x12\x10ɦɦ\x12\x10ɜɜ\x12\x10ɡɡ\x12\x10ɬɬ\x12\x10ɪɪ\x12" +
+ "\x10ʞʞ\x12\x10ʇʇ\x12\x10ʝʝ\x12\x12ffFFFf\x12\x12fiFIFi\x12\x12flFLFl\x13" +
+ "\x1bffiFFIFfi\x13\x1bfflFFLFfl\x12\x12stSTSt\x12\x12stSTSt\x14$մնՄՆՄն" +
+ "\x14$մեՄԵՄե\x14$միՄԻՄի\x14$վնՎՆՎն\x14$մխՄԽՄխ"
+
+// lookup returns the trie value for the first UTF-8 encoding in s and
+// the width in bytes of this encoding. The size will be 0 if s does not
+// hold enough bytes to complete the encoding. len(s) must be greater than 0.
+func (t *caseTrie) lookup(s []byte) (v uint16, sz int) {
+ c0 := s[0]
+ switch {
+ case c0 < 0x80: // is ASCII
+ return caseValues[c0], 1
+ case c0 < 0xC2:
+ return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
+ case c0 < 0xE0: // 2-byte UTF-8
+ if len(s) < 2 {
+ return 0, 0
+ }
+ i := caseIndex[c0]
+ c1 := s[1]
+ if c1 < 0x80 || 0xC0 <= c1 {
+ return 0, 1 // Illegal UTF-8: not a continuation byte.
+ }
+ return t.lookupValue(uint32(i), c1), 2
+ case c0 < 0xF0: // 3-byte UTF-8
+ if len(s) < 3 {
+ return 0, 0
+ }
+ i := caseIndex[c0]
+ c1 := s[1]
+ if c1 < 0x80 || 0xC0 <= c1 {
+ return 0, 1 // Illegal UTF-8: not a continuation byte.
+ }
+ o := uint32(i)<<6 + uint32(c1)
+ i = caseIndex[o]
+ c2 := s[2]
+ if c2 < 0x80 || 0xC0 <= c2 {
+ return 0, 2 // Illegal UTF-8: not a continuation byte.
+ }
+ return t.lookupValue(uint32(i), c2), 3
+ case c0 < 0xF8: // 4-byte UTF-8
+ if len(s) < 4 {
+ return 0, 0
+ }
+ i := caseIndex[c0]
+ c1 := s[1]
+ if c1 < 0x80 || 0xC0 <= c1 {
+ return 0, 1 // Illegal UTF-8: not a continuation byte.
+ }
+ o := uint32(i)<<6 + uint32(c1)
+ i = caseIndex[o]
+ c2 := s[2]
+ if c2 < 0x80 || 0xC0 <= c2 {
+ return 0, 2 // Illegal UTF-8: not a continuation byte.
+ }
+ o = uint32(i)<<6 + uint32(c2)
+ i = caseIndex[o]
+ c3 := s[3]
+ if c3 < 0x80 || 0xC0 <= c3 {
+ return 0, 3 // Illegal UTF-8: not a continuation byte.
+ }
+ return t.lookupValue(uint32(i), c3), 4
+ }
+ // Illegal rune
+ return 0, 1
+}
+
+// lookupUnsafe returns the trie value for the first UTF-8 encoding in s.
+// s must start with a full and valid UTF-8 encoded rune.
+func (t *caseTrie) lookupUnsafe(s []byte) uint16 {
+ c0 := s[0]
+ if c0 < 0x80 { // is ASCII
+ return caseValues[c0]
+ }
+ i := caseIndex[c0]
+ if c0 < 0xE0 { // 2-byte UTF-8
+ return t.lookupValue(uint32(i), s[1])
+ }
+ i = caseIndex[uint32(i)<<6+uint32(s[1])]
+ if c0 < 0xF0 { // 3-byte UTF-8
+ return t.lookupValue(uint32(i), s[2])
+ }
+ i = caseIndex[uint32(i)<<6+uint32(s[2])]
+ if c0 < 0xF8 { // 4-byte UTF-8
+ return t.lookupValue(uint32(i), s[3])
+ }
+ return 0
+}
+
+// lookupString returns the trie value for the first UTF-8 encoding in s and
+// the width in bytes of this encoding. The size will be 0 if s does not
+// hold enough bytes to complete the encoding. len(s) must be greater than 0.
+func (t *caseTrie) lookupString(s string) (v uint16, sz int) {
+ c0 := s[0]
+ switch {
+ case c0 < 0x80: // is ASCII
+ return caseValues[c0], 1
+ case c0 < 0xC2:
+ return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
+ case c0 < 0xE0: // 2-byte UTF-8
+ if len(s) < 2 {
+ return 0, 0
+ }
+ i := caseIndex[c0]
+ c1 := s[1]
+ if c1 < 0x80 || 0xC0 <= c1 {
+ return 0, 1 // Illegal UTF-8: not a continuation byte.
+ }
+ return t.lookupValue(uint32(i), c1), 2
+ case c0 < 0xF0: // 3-byte UTF-8
+ if len(s) < 3 {
+ return 0, 0
+ }
+ i := caseIndex[c0]
+ c1 := s[1]
+ if c1 < 0x80 || 0xC0 <= c1 {
+ return 0, 1 // Illegal UTF-8: not a continuation byte.
+ }
+ o := uint32(i)<<6 + uint32(c1)
+ i = caseIndex[o]
+ c2 := s[2]
+ if c2 < 0x80 || 0xC0 <= c2 {
+ return 0, 2 // Illegal UTF-8: not a continuation byte.
+ }
+ return t.lookupValue(uint32(i), c2), 3
+ case c0 < 0xF8: // 4-byte UTF-8
+ if len(s) < 4 {
+ return 0, 0
+ }
+ i := caseIndex[c0]
+ c1 := s[1]
+ if c1 < 0x80 || 0xC0 <= c1 {
+ return 0, 1 // Illegal UTF-8: not a continuation byte.
+ }
+ o := uint32(i)<<6 + uint32(c1)
+ i = caseIndex[o]
+ c2 := s[2]
+ if c2 < 0x80 || 0xC0 <= c2 {
+ return 0, 2 // Illegal UTF-8: not a continuation byte.
+ }
+ o = uint32(i)<<6 + uint32(c2)
+ i = caseIndex[o]
+ c3 := s[3]
+ if c3 < 0x80 || 0xC0 <= c3 {
+ return 0, 3 // Illegal UTF-8: not a continuation byte.
+ }
+ return t.lookupValue(uint32(i), c3), 4
+ }
+ // Illegal rune
+ return 0, 1
+}
+
+// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s.
+// s must start with a full and valid UTF-8 encoded rune.
+func (t *caseTrie) lookupStringUnsafe(s string) uint16 {
+ c0 := s[0]
+ if c0 < 0x80 { // is ASCII
+ return caseValues[c0]
+ }
+ i := caseIndex[c0]
+ if c0 < 0xE0 { // 2-byte UTF-8
+ return t.lookupValue(uint32(i), s[1])
+ }
+ i = caseIndex[uint32(i)<<6+uint32(s[1])]
+ if c0 < 0xF0 { // 3-byte UTF-8
+ return t.lookupValue(uint32(i), s[2])
+ }
+ i = caseIndex[uint32(i)<<6+uint32(s[2])]
+ if c0 < 0xF8 { // 4-byte UTF-8
+ return t.lookupValue(uint32(i), s[3])
+ }
+ return 0
+}
+
+// caseTrie. Total size: 11892 bytes (11.61 KiB). Checksum: abd4a0bc39341b30.
+type caseTrie struct{}
+
+func newCaseTrie(i int) *caseTrie {
+ return &caseTrie{}
+}
+
+// lookupValue determines the type of block n and looks up the value for b.
+func (t *caseTrie) lookupValue(n uint32, b byte) uint16 {
+ switch {
+ case n < 18:
+ return uint16(caseValues[n<<6+uint32(b)])
+ default:
+ n -= 18
+ return uint16(sparse.lookup(n, b))
+ }
+}
+
+// caseValues: 20 blocks, 1280 entries, 2560 bytes
+// The third block is the zero block.
+var caseValues = [1280]uint16{
+ // Block 0x0, offset 0x0
+ 0x27: 0x0054,
+ 0x2e: 0x0054,
+ 0x30: 0x0010, 0x31: 0x0010, 0x32: 0x0010, 0x33: 0x0010, 0x34: 0x0010, 0x35: 0x0010,
+ 0x36: 0x0010, 0x37: 0x0010, 0x38: 0x0010, 0x39: 0x0010, 0x3a: 0x0054,
+ // Block 0x1, offset 0x40
+ 0x41: 0x2013, 0x42: 0x2013, 0x43: 0x2013, 0x44: 0x2013, 0x45: 0x2013,
+ 0x46: 0x2013, 0x47: 0x2013, 0x48: 0x2013, 0x49: 0x2013, 0x4a: 0x2013, 0x4b: 0x2013,
+ 0x4c: 0x2013, 0x4d: 0x2013, 0x4e: 0x2013, 0x4f: 0x2013, 0x50: 0x2013, 0x51: 0x2013,
+ 0x52: 0x2013, 0x53: 0x2013, 0x54: 0x2013, 0x55: 0x2013, 0x56: 0x2013, 0x57: 0x2013,
+ 0x58: 0x2013, 0x59: 0x2013, 0x5a: 0x2013,
+ 0x5e: 0x0004, 0x5f: 0x0010, 0x60: 0x0004, 0x61: 0x2012, 0x62: 0x2012, 0x63: 0x2012,
+ 0x64: 0x2012, 0x65: 0x2012, 0x66: 0x2012, 0x67: 0x2012, 0x68: 0x2012, 0x69: 0x2012,
+ 0x6a: 0x2012, 0x6b: 0x2012, 0x6c: 0x2012, 0x6d: 0x2012, 0x6e: 0x2012, 0x6f: 0x2012,
+ 0x70: 0x2012, 0x71: 0x2012, 0x72: 0x2012, 0x73: 0x2012, 0x74: 0x2012, 0x75: 0x2012,
+ 0x76: 0x2012, 0x77: 0x2012, 0x78: 0x2012, 0x79: 0x2012, 0x7a: 0x2012,
+ // Block 0x2, offset 0x80
+ // Block 0x3, offset 0xc0
+ 0xc0: 0x0852, 0xc1: 0x0b53, 0xc2: 0x0113, 0xc3: 0x0112, 0xc4: 0x0113, 0xc5: 0x0112,
+ 0xc6: 0x0b53, 0xc7: 0x0f13, 0xc8: 0x0f12, 0xc9: 0x0e53, 0xca: 0x1153, 0xcb: 0x0713,
+ 0xcc: 0x0712, 0xcd: 0x0012, 0xce: 0x1453, 0xcf: 0x1753, 0xd0: 0x1a53, 0xd1: 0x0313,
+ 0xd2: 0x0312, 0xd3: 0x1d53, 0xd4: 0x2053, 0xd5: 0x2352, 0xd6: 0x2653, 0xd7: 0x2653,
+ 0xd8: 0x0113, 0xd9: 0x0112, 0xda: 0x2952, 0xdb: 0x0012, 0xdc: 0x1d53, 0xdd: 0x2c53,
+ 0xde: 0x2f52, 0xdf: 0x3253, 0xe0: 0x0113, 0xe1: 0x0112, 0xe2: 0x0113, 0xe3: 0x0112,
+ 0xe4: 0x0113, 0xe5: 0x0112, 0xe6: 0x3553, 0xe7: 0x0f13, 0xe8: 0x0f12, 0xe9: 0x3853,
+ 0xea: 0x0012, 0xeb: 0x0012, 0xec: 0x0113, 0xed: 0x0112, 0xee: 0x3553, 0xef: 0x1f13,
+ 0xf0: 0x1f12, 0xf1: 0x3b53, 0xf2: 0x3e53, 0xf3: 0x0713, 0xf4: 0x0712, 0xf5: 0x0313,
+ 0xf6: 0x0312, 0xf7: 0x4153, 0xf8: 0x0113, 0xf9: 0x0112, 0xfa: 0x0012, 0xfb: 0x0010,
+ 0xfc: 0x0113, 0xfd: 0x0112, 0xfe: 0x0012, 0xff: 0x4452,
+ // Block 0x4, offset 0x100
+ 0x100: 0x0010, 0x101: 0x0010, 0x102: 0x0010, 0x103: 0x0010, 0x104: 0x04cb, 0x105: 0x05c9,
+ 0x106: 0x06ca, 0x107: 0x078b, 0x108: 0x0889, 0x109: 0x098a, 0x10a: 0x0a4b, 0x10b: 0x0b49,
+ 0x10c: 0x0c4a, 0x10d: 0x0313, 0x10e: 0x0312, 0x10f: 0x1f13, 0x110: 0x1f12, 0x111: 0x0313,
+ 0x112: 0x0312, 0x113: 0x0713, 0x114: 0x0712, 0x115: 0x0313, 0x116: 0x0312, 0x117: 0x0f13,
+ 0x118: 0x0f12, 0x119: 0x0313, 0x11a: 0x0312, 0x11b: 0x0713, 0x11c: 0x0712, 0x11d: 0x1452,
+ 0x11e: 0x0113, 0x11f: 0x0112, 0x120: 0x0113, 0x121: 0x0112, 0x122: 0x0113, 0x123: 0x0112,
+ 0x124: 0x0113, 0x125: 0x0112, 0x126: 0x0113, 0x127: 0x0112, 0x128: 0x0113, 0x129: 0x0112,
+ 0x12a: 0x0113, 0x12b: 0x0112, 0x12c: 0x0113, 0x12d: 0x0112, 0x12e: 0x0113, 0x12f: 0x0112,
+ 0x130: 0x0d0a, 0x131: 0x0e0b, 0x132: 0x0f09, 0x133: 0x100a, 0x134: 0x0113, 0x135: 0x0112,
+ 0x136: 0x2353, 0x137: 0x4453, 0x138: 0x0113, 0x139: 0x0112, 0x13a: 0x0113, 0x13b: 0x0112,
+ 0x13c: 0x0113, 0x13d: 0x0112, 0x13e: 0x0113, 0x13f: 0x0112,
+ // Block 0x5, offset 0x140
+ 0x140: 0x136a, 0x141: 0x0313, 0x142: 0x0312, 0x143: 0x0853, 0x144: 0x4753, 0x145: 0x4a53,
+ 0x146: 0x0113, 0x147: 0x0112, 0x148: 0x0113, 0x149: 0x0112, 0x14a: 0x0113, 0x14b: 0x0112,
+ 0x14c: 0x0113, 0x14d: 0x0112, 0x14e: 0x0113, 0x14f: 0x0112, 0x150: 0x140a, 0x151: 0x14aa,
+ 0x152: 0x154a, 0x153: 0x0b52, 0x154: 0x0b52, 0x155: 0x0012, 0x156: 0x0e52, 0x157: 0x1152,
+ 0x158: 0x0012, 0x159: 0x1752, 0x15a: 0x0012, 0x15b: 0x1a52, 0x15c: 0x15ea, 0x15d: 0x0012,
+ 0x15e: 0x0012, 0x15f: 0x0012, 0x160: 0x1d52, 0x161: 0x168a, 0x162: 0x0012, 0x163: 0x2052,
+ 0x164: 0x0012, 0x165: 0x172a, 0x166: 0x17ca, 0x167: 0x0012, 0x168: 0x2652, 0x169: 0x2652,
+ 0x16a: 0x186a, 0x16b: 0x190a, 0x16c: 0x19aa, 0x16d: 0x0012, 0x16e: 0x0012, 0x16f: 0x1d52,
+ 0x170: 0x0012, 0x171: 0x1a4a, 0x172: 0x2c52, 0x173: 0x0012, 0x174: 0x0012, 0x175: 0x3252,
+ 0x176: 0x0012, 0x177: 0x0012, 0x178: 0x0012, 0x179: 0x0012, 0x17a: 0x0012, 0x17b: 0x0012,
+ 0x17c: 0x0012, 0x17d: 0x1aea, 0x17e: 0x0012, 0x17f: 0x0012,
+ // Block 0x6, offset 0x180
+ 0x180: 0x3552, 0x181: 0x0012, 0x182: 0x0012, 0x183: 0x3852, 0x184: 0x0012, 0x185: 0x0012,
+ 0x186: 0x0012, 0x187: 0x1b8a, 0x188: 0x3552, 0x189: 0x4752, 0x18a: 0x3b52, 0x18b: 0x3e52,
+ 0x18c: 0x4a52, 0x18d: 0x0012, 0x18e: 0x0012, 0x18f: 0x0012, 0x190: 0x0012, 0x191: 0x0012,
+ 0x192: 0x4152, 0x193: 0x0012, 0x194: 0x0010, 0x195: 0x0012, 0x196: 0x0012, 0x197: 0x0012,
+ 0x198: 0x0012, 0x199: 0x0012, 0x19a: 0x0012, 0x19b: 0x0012, 0x19c: 0x0012, 0x19d: 0x1c2a,
+ 0x19e: 0x1cca, 0x19f: 0x0012, 0x1a0: 0x0012, 0x1a1: 0x0012, 0x1a2: 0x0012, 0x1a3: 0x0012,
+ 0x1a4: 0x0012, 0x1a5: 0x0012, 0x1a6: 0x0012, 0x1a7: 0x0012, 0x1a8: 0x0012, 0x1a9: 0x0012,
+ 0x1aa: 0x0012, 0x1ab: 0x0012, 0x1ac: 0x0012, 0x1ad: 0x0012, 0x1ae: 0x0012, 0x1af: 0x0012,
+ 0x1b0: 0x0015, 0x1b1: 0x0015, 0x1b2: 0x0015, 0x1b3: 0x0015, 0x1b4: 0x0015, 0x1b5: 0x0015,
+ 0x1b6: 0x0015, 0x1b7: 0x0015, 0x1b8: 0x0015, 0x1b9: 0x0014, 0x1ba: 0x0014, 0x1bb: 0x0014,
+ 0x1bc: 0x0014, 0x1bd: 0x0014, 0x1be: 0x0014, 0x1bf: 0x0014,
+ // Block 0x7, offset 0x1c0
+ 0x1c0: 0x0024, 0x1c1: 0x0024, 0x1c2: 0x0024, 0x1c3: 0x0024, 0x1c4: 0x0024, 0x1c5: 0x1d6d,
+ 0x1c6: 0x0024, 0x1c7: 0x0034, 0x1c8: 0x0034, 0x1c9: 0x0034, 0x1ca: 0x0024, 0x1cb: 0x0024,
+ 0x1cc: 0x0024, 0x1cd: 0x0034, 0x1ce: 0x0034, 0x1cf: 0x0014, 0x1d0: 0x0024, 0x1d1: 0x0024,
+ 0x1d2: 0x0024, 0x1d3: 0x0034, 0x1d4: 0x0034, 0x1d5: 0x0034, 0x1d6: 0x0034, 0x1d7: 0x0024,
+ 0x1d8: 0x0034, 0x1d9: 0x0034, 0x1da: 0x0034, 0x1db: 0x0024, 0x1dc: 0x0034, 0x1dd: 0x0034,
+ 0x1de: 0x0034, 0x1df: 0x0034, 0x1e0: 0x0034, 0x1e1: 0x0034, 0x1e2: 0x0034, 0x1e3: 0x0024,
+ 0x1e4: 0x0024, 0x1e5: 0x0024, 0x1e6: 0x0024, 0x1e7: 0x0024, 0x1e8: 0x0024, 0x1e9: 0x0024,
+ 0x1ea: 0x0024, 0x1eb: 0x0024, 0x1ec: 0x0024, 0x1ed: 0x0024, 0x1ee: 0x0024, 0x1ef: 0x0024,
+ 0x1f0: 0x0113, 0x1f1: 0x0112, 0x1f2: 0x0113, 0x1f3: 0x0112, 0x1f4: 0x0014, 0x1f5: 0x0004,
+ 0x1f6: 0x0113, 0x1f7: 0x0112, 0x1fa: 0x0015, 0x1fb: 0x4d52,
+ 0x1fc: 0x5052, 0x1fd: 0x5052, 0x1ff: 0x5353,
+ // Block 0x8, offset 0x200
+ 0x204: 0x0004, 0x205: 0x0004,
+ 0x206: 0x2a13, 0x207: 0x0054, 0x208: 0x2513, 0x209: 0x2713, 0x20a: 0x2513,
+ 0x20c: 0x5653, 0x20e: 0x5953, 0x20f: 0x5c53, 0x210: 0x1e2a, 0x211: 0x2013,
+ 0x212: 0x2013, 0x213: 0x2013, 0x214: 0x2013, 0x215: 0x2013, 0x216: 0x2013, 0x217: 0x2013,
+ 0x218: 0x2013, 0x219: 0x2013, 0x21a: 0x2013, 0x21b: 0x2013, 0x21c: 0x2013, 0x21d: 0x2013,
+ 0x21e: 0x2013, 0x21f: 0x2013, 0x220: 0x5f53, 0x221: 0x5f53, 0x223: 0x5f53,
+ 0x224: 0x5f53, 0x225: 0x5f53, 0x226: 0x5f53, 0x227: 0x5f53, 0x228: 0x5f53, 0x229: 0x5f53,
+ 0x22a: 0x5f53, 0x22b: 0x5f53, 0x22c: 0x2a12, 0x22d: 0x2512, 0x22e: 0x2712, 0x22f: 0x2512,
+ 0x230: 0x1fea, 0x231: 0x2012, 0x232: 0x2012, 0x233: 0x2012, 0x234: 0x2012, 0x235: 0x2012,
+ 0x236: 0x2012, 0x237: 0x2012, 0x238: 0x2012, 0x239: 0x2012, 0x23a: 0x2012, 0x23b: 0x2012,
+ 0x23c: 0x2012, 0x23d: 0x2012, 0x23e: 0x2012, 0x23f: 0x2012,
+ // Block 0x9, offset 0x240
+ 0x240: 0x5f52, 0x241: 0x5f52, 0x242: 0x21aa, 0x243: 0x5f52, 0x244: 0x5f52, 0x245: 0x5f52,
+ 0x246: 0x5f52, 0x247: 0x5f52, 0x248: 0x5f52, 0x249: 0x5f52, 0x24a: 0x5f52, 0x24b: 0x5f52,
+ 0x24c: 0x5652, 0x24d: 0x5952, 0x24e: 0x5c52, 0x24f: 0x1813, 0x250: 0x226a, 0x251: 0x232a,
+ 0x252: 0x0013, 0x253: 0x0013, 0x254: 0x0013, 0x255: 0x23ea, 0x256: 0x24aa, 0x257: 0x1812,
+ 0x258: 0x0113, 0x259: 0x0112, 0x25a: 0x0113, 0x25b: 0x0112, 0x25c: 0x0113, 0x25d: 0x0112,
+ 0x25e: 0x0113, 0x25f: 0x0112, 0x260: 0x0113, 0x261: 0x0112, 0x262: 0x0113, 0x263: 0x0112,
+ 0x264: 0x0113, 0x265: 0x0112, 0x266: 0x0113, 0x267: 0x0112, 0x268: 0x0113, 0x269: 0x0112,
+ 0x26a: 0x0113, 0x26b: 0x0112, 0x26c: 0x0113, 0x26d: 0x0112, 0x26e: 0x0113, 0x26f: 0x0112,
+ 0x270: 0x256a, 0x271: 0x262a, 0x272: 0x0b12, 0x273: 0x5352, 0x274: 0x6253, 0x275: 0x26ea,
+ 0x277: 0x0f13, 0x278: 0x0f12, 0x279: 0x0b13, 0x27a: 0x0113, 0x27b: 0x0112,
+ 0x27c: 0x0012, 0x27d: 0x4d53, 0x27e: 0x5053, 0x27f: 0x5053,
+ // Block 0xa, offset 0x280
+ 0x280: 0x0812, 0x281: 0x0812, 0x282: 0x0812, 0x283: 0x0812, 0x284: 0x0812, 0x285: 0x0812,
+ 0x288: 0x0813, 0x289: 0x0813, 0x28a: 0x0813, 0x28b: 0x0813,
+ 0x28c: 0x0813, 0x28d: 0x0813, 0x290: 0x372a, 0x291: 0x0812,
+ 0x292: 0x386a, 0x293: 0x0812, 0x294: 0x3a2a, 0x295: 0x0812, 0x296: 0x3bea, 0x297: 0x0812,
+ 0x299: 0x0813, 0x29b: 0x0813, 0x29d: 0x0813,
+ 0x29f: 0x0813, 0x2a0: 0x0812, 0x2a1: 0x0812, 0x2a2: 0x0812, 0x2a3: 0x0812,
+ 0x2a4: 0x0812, 0x2a5: 0x0812, 0x2a6: 0x0812, 0x2a7: 0x0812, 0x2a8: 0x0813, 0x2a9: 0x0813,
+ 0x2aa: 0x0813, 0x2ab: 0x0813, 0x2ac: 0x0813, 0x2ad: 0x0813, 0x2ae: 0x0813, 0x2af: 0x0813,
+ 0x2b0: 0x8b52, 0x2b1: 0x8b52, 0x2b2: 0x8e52, 0x2b3: 0x8e52, 0x2b4: 0x9152, 0x2b5: 0x9152,
+ 0x2b6: 0x9452, 0x2b7: 0x9452, 0x2b8: 0x9752, 0x2b9: 0x9752, 0x2ba: 0x9a52, 0x2bb: 0x9a52,
+ 0x2bc: 0x4d52, 0x2bd: 0x4d52,
+ // Block 0xb, offset 0x2c0
+ 0x2c0: 0x3daa, 0x2c1: 0x3f8a, 0x2c2: 0x416a, 0x2c3: 0x434a, 0x2c4: 0x452a, 0x2c5: 0x470a,
+ 0x2c6: 0x48ea, 0x2c7: 0x4aca, 0x2c8: 0x4ca9, 0x2c9: 0x4e89, 0x2ca: 0x5069, 0x2cb: 0x5249,
+ 0x2cc: 0x5429, 0x2cd: 0x5609, 0x2ce: 0x57e9, 0x2cf: 0x59c9, 0x2d0: 0x5baa, 0x2d1: 0x5d8a,
+ 0x2d2: 0x5f6a, 0x2d3: 0x614a, 0x2d4: 0x632a, 0x2d5: 0x650a, 0x2d6: 0x66ea, 0x2d7: 0x68ca,
+ 0x2d8: 0x6aa9, 0x2d9: 0x6c89, 0x2da: 0x6e69, 0x2db: 0x7049, 0x2dc: 0x7229, 0x2dd: 0x7409,
+ 0x2de: 0x75e9, 0x2df: 0x77c9, 0x2e0: 0x79aa, 0x2e1: 0x7b8a, 0x2e2: 0x7d6a, 0x2e3: 0x7f4a,
+ 0x2e4: 0x812a, 0x2e5: 0x830a, 0x2e6: 0x84ea, 0x2e7: 0x86ca, 0x2e8: 0x88a9, 0x2e9: 0x8a89,
+ 0x2ea: 0x8c69, 0x2eb: 0x8e49, 0x2ec: 0x9029, 0x2ed: 0x9209, 0x2ee: 0x93e9, 0x2ef: 0x95c9,
+ 0x2f0: 0x0812, 0x2f1: 0x0812, 0x2f2: 0x97aa, 0x2f3: 0x99ca, 0x2f4: 0x9b6a,
+ 0x2f6: 0x9d2a, 0x2f7: 0x9e6a, 0x2f8: 0x0813, 0x2f9: 0x0813, 0x2fa: 0x8b53, 0x2fb: 0x8b53,
+ 0x2fc: 0xa0e9, 0x2fd: 0x0004, 0x2fe: 0xa28a, 0x2ff: 0x0004,
+ // Block 0xc, offset 0x300
+ 0x300: 0x0004, 0x301: 0x0004, 0x302: 0xa34a, 0x303: 0xa56a, 0x304: 0xa70a,
+ 0x306: 0xa8ca, 0x307: 0xaa0a, 0x308: 0x8e53, 0x309: 0x8e53, 0x30a: 0x9153, 0x30b: 0x9153,
+ 0x30c: 0xac89, 0x30d: 0x0004, 0x30e: 0x0004, 0x30f: 0x0004, 0x310: 0x0812, 0x311: 0x0812,
+ 0x312: 0xae2a, 0x313: 0xafea, 0x316: 0xb1aa, 0x317: 0xb2ea,
+ 0x318: 0x0813, 0x319: 0x0813, 0x31a: 0x9453, 0x31b: 0x9453, 0x31d: 0x0004,
+ 0x31e: 0x0004, 0x31f: 0x0004, 0x320: 0x0812, 0x321: 0x0812, 0x322: 0xb4aa, 0x323: 0xb66a,
+ 0x324: 0xb82a, 0x325: 0x0912, 0x326: 0xb96a, 0x327: 0xbaaa, 0x328: 0x0813, 0x329: 0x0813,
+ 0x32a: 0x9a53, 0x32b: 0x9a53, 0x32c: 0x0913, 0x32d: 0x0004, 0x32e: 0x0004, 0x32f: 0x0004,
+ 0x332: 0xbc6a, 0x333: 0xbe8a, 0x334: 0xc02a,
+ 0x336: 0xc1ea, 0x337: 0xc32a, 0x338: 0x9753, 0x339: 0x9753, 0x33a: 0x4d53, 0x33b: 0x4d53,
+ 0x33c: 0xc5a9, 0x33d: 0x0004, 0x33e: 0x0004,
+ // Block 0xd, offset 0x340
+ 0x342: 0x0013,
+ 0x347: 0x0013, 0x34a: 0x0012, 0x34b: 0x0013,
+ 0x34c: 0x0013, 0x34d: 0x0013, 0x34e: 0x0012, 0x34f: 0x0012, 0x350: 0x0013, 0x351: 0x0013,
+ 0x352: 0x0013, 0x353: 0x0012, 0x355: 0x0013,
+ 0x359: 0x0013, 0x35a: 0x0013, 0x35b: 0x0013, 0x35c: 0x0013, 0x35d: 0x0013,
+ 0x364: 0x0013, 0x366: 0xc74b, 0x368: 0x0013,
+ 0x36a: 0xc80b, 0x36b: 0xc88b, 0x36c: 0x0013, 0x36d: 0x0013, 0x36f: 0x0012,
+ 0x370: 0x0013, 0x371: 0x0013, 0x372: 0x9d53, 0x373: 0x0013, 0x374: 0x0012, 0x375: 0x0010,
+ 0x376: 0x0010, 0x377: 0x0010, 0x378: 0x0010, 0x379: 0x0012,
+ 0x37c: 0x0012, 0x37d: 0x0012, 0x37e: 0x0013, 0x37f: 0x0013,
+ // Block 0xe, offset 0x380
+ 0x380: 0x1a13, 0x381: 0x1a13, 0x382: 0x1e13, 0x383: 0x1e13, 0x384: 0x1a13, 0x385: 0x1a13,
+ 0x386: 0x2613, 0x387: 0x2613, 0x388: 0x2a13, 0x389: 0x2a13, 0x38a: 0x2e13, 0x38b: 0x2e13,
+ 0x38c: 0x2a13, 0x38d: 0x2a13, 0x38e: 0x2613, 0x38f: 0x2613, 0x390: 0xa052, 0x391: 0xa052,
+ 0x392: 0xa352, 0x393: 0xa352, 0x394: 0xa652, 0x395: 0xa652, 0x396: 0xa352, 0x397: 0xa352,
+ 0x398: 0xa052, 0x399: 0xa052, 0x39a: 0x1a12, 0x39b: 0x1a12, 0x39c: 0x1e12, 0x39d: 0x1e12,
+ 0x39e: 0x1a12, 0x39f: 0x1a12, 0x3a0: 0x2612, 0x3a1: 0x2612, 0x3a2: 0x2a12, 0x3a3: 0x2a12,
+ 0x3a4: 0x2e12, 0x3a5: 0x2e12, 0x3a6: 0x2a12, 0x3a7: 0x2a12, 0x3a8: 0x2612, 0x3a9: 0x2612,
+ // Block 0xf, offset 0x3c0
+ 0x3c0: 0x6552, 0x3c1: 0x6552, 0x3c2: 0x6552, 0x3c3: 0x6552, 0x3c4: 0x6552, 0x3c5: 0x6552,
+ 0x3c6: 0x6552, 0x3c7: 0x6552, 0x3c8: 0x6552, 0x3c9: 0x6552, 0x3ca: 0x6552, 0x3cb: 0x6552,
+ 0x3cc: 0x6552, 0x3cd: 0x6552, 0x3ce: 0x6552, 0x3cf: 0x6552, 0x3d0: 0xa952, 0x3d1: 0xa952,
+ 0x3d2: 0xa952, 0x3d3: 0xa952, 0x3d4: 0xa952, 0x3d5: 0xa952, 0x3d6: 0xa952, 0x3d7: 0xa952,
+ 0x3d8: 0xa952, 0x3d9: 0xa952, 0x3da: 0xa952, 0x3db: 0xa952, 0x3dc: 0xa952, 0x3dd: 0xa952,
+ 0x3de: 0xa952, 0x3e0: 0x0113, 0x3e1: 0x0112, 0x3e2: 0xc94b, 0x3e3: 0x8853,
+ 0x3e4: 0xca0b, 0x3e5: 0xcaca, 0x3e6: 0xcb4a, 0x3e7: 0x0f13, 0x3e8: 0x0f12, 0x3e9: 0x0313,
+ 0x3ea: 0x0312, 0x3eb: 0x0713, 0x3ec: 0x0712, 0x3ed: 0xcbcb, 0x3ee: 0xcc8b, 0x3ef: 0xcd4b,
+ 0x3f0: 0xce0b, 0x3f1: 0x0012, 0x3f2: 0x0113, 0x3f3: 0x0112, 0x3f4: 0x0012, 0x3f5: 0x0313,
+ 0x3f6: 0x0312, 0x3f7: 0x0012, 0x3f8: 0x0012, 0x3f9: 0x0012, 0x3fa: 0x0012, 0x3fb: 0x0012,
+ 0x3fc: 0x0015, 0x3fd: 0x0015, 0x3fe: 0xcecb, 0x3ff: 0xcf8b,
+ // Block 0x10, offset 0x400
+ 0x400: 0x0113, 0x401: 0x0112, 0x402: 0x0113, 0x403: 0x0112, 0x404: 0x0113, 0x405: 0x0112,
+ 0x406: 0x0113, 0x407: 0x0112, 0x408: 0x0014, 0x409: 0x0014, 0x40a: 0x0014, 0x40b: 0x0713,
+ 0x40c: 0x0712, 0x40d: 0xd04b, 0x40e: 0x0012, 0x40f: 0x0010, 0x410: 0x0113, 0x411: 0x0112,
+ 0x412: 0x0113, 0x413: 0x0112, 0x414: 0x0012, 0x415: 0x0012, 0x416: 0x0113, 0x417: 0x0112,
+ 0x418: 0x0113, 0x419: 0x0112, 0x41a: 0x0113, 0x41b: 0x0112, 0x41c: 0x0113, 0x41d: 0x0112,
+ 0x41e: 0x0113, 0x41f: 0x0112, 0x420: 0x0113, 0x421: 0x0112, 0x422: 0x0113, 0x423: 0x0112,
+ 0x424: 0x0113, 0x425: 0x0112, 0x426: 0x0113, 0x427: 0x0112, 0x428: 0x0113, 0x429: 0x0112,
+ 0x42a: 0xd10b, 0x42b: 0xd1cb, 0x42c: 0xd28b, 0x42d: 0xd34b, 0x42e: 0xd40b,
+ 0x430: 0xd4cb, 0x431: 0xd58b, 0x432: 0xd64b, 0x433: 0xac53, 0x434: 0x0113, 0x435: 0x0112,
+ 0x436: 0x0113, 0x437: 0x0112,
+ // Block 0x11, offset 0x440
+ 0x440: 0xd70a, 0x441: 0xd80a, 0x442: 0xd90a, 0x443: 0xda0a, 0x444: 0xdb6a, 0x445: 0xdcca,
+ 0x446: 0xddca,
+ 0x453: 0xdeca, 0x454: 0xe08a, 0x455: 0xe24a, 0x456: 0xe40a, 0x457: 0xe5ca,
+ 0x45d: 0x0010,
+ 0x45e: 0x0034, 0x45f: 0x0010, 0x460: 0x0010, 0x461: 0x0010, 0x462: 0x0010, 0x463: 0x0010,
+ 0x464: 0x0010, 0x465: 0x0010, 0x466: 0x0010, 0x467: 0x0010, 0x468: 0x0010,
+ 0x46a: 0x0010, 0x46b: 0x0010, 0x46c: 0x0010, 0x46d: 0x0010, 0x46e: 0x0010, 0x46f: 0x0010,
+ 0x470: 0x0010, 0x471: 0x0010, 0x472: 0x0010, 0x473: 0x0010, 0x474: 0x0010, 0x475: 0x0010,
+ 0x476: 0x0010, 0x478: 0x0010, 0x479: 0x0010, 0x47a: 0x0010, 0x47b: 0x0010,
+ 0x47c: 0x0010, 0x47e: 0x0010,
+ // Block 0x12, offset 0x480
+ 0x480: 0x2213, 0x481: 0x2213, 0x482: 0x2613, 0x483: 0x2613, 0x484: 0x2213, 0x485: 0x2213,
+ 0x486: 0x2e13, 0x487: 0x2e13, 0x488: 0x2213, 0x489: 0x2213, 0x48a: 0x2613, 0x48b: 0x2613,
+ 0x48c: 0x2213, 0x48d: 0x2213, 0x48e: 0x3e13, 0x48f: 0x3e13, 0x490: 0x2213, 0x491: 0x2213,
+ 0x492: 0x2613, 0x493: 0x2613, 0x494: 0x2213, 0x495: 0x2213, 0x496: 0x2e13, 0x497: 0x2e13,
+ 0x498: 0x2213, 0x499: 0x2213, 0x49a: 0x2613, 0x49b: 0x2613, 0x49c: 0x2213, 0x49d: 0x2213,
+ 0x49e: 0xb553, 0x49f: 0xb553, 0x4a0: 0xb853, 0x4a1: 0xb853, 0x4a2: 0x2212, 0x4a3: 0x2212,
+ 0x4a4: 0x2612, 0x4a5: 0x2612, 0x4a6: 0x2212, 0x4a7: 0x2212, 0x4a8: 0x2e12, 0x4a9: 0x2e12,
+ 0x4aa: 0x2212, 0x4ab: 0x2212, 0x4ac: 0x2612, 0x4ad: 0x2612, 0x4ae: 0x2212, 0x4af: 0x2212,
+ 0x4b0: 0x3e12, 0x4b1: 0x3e12, 0x4b2: 0x2212, 0x4b3: 0x2212, 0x4b4: 0x2612, 0x4b5: 0x2612,
+ 0x4b6: 0x2212, 0x4b7: 0x2212, 0x4b8: 0x2e12, 0x4b9: 0x2e12, 0x4ba: 0x2212, 0x4bb: 0x2212,
+ 0x4bc: 0x2612, 0x4bd: 0x2612, 0x4be: 0x2212, 0x4bf: 0x2212,
+ // Block 0x13, offset 0x4c0
+ 0x4c2: 0x0010,
+ 0x4c7: 0x0010, 0x4c9: 0x0010, 0x4cb: 0x0010,
+ 0x4cd: 0x0010, 0x4ce: 0x0010, 0x4cf: 0x0010, 0x4d1: 0x0010,
+ 0x4d2: 0x0010, 0x4d4: 0x0010, 0x4d7: 0x0010,
+ 0x4d9: 0x0010, 0x4db: 0x0010, 0x4dd: 0x0010,
+ 0x4df: 0x0010, 0x4e1: 0x0010, 0x4e2: 0x0010,
+ 0x4e4: 0x0010, 0x4e7: 0x0010, 0x4e8: 0x0010, 0x4e9: 0x0010,
+ 0x4ea: 0x0010, 0x4ec: 0x0010, 0x4ed: 0x0010, 0x4ee: 0x0010, 0x4ef: 0x0010,
+ 0x4f0: 0x0010, 0x4f1: 0x0010, 0x4f2: 0x0010, 0x4f4: 0x0010, 0x4f5: 0x0010,
+ 0x4f6: 0x0010, 0x4f7: 0x0010, 0x4f9: 0x0010, 0x4fa: 0x0010, 0x4fb: 0x0010,
+ 0x4fc: 0x0010, 0x4fe: 0x0010,
+}
+
+// caseIndex: 25 blocks, 1600 entries, 3200 bytes
+// Block 0 is the zero block.
+var caseIndex = [1600]uint16{
+ // Block 0x0, offset 0x0
+ // Block 0x1, offset 0x40
+ // Block 0x2, offset 0x80
+ // Block 0x3, offset 0xc0
+ 0xc2: 0x12, 0xc3: 0x13, 0xc4: 0x14, 0xc5: 0x15, 0xc6: 0x01, 0xc7: 0x02,
+ 0xc8: 0x16, 0xc9: 0x03, 0xca: 0x04, 0xcb: 0x17, 0xcc: 0x18, 0xcd: 0x05, 0xce: 0x06, 0xcf: 0x07,
+ 0xd0: 0x19, 0xd1: 0x1a, 0xd2: 0x1b, 0xd3: 0x1c, 0xd4: 0x1d, 0xd5: 0x1e, 0xd6: 0x1f, 0xd7: 0x20,
+ 0xd8: 0x21, 0xd9: 0x22, 0xda: 0x23, 0xdb: 0x24, 0xdc: 0x25, 0xdd: 0x26, 0xde: 0x27, 0xdf: 0x28,
+ 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05,
+ 0xea: 0x06, 0xeb: 0x07, 0xec: 0x07, 0xed: 0x08, 0xef: 0x09,
+ 0xf0: 0x14, 0xf3: 0x16,
+ // Block 0x4, offset 0x100
+ 0x120: 0x29, 0x121: 0x2a, 0x122: 0x2b, 0x123: 0x2c, 0x124: 0x2d, 0x125: 0x2e, 0x126: 0x2f, 0x127: 0x30,
+ 0x128: 0x31, 0x129: 0x32, 0x12a: 0x33, 0x12b: 0x34, 0x12c: 0x35, 0x12d: 0x36, 0x12e: 0x37, 0x12f: 0x38,
+ 0x130: 0x39, 0x131: 0x3a, 0x132: 0x3b, 0x133: 0x3c, 0x134: 0x3d, 0x135: 0x3e, 0x136: 0x3f, 0x137: 0x40,
+ 0x138: 0x41, 0x139: 0x42, 0x13a: 0x43, 0x13b: 0x44, 0x13c: 0x45, 0x13d: 0x46, 0x13e: 0x47, 0x13f: 0x48,
+ // Block 0x5, offset 0x140
+ 0x140: 0x49, 0x141: 0x4a, 0x142: 0x4b, 0x143: 0x4c, 0x144: 0x23, 0x145: 0x23, 0x146: 0x23, 0x147: 0x23,
+ 0x148: 0x23, 0x149: 0x4d, 0x14a: 0x4e, 0x14b: 0x4f, 0x14c: 0x50, 0x14d: 0x51, 0x14e: 0x52, 0x14f: 0x53,
+ 0x150: 0x54, 0x151: 0x23, 0x152: 0x23, 0x153: 0x23, 0x154: 0x23, 0x155: 0x23, 0x156: 0x23, 0x157: 0x23,
+ 0x158: 0x23, 0x159: 0x55, 0x15a: 0x56, 0x15b: 0x57, 0x15c: 0x58, 0x15d: 0x59, 0x15e: 0x5a, 0x15f: 0x5b,
+ 0x160: 0x5c, 0x161: 0x5d, 0x162: 0x5e, 0x163: 0x5f, 0x164: 0x60, 0x165: 0x61, 0x167: 0x62,
+ 0x168: 0x63, 0x169: 0x64, 0x16a: 0x65, 0x16c: 0x66, 0x16d: 0x67, 0x16e: 0x68, 0x16f: 0x69,
+ 0x170: 0x6a, 0x171: 0x6b, 0x172: 0x6c, 0x173: 0x6d, 0x174: 0x6e, 0x175: 0x6f, 0x176: 0x70, 0x177: 0x71,
+ 0x178: 0x72, 0x179: 0x72, 0x17a: 0x73, 0x17b: 0x72, 0x17c: 0x74, 0x17d: 0x08, 0x17e: 0x09, 0x17f: 0x0a,
+ // Block 0x6, offset 0x180
+ 0x180: 0x75, 0x181: 0x76, 0x182: 0x77, 0x183: 0x78, 0x184: 0x0b, 0x185: 0x79, 0x186: 0x7a,
+ 0x192: 0x7b, 0x193: 0x0c,
+ 0x1b0: 0x7c, 0x1b1: 0x0d, 0x1b2: 0x72, 0x1b3: 0x7d, 0x1b4: 0x7e, 0x1b5: 0x7f, 0x1b6: 0x80, 0x1b7: 0x81,
+ 0x1b8: 0x82,
+ // Block 0x7, offset 0x1c0
+ 0x1c0: 0x83, 0x1c2: 0x84, 0x1c3: 0x85, 0x1c4: 0x86, 0x1c5: 0x23, 0x1c6: 0x87,
+ // Block 0x8, offset 0x200
+ 0x200: 0x88, 0x201: 0x23, 0x202: 0x23, 0x203: 0x23, 0x204: 0x23, 0x205: 0x23, 0x206: 0x23, 0x207: 0x23,
+ 0x208: 0x23, 0x209: 0x23, 0x20a: 0x23, 0x20b: 0x23, 0x20c: 0x23, 0x20d: 0x23, 0x20e: 0x23, 0x20f: 0x23,
+ 0x210: 0x23, 0x211: 0x23, 0x212: 0x89, 0x213: 0x8a, 0x214: 0x23, 0x215: 0x23, 0x216: 0x23, 0x217: 0x23,
+ 0x218: 0x8b, 0x219: 0x8c, 0x21a: 0x8d, 0x21b: 0x8e, 0x21c: 0x8f, 0x21d: 0x90, 0x21e: 0x0e, 0x21f: 0x91,
+ 0x220: 0x92, 0x221: 0x93, 0x222: 0x23, 0x223: 0x94, 0x224: 0x95, 0x225: 0x96, 0x226: 0x97, 0x227: 0x98,
+ 0x228: 0x99, 0x229: 0x9a, 0x22a: 0x9b, 0x22b: 0x9c, 0x22c: 0x9d, 0x22d: 0x9e, 0x22e: 0x9f, 0x22f: 0xa0,
+ 0x230: 0x23, 0x231: 0x23, 0x232: 0x23, 0x233: 0x23, 0x234: 0x23, 0x235: 0x23, 0x236: 0x23, 0x237: 0x23,
+ 0x238: 0x23, 0x239: 0x23, 0x23a: 0x23, 0x23b: 0x23, 0x23c: 0x23, 0x23d: 0x23, 0x23e: 0x23, 0x23f: 0x23,
+ // Block 0x9, offset 0x240
+ 0x240: 0x23, 0x241: 0x23, 0x242: 0x23, 0x243: 0x23, 0x244: 0x23, 0x245: 0x23, 0x246: 0x23, 0x247: 0x23,
+ 0x248: 0x23, 0x249: 0x23, 0x24a: 0x23, 0x24b: 0x23, 0x24c: 0x23, 0x24d: 0x23, 0x24e: 0x23, 0x24f: 0x23,
+ 0x250: 0x23, 0x251: 0x23, 0x252: 0x23, 0x253: 0x23, 0x254: 0x23, 0x255: 0x23, 0x256: 0x23, 0x257: 0x23,
+ 0x258: 0x23, 0x259: 0x23, 0x25a: 0x23, 0x25b: 0x23, 0x25c: 0x23, 0x25d: 0x23, 0x25e: 0x23, 0x25f: 0x23,
+ 0x260: 0x23, 0x261: 0x23, 0x262: 0x23, 0x263: 0x23, 0x264: 0x23, 0x265: 0x23, 0x266: 0x23, 0x267: 0x23,
+ 0x268: 0x23, 0x269: 0x23, 0x26a: 0x23, 0x26b: 0x23, 0x26c: 0x23, 0x26d: 0x23, 0x26e: 0x23, 0x26f: 0x23,
+ 0x270: 0x23, 0x271: 0x23, 0x272: 0x23, 0x273: 0x23, 0x274: 0x23, 0x275: 0x23, 0x276: 0x23, 0x277: 0x23,
+ 0x278: 0x23, 0x279: 0x23, 0x27a: 0x23, 0x27b: 0x23, 0x27c: 0x23, 0x27d: 0x23, 0x27e: 0x23, 0x27f: 0x23,
+ // Block 0xa, offset 0x280
+ 0x280: 0x23, 0x281: 0x23, 0x282: 0x23, 0x283: 0x23, 0x284: 0x23, 0x285: 0x23, 0x286: 0x23, 0x287: 0x23,
+ 0x288: 0x23, 0x289: 0x23, 0x28a: 0x23, 0x28b: 0x23, 0x28c: 0x23, 0x28d: 0x23, 0x28e: 0x23, 0x28f: 0x23,
+ 0x290: 0x23, 0x291: 0x23, 0x292: 0x23, 0x293: 0x23, 0x294: 0x23, 0x295: 0x23, 0x296: 0x23, 0x297: 0x23,
+ 0x298: 0x23, 0x299: 0x23, 0x29a: 0x23, 0x29b: 0x23, 0x29c: 0x23, 0x29d: 0x23, 0x29e: 0xa1, 0x29f: 0xa2,
+ // Block 0xb, offset 0x2c0
+ 0x2ec: 0x0f, 0x2ed: 0xa3, 0x2ee: 0xa4, 0x2ef: 0xa5,
+ 0x2f0: 0x23, 0x2f1: 0x23, 0x2f2: 0x23, 0x2f3: 0x23, 0x2f4: 0xa6, 0x2f5: 0xa7, 0x2f6: 0xa8, 0x2f7: 0xa9,
+ 0x2f8: 0xaa, 0x2f9: 0xab, 0x2fa: 0x23, 0x2fb: 0xac, 0x2fc: 0xad, 0x2fd: 0xae, 0x2fe: 0xaf, 0x2ff: 0xb0,
+ // Block 0xc, offset 0x300
+ 0x300: 0xb1, 0x301: 0xb2, 0x302: 0x23, 0x303: 0xb3, 0x305: 0xb4, 0x307: 0xb5,
+ 0x30a: 0xb6, 0x30b: 0xb7, 0x30c: 0xb8, 0x30d: 0xb9, 0x30e: 0xba, 0x30f: 0xbb,
+ 0x310: 0xbc, 0x311: 0xbd, 0x312: 0xbe, 0x313: 0xbf, 0x314: 0xc0, 0x315: 0xc1,
+ 0x318: 0x23, 0x319: 0x23, 0x31a: 0x23, 0x31b: 0x23, 0x31c: 0xc2, 0x31d: 0xc3,
+ 0x320: 0xc4, 0x321: 0xc5, 0x322: 0xc6, 0x323: 0xc7, 0x324: 0xc8, 0x326: 0xc9,
+ 0x328: 0xca, 0x329: 0xcb, 0x32a: 0xcc, 0x32b: 0xcd, 0x32c: 0x5f, 0x32d: 0xce, 0x32e: 0xcf,
+ 0x330: 0x23, 0x331: 0xd0, 0x332: 0xd1, 0x333: 0xd2,
+ // Block 0xd, offset 0x340
+ 0x340: 0xd3, 0x341: 0xd4, 0x342: 0xd5, 0x343: 0xd6, 0x344: 0xd7, 0x345: 0xd8, 0x346: 0xd9, 0x347: 0xda,
+ 0x348: 0xdb, 0x34a: 0xdc, 0x34b: 0xdd, 0x34c: 0xde, 0x34d: 0xdf,
+ 0x350: 0xe0, 0x351: 0xe1, 0x352: 0xe2, 0x353: 0xe3, 0x356: 0xe4, 0x357: 0xe5,
+ 0x358: 0xe6, 0x359: 0xe7, 0x35a: 0xe8, 0x35b: 0xe9, 0x35c: 0xea,
+ 0x362: 0xeb, 0x363: 0xec,
+ 0x368: 0xed, 0x369: 0xee, 0x36a: 0xef, 0x36b: 0xf0,
+ 0x370: 0xf1, 0x371: 0xf2, 0x372: 0xf3, 0x374: 0xf4, 0x375: 0xf5,
+ // Block 0xe, offset 0x380
+ 0x380: 0x23, 0x381: 0x23, 0x382: 0x23, 0x383: 0x23, 0x384: 0x23, 0x385: 0x23, 0x386: 0x23, 0x387: 0x23,
+ 0x388: 0x23, 0x389: 0x23, 0x38a: 0x23, 0x38b: 0x23, 0x38c: 0x23, 0x38d: 0x23, 0x38e: 0xf6,
+ 0x390: 0x23, 0x391: 0xf7, 0x392: 0x23, 0x393: 0x23, 0x394: 0x23, 0x395: 0xf8,
+ // Block 0xf, offset 0x3c0
+ 0x3c0: 0x23, 0x3c1: 0x23, 0x3c2: 0x23, 0x3c3: 0x23, 0x3c4: 0x23, 0x3c5: 0x23, 0x3c6: 0x23, 0x3c7: 0x23,
+ 0x3c8: 0x23, 0x3c9: 0x23, 0x3ca: 0x23, 0x3cb: 0x23, 0x3cc: 0x23, 0x3cd: 0x23, 0x3ce: 0x23, 0x3cf: 0x23,
+ 0x3d0: 0xf7,
+ // Block 0x10, offset 0x400
+ 0x410: 0x23, 0x411: 0x23, 0x412: 0x23, 0x413: 0x23, 0x414: 0x23, 0x415: 0x23, 0x416: 0x23, 0x417: 0x23,
+ 0x418: 0x23, 0x419: 0xf9,
+ // Block 0x11, offset 0x440
+ 0x460: 0x23, 0x461: 0x23, 0x462: 0x23, 0x463: 0x23, 0x464: 0x23, 0x465: 0x23, 0x466: 0x23, 0x467: 0x23,
+ 0x468: 0xf0, 0x469: 0xfa, 0x46b: 0xfb, 0x46c: 0xfc, 0x46d: 0xfd, 0x46e: 0xfe,
+ 0x47c: 0x23, 0x47d: 0xff, 0x47e: 0x100, 0x47f: 0x101,
+ // Block 0x12, offset 0x480
+ 0x4b0: 0x23, 0x4b1: 0x102, 0x4b2: 0x103,
+ // Block 0x13, offset 0x4c0
+ 0x4c5: 0x104, 0x4c6: 0x105,
+ 0x4c9: 0x106,
+ 0x4d0: 0x107, 0x4d1: 0x108, 0x4d2: 0x109, 0x4d3: 0x10a, 0x4d4: 0x10b, 0x4d5: 0x10c, 0x4d6: 0x10d, 0x4d7: 0x10e,
+ 0x4d8: 0x10f, 0x4d9: 0x110, 0x4da: 0x111, 0x4db: 0x112, 0x4dc: 0x113, 0x4dd: 0x114, 0x4de: 0x115, 0x4df: 0x116,
+ 0x4e8: 0x117, 0x4e9: 0x118, 0x4ea: 0x119,
+ // Block 0x14, offset 0x500
+ 0x500: 0x11a,
+ 0x520: 0x23, 0x521: 0x23, 0x522: 0x23, 0x523: 0x11b, 0x524: 0x10, 0x525: 0x11c,
+ 0x538: 0x11d, 0x539: 0x11, 0x53a: 0x11e,
+ // Block 0x15, offset 0x540
+ 0x544: 0x11f, 0x545: 0x120, 0x546: 0x121,
+ 0x54f: 0x122,
+ // Block 0x16, offset 0x580
+ 0x590: 0x0a, 0x591: 0x0b, 0x592: 0x0c, 0x593: 0x0d, 0x594: 0x0e, 0x596: 0x0f,
+ 0x59b: 0x10, 0x59d: 0x11, 0x59e: 0x12, 0x59f: 0x13,
+ // Block 0x17, offset 0x5c0
+ 0x5c0: 0x123, 0x5c1: 0x124, 0x5c4: 0x124, 0x5c5: 0x124, 0x5c6: 0x124, 0x5c7: 0x125,
+ // Block 0x18, offset 0x600
+ 0x620: 0x15,
+}
+
+// sparseOffsets: 277 entries, 554 bytes
+var sparseOffsets = []uint16{0x0, 0x9, 0xf, 0x18, 0x24, 0x2e, 0x35, 0x38, 0x3c, 0x3f, 0x43, 0x4d, 0x4f, 0x54, 0x64, 0x6b, 0x70, 0x7e, 0x7f, 0x8d, 0x9c, 0xa6, 0xa9, 0xaf, 0xb7, 0xba, 0xbc, 0xca, 0xd0, 0xde, 0xe9, 0xf5, 0x100, 0x10c, 0x116, 0x122, 0x12d, 0x139, 0x145, 0x14d, 0x155, 0x15f, 0x16a, 0x176, 0x17d, 0x188, 0x18d, 0x195, 0x198, 0x19d, 0x1a1, 0x1a5, 0x1ac, 0x1b5, 0x1bd, 0x1be, 0x1c7, 0x1ce, 0x1d6, 0x1dc, 0x1e2, 0x1e7, 0x1eb, 0x1ee, 0x1f0, 0x1f3, 0x1f8, 0x1f9, 0x1fb, 0x1fd, 0x1ff, 0x206, 0x20b, 0x20f, 0x218, 0x21b, 0x21e, 0x224, 0x225, 0x230, 0x231, 0x232, 0x237, 0x244, 0x24c, 0x254, 0x25d, 0x266, 0x26f, 0x274, 0x277, 0x280, 0x28d, 0x28f, 0x296, 0x298, 0x2a4, 0x2a5, 0x2b0, 0x2b8, 0x2c0, 0x2c6, 0x2c7, 0x2d5, 0x2da, 0x2dd, 0x2e2, 0x2e6, 0x2ec, 0x2f1, 0x2f4, 0x2f9, 0x2fe, 0x2ff, 0x305, 0x307, 0x308, 0x30a, 0x30c, 0x30f, 0x310, 0x312, 0x315, 0x31b, 0x31f, 0x321, 0x326, 0x32d, 0x331, 0x33a, 0x33b, 0x343, 0x347, 0x34c, 0x354, 0x35a, 0x360, 0x36a, 0x36f, 0x378, 0x37e, 0x385, 0x389, 0x391, 0x393, 0x395, 0x398, 0x39a, 0x39c, 0x39d, 0x39e, 0x3a0, 0x3a2, 0x3a8, 0x3ad, 0x3af, 0x3b5, 0x3b8, 0x3ba, 0x3c0, 0x3c5, 0x3c7, 0x3c8, 0x3c9, 0x3ca, 0x3cc, 0x3ce, 0x3d0, 0x3d3, 0x3d5, 0x3d8, 0x3e0, 0x3e3, 0x3e7, 0x3ef, 0x3f1, 0x3f2, 0x3f3, 0x3f5, 0x3fb, 0x3fd, 0x3fe, 0x400, 0x402, 0x404, 0x411, 0x412, 0x413, 0x417, 0x419, 0x41a, 0x41b, 0x41c, 0x41d, 0x421, 0x425, 0x42b, 0x42d, 0x434, 0x437, 0x43b, 0x441, 0x44a, 0x450, 0x456, 0x460, 0x46a, 0x46c, 0x473, 0x479, 0x47f, 0x485, 0x488, 0x48e, 0x491, 0x499, 0x49a, 0x4a1, 0x4a2, 0x4a5, 0x4af, 0x4b5, 0x4bb, 0x4bc, 0x4c2, 0x4c5, 0x4cd, 0x4d4, 0x4db, 0x4dc, 0x4dd, 0x4de, 0x4df, 0x4e1, 0x4e3, 0x4e5, 0x4e9, 0x4ea, 0x4ec, 0x4ed, 0x4ee, 0x4f0, 0x4f5, 0x4fa, 0x4fe, 0x4ff, 0x502, 0x506, 0x511, 0x515, 0x51d, 0x522, 0x526, 0x529, 0x52d, 0x530, 0x533, 0x538, 0x53c, 0x540, 0x544, 0x548, 0x54a, 0x54c, 0x54f, 0x554, 0x556, 0x55b, 0x564, 0x569, 0x56a, 0x56d, 0x56e, 0x56f, 0x571, 0x572, 0x573}
+
+// sparseValues: 1395 entries, 5580 bytes
+var sparseValues = [1395]valueRange{
+ // Block 0x0, offset 0x0
+ {value: 0x0004, lo: 0xa8, hi: 0xa8},
+ {value: 0x0012, lo: 0xaa, hi: 0xaa},
+ {value: 0x0014, lo: 0xad, hi: 0xad},
+ {value: 0x0004, lo: 0xaf, hi: 0xaf},
+ {value: 0x0004, lo: 0xb4, hi: 0xb4},
+ {value: 0x002a, lo: 0xb5, hi: 0xb5},
+ {value: 0x0054, lo: 0xb7, hi: 0xb7},
+ {value: 0x0004, lo: 0xb8, hi: 0xb8},
+ {value: 0x0012, lo: 0xba, hi: 0xba},
+ // Block 0x1, offset 0x9
+ {value: 0x2013, lo: 0x80, hi: 0x96},
+ {value: 0x2013, lo: 0x98, hi: 0x9e},
+ {value: 0x00ea, lo: 0x9f, hi: 0x9f},
+ {value: 0x2012, lo: 0xa0, hi: 0xb6},
+ {value: 0x2012, lo: 0xb8, hi: 0xbe},
+ {value: 0x0252, lo: 0xbf, hi: 0xbf},
+ // Block 0x2, offset 0xf
+ {value: 0x0117, lo: 0x80, hi: 0xaf},
+ {value: 0x01eb, lo: 0xb0, hi: 0xb0},
+ {value: 0x02ea, lo: 0xb1, hi: 0xb1},
+ {value: 0x0117, lo: 0xb2, hi: 0xb7},
+ {value: 0x0012, lo: 0xb8, hi: 0xb8},
+ {value: 0x0316, lo: 0xb9, hi: 0xba},
+ {value: 0x0716, lo: 0xbb, hi: 0xbc},
+ {value: 0x0316, lo: 0xbd, hi: 0xbe},
+ {value: 0x0553, lo: 0xbf, hi: 0xbf},
+ // Block 0x3, offset 0x18
+ {value: 0x0552, lo: 0x80, hi: 0x80},
+ {value: 0x0316, lo: 0x81, hi: 0x82},
+ {value: 0x0716, lo: 0x83, hi: 0x84},
+ {value: 0x0316, lo: 0x85, hi: 0x86},
+ {value: 0x0f16, lo: 0x87, hi: 0x88},
+ {value: 0x034a, lo: 0x89, hi: 0x89},
+ {value: 0x0117, lo: 0x8a, hi: 0xb7},
+ {value: 0x0253, lo: 0xb8, hi: 0xb8},
+ {value: 0x0316, lo: 0xb9, hi: 0xba},
+ {value: 0x0716, lo: 0xbb, hi: 0xbc},
+ {value: 0x0316, lo: 0xbd, hi: 0xbe},
+ {value: 0x044a, lo: 0xbf, hi: 0xbf},
+ // Block 0x4, offset 0x24
+ {value: 0x0117, lo: 0x80, hi: 0x9f},
+ {value: 0x2f53, lo: 0xa0, hi: 0xa0},
+ {value: 0x0012, lo: 0xa1, hi: 0xa1},
+ {value: 0x0117, lo: 0xa2, hi: 0xb3},
+ {value: 0x0012, lo: 0xb4, hi: 0xb9},
+ {value: 0x10cb, lo: 0xba, hi: 0xba},
+ {value: 0x0716, lo: 0xbb, hi: 0xbc},
+ {value: 0x2953, lo: 0xbd, hi: 0xbd},
+ {value: 0x11cb, lo: 0xbe, hi: 0xbe},
+ {value: 0x12ca, lo: 0xbf, hi: 0xbf},
+ // Block 0x5, offset 0x2e
+ {value: 0x0015, lo: 0x80, hi: 0x81},
+ {value: 0x0014, lo: 0x82, hi: 0x97},
+ {value: 0x0004, lo: 0x98, hi: 0x9d},
+ {value: 0x0014, lo: 0x9e, hi: 0x9f},
+ {value: 0x0015, lo: 0xa0, hi: 0xa4},
+ {value: 0x0004, lo: 0xa5, hi: 0xab},
+ {value: 0x0014, lo: 0xac, hi: 0xbf},
+ // Block 0x6, offset 0x35
+ {value: 0x0024, lo: 0x80, hi: 0x94},
+ {value: 0x0034, lo: 0x95, hi: 0xbc},
+ {value: 0x0024, lo: 0xbd, hi: 0xbf},
+ // Block 0x7, offset 0x38
+ {value: 0x6553, lo: 0x80, hi: 0x8f},
+ {value: 0x2013, lo: 0x90, hi: 0x9f},
+ {value: 0x5f53, lo: 0xa0, hi: 0xaf},
+ {value: 0x2012, lo: 0xb0, hi: 0xbf},
+ // Block 0x8, offset 0x3c
+ {value: 0x5f52, lo: 0x80, hi: 0x8f},
+ {value: 0x6552, lo: 0x90, hi: 0x9f},
+ {value: 0x0117, lo: 0xa0, hi: 0xbf},
+ // Block 0x9, offset 0x3f
+ {value: 0x0117, lo: 0x80, hi: 0x81},
+ {value: 0x0024, lo: 0x83, hi: 0x87},
+ {value: 0x0014, lo: 0x88, hi: 0x89},
+ {value: 0x0117, lo: 0x8a, hi: 0xbf},
+ // Block 0xa, offset 0x43
+ {value: 0x0f13, lo: 0x80, hi: 0x80},
+ {value: 0x0316, lo: 0x81, hi: 0x82},
+ {value: 0x0716, lo: 0x83, hi: 0x84},
+ {value: 0x0316, lo: 0x85, hi: 0x86},
+ {value: 0x0f16, lo: 0x87, hi: 0x88},
+ {value: 0x0316, lo: 0x89, hi: 0x8a},
+ {value: 0x0716, lo: 0x8b, hi: 0x8c},
+ {value: 0x0316, lo: 0x8d, hi: 0x8e},
+ {value: 0x0f12, lo: 0x8f, hi: 0x8f},
+ {value: 0x0117, lo: 0x90, hi: 0xbf},
+ // Block 0xb, offset 0x4d
+ {value: 0x0117, lo: 0x80, hi: 0xaf},
+ {value: 0x6553, lo: 0xb1, hi: 0xbf},
+ // Block 0xc, offset 0x4f
+ {value: 0x3013, lo: 0x80, hi: 0x8f},
+ {value: 0x6853, lo: 0x90, hi: 0x96},
+ {value: 0x0014, lo: 0x99, hi: 0x99},
+ {value: 0x6552, lo: 0xa1, hi: 0xaf},
+ {value: 0x3012, lo: 0xb0, hi: 0xbf},
+ // Block 0xd, offset 0x54
+ {value: 0x6852, lo: 0x80, hi: 0x86},
+ {value: 0x27aa, lo: 0x87, hi: 0x87},
+ {value: 0x0034, lo: 0x91, hi: 0x91},
+ {value: 0x0024, lo: 0x92, hi: 0x95},
+ {value: 0x0034, lo: 0x96, hi: 0x96},
+ {value: 0x0024, lo: 0x97, hi: 0x99},
+ {value: 0x0034, lo: 0x9a, hi: 0x9b},
+ {value: 0x0024, lo: 0x9c, hi: 0xa1},
+ {value: 0x0034, lo: 0xa2, hi: 0xa7},
+ {value: 0x0024, lo: 0xa8, hi: 0xa9},
+ {value: 0x0034, lo: 0xaa, hi: 0xaa},
+ {value: 0x0024, lo: 0xab, hi: 0xac},
+ {value: 0x0034, lo: 0xad, hi: 0xae},
+ {value: 0x0024, lo: 0xaf, hi: 0xaf},
+ {value: 0x0034, lo: 0xb0, hi: 0xbd},
+ {value: 0x0034, lo: 0xbf, hi: 0xbf},
+ // Block 0xe, offset 0x64
+ {value: 0x0034, lo: 0x81, hi: 0x82},
+ {value: 0x0024, lo: 0x84, hi: 0x84},
+ {value: 0x0034, lo: 0x85, hi: 0x85},
+ {value: 0x0034, lo: 0x87, hi: 0x87},
+ {value: 0x0010, lo: 0x90, hi: 0xaa},
+ {value: 0x0010, lo: 0xb0, hi: 0xb3},
+ {value: 0x0054, lo: 0xb4, hi: 0xb4},
+ // Block 0xf, offset 0x6b
+ {value: 0x0014, lo: 0x80, hi: 0x85},
+ {value: 0x0024, lo: 0x90, hi: 0x97},
+ {value: 0x0034, lo: 0x98, hi: 0x9a},
+ {value: 0x0014, lo: 0x9c, hi: 0x9c},
+ {value: 0x0010, lo: 0xa0, hi: 0xbf},
+ // Block 0x10, offset 0x70
+ {value: 0x0014, lo: 0x80, hi: 0x80},
+ {value: 0x0010, lo: 0x81, hi: 0x8a},
+ {value: 0x0034, lo: 0x8b, hi: 0x92},
+ {value: 0x0024, lo: 0x93, hi: 0x94},
+ {value: 0x0034, lo: 0x95, hi: 0x96},
+ {value: 0x0024, lo: 0x97, hi: 0x9b},
+ {value: 0x0034, lo: 0x9c, hi: 0x9c},
+ {value: 0x0024, lo: 0x9d, hi: 0x9e},
+ {value: 0x0034, lo: 0x9f, hi: 0x9f},
+ {value: 0x0010, lo: 0xa0, hi: 0xa9},
+ {value: 0x0010, lo: 0xab, hi: 0xab},
+ {value: 0x0010, lo: 0xae, hi: 0xaf},
+ {value: 0x0034, lo: 0xb0, hi: 0xb0},
+ {value: 0x0010, lo: 0xb1, hi: 0xbf},
+ // Block 0x11, offset 0x7e
+ {value: 0x0010, lo: 0x80, hi: 0xbf},
+ // Block 0x12, offset 0x7f
+ {value: 0x0010, lo: 0x80, hi: 0x93},
+ {value: 0x0010, lo: 0x95, hi: 0x95},
+ {value: 0x0024, lo: 0x96, hi: 0x9c},
+ {value: 0x0014, lo: 0x9d, hi: 0x9d},
+ {value: 0x0024, lo: 0x9f, hi: 0xa2},
+ {value: 0x0034, lo: 0xa3, hi: 0xa3},
+ {value: 0x0024, lo: 0xa4, hi: 0xa4},
+ {value: 0x0014, lo: 0xa5, hi: 0xa6},
+ {value: 0x0024, lo: 0xa7, hi: 0xa8},
+ {value: 0x0034, lo: 0xaa, hi: 0xaa},
+ {value: 0x0024, lo: 0xab, hi: 0xac},
+ {value: 0x0034, lo: 0xad, hi: 0xad},
+ {value: 0x0010, lo: 0xae, hi: 0xbc},
+ {value: 0x0010, lo: 0xbf, hi: 0xbf},
+ // Block 0x13, offset 0x8d
+ {value: 0x0014, lo: 0x8f, hi: 0x8f},
+ {value: 0x0010, lo: 0x90, hi: 0x90},
+ {value: 0x0034, lo: 0x91, hi: 0x91},
+ {value: 0x0010, lo: 0x92, hi: 0xaf},
+ {value: 0x0024, lo: 0xb0, hi: 0xb0},
+ {value: 0x0034, lo: 0xb1, hi: 0xb1},
+ {value: 0x0024, lo: 0xb2, hi: 0xb3},
+ {value: 0x0034, lo: 0xb4, hi: 0xb4},
+ {value: 0x0024, lo: 0xb5, hi: 0xb6},
+ {value: 0x0034, lo: 0xb7, hi: 0xb9},
+ {value: 0x0024, lo: 0xba, hi: 0xba},
+ {value: 0x0034, lo: 0xbb, hi: 0xbc},
+ {value: 0x0024, lo: 0xbd, hi: 0xbd},
+ {value: 0x0034, lo: 0xbe, hi: 0xbe},
+ {value: 0x0024, lo: 0xbf, hi: 0xbf},
+ // Block 0x14, offset 0x9c
+ {value: 0x0024, lo: 0x80, hi: 0x81},
+ {value: 0x0034, lo: 0x82, hi: 0x82},
+ {value: 0x0024, lo: 0x83, hi: 0x83},
+ {value: 0x0034, lo: 0x84, hi: 0x84},
+ {value: 0x0024, lo: 0x85, hi: 0x85},
+ {value: 0x0034, lo: 0x86, hi: 0x86},
+ {value: 0x0024, lo: 0x87, hi: 0x87},
+ {value: 0x0034, lo: 0x88, hi: 0x88},
+ {value: 0x0024, lo: 0x89, hi: 0x8a},
+ {value: 0x0010, lo: 0x8d, hi: 0xbf},
+ // Block 0x15, offset 0xa6
+ {value: 0x0010, lo: 0x80, hi: 0xa5},
+ {value: 0x0014, lo: 0xa6, hi: 0xb0},
+ {value: 0x0010, lo: 0xb1, hi: 0xb1},
+ // Block 0x16, offset 0xa9
+ {value: 0x0010, lo: 0x80, hi: 0xaa},
+ {value: 0x0024, lo: 0xab, hi: 0xb1},
+ {value: 0x0034, lo: 0xb2, hi: 0xb2},
+ {value: 0x0024, lo: 0xb3, hi: 0xb3},
+ {value: 0x0014, lo: 0xb4, hi: 0xb5},
+ {value: 0x0014, lo: 0xba, hi: 0xba},
+ // Block 0x17, offset 0xaf
+ {value: 0x0010, lo: 0x80, hi: 0x95},
+ {value: 0x0024, lo: 0x96, hi: 0x99},
+ {value: 0x0014, lo: 0x9a, hi: 0x9a},
+ {value: 0x0024, lo: 0x9b, hi: 0xa3},
+ {value: 0x0014, lo: 0xa4, hi: 0xa4},
+ {value: 0x0024, lo: 0xa5, hi: 0xa7},
+ {value: 0x0014, lo: 0xa8, hi: 0xa8},
+ {value: 0x0024, lo: 0xa9, hi: 0xad},
+ // Block 0x18, offset 0xb7
+ {value: 0x0010, lo: 0x80, hi: 0x98},
+ {value: 0x0034, lo: 0x99, hi: 0x9b},
+ {value: 0x0010, lo: 0xa0, hi: 0xaa},
+ // Block 0x19, offset 0xba
+ {value: 0x0010, lo: 0xa0, hi: 0xb4},
+ {value: 0x0010, lo: 0xb6, hi: 0xbd},
+ // Block 0x1a, offset 0xbc
+ {value: 0x0024, lo: 0x94, hi: 0xa1},
+ {value: 0x0014, lo: 0xa2, hi: 0xa2},
+ {value: 0x0034, lo: 0xa3, hi: 0xa3},
+ {value: 0x0024, lo: 0xa4, hi: 0xa5},
+ {value: 0x0034, lo: 0xa6, hi: 0xa6},
+ {value: 0x0024, lo: 0xa7, hi: 0xa8},
+ {value: 0x0034, lo: 0xa9, hi: 0xa9},
+ {value: 0x0024, lo: 0xaa, hi: 0xac},
+ {value: 0x0034, lo: 0xad, hi: 0xb2},
+ {value: 0x0024, lo: 0xb3, hi: 0xb5},
+ {value: 0x0034, lo: 0xb6, hi: 0xb6},
+ {value: 0x0024, lo: 0xb7, hi: 0xb8},
+ {value: 0x0034, lo: 0xb9, hi: 0xba},
+ {value: 0x0024, lo: 0xbb, hi: 0xbf},
+ // Block 0x1b, offset 0xca
+ {value: 0x0014, lo: 0x80, hi: 0x82},
+ {value: 0x0010, lo: 0x83, hi: 0xb9},
+ {value: 0x0014, lo: 0xba, hi: 0xba},
+ {value: 0x0010, lo: 0xbb, hi: 0xbb},
+ {value: 0x0034, lo: 0xbc, hi: 0xbc},
+ {value: 0x0010, lo: 0xbd, hi: 0xbf},
+ // Block 0x1c, offset 0xd0
+ {value: 0x0010, lo: 0x80, hi: 0x80},
+ {value: 0x0014, lo: 0x81, hi: 0x88},
+ {value: 0x0010, lo: 0x89, hi: 0x8c},
+ {value: 0x0034, lo: 0x8d, hi: 0x8d},
+ {value: 0x0010, lo: 0x8e, hi: 0x90},
+ {value: 0x0024, lo: 0x91, hi: 0x91},
+ {value: 0x0034, lo: 0x92, hi: 0x92},
+ {value: 0x0024, lo: 0x93, hi: 0x94},
+ {value: 0x0014, lo: 0x95, hi: 0x97},
+ {value: 0x0010, lo: 0x98, hi: 0xa1},
+ {value: 0x0014, lo: 0xa2, hi: 0xa3},
+ {value: 0x0010, lo: 0xa6, hi: 0xaf},
+ {value: 0x0014, lo: 0xb1, hi: 0xb1},
+ {value: 0x0010, lo: 0xb2, hi: 0xbf},
+ // Block 0x1d, offset 0xde
+ {value: 0x0010, lo: 0x80, hi: 0x80},
+ {value: 0x0014, lo: 0x81, hi: 0x81},
+ {value: 0x0010, lo: 0x82, hi: 0x83},
+ {value: 0x0010, lo: 0x85, hi: 0x8c},
+ {value: 0x0010, lo: 0x8f, hi: 0x90},
+ {value: 0x0010, lo: 0x93, hi: 0xa8},
+ {value: 0x0010, lo: 0xaa, hi: 0xb0},
+ {value: 0x0010, lo: 0xb2, hi: 0xb2},
+ {value: 0x0010, lo: 0xb6, hi: 0xb9},
+ {value: 0x0034, lo: 0xbc, hi: 0xbc},
+ {value: 0x0010, lo: 0xbd, hi: 0xbf},
+ // Block 0x1e, offset 0xe9
+ {value: 0x0010, lo: 0x80, hi: 0x80},
+ {value: 0x0014, lo: 0x81, hi: 0x84},
+ {value: 0x0010, lo: 0x87, hi: 0x88},
+ {value: 0x0010, lo: 0x8b, hi: 0x8c},
+ {value: 0x0034, lo: 0x8d, hi: 0x8d},
+ {value: 0x0010, lo: 0x8e, hi: 0x8e},
+ {value: 0x0010, lo: 0x97, hi: 0x97},
+ {value: 0x0010, lo: 0x9c, hi: 0x9d},
+ {value: 0x0010, lo: 0x9f, hi: 0xa1},
+ {value: 0x0014, lo: 0xa2, hi: 0xa3},
+ {value: 0x0010, lo: 0xa6, hi: 0xb1},
+ {value: 0x0010, lo: 0xbc, hi: 0xbc},
+ // Block 0x1f, offset 0xf5
+ {value: 0x0014, lo: 0x81, hi: 0x82},
+ {value: 0x0010, lo: 0x83, hi: 0x83},
+ {value: 0x0010, lo: 0x85, hi: 0x8a},
+ {value: 0x0010, lo: 0x8f, hi: 0x90},
+ {value: 0x0010, lo: 0x93, hi: 0xa8},
+ {value: 0x0010, lo: 0xaa, hi: 0xb0},
+ {value: 0x0010, lo: 0xb2, hi: 0xb3},
+ {value: 0x0010, lo: 0xb5, hi: 0xb6},
+ {value: 0x0010, lo: 0xb8, hi: 0xb9},
+ {value: 0x0034, lo: 0xbc, hi: 0xbc},
+ {value: 0x0010, lo: 0xbe, hi: 0xbf},
+ // Block 0x20, offset 0x100
+ {value: 0x0010, lo: 0x80, hi: 0x80},
+ {value: 0x0014, lo: 0x81, hi: 0x82},
+ {value: 0x0014, lo: 0x87, hi: 0x88},
+ {value: 0x0014, lo: 0x8b, hi: 0x8c},
+ {value: 0x0034, lo: 0x8d, hi: 0x8d},
+ {value: 0x0014, lo: 0x91, hi: 0x91},
+ {value: 0x0010, lo: 0x99, hi: 0x9c},
+ {value: 0x0010, lo: 0x9e, hi: 0x9e},
+ {value: 0x0010, lo: 0xa6, hi: 0xaf},
+ {value: 0x0014, lo: 0xb0, hi: 0xb1},
+ {value: 0x0010, lo: 0xb2, hi: 0xb4},
+ {value: 0x0014, lo: 0xb5, hi: 0xb5},
+ // Block 0x21, offset 0x10c
+ {value: 0x0014, lo: 0x81, hi: 0x82},
+ {value: 0x0010, lo: 0x83, hi: 0x83},
+ {value: 0x0010, lo: 0x85, hi: 0x8d},
+ {value: 0x0010, lo: 0x8f, hi: 0x91},
+ {value: 0x0010, lo: 0x93, hi: 0xa8},
+ {value: 0x0010, lo: 0xaa, hi: 0xb0},
+ {value: 0x0010, lo: 0xb2, hi: 0xb3},
+ {value: 0x0010, lo: 0xb5, hi: 0xb9},
+ {value: 0x0034, lo: 0xbc, hi: 0xbc},
+ {value: 0x0010, lo: 0xbd, hi: 0xbf},
+ // Block 0x22, offset 0x116
+ {value: 0x0010, lo: 0x80, hi: 0x80},
+ {value: 0x0014, lo: 0x81, hi: 0x85},
+ {value: 0x0014, lo: 0x87, hi: 0x88},
+ {value: 0x0010, lo: 0x89, hi: 0x89},
+ {value: 0x0010, lo: 0x8b, hi: 0x8c},
+ {value: 0x0034, lo: 0x8d, hi: 0x8d},
+ {value: 0x0010, lo: 0x90, hi: 0x90},
+ {value: 0x0010, lo: 0xa0, hi: 0xa1},
+ {value: 0x0014, lo: 0xa2, hi: 0xa3},
+ {value: 0x0010, lo: 0xa6, hi: 0xaf},
+ {value: 0x0010, lo: 0xb9, hi: 0xb9},
+ {value: 0x0014, lo: 0xba, hi: 0xbf},
+ // Block 0x23, offset 0x122
+ {value: 0x0014, lo: 0x81, hi: 0x81},
+ {value: 0x0010, lo: 0x82, hi: 0x83},
+ {value: 0x0010, lo: 0x85, hi: 0x8c},
+ {value: 0x0010, lo: 0x8f, hi: 0x90},
+ {value: 0x0010, lo: 0x93, hi: 0xa8},
+ {value: 0x0010, lo: 0xaa, hi: 0xb0},
+ {value: 0x0010, lo: 0xb2, hi: 0xb3},
+ {value: 0x0010, lo: 0xb5, hi: 0xb9},
+ {value: 0x0034, lo: 0xbc, hi: 0xbc},
+ {value: 0x0010, lo: 0xbd, hi: 0xbe},
+ {value: 0x0014, lo: 0xbf, hi: 0xbf},
+ // Block 0x24, offset 0x12d
+ {value: 0x0010, lo: 0x80, hi: 0x80},
+ {value: 0x0014, lo: 0x81, hi: 0x84},
+ {value: 0x0010, lo: 0x87, hi: 0x88},
+ {value: 0x0010, lo: 0x8b, hi: 0x8c},
+ {value: 0x0034, lo: 0x8d, hi: 0x8d},
+ {value: 0x0014, lo: 0x96, hi: 0x96},
+ {value: 0x0010, lo: 0x97, hi: 0x97},
+ {value: 0x0010, lo: 0x9c, hi: 0x9d},
+ {value: 0x0010, lo: 0x9f, hi: 0xa1},
+ {value: 0x0014, lo: 0xa2, hi: 0xa3},
+ {value: 0x0010, lo: 0xa6, hi: 0xaf},
+ {value: 0x0010, lo: 0xb1, hi: 0xb1},
+ // Block 0x25, offset 0x139
+ {value: 0x0014, lo: 0x82, hi: 0x82},
+ {value: 0x0010, lo: 0x83, hi: 0x83},
+ {value: 0x0010, lo: 0x85, hi: 0x8a},
+ {value: 0x0010, lo: 0x8e, hi: 0x90},
+ {value: 0x0010, lo: 0x92, hi: 0x95},
+ {value: 0x0010, lo: 0x99, hi: 0x9a},
+ {value: 0x0010, lo: 0x9c, hi: 0x9c},
+ {value: 0x0010, lo: 0x9e, hi: 0x9f},
+ {value: 0x0010, lo: 0xa3, hi: 0xa4},
+ {value: 0x0010, lo: 0xa8, hi: 0xaa},
+ {value: 0x0010, lo: 0xae, hi: 0xb9},
+ {value: 0x0010, lo: 0xbe, hi: 0xbf},
+ // Block 0x26, offset 0x145
+ {value: 0x0014, lo: 0x80, hi: 0x80},
+ {value: 0x0010, lo: 0x81, hi: 0x82},
+ {value: 0x0010, lo: 0x86, hi: 0x88},
+ {value: 0x0010, lo: 0x8a, hi: 0x8c},
+ {value: 0x0034, lo: 0x8d, hi: 0x8d},
+ {value: 0x0010, lo: 0x90, hi: 0x90},
+ {value: 0x0010, lo: 0x97, hi: 0x97},
+ {value: 0x0010, lo: 0xa6, hi: 0xaf},
+ // Block 0x27, offset 0x14d
+ {value: 0x0014, lo: 0x80, hi: 0x80},
+ {value: 0x0010, lo: 0x81, hi: 0x83},
+ {value: 0x0010, lo: 0x85, hi: 0x8c},
+ {value: 0x0010, lo: 0x8e, hi: 0x90},
+ {value: 0x0010, lo: 0x92, hi: 0xa8},
+ {value: 0x0010, lo: 0xaa, hi: 0xb9},
+ {value: 0x0010, lo: 0xbd, hi: 0xbd},
+ {value: 0x0014, lo: 0xbe, hi: 0xbf},
+ // Block 0x28, offset 0x155
+ {value: 0x0014, lo: 0x80, hi: 0x80},
+ {value: 0x0010, lo: 0x81, hi: 0x84},
+ {value: 0x0014, lo: 0x86, hi: 0x88},
+ {value: 0x0014, lo: 0x8a, hi: 0x8c},
+ {value: 0x0034, lo: 0x8d, hi: 0x8d},
+ {value: 0x0034, lo: 0x95, hi: 0x96},
+ {value: 0x0010, lo: 0x98, hi: 0x9a},
+ {value: 0x0010, lo: 0xa0, hi: 0xa1},
+ {value: 0x0014, lo: 0xa2, hi: 0xa3},
+ {value: 0x0010, lo: 0xa6, hi: 0xaf},
+ // Block 0x29, offset 0x15f
+ {value: 0x0010, lo: 0x80, hi: 0x80},
+ {value: 0x0014, lo: 0x81, hi: 0x81},
+ {value: 0x0010, lo: 0x82, hi: 0x83},
+ {value: 0x0010, lo: 0x85, hi: 0x8c},
+ {value: 0x0010, lo: 0x8e, hi: 0x90},
+ {value: 0x0010, lo: 0x92, hi: 0xa8},
+ {value: 0x0010, lo: 0xaa, hi: 0xb3},
+ {value: 0x0010, lo: 0xb5, hi: 0xb9},
+ {value: 0x0034, lo: 0xbc, hi: 0xbc},
+ {value: 0x0010, lo: 0xbd, hi: 0xbe},
+ {value: 0x0014, lo: 0xbf, hi: 0xbf},
+ // Block 0x2a, offset 0x16a
+ {value: 0x0010, lo: 0x80, hi: 0x84},
+ {value: 0x0014, lo: 0x86, hi: 0x86},
+ {value: 0x0010, lo: 0x87, hi: 0x88},
+ {value: 0x0010, lo: 0x8a, hi: 0x8b},
+ {value: 0x0014, lo: 0x8c, hi: 0x8c},
+ {value: 0x0034, lo: 0x8d, hi: 0x8d},
+ {value: 0x0010, lo: 0x95, hi: 0x96},
+ {value: 0x0010, lo: 0x9e, hi: 0x9e},
+ {value: 0x0010, lo: 0xa0, hi: 0xa1},
+ {value: 0x0014, lo: 0xa2, hi: 0xa3},
+ {value: 0x0010, lo: 0xa6, hi: 0xaf},
+ {value: 0x0010, lo: 0xb1, hi: 0xb2},
+ // Block 0x2b, offset 0x176
+ {value: 0x0014, lo: 0x80, hi: 0x81},
+ {value: 0x0010, lo: 0x82, hi: 0x83},
+ {value: 0x0010, lo: 0x85, hi: 0x8c},
+ {value: 0x0010, lo: 0x8e, hi: 0x90},
+ {value: 0x0010, lo: 0x92, hi: 0xba},
+ {value: 0x0034, lo: 0xbb, hi: 0xbc},
+ {value: 0x0010, lo: 0xbd, hi: 0xbf},
+ // Block 0x2c, offset 0x17d
+ {value: 0x0010, lo: 0x80, hi: 0x80},
+ {value: 0x0014, lo: 0x81, hi: 0x84},
+ {value: 0x0010, lo: 0x86, hi: 0x88},
+ {value: 0x0010, lo: 0x8a, hi: 0x8c},
+ {value: 0x0034, lo: 0x8d, hi: 0x8d},
+ {value: 0x0010, lo: 0x8e, hi: 0x8e},
+ {value: 0x0010, lo: 0x94, hi: 0x97},
+ {value: 0x0010, lo: 0x9f, hi: 0xa1},
+ {value: 0x0014, lo: 0xa2, hi: 0xa3},
+ {value: 0x0010, lo: 0xa6, hi: 0xaf},
+ {value: 0x0010, lo: 0xba, hi: 0xbf},
+ // Block 0x2d, offset 0x188
+ {value: 0x0010, lo: 0x82, hi: 0x83},
+ {value: 0x0010, lo: 0x85, hi: 0x96},
+ {value: 0x0010, lo: 0x9a, hi: 0xb1},
+ {value: 0x0010, lo: 0xb3, hi: 0xbb},
+ {value: 0x0010, lo: 0xbd, hi: 0xbd},
+ // Block 0x2e, offset 0x18d
+ {value: 0x0010, lo: 0x80, hi: 0x86},
+ {value: 0x0034, lo: 0x8a, hi: 0x8a},
+ {value: 0x0010, lo: 0x8f, hi: 0x91},
+ {value: 0x0014, lo: 0x92, hi: 0x94},
+ {value: 0x0014, lo: 0x96, hi: 0x96},
+ {value: 0x0010, lo: 0x98, hi: 0x9f},
+ {value: 0x0010, lo: 0xa6, hi: 0xaf},
+ {value: 0x0010, lo: 0xb2, hi: 0xb3},
+ // Block 0x2f, offset 0x195
+ {value: 0x0014, lo: 0xb1, hi: 0xb1},
+ {value: 0x0014, lo: 0xb4, hi: 0xb7},
+ {value: 0x0034, lo: 0xb8, hi: 0xba},
+ // Block 0x30, offset 0x198
+ {value: 0x0004, lo: 0x86, hi: 0x86},
+ {value: 0x0014, lo: 0x87, hi: 0x87},
+ {value: 0x0034, lo: 0x88, hi: 0x8b},
+ {value: 0x0014, lo: 0x8c, hi: 0x8e},
+ {value: 0x0010, lo: 0x90, hi: 0x99},
+ // Block 0x31, offset 0x19d
+ {value: 0x0014, lo: 0xb1, hi: 0xb1},
+ {value: 0x0014, lo: 0xb4, hi: 0xb7},
+ {value: 0x0034, lo: 0xb8, hi: 0xb9},
+ {value: 0x0014, lo: 0xbb, hi: 0xbc},
+ // Block 0x32, offset 0x1a1
+ {value: 0x0004, lo: 0x86, hi: 0x86},
+ {value: 0x0034, lo: 0x88, hi: 0x8b},
+ {value: 0x0014, lo: 0x8c, hi: 0x8d},
+ {value: 0x0010, lo: 0x90, hi: 0x99},
+ // Block 0x33, offset 0x1a5
+ {value: 0x0010, lo: 0x80, hi: 0x80},
+ {value: 0x0034, lo: 0x98, hi: 0x99},
+ {value: 0x0010, lo: 0xa0, hi: 0xa9},
+ {value: 0x0034, lo: 0xb5, hi: 0xb5},
+ {value: 0x0034, lo: 0xb7, hi: 0xb7},
+ {value: 0x0034, lo: 0xb9, hi: 0xb9},
+ {value: 0x0010, lo: 0xbe, hi: 0xbf},
+ // Block 0x34, offset 0x1ac
+ {value: 0x0010, lo: 0x80, hi: 0x87},
+ {value: 0x0010, lo: 0x89, hi: 0xac},
+ {value: 0x0034, lo: 0xb1, hi: 0xb2},
+ {value: 0x0014, lo: 0xb3, hi: 0xb3},
+ {value: 0x0034, lo: 0xb4, hi: 0xb4},
+ {value: 0x0014, lo: 0xb5, hi: 0xb9},
+ {value: 0x0034, lo: 0xba, hi: 0xbd},
+ {value: 0x0014, lo: 0xbe, hi: 0xbe},
+ {value: 0x0010, lo: 0xbf, hi: 0xbf},
+ // Block 0x35, offset 0x1b5
+ {value: 0x0034, lo: 0x80, hi: 0x80},
+ {value: 0x0014, lo: 0x81, hi: 0x81},
+ {value: 0x0024, lo: 0x82, hi: 0x83},
+ {value: 0x0034, lo: 0x84, hi: 0x84},
+ {value: 0x0024, lo: 0x86, hi: 0x87},
+ {value: 0x0010, lo: 0x88, hi: 0x8c},
+ {value: 0x0014, lo: 0x8d, hi: 0x97},
+ {value: 0x0014, lo: 0x99, hi: 0xbc},
+ // Block 0x36, offset 0x1bd
+ {value: 0x0034, lo: 0x86, hi: 0x86},
+ // Block 0x37, offset 0x1be
+ {value: 0x0010, lo: 0xab, hi: 0xac},
+ {value: 0x0014, lo: 0xad, hi: 0xb0},
+ {value: 0x0010, lo: 0xb1, hi: 0xb1},
+ {value: 0x0014, lo: 0xb2, hi: 0xb6},
+ {value: 0x0034, lo: 0xb7, hi: 0xb7},
+ {value: 0x0010, lo: 0xb8, hi: 0xb8},
+ {value: 0x0034, lo: 0xb9, hi: 0xba},
+ {value: 0x0010, lo: 0xbb, hi: 0xbc},
+ {value: 0x0014, lo: 0xbd, hi: 0xbe},
+ // Block 0x38, offset 0x1c7
+ {value: 0x0010, lo: 0x80, hi: 0x89},
+ {value: 0x0010, lo: 0x96, hi: 0x97},
+ {value: 0x0014, lo: 0x98, hi: 0x99},
+ {value: 0x0014, lo: 0x9e, hi: 0xa0},
+ {value: 0x0010, lo: 0xa2, hi: 0xa4},
+ {value: 0x0010, lo: 0xa7, hi: 0xad},
+ {value: 0x0014, lo: 0xb1, hi: 0xb4},
+ // Block 0x39, offset 0x1ce
+ {value: 0x0014, lo: 0x82, hi: 0x82},
+ {value: 0x0010, lo: 0x83, hi: 0x84},
+ {value: 0x0014, lo: 0x85, hi: 0x86},
+ {value: 0x0010, lo: 0x87, hi: 0x8c},
+ {value: 0x0034, lo: 0x8d, hi: 0x8d},
+ {value: 0x0010, lo: 0x8f, hi: 0x9c},
+ {value: 0x0014, lo: 0x9d, hi: 0x9d},
+ {value: 0x6c53, lo: 0xa0, hi: 0xbf},
+ // Block 0x3a, offset 0x1d6
+ {value: 0x7053, lo: 0x80, hi: 0x85},
+ {value: 0x7053, lo: 0x87, hi: 0x87},
+ {value: 0x7053, lo: 0x8d, hi: 0x8d},
+ {value: 0x0010, lo: 0x90, hi: 0xba},
+ {value: 0x0014, lo: 0xbc, hi: 0xbc},
+ {value: 0x0010, lo: 0xbd, hi: 0xbf},
+ // Block 0x3b, offset 0x1dc
+ {value: 0x0010, lo: 0x80, hi: 0x88},
+ {value: 0x0010, lo: 0x8a, hi: 0x8d},
+ {value: 0x0010, lo: 0x90, hi: 0x96},
+ {value: 0x0010, lo: 0x98, hi: 0x98},
+ {value: 0x0010, lo: 0x9a, hi: 0x9d},
+ {value: 0x0010, lo: 0xa0, hi: 0xbf},
+ // Block 0x3c, offset 0x1e2
+ {value: 0x0010, lo: 0x80, hi: 0x88},
+ {value: 0x0010, lo: 0x8a, hi: 0x8d},
+ {value: 0x0010, lo: 0x90, hi: 0xb0},
+ {value: 0x0010, lo: 0xb2, hi: 0xb5},
+ {value: 0x0010, lo: 0xb8, hi: 0xbe},
+ // Block 0x3d, offset 0x1e7
+ {value: 0x0010, lo: 0x80, hi: 0x80},
+ {value: 0x0010, lo: 0x82, hi: 0x85},
+ {value: 0x0010, lo: 0x88, hi: 0x96},
+ {value: 0x0010, lo: 0x98, hi: 0xbf},
+ // Block 0x3e, offset 0x1eb
+ {value: 0x0010, lo: 0x80, hi: 0x90},
+ {value: 0x0010, lo: 0x92, hi: 0x95},
+ {value: 0x0010, lo: 0x98, hi: 0xbf},
+ // Block 0x3f, offset 0x1ee
+ {value: 0x0010, lo: 0x80, hi: 0x9a},
+ {value: 0x0024, lo: 0x9d, hi: 0x9f},
+ // Block 0x40, offset 0x1f0
+ {value: 0x0010, lo: 0x80, hi: 0x8f},
+ {value: 0x7453, lo: 0xa0, hi: 0xaf},
+ {value: 0x7853, lo: 0xb0, hi: 0xbf},
+ // Block 0x41, offset 0x1f3
+ {value: 0x7c53, lo: 0x80, hi: 0x8f},
+ {value: 0x8053, lo: 0x90, hi: 0x9f},
+ {value: 0x7c53, lo: 0xa0, hi: 0xaf},
+ {value: 0x0813, lo: 0xb0, hi: 0xb5},
+ {value: 0x0892, lo: 0xb8, hi: 0xbd},
+ // Block 0x42, offset 0x1f8
+ {value: 0x0010, lo: 0x81, hi: 0xbf},
+ // Block 0x43, offset 0x1f9
+ {value: 0x0010, lo: 0x80, hi: 0xac},
+ {value: 0x0010, lo: 0xaf, hi: 0xbf},
+ // Block 0x44, offset 0x1fb
+ {value: 0x0010, lo: 0x81, hi: 0x9a},
+ {value: 0x0010, lo: 0xa0, hi: 0xbf},
+ // Block 0x45, offset 0x1fd
+ {value: 0x0010, lo: 0x80, hi: 0xaa},
+ {value: 0x0010, lo: 0xae, hi: 0xb8},
+ // Block 0x46, offset 0x1ff
+ {value: 0x0010, lo: 0x80, hi: 0x8c},
+ {value: 0x0010, lo: 0x8e, hi: 0x91},
+ {value: 0x0014, lo: 0x92, hi: 0x93},
+ {value: 0x0034, lo: 0x94, hi: 0x94},
+ {value: 0x0010, lo: 0xa0, hi: 0xb1},
+ {value: 0x0014, lo: 0xb2, hi: 0xb3},
+ {value: 0x0034, lo: 0xb4, hi: 0xb4},
+ // Block 0x47, offset 0x206
+ {value: 0x0010, lo: 0x80, hi: 0x91},
+ {value: 0x0014, lo: 0x92, hi: 0x93},
+ {value: 0x0010, lo: 0xa0, hi: 0xac},
+ {value: 0x0010, lo: 0xae, hi: 0xb0},
+ {value: 0x0014, lo: 0xb2, hi: 0xb3},
+ // Block 0x48, offset 0x20b
+ {value: 0x0014, lo: 0xb4, hi: 0xb5},
+ {value: 0x0010, lo: 0xb6, hi: 0xb6},
+ {value: 0x0014, lo: 0xb7, hi: 0xbd},
+ {value: 0x0010, lo: 0xbe, hi: 0xbf},
+ // Block 0x49, offset 0x20f
+ {value: 0x0010, lo: 0x80, hi: 0x85},
+ {value: 0x0014, lo: 0x86, hi: 0x86},
+ {value: 0x0010, lo: 0x87, hi: 0x88},
+ {value: 0x0014, lo: 0x89, hi: 0x91},
+ {value: 0x0034, lo: 0x92, hi: 0x92},
+ {value: 0x0014, lo: 0x93, hi: 0x93},
+ {value: 0x0004, lo: 0x97, hi: 0x97},
+ {value: 0x0024, lo: 0x9d, hi: 0x9d},
+ {value: 0x0010, lo: 0xa0, hi: 0xa9},
+ // Block 0x4a, offset 0x218
+ {value: 0x0014, lo: 0x8b, hi: 0x8e},
+ {value: 0x0010, lo: 0x90, hi: 0x99},
+ {value: 0x0010, lo: 0xa0, hi: 0xbf},
+ // Block 0x4b, offset 0x21b
+ {value: 0x0010, lo: 0x80, hi: 0x82},
+ {value: 0x0014, lo: 0x83, hi: 0x83},
+ {value: 0x0010, lo: 0x84, hi: 0xb7},
+ // Block 0x4c, offset 0x21e
+ {value: 0x0010, lo: 0x80, hi: 0x84},
+ {value: 0x0014, lo: 0x85, hi: 0x86},
+ {value: 0x0010, lo: 0x87, hi: 0xa8},
+ {value: 0x0034, lo: 0xa9, hi: 0xa9},
+ {value: 0x0010, lo: 0xaa, hi: 0xaa},
+ {value: 0x0010, lo: 0xb0, hi: 0xbf},
+ // Block 0x4d, offset 0x224
+ {value: 0x0010, lo: 0x80, hi: 0xb5},
+ // Block 0x4e, offset 0x225
+ {value: 0x0010, lo: 0x80, hi: 0x9e},
+ {value: 0x0014, lo: 0xa0, hi: 0xa2},
+ {value: 0x0010, lo: 0xa3, hi: 0xa6},
+ {value: 0x0014, lo: 0xa7, hi: 0xa8},
+ {value: 0x0010, lo: 0xa9, hi: 0xab},
+ {value: 0x0010, lo: 0xb0, hi: 0xb1},
+ {value: 0x0014, lo: 0xb2, hi: 0xb2},
+ {value: 0x0010, lo: 0xb3, hi: 0xb8},
+ {value: 0x0034, lo: 0xb9, hi: 0xb9},
+ {value: 0x0024, lo: 0xba, hi: 0xba},
+ {value: 0x0034, lo: 0xbb, hi: 0xbb},
+ // Block 0x4f, offset 0x230
+ {value: 0x0010, lo: 0x86, hi: 0x8f},
+ // Block 0x50, offset 0x231
+ {value: 0x0010, lo: 0x90, hi: 0x99},
+ // Block 0x51, offset 0x232
+ {value: 0x0010, lo: 0x80, hi: 0x96},
+ {value: 0x0024, lo: 0x97, hi: 0x97},
+ {value: 0x0034, lo: 0x98, hi: 0x98},
+ {value: 0x0010, lo: 0x99, hi: 0x9a},
+ {value: 0x0014, lo: 0x9b, hi: 0x9b},
+ // Block 0x52, offset 0x237
+ {value: 0x0010, lo: 0x95, hi: 0x95},
+ {value: 0x0014, lo: 0x96, hi: 0x96},
+ {value: 0x0010, lo: 0x97, hi: 0x97},
+ {value: 0x0014, lo: 0x98, hi: 0x9e},
+ {value: 0x0034, lo: 0xa0, hi: 0xa0},
+ {value: 0x0010, lo: 0xa1, hi: 0xa1},
+ {value: 0x0014, lo: 0xa2, hi: 0xa2},
+ {value: 0x0010, lo: 0xa3, hi: 0xa4},
+ {value: 0x0014, lo: 0xa5, hi: 0xac},
+ {value: 0x0010, lo: 0xad, hi: 0xb2},
+ {value: 0x0014, lo: 0xb3, hi: 0xb4},
+ {value: 0x0024, lo: 0xb5, hi: 0xbc},
+ {value: 0x0034, lo: 0xbf, hi: 0xbf},
+ // Block 0x53, offset 0x244
+ {value: 0x0010, lo: 0x80, hi: 0x89},
+ {value: 0x0010, lo: 0x90, hi: 0x99},
+ {value: 0x0004, lo: 0xa7, hi: 0xa7},
+ {value: 0x0024, lo: 0xb0, hi: 0xb4},
+ {value: 0x0034, lo: 0xb5, hi: 0xba},
+ {value: 0x0024, lo: 0xbb, hi: 0xbc},
+ {value: 0x0034, lo: 0xbd, hi: 0xbd},
+ {value: 0x0014, lo: 0xbe, hi: 0xbe},
+ // Block 0x54, offset 0x24c
+ {value: 0x0014, lo: 0x80, hi: 0x83},
+ {value: 0x0010, lo: 0x84, hi: 0xb3},
+ {value: 0x0034, lo: 0xb4, hi: 0xb4},
+ {value: 0x0010, lo: 0xb5, hi: 0xb5},
+ {value: 0x0014, lo: 0xb6, hi: 0xba},
+ {value: 0x0010, lo: 0xbb, hi: 0xbb},
+ {value: 0x0014, lo: 0xbc, hi: 0xbc},
+ {value: 0x0010, lo: 0xbd, hi: 0xbf},
+ // Block 0x55, offset 0x254
+ {value: 0x0010, lo: 0x80, hi: 0x81},
+ {value: 0x0014, lo: 0x82, hi: 0x82},
+ {value: 0x0010, lo: 0x83, hi: 0x83},
+ {value: 0x0030, lo: 0x84, hi: 0x84},
+ {value: 0x0010, lo: 0x85, hi: 0x8b},
+ {value: 0x0010, lo: 0x90, hi: 0x99},
+ {value: 0x0024, lo: 0xab, hi: 0xab},
+ {value: 0x0034, lo: 0xac, hi: 0xac},
+ {value: 0x0024, lo: 0xad, hi: 0xb3},
+ // Block 0x56, offset 0x25d
+ {value: 0x0014, lo: 0x80, hi: 0x81},
+ {value: 0x0010, lo: 0x82, hi: 0xa1},
+ {value: 0x0014, lo: 0xa2, hi: 0xa5},
+ {value: 0x0010, lo: 0xa6, hi: 0xa7},
+ {value: 0x0014, lo: 0xa8, hi: 0xa9},
+ {value: 0x0030, lo: 0xaa, hi: 0xaa},
+ {value: 0x0034, lo: 0xab, hi: 0xab},
+ {value: 0x0014, lo: 0xac, hi: 0xad},
+ {value: 0x0010, lo: 0xae, hi: 0xbf},
+ // Block 0x57, offset 0x266
+ {value: 0x0010, lo: 0x80, hi: 0xa5},
+ {value: 0x0034, lo: 0xa6, hi: 0xa6},
+ {value: 0x0010, lo: 0xa7, hi: 0xa7},
+ {value: 0x0014, lo: 0xa8, hi: 0xa9},
+ {value: 0x0010, lo: 0xaa, hi: 0xac},
+ {value: 0x0014, lo: 0xad, hi: 0xad},
+ {value: 0x0010, lo: 0xae, hi: 0xae},
+ {value: 0x0014, lo: 0xaf, hi: 0xb1},
+ {value: 0x0030, lo: 0xb2, hi: 0xb3},
+ // Block 0x58, offset 0x26f
+ {value: 0x0010, lo: 0x80, hi: 0xab},
+ {value: 0x0014, lo: 0xac, hi: 0xb3},
+ {value: 0x0010, lo: 0xb4, hi: 0xb5},
+ {value: 0x0014, lo: 0xb6, hi: 0xb6},
+ {value: 0x0034, lo: 0xb7, hi: 0xb7},
+ // Block 0x59, offset 0x274
+ {value: 0x0010, lo: 0x80, hi: 0x89},
+ {value: 0x0010, lo: 0x8d, hi: 0xb7},
+ {value: 0x0014, lo: 0xb8, hi: 0xbd},
+ // Block 0x5a, offset 0x277
+ {value: 0x296a, lo: 0x80, hi: 0x80},
+ {value: 0x2a2a, lo: 0x81, hi: 0x81},
+ {value: 0x2aea, lo: 0x82, hi: 0x82},
+ {value: 0x2baa, lo: 0x83, hi: 0x83},
+ {value: 0x2c6a, lo: 0x84, hi: 0x84},
+ {value: 0x2d2a, lo: 0x85, hi: 0x85},
+ {value: 0x2dea, lo: 0x86, hi: 0x86},
+ {value: 0x2eaa, lo: 0x87, hi: 0x87},
+ {value: 0x2f6a, lo: 0x88, hi: 0x88},
+ // Block 0x5b, offset 0x280
+ {value: 0x0024, lo: 0x90, hi: 0x92},
+ {value: 0x0034, lo: 0x94, hi: 0x99},
+ {value: 0x0024, lo: 0x9a, hi: 0x9b},
+ {value: 0x0034, lo: 0x9c, hi: 0x9f},
+ {value: 0x0024, lo: 0xa0, hi: 0xa0},
+ {value: 0x0010, lo: 0xa1, hi: 0xa1},
+ {value: 0x0034, lo: 0xa2, hi: 0xa8},
+ {value: 0x0010, lo: 0xa9, hi: 0xac},
+ {value: 0x0034, lo: 0xad, hi: 0xad},
+ {value: 0x0010, lo: 0xae, hi: 0xb3},
+ {value: 0x0024, lo: 0xb4, hi: 0xb4},
+ {value: 0x0010, lo: 0xb5, hi: 0xb7},
+ {value: 0x0024, lo: 0xb8, hi: 0xb9},
+ // Block 0x5c, offset 0x28d
+ {value: 0x0012, lo: 0x80, hi: 0xab},
+ {value: 0x0015, lo: 0xac, hi: 0xbf},
+ // Block 0x5d, offset 0x28f
+ {value: 0x0015, lo: 0x80, hi: 0xaa},
+ {value: 0x0012, lo: 0xab, hi: 0xb7},
+ {value: 0x0015, lo: 0xb8, hi: 0xb8},
+ {value: 0x8452, lo: 0xb9, hi: 0xb9},
+ {value: 0x0012, lo: 0xba, hi: 0xbc},
+ {value: 0x8852, lo: 0xbd, hi: 0xbd},
+ {value: 0x0012, lo: 0xbe, hi: 0xbf},
+ // Block 0x5e, offset 0x296
+ {value: 0x0012, lo: 0x80, hi: 0x9a},
+ {value: 0x0015, lo: 0x9b, hi: 0xbf},
+ // Block 0x5f, offset 0x298
+ {value: 0x0024, lo: 0x80, hi: 0x81},
+ {value: 0x0034, lo: 0x82, hi: 0x82},
+ {value: 0x0024, lo: 0x83, hi: 0x89},
+ {value: 0x0034, lo: 0x8a, hi: 0x8a},
+ {value: 0x0024, lo: 0x8b, hi: 0x8c},
+ {value: 0x0034, lo: 0x8d, hi: 0x90},
+ {value: 0x0024, lo: 0x91, hi: 0xb5},
+ {value: 0x0034, lo: 0xb6, hi: 0xb9},
+ {value: 0x0024, lo: 0xbb, hi: 0xbb},
+ {value: 0x0034, lo: 0xbc, hi: 0xbd},
+ {value: 0x0024, lo: 0xbe, hi: 0xbe},
+ {value: 0x0034, lo: 0xbf, hi: 0xbf},
+ // Block 0x60, offset 0x2a4
+ {value: 0x0117, lo: 0x80, hi: 0xbf},
+ // Block 0x61, offset 0x2a5
+ {value: 0x0117, lo: 0x80, hi: 0x95},
+ {value: 0x306a, lo: 0x96, hi: 0x96},
+ {value: 0x316a, lo: 0x97, hi: 0x97},
+ {value: 0x326a, lo: 0x98, hi: 0x98},
+ {value: 0x336a, lo: 0x99, hi: 0x99},
+ {value: 0x346a, lo: 0x9a, hi: 0x9a},
+ {value: 0x356a, lo: 0x9b, hi: 0x9b},
+ {value: 0x0012, lo: 0x9c, hi: 0x9d},
+ {value: 0x366b, lo: 0x9e, hi: 0x9e},
+ {value: 0x0012, lo: 0x9f, hi: 0x9f},
+ {value: 0x0117, lo: 0xa0, hi: 0xbf},
+ // Block 0x62, offset 0x2b0
+ {value: 0x0812, lo: 0x80, hi: 0x87},
+ {value: 0x0813, lo: 0x88, hi: 0x8f},
+ {value: 0x0812, lo: 0x90, hi: 0x95},
+ {value: 0x0813, lo: 0x98, hi: 0x9d},
+ {value: 0x0812, lo: 0xa0, hi: 0xa7},
+ {value: 0x0813, lo: 0xa8, hi: 0xaf},
+ {value: 0x0812, lo: 0xb0, hi: 0xb7},
+ {value: 0x0813, lo: 0xb8, hi: 0xbf},
+ // Block 0x63, offset 0x2b8
+ {value: 0x0004, lo: 0x8b, hi: 0x8b},
+ {value: 0x0014, lo: 0x8c, hi: 0x8f},
+ {value: 0x0054, lo: 0x98, hi: 0x99},
+ {value: 0x0054, lo: 0xa4, hi: 0xa4},
+ {value: 0x0054, lo: 0xa7, hi: 0xa7},
+ {value: 0x0014, lo: 0xaa, hi: 0xae},
+ {value: 0x0010, lo: 0xaf, hi: 0xaf},
+ {value: 0x0010, lo: 0xbf, hi: 0xbf},
+ // Block 0x64, offset 0x2c0
+ {value: 0x0010, lo: 0x80, hi: 0x80},
+ {value: 0x0010, lo: 0x94, hi: 0x94},
+ {value: 0x0014, lo: 0xa0, hi: 0xa4},
+ {value: 0x0014, lo: 0xa6, hi: 0xaf},
+ {value: 0x0015, lo: 0xb1, hi: 0xb1},
+ {value: 0x0015, lo: 0xbf, hi: 0xbf},
+ // Block 0x65, offset 0x2c6
+ {value: 0x0015, lo: 0x90, hi: 0x9c},
+ // Block 0x66, offset 0x2c7
+ {value: 0x0024, lo: 0x90, hi: 0x91},
+ {value: 0x0034, lo: 0x92, hi: 0x93},
+ {value: 0x0024, lo: 0x94, hi: 0x97},
+ {value: 0x0034, lo: 0x98, hi: 0x9a},
+ {value: 0x0024, lo: 0x9b, hi: 0x9c},
+ {value: 0x0014, lo: 0x9d, hi: 0xa0},
+ {value: 0x0024, lo: 0xa1, hi: 0xa1},
+ {value: 0x0014, lo: 0xa2, hi: 0xa4},
+ {value: 0x0034, lo: 0xa5, hi: 0xa6},
+ {value: 0x0024, lo: 0xa7, hi: 0xa7},
+ {value: 0x0034, lo: 0xa8, hi: 0xa8},
+ {value: 0x0024, lo: 0xa9, hi: 0xa9},
+ {value: 0x0034, lo: 0xaa, hi: 0xaf},
+ {value: 0x0024, lo: 0xb0, hi: 0xb0},
+ // Block 0x67, offset 0x2d5
+ {value: 0x0016, lo: 0x85, hi: 0x86},
+ {value: 0x0012, lo: 0x87, hi: 0x89},
+ {value: 0x9d52, lo: 0x8e, hi: 0x8e},
+ {value: 0x1013, lo: 0xa0, hi: 0xaf},
+ {value: 0x1012, lo: 0xb0, hi: 0xbf},
+ // Block 0x68, offset 0x2da
+ {value: 0x0010, lo: 0x80, hi: 0x82},
+ {value: 0x0716, lo: 0x83, hi: 0x84},
+ {value: 0x0010, lo: 0x85, hi: 0x88},
+ // Block 0x69, offset 0x2dd
+ {value: 0xa053, lo: 0xb6, hi: 0xb7},
+ {value: 0xa353, lo: 0xb8, hi: 0xb9},
+ {value: 0xa653, lo: 0xba, hi: 0xbb},
+ {value: 0xa353, lo: 0xbc, hi: 0xbd},
+ {value: 0xa053, lo: 0xbe, hi: 0xbf},
+ // Block 0x6a, offset 0x2e2
+ {value: 0x3013, lo: 0x80, hi: 0x8f},
+ {value: 0x6553, lo: 0x90, hi: 0x9f},
+ {value: 0xa953, lo: 0xa0, hi: 0xae},
+ {value: 0x3012, lo: 0xb0, hi: 0xbf},
+ // Block 0x6b, offset 0x2e6
+ {value: 0x0117, lo: 0x80, hi: 0xa3},
+ {value: 0x0012, lo: 0xa4, hi: 0xa4},
+ {value: 0x0716, lo: 0xab, hi: 0xac},
+ {value: 0x0316, lo: 0xad, hi: 0xae},
+ {value: 0x0024, lo: 0xaf, hi: 0xb1},
+ {value: 0x0117, lo: 0xb2, hi: 0xb3},
+ // Block 0x6c, offset 0x2ec
+ {value: 0x6c52, lo: 0x80, hi: 0x9f},
+ {value: 0x7052, lo: 0xa0, hi: 0xa5},
+ {value: 0x7052, lo: 0xa7, hi: 0xa7},
+ {value: 0x7052, lo: 0xad, hi: 0xad},
+ {value: 0x0010, lo: 0xb0, hi: 0xbf},
+ // Block 0x6d, offset 0x2f1
+ {value: 0x0010, lo: 0x80, hi: 0xa7},
+ {value: 0x0014, lo: 0xaf, hi: 0xaf},
+ {value: 0x0034, lo: 0xbf, hi: 0xbf},
+ // Block 0x6e, offset 0x2f4
+ {value: 0x0010, lo: 0x80, hi: 0x96},
+ {value: 0x0010, lo: 0xa0, hi: 0xa6},
+ {value: 0x0010, lo: 0xa8, hi: 0xae},
+ {value: 0x0010, lo: 0xb0, hi: 0xb6},
+ {value: 0x0010, lo: 0xb8, hi: 0xbe},
+ // Block 0x6f, offset 0x2f9
+ {value: 0x0010, lo: 0x80, hi: 0x86},
+ {value: 0x0010, lo: 0x88, hi: 0x8e},
+ {value: 0x0010, lo: 0x90, hi: 0x96},
+ {value: 0x0010, lo: 0x98, hi: 0x9e},
+ {value: 0x0024, lo: 0xa0, hi: 0xbf},
+ // Block 0x70, offset 0x2fe
+ {value: 0x0014, lo: 0xaf, hi: 0xaf},
+ // Block 0x71, offset 0x2ff
+ {value: 0x0014, lo: 0x85, hi: 0x85},
+ {value: 0x0034, lo: 0xaa, hi: 0xad},
+ {value: 0x0030, lo: 0xae, hi: 0xaf},
+ {value: 0x0004, lo: 0xb1, hi: 0xb5},
+ {value: 0x0014, lo: 0xbb, hi: 0xbb},
+ {value: 0x0010, lo: 0xbc, hi: 0xbc},
+ // Block 0x72, offset 0x305
+ {value: 0x0034, lo: 0x99, hi: 0x9a},
+ {value: 0x0004, lo: 0x9b, hi: 0x9e},
+ // Block 0x73, offset 0x307
+ {value: 0x0004, lo: 0xbc, hi: 0xbe},
+ // Block 0x74, offset 0x308
+ {value: 0x0010, lo: 0x85, hi: 0xae},
+ {value: 0x0010, lo: 0xb1, hi: 0xbf},
+ // Block 0x75, offset 0x30a
+ {value: 0x0010, lo: 0x80, hi: 0x8e},
+ {value: 0x0010, lo: 0xa0, hi: 0xba},
+ // Block 0x76, offset 0x30c
+ {value: 0x0010, lo: 0x80, hi: 0x94},
+ {value: 0x0014, lo: 0x95, hi: 0x95},
+ {value: 0x0010, lo: 0x96, hi: 0xbf},
+ // Block 0x77, offset 0x30f
+ {value: 0x0010, lo: 0x80, hi: 0x8c},
+ // Block 0x78, offset 0x310
+ {value: 0x0010, lo: 0x90, hi: 0xb7},
+ {value: 0x0014, lo: 0xb8, hi: 0xbd},
+ // Block 0x79, offset 0x312
+ {value: 0x0010, lo: 0x80, hi: 0x8b},
+ {value: 0x0014, lo: 0x8c, hi: 0x8c},
+ {value: 0x0010, lo: 0x90, hi: 0xab},
+ // Block 0x7a, offset 0x315
+ {value: 0x0117, lo: 0x80, hi: 0xad},
+ {value: 0x0010, lo: 0xae, hi: 0xae},
+ {value: 0x0024, lo: 0xaf, hi: 0xaf},
+ {value: 0x0014, lo: 0xb0, hi: 0xb2},
+ {value: 0x0024, lo: 0xb4, hi: 0xbd},
+ {value: 0x0014, lo: 0xbf, hi: 0xbf},
+ // Block 0x7b, offset 0x31b
+ {value: 0x0117, lo: 0x80, hi: 0x9b},
+ {value: 0x0015, lo: 0x9c, hi: 0x9d},
+ {value: 0x0024, lo: 0x9e, hi: 0x9f},
+ {value: 0x0010, lo: 0xa0, hi: 0xbf},
+ // Block 0x7c, offset 0x31f
+ {value: 0x0010, lo: 0x80, hi: 0xaf},
+ {value: 0x0024, lo: 0xb0, hi: 0xb1},
+ // Block 0x7d, offset 0x321
+ {value: 0x0004, lo: 0x80, hi: 0x96},
+ {value: 0x0014, lo: 0x97, hi: 0xa1},
+ {value: 0x0117, lo: 0xa2, hi: 0xaf},
+ {value: 0x0012, lo: 0xb0, hi: 0xb1},
+ {value: 0x0117, lo: 0xb2, hi: 0xbf},
+ // Block 0x7e, offset 0x326
+ {value: 0x0117, lo: 0x80, hi: 0xaf},
+ {value: 0x0015, lo: 0xb0, hi: 0xb0},
+ {value: 0x0012, lo: 0xb1, hi: 0xb8},
+ {value: 0x0316, lo: 0xb9, hi: 0xba},
+ {value: 0x0716, lo: 0xbb, hi: 0xbc},
+ {value: 0x8453, lo: 0xbd, hi: 0xbd},
+ {value: 0x0117, lo: 0xbe, hi: 0xbf},
+ // Block 0x7f, offset 0x32d
+ {value: 0x0010, lo: 0xb7, hi: 0xb7},
+ {value: 0x0015, lo: 0xb8, hi: 0xb9},
+ {value: 0x0012, lo: 0xba, hi: 0xba},
+ {value: 0x0010, lo: 0xbb, hi: 0xbf},
+ // Block 0x80, offset 0x331
+ {value: 0x0010, lo: 0x80, hi: 0x81},
+ {value: 0x0014, lo: 0x82, hi: 0x82},
+ {value: 0x0010, lo: 0x83, hi: 0x85},
+ {value: 0x0034, lo: 0x86, hi: 0x86},
+ {value: 0x0010, lo: 0x87, hi: 0x8a},
+ {value: 0x0014, lo: 0x8b, hi: 0x8b},
+ {value: 0x0010, lo: 0x8c, hi: 0xa4},
+ {value: 0x0014, lo: 0xa5, hi: 0xa6},
+ {value: 0x0010, lo: 0xa7, hi: 0xa7},
+ // Block 0x81, offset 0x33a
+ {value: 0x0010, lo: 0x80, hi: 0xb3},
+ // Block 0x82, offset 0x33b
+ {value: 0x0010, lo: 0x80, hi: 0x83},
+ {value: 0x0034, lo: 0x84, hi: 0x84},
+ {value: 0x0014, lo: 0x85, hi: 0x85},
+ {value: 0x0010, lo: 0x90, hi: 0x99},
+ {value: 0x0024, lo: 0xa0, hi: 0xb1},
+ {value: 0x0010, lo: 0xb2, hi: 0xb7},
+ {value: 0x0010, lo: 0xbb, hi: 0xbb},
+ {value: 0x0010, lo: 0xbd, hi: 0xbd},
+ // Block 0x83, offset 0x343
+ {value: 0x0010, lo: 0x80, hi: 0xa5},
+ {value: 0x0014, lo: 0xa6, hi: 0xaa},
+ {value: 0x0034, lo: 0xab, hi: 0xad},
+ {value: 0x0010, lo: 0xb0, hi: 0xbf},
+ // Block 0x84, offset 0x347
+ {value: 0x0010, lo: 0x80, hi: 0x86},
+ {value: 0x0014, lo: 0x87, hi: 0x91},
+ {value: 0x0010, lo: 0x92, hi: 0x92},
+ {value: 0x0030, lo: 0x93, hi: 0x93},
+ {value: 0x0010, lo: 0xa0, hi: 0xbc},
+ // Block 0x85, offset 0x34c
+ {value: 0x0014, lo: 0x80, hi: 0x82},
+ {value: 0x0010, lo: 0x83, hi: 0xb2},
+ {value: 0x0034, lo: 0xb3, hi: 0xb3},
+ {value: 0x0010, lo: 0xb4, hi: 0xb5},
+ {value: 0x0014, lo: 0xb6, hi: 0xb9},
+ {value: 0x0010, lo: 0xba, hi: 0xbb},
+ {value: 0x0014, lo: 0xbc, hi: 0xbc},
+ {value: 0x0010, lo: 0xbd, hi: 0xbf},
+ // Block 0x86, offset 0x354
+ {value: 0x0030, lo: 0x80, hi: 0x80},
+ {value: 0x0014, lo: 0x8f, hi: 0x8f},
+ {value: 0x0010, lo: 0x90, hi: 0x99},
+ {value: 0x0014, lo: 0xa5, hi: 0xa5},
+ {value: 0x0004, lo: 0xa6, hi: 0xa6},
+ {value: 0x0010, lo: 0xb0, hi: 0xb9},
+ // Block 0x87, offset 0x35a
+ {value: 0x0010, lo: 0x80, hi: 0xa8},
+ {value: 0x0014, lo: 0xa9, hi: 0xae},
+ {value: 0x0010, lo: 0xaf, hi: 0xb0},
+ {value: 0x0014, lo: 0xb1, hi: 0xb2},
+ {value: 0x0010, lo: 0xb3, hi: 0xb4},
+ {value: 0x0014, lo: 0xb5, hi: 0xb6},
+ // Block 0x88, offset 0x360
+ {value: 0x0010, lo: 0x80, hi: 0x82},
+ {value: 0x0014, lo: 0x83, hi: 0x83},
+ {value: 0x0010, lo: 0x84, hi: 0x8b},
+ {value: 0x0014, lo: 0x8c, hi: 0x8c},
+ {value: 0x0010, lo: 0x8d, hi: 0x8d},
+ {value: 0x0010, lo: 0x90, hi: 0x99},
+ {value: 0x0004, lo: 0xb0, hi: 0xb0},
+ {value: 0x0010, lo: 0xbb, hi: 0xbb},
+ {value: 0x0014, lo: 0xbc, hi: 0xbc},
+ {value: 0x0010, lo: 0xbd, hi: 0xbd},
+ // Block 0x89, offset 0x36a
+ {value: 0x0024, lo: 0xb0, hi: 0xb0},
+ {value: 0x0024, lo: 0xb2, hi: 0xb3},
+ {value: 0x0034, lo: 0xb4, hi: 0xb4},
+ {value: 0x0024, lo: 0xb7, hi: 0xb8},
+ {value: 0x0024, lo: 0xbe, hi: 0xbf},
+ // Block 0x8a, offset 0x36f
+ {value: 0x0024, lo: 0x81, hi: 0x81},
+ {value: 0x0004, lo: 0x9d, hi: 0x9d},
+ {value: 0x0010, lo: 0xa0, hi: 0xab},
+ {value: 0x0014, lo: 0xac, hi: 0xad},
+ {value: 0x0010, lo: 0xae, hi: 0xaf},
+ {value: 0x0010, lo: 0xb2, hi: 0xb2},
+ {value: 0x0014, lo: 0xb3, hi: 0xb4},
+ {value: 0x0010, lo: 0xb5, hi: 0xb5},
+ {value: 0x0034, lo: 0xb6, hi: 0xb6},
+ // Block 0x8b, offset 0x378
+ {value: 0x0010, lo: 0x81, hi: 0x86},
+ {value: 0x0010, lo: 0x89, hi: 0x8e},
+ {value: 0x0010, lo: 0x91, hi: 0x96},
+ {value: 0x0010, lo: 0xa0, hi: 0xa6},
+ {value: 0x0010, lo: 0xa8, hi: 0xae},
+ {value: 0x0012, lo: 0xb0, hi: 0xbf},
+ // Block 0x8c, offset 0x37e
+ {value: 0x0012, lo: 0x80, hi: 0x92},
+ {value: 0xac52, lo: 0x93, hi: 0x93},
+ {value: 0x0012, lo: 0x94, hi: 0x9a},
+ {value: 0x0014, lo: 0x9b, hi: 0x9b},
+ {value: 0x0015, lo: 0x9c, hi: 0x9f},
+ {value: 0x0012, lo: 0xa0, hi: 0xa5},
+ {value: 0x74d2, lo: 0xb0, hi: 0xbf},
+ // Block 0x8d, offset 0x385
+ {value: 0x78d2, lo: 0x80, hi: 0x8f},
+ {value: 0x7cd2, lo: 0x90, hi: 0x9f},
+ {value: 0x80d2, lo: 0xa0, hi: 0xaf},
+ {value: 0x7cd2, lo: 0xb0, hi: 0xbf},
+ // Block 0x8e, offset 0x389
+ {value: 0x0010, lo: 0x80, hi: 0xa4},
+ {value: 0x0014, lo: 0xa5, hi: 0xa5},
+ {value: 0x0010, lo: 0xa6, hi: 0xa7},
+ {value: 0x0014, lo: 0xa8, hi: 0xa8},
+ {value: 0x0010, lo: 0xa9, hi: 0xaa},
+ {value: 0x0010, lo: 0xac, hi: 0xac},
+ {value: 0x0034, lo: 0xad, hi: 0xad},
+ {value: 0x0010, lo: 0xb0, hi: 0xb9},
+ // Block 0x8f, offset 0x391
+ {value: 0x0010, lo: 0x80, hi: 0xa3},
+ {value: 0x0010, lo: 0xb0, hi: 0xbf},
+ // Block 0x90, offset 0x393
+ {value: 0x0010, lo: 0x80, hi: 0x86},
+ {value: 0x0010, lo: 0x8b, hi: 0xbb},
+ // Block 0x91, offset 0x395
+ {value: 0x0010, lo: 0x80, hi: 0x81},
+ {value: 0x0010, lo: 0x83, hi: 0x84},
+ {value: 0x0010, lo: 0x86, hi: 0xbf},
+ // Block 0x92, offset 0x398
+ {value: 0x0010, lo: 0x80, hi: 0xb1},
+ {value: 0x0004, lo: 0xb2, hi: 0xbf},
+ // Block 0x93, offset 0x39a
+ {value: 0x0004, lo: 0x80, hi: 0x81},
+ {value: 0x0010, lo: 0x93, hi: 0xbf},
+ // Block 0x94, offset 0x39c
+ {value: 0x0010, lo: 0x80, hi: 0xbd},
+ // Block 0x95, offset 0x39d
+ {value: 0x0010, lo: 0x90, hi: 0xbf},
+ // Block 0x96, offset 0x39e
+ {value: 0x0010, lo: 0x80, hi: 0x8f},
+ {value: 0x0010, lo: 0x92, hi: 0xbf},
+ // Block 0x97, offset 0x3a0
+ {value: 0x0010, lo: 0x80, hi: 0x87},
+ {value: 0x0010, lo: 0xb0, hi: 0xbb},
+ // Block 0x98, offset 0x3a2
+ {value: 0x0014, lo: 0x80, hi: 0x8f},
+ {value: 0x0054, lo: 0x93, hi: 0x93},
+ {value: 0x0024, lo: 0xa0, hi: 0xa6},
+ {value: 0x0034, lo: 0xa7, hi: 0xad},
+ {value: 0x0024, lo: 0xae, hi: 0xaf},
+ {value: 0x0010, lo: 0xb3, hi: 0xb4},
+ // Block 0x99, offset 0x3a8
+ {value: 0x0010, lo: 0x8d, hi: 0x8f},
+ {value: 0x0054, lo: 0x92, hi: 0x92},
+ {value: 0x0054, lo: 0x95, hi: 0x95},
+ {value: 0x0010, lo: 0xb0, hi: 0xb4},
+ {value: 0x0010, lo: 0xb6, hi: 0xbf},
+ // Block 0x9a, offset 0x3ad
+ {value: 0x0010, lo: 0x80, hi: 0xbc},
+ {value: 0x0014, lo: 0xbf, hi: 0xbf},
+ // Block 0x9b, offset 0x3af
+ {value: 0x0054, lo: 0x87, hi: 0x87},
+ {value: 0x0054, lo: 0x8e, hi: 0x8e},
+ {value: 0x0054, lo: 0x9a, hi: 0x9a},
+ {value: 0x5f53, lo: 0xa1, hi: 0xba},
+ {value: 0x0004, lo: 0xbe, hi: 0xbe},
+ {value: 0x0010, lo: 0xbf, hi: 0xbf},
+ // Block 0x9c, offset 0x3b5
+ {value: 0x0004, lo: 0x80, hi: 0x80},
+ {value: 0x5f52, lo: 0x81, hi: 0x9a},
+ {value: 0x0004, lo: 0xb0, hi: 0xb0},
+ // Block 0x9d, offset 0x3b8
+ {value: 0x0014, lo: 0x9e, hi: 0x9f},
+ {value: 0x0010, lo: 0xa0, hi: 0xbe},
+ // Block 0x9e, offset 0x3ba
+ {value: 0x0010, lo: 0x82, hi: 0x87},
+ {value: 0x0010, lo: 0x8a, hi: 0x8f},
+ {value: 0x0010, lo: 0x92, hi: 0x97},
+ {value: 0x0010, lo: 0x9a, hi: 0x9c},
+ {value: 0x0004, lo: 0xa3, hi: 0xa3},
+ {value: 0x0014, lo: 0xb9, hi: 0xbb},
+ // Block 0x9f, offset 0x3c0
+ {value: 0x0010, lo: 0x80, hi: 0x8b},
+ {value: 0x0010, lo: 0x8d, hi: 0xa6},
+ {value: 0x0010, lo: 0xa8, hi: 0xba},
+ {value: 0x0010, lo: 0xbc, hi: 0xbd},
+ {value: 0x0010, lo: 0xbf, hi: 0xbf},
+ // Block 0xa0, offset 0x3c5
+ {value: 0x0010, lo: 0x80, hi: 0x8d},
+ {value: 0x0010, lo: 0x90, hi: 0x9d},
+ // Block 0xa1, offset 0x3c7
+ {value: 0x0010, lo: 0x80, hi: 0xba},
+ // Block 0xa2, offset 0x3c8
+ {value: 0x0010, lo: 0x80, hi: 0xb4},
+ // Block 0xa3, offset 0x3c9
+ {value: 0x0034, lo: 0xbd, hi: 0xbd},
+ // Block 0xa4, offset 0x3ca
+ {value: 0x0010, lo: 0x80, hi: 0x9c},
+ {value: 0x0010, lo: 0xa0, hi: 0xbf},
+ // Block 0xa5, offset 0x3cc
+ {value: 0x0010, lo: 0x80, hi: 0x90},
+ {value: 0x0034, lo: 0xa0, hi: 0xa0},
+ // Block 0xa6, offset 0x3ce
+ {value: 0x0010, lo: 0x80, hi: 0x9f},
+ {value: 0x0010, lo: 0xad, hi: 0xbf},
+ // Block 0xa7, offset 0x3d0
+ {value: 0x0010, lo: 0x80, hi: 0x8a},
+ {value: 0x0010, lo: 0x90, hi: 0xb5},
+ {value: 0x0024, lo: 0xb6, hi: 0xba},
+ // Block 0xa8, offset 0x3d3
+ {value: 0x0010, lo: 0x80, hi: 0x9d},
+ {value: 0x0010, lo: 0xa0, hi: 0xbf},
+ // Block 0xa9, offset 0x3d5
+ {value: 0x0010, lo: 0x80, hi: 0x83},
+ {value: 0x0010, lo: 0x88, hi: 0x8f},
+ {value: 0x0010, lo: 0x91, hi: 0x95},
+ // Block 0xaa, offset 0x3d8
+ {value: 0x2813, lo: 0x80, hi: 0x87},
+ {value: 0x3813, lo: 0x88, hi: 0x8f},
+ {value: 0x2813, lo: 0x90, hi: 0x97},
+ {value: 0xaf53, lo: 0x98, hi: 0x9f},
+ {value: 0xb253, lo: 0xa0, hi: 0xa7},
+ {value: 0x2812, lo: 0xa8, hi: 0xaf},
+ {value: 0x3812, lo: 0xb0, hi: 0xb7},
+ {value: 0x2812, lo: 0xb8, hi: 0xbf},
+ // Block 0xab, offset 0x3e0
+ {value: 0xaf52, lo: 0x80, hi: 0x87},
+ {value: 0xb252, lo: 0x88, hi: 0x8f},
+ {value: 0x0010, lo: 0x90, hi: 0xbf},
+ // Block 0xac, offset 0x3e3
+ {value: 0x0010, lo: 0x80, hi: 0x9d},
+ {value: 0x0010, lo: 0xa0, hi: 0xa9},
+ {value: 0xb253, lo: 0xb0, hi: 0xb7},
+ {value: 0xaf53, lo: 0xb8, hi: 0xbf},
+ // Block 0xad, offset 0x3e7
+ {value: 0x2813, lo: 0x80, hi: 0x87},
+ {value: 0x3813, lo: 0x88, hi: 0x8f},
+ {value: 0x2813, lo: 0x90, hi: 0x93},
+ {value: 0xb252, lo: 0x98, hi: 0x9f},
+ {value: 0xaf52, lo: 0xa0, hi: 0xa7},
+ {value: 0x2812, lo: 0xa8, hi: 0xaf},
+ {value: 0x3812, lo: 0xb0, hi: 0xb7},
+ {value: 0x2812, lo: 0xb8, hi: 0xbb},
+ // Block 0xae, offset 0x3ef
+ {value: 0x0010, lo: 0x80, hi: 0xa7},
+ {value: 0x0010, lo: 0xb0, hi: 0xbf},
+ // Block 0xaf, offset 0x3f1
+ {value: 0x0010, lo: 0x80, hi: 0xa3},
+ // Block 0xb0, offset 0x3f2
+ {value: 0x0010, lo: 0x80, hi: 0xb6},
+ // Block 0xb1, offset 0x3f3
+ {value: 0x0010, lo: 0x80, hi: 0x95},
+ {value: 0x0010, lo: 0xa0, hi: 0xa7},
+ // Block 0xb2, offset 0x3f5
+ {value: 0x0010, lo: 0x80, hi: 0x85},
+ {value: 0x0010, lo: 0x88, hi: 0x88},
+ {value: 0x0010, lo: 0x8a, hi: 0xb5},
+ {value: 0x0010, lo: 0xb7, hi: 0xb8},
+ {value: 0x0010, lo: 0xbc, hi: 0xbc},
+ {value: 0x0010, lo: 0xbf, hi: 0xbf},
+ // Block 0xb3, offset 0x3fb
+ {value: 0x0010, lo: 0x80, hi: 0x95},
+ {value: 0x0010, lo: 0xa0, hi: 0xb6},
+ // Block 0xb4, offset 0x3fd
+ {value: 0x0010, lo: 0x80, hi: 0x9e},
+ // Block 0xb5, offset 0x3fe
+ {value: 0x0010, lo: 0xa0, hi: 0xb2},
+ {value: 0x0010, lo: 0xb4, hi: 0xb5},
+ // Block 0xb6, offset 0x400
+ {value: 0x0010, lo: 0x80, hi: 0x95},
+ {value: 0x0010, lo: 0xa0, hi: 0xb9},
+ // Block 0xb7, offset 0x402
+ {value: 0x0010, lo: 0x80, hi: 0xb7},
+ {value: 0x0010, lo: 0xbe, hi: 0xbf},
+ // Block 0xb8, offset 0x404
+ {value: 0x0010, lo: 0x80, hi: 0x80},
+ {value: 0x0014, lo: 0x81, hi: 0x83},
+ {value: 0x0014, lo: 0x85, hi: 0x86},
+ {value: 0x0014, lo: 0x8c, hi: 0x8c},
+ {value: 0x0034, lo: 0x8d, hi: 0x8d},
+ {value: 0x0014, lo: 0x8e, hi: 0x8e},
+ {value: 0x0024, lo: 0x8f, hi: 0x8f},
+ {value: 0x0010, lo: 0x90, hi: 0x93},
+ {value: 0x0010, lo: 0x95, hi: 0x97},
+ {value: 0x0010, lo: 0x99, hi: 0xb3},
+ {value: 0x0024, lo: 0xb8, hi: 0xb8},
+ {value: 0x0034, lo: 0xb9, hi: 0xba},
+ {value: 0x0034, lo: 0xbf, hi: 0xbf},
+ // Block 0xb9, offset 0x411
+ {value: 0x0010, lo: 0xa0, hi: 0xbc},
+ // Block 0xba, offset 0x412
+ {value: 0x0010, lo: 0x80, hi: 0x9c},
+ // Block 0xbb, offset 0x413
+ {value: 0x0010, lo: 0x80, hi: 0x87},
+ {value: 0x0010, lo: 0x89, hi: 0xa4},
+ {value: 0x0024, lo: 0xa5, hi: 0xa5},
+ {value: 0x0034, lo: 0xa6, hi: 0xa6},
+ // Block 0xbc, offset 0x417
+ {value: 0x0010, lo: 0x80, hi: 0x95},
+ {value: 0x0010, lo: 0xa0, hi: 0xb2},
+ // Block 0xbd, offset 0x419
+ {value: 0x0010, lo: 0x80, hi: 0x91},
+ // Block 0xbe, offset 0x41a
+ {value: 0x0010, lo: 0x80, hi: 0x88},
+ // Block 0xbf, offset 0x41b
+ {value: 0x5653, lo: 0x80, hi: 0xb2},
+ // Block 0xc0, offset 0x41c
+ {value: 0x5652, lo: 0x80, hi: 0xb2},
+ // Block 0xc1, offset 0x41d
+ {value: 0x0010, lo: 0x80, hi: 0x80},
+ {value: 0x0014, lo: 0x81, hi: 0x81},
+ {value: 0x0010, lo: 0x82, hi: 0xb7},
+ {value: 0x0014, lo: 0xb8, hi: 0xbf},
+ // Block 0xc2, offset 0x421
+ {value: 0x0014, lo: 0x80, hi: 0x85},
+ {value: 0x0034, lo: 0x86, hi: 0x86},
+ {value: 0x0010, lo: 0xa6, hi: 0xaf},
+ {value: 0x0034, lo: 0xbf, hi: 0xbf},
+ // Block 0xc3, offset 0x425
+ {value: 0x0014, lo: 0x80, hi: 0x81},
+ {value: 0x0010, lo: 0x82, hi: 0xb2},
+ {value: 0x0014, lo: 0xb3, hi: 0xb6},
+ {value: 0x0010, lo: 0xb7, hi: 0xb8},
+ {value: 0x0034, lo: 0xb9, hi: 0xba},
+ {value: 0x0014, lo: 0xbd, hi: 0xbd},
+ // Block 0xc4, offset 0x42b
+ {value: 0x0010, lo: 0x90, hi: 0xa8},
+ {value: 0x0010, lo: 0xb0, hi: 0xb9},
+ // Block 0xc5, offset 0x42d
+ {value: 0x0024, lo: 0x80, hi: 0x82},
+ {value: 0x0010, lo: 0x83, hi: 0xa6},
+ {value: 0x0014, lo: 0xa7, hi: 0xab},
+ {value: 0x0010, lo: 0xac, hi: 0xac},
+ {value: 0x0014, lo: 0xad, hi: 0xb2},
+ {value: 0x0034, lo: 0xb3, hi: 0xb4},
+ {value: 0x0010, lo: 0xb6, hi: 0xbf},
+ // Block 0xc6, offset 0x434
+ {value: 0x0010, lo: 0x90, hi: 0xb2},
+ {value: 0x0034, lo: 0xb3, hi: 0xb3},
+ {value: 0x0010, lo: 0xb6, hi: 0xb6},
+ // Block 0xc7, offset 0x437
+ {value: 0x0014, lo: 0x80, hi: 0x81},
+ {value: 0x0010, lo: 0x82, hi: 0xb5},
+ {value: 0x0014, lo: 0xb6, hi: 0xbe},
+ {value: 0x0010, lo: 0xbf, hi: 0xbf},
+ // Block 0xc8, offset 0x43b
+ {value: 0x0030, lo: 0x80, hi: 0x80},
+ {value: 0x0010, lo: 0x81, hi: 0x84},
+ {value: 0x0034, lo: 0x8a, hi: 0x8a},
+ {value: 0x0014, lo: 0x8b, hi: 0x8c},
+ {value: 0x0010, lo: 0x90, hi: 0x9a},
+ {value: 0x0010, lo: 0x9c, hi: 0x9c},
+ // Block 0xc9, offset 0x441
+ {value: 0x0010, lo: 0x80, hi: 0x91},
+ {value: 0x0010, lo: 0x93, hi: 0xae},
+ {value: 0x0014, lo: 0xaf, hi: 0xb1},
+ {value: 0x0010, lo: 0xb2, hi: 0xb3},
+ {value: 0x0014, lo: 0xb4, hi: 0xb4},
+ {value: 0x0030, lo: 0xb5, hi: 0xb5},
+ {value: 0x0034, lo: 0xb6, hi: 0xb6},
+ {value: 0x0014, lo: 0xb7, hi: 0xb7},
+ {value: 0x0014, lo: 0xbe, hi: 0xbe},
+ // Block 0xca, offset 0x44a
+ {value: 0x0010, lo: 0x80, hi: 0x86},
+ {value: 0x0010, lo: 0x88, hi: 0x88},
+ {value: 0x0010, lo: 0x8a, hi: 0x8d},
+ {value: 0x0010, lo: 0x8f, hi: 0x9d},
+ {value: 0x0010, lo: 0x9f, hi: 0xa8},
+ {value: 0x0010, lo: 0xb0, hi: 0xbf},
+ // Block 0xcb, offset 0x450
+ {value: 0x0010, lo: 0x80, hi: 0x9e},
+ {value: 0x0014, lo: 0x9f, hi: 0x9f},
+ {value: 0x0010, lo: 0xa0, hi: 0xa2},
+ {value: 0x0014, lo: 0xa3, hi: 0xa8},
+ {value: 0x0034, lo: 0xa9, hi: 0xaa},
+ {value: 0x0010, lo: 0xb0, hi: 0xb9},
+ // Block 0xcc, offset 0x456
+ {value: 0x0014, lo: 0x80, hi: 0x81},
+ {value: 0x0010, lo: 0x82, hi: 0x83},
+ {value: 0x0010, lo: 0x85, hi: 0x8c},
+ {value: 0x0010, lo: 0x8f, hi: 0x90},
+ {value: 0x0010, lo: 0x93, hi: 0xa8},
+ {value: 0x0010, lo: 0xaa, hi: 0xb0},
+ {value: 0x0010, lo: 0xb2, hi: 0xb3},
+ {value: 0x0010, lo: 0xb5, hi: 0xb9},
+ {value: 0x0034, lo: 0xbc, hi: 0xbc},
+ {value: 0x0010, lo: 0xbd, hi: 0xbf},
+ // Block 0xcd, offset 0x460
+ {value: 0x0014, lo: 0x80, hi: 0x80},
+ {value: 0x0010, lo: 0x81, hi: 0x84},
+ {value: 0x0010, lo: 0x87, hi: 0x88},
+ {value: 0x0010, lo: 0x8b, hi: 0x8c},
+ {value: 0x0030, lo: 0x8d, hi: 0x8d},
+ {value: 0x0010, lo: 0x90, hi: 0x90},
+ {value: 0x0010, lo: 0x97, hi: 0x97},
+ {value: 0x0010, lo: 0x9d, hi: 0xa3},
+ {value: 0x0024, lo: 0xa6, hi: 0xac},
+ {value: 0x0024, lo: 0xb0, hi: 0xb4},
+ // Block 0xce, offset 0x46a
+ {value: 0x0010, lo: 0x80, hi: 0xb7},
+ {value: 0x0014, lo: 0xb8, hi: 0xbf},
+ // Block 0xcf, offset 0x46c
+ {value: 0x0010, lo: 0x80, hi: 0x81},
+ {value: 0x0034, lo: 0x82, hi: 0x82},
+ {value: 0x0014, lo: 0x83, hi: 0x84},
+ {value: 0x0010, lo: 0x85, hi: 0x85},
+ {value: 0x0034, lo: 0x86, hi: 0x86},
+ {value: 0x0010, lo: 0x87, hi: 0x8a},
+ {value: 0x0010, lo: 0x90, hi: 0x99},
+ // Block 0xd0, offset 0x473
+ {value: 0x0010, lo: 0x80, hi: 0xb2},
+ {value: 0x0014, lo: 0xb3, hi: 0xb8},
+ {value: 0x0010, lo: 0xb9, hi: 0xb9},
+ {value: 0x0014, lo: 0xba, hi: 0xba},
+ {value: 0x0010, lo: 0xbb, hi: 0xbe},
+ {value: 0x0014, lo: 0xbf, hi: 0xbf},
+ // Block 0xd1, offset 0x479
+ {value: 0x0014, lo: 0x80, hi: 0x80},
+ {value: 0x0010, lo: 0x81, hi: 0x81},
+ {value: 0x0034, lo: 0x82, hi: 0x83},
+ {value: 0x0010, lo: 0x84, hi: 0x85},
+ {value: 0x0010, lo: 0x87, hi: 0x87},
+ {value: 0x0010, lo: 0x90, hi: 0x99},
+ // Block 0xd2, offset 0x47f
+ {value: 0x0010, lo: 0x80, hi: 0xb1},
+ {value: 0x0014, lo: 0xb2, hi: 0xb5},
+ {value: 0x0010, lo: 0xb8, hi: 0xbb},
+ {value: 0x0014, lo: 0xbc, hi: 0xbd},
+ {value: 0x0010, lo: 0xbe, hi: 0xbe},
+ {value: 0x0034, lo: 0xbf, hi: 0xbf},
+ // Block 0xd3, offset 0x485
+ {value: 0x0034, lo: 0x80, hi: 0x80},
+ {value: 0x0010, lo: 0x98, hi: 0x9b},
+ {value: 0x0014, lo: 0x9c, hi: 0x9d},
+ // Block 0xd4, offset 0x488
+ {value: 0x0010, lo: 0x80, hi: 0xb2},
+ {value: 0x0014, lo: 0xb3, hi: 0xba},
+ {value: 0x0010, lo: 0xbb, hi: 0xbc},
+ {value: 0x0014, lo: 0xbd, hi: 0xbd},
+ {value: 0x0010, lo: 0xbe, hi: 0xbe},
+ {value: 0x0034, lo: 0xbf, hi: 0xbf},
+ // Block 0xd5, offset 0x48e
+ {value: 0x0014, lo: 0x80, hi: 0x80},
+ {value: 0x0010, lo: 0x84, hi: 0x84},
+ {value: 0x0010, lo: 0x90, hi: 0x99},
+ // Block 0xd6, offset 0x491
+ {value: 0x0010, lo: 0x80, hi: 0xaa},
+ {value: 0x0014, lo: 0xab, hi: 0xab},
+ {value: 0x0010, lo: 0xac, hi: 0xac},
+ {value: 0x0014, lo: 0xad, hi: 0xad},
+ {value: 0x0010, lo: 0xae, hi: 0xaf},
+ {value: 0x0014, lo: 0xb0, hi: 0xb5},
+ {value: 0x0030, lo: 0xb6, hi: 0xb6},
+ {value: 0x0034, lo: 0xb7, hi: 0xb7},
+ // Block 0xd7, offset 0x499
+ {value: 0x0010, lo: 0x80, hi: 0x89},
+ // Block 0xd8, offset 0x49a
+ {value: 0x0014, lo: 0x9d, hi: 0x9f},
+ {value: 0x0010, lo: 0xa0, hi: 0xa1},
+ {value: 0x0014, lo: 0xa2, hi: 0xa5},
+ {value: 0x0010, lo: 0xa6, hi: 0xa6},
+ {value: 0x0014, lo: 0xa7, hi: 0xaa},
+ {value: 0x0034, lo: 0xab, hi: 0xab},
+ {value: 0x0010, lo: 0xb0, hi: 0xb9},
+ // Block 0xd9, offset 0x4a1
+ {value: 0x5f53, lo: 0xa0, hi: 0xbf},
+ // Block 0xda, offset 0x4a2
+ {value: 0x5f52, lo: 0x80, hi: 0x9f},
+ {value: 0x0010, lo: 0xa0, hi: 0xa9},
+ {value: 0x0010, lo: 0xbf, hi: 0xbf},
+ // Block 0xdb, offset 0x4a5
+ {value: 0x0010, lo: 0x80, hi: 0x80},
+ {value: 0x0014, lo: 0x81, hi: 0x86},
+ {value: 0x0010, lo: 0x87, hi: 0x88},
+ {value: 0x0014, lo: 0x89, hi: 0x8a},
+ {value: 0x0010, lo: 0x8b, hi: 0xb2},
+ {value: 0x0014, lo: 0xb3, hi: 0xb3},
+ {value: 0x0034, lo: 0xb4, hi: 0xb4},
+ {value: 0x0014, lo: 0xb5, hi: 0xb8},
+ {value: 0x0010, lo: 0xb9, hi: 0xba},
+ {value: 0x0014, lo: 0xbb, hi: 0xbe},
+ // Block 0xdc, offset 0x4af
+ {value: 0x0034, lo: 0x87, hi: 0x87},
+ {value: 0x0010, lo: 0x90, hi: 0x90},
+ {value: 0x0014, lo: 0x91, hi: 0x96},
+ {value: 0x0010, lo: 0x97, hi: 0x98},
+ {value: 0x0014, lo: 0x99, hi: 0x9b},
+ {value: 0x0010, lo: 0x9c, hi: 0xbf},
+ // Block 0xdd, offset 0x4b5
+ {value: 0x0010, lo: 0x80, hi: 0x83},
+ {value: 0x0010, lo: 0x86, hi: 0x89},
+ {value: 0x0014, lo: 0x8a, hi: 0x96},
+ {value: 0x0010, lo: 0x97, hi: 0x97},
+ {value: 0x0014, lo: 0x98, hi: 0x98},
+ {value: 0x0034, lo: 0x99, hi: 0x99},
+ // Block 0xde, offset 0x4bb
+ {value: 0x0010, lo: 0x80, hi: 0xb8},
+ // Block 0xdf, offset 0x4bc
+ {value: 0x0010, lo: 0x80, hi: 0x88},
+ {value: 0x0010, lo: 0x8a, hi: 0xaf},
+ {value: 0x0014, lo: 0xb0, hi: 0xb6},
+ {value: 0x0014, lo: 0xb8, hi: 0xbd},
+ {value: 0x0010, lo: 0xbe, hi: 0xbe},
+ {value: 0x0034, lo: 0xbf, hi: 0xbf},
+ // Block 0xe0, offset 0x4c2
+ {value: 0x0010, lo: 0x80, hi: 0x80},
+ {value: 0x0010, lo: 0x90, hi: 0x99},
+ {value: 0x0010, lo: 0xb2, hi: 0xbf},
+ // Block 0xe1, offset 0x4c5
+ {value: 0x0010, lo: 0x80, hi: 0x8f},
+ {value: 0x0014, lo: 0x92, hi: 0xa7},
+ {value: 0x0010, lo: 0xa9, hi: 0xa9},
+ {value: 0x0014, lo: 0xaa, hi: 0xb0},
+ {value: 0x0010, lo: 0xb1, hi: 0xb1},
+ {value: 0x0014, lo: 0xb2, hi: 0xb3},
+ {value: 0x0010, lo: 0xb4, hi: 0xb4},
+ {value: 0x0014, lo: 0xb5, hi: 0xb6},
+ // Block 0xe2, offset 0x4cd
+ {value: 0x0010, lo: 0x80, hi: 0x86},
+ {value: 0x0010, lo: 0x88, hi: 0x89},
+ {value: 0x0010, lo: 0x8b, hi: 0xb0},
+ {value: 0x0014, lo: 0xb1, hi: 0xb6},
+ {value: 0x0014, lo: 0xba, hi: 0xba},
+ {value: 0x0014, lo: 0xbc, hi: 0xbd},
+ {value: 0x0014, lo: 0xbf, hi: 0xbf},
+ // Block 0xe3, offset 0x4d4
+ {value: 0x0014, lo: 0x80, hi: 0x81},
+ {value: 0x0034, lo: 0x82, hi: 0x82},
+ {value: 0x0014, lo: 0x83, hi: 0x83},
+ {value: 0x0034, lo: 0x84, hi: 0x85},
+ {value: 0x0010, lo: 0x86, hi: 0x86},
+ {value: 0x0014, lo: 0x87, hi: 0x87},
+ {value: 0x0010, lo: 0x90, hi: 0x99},
+ // Block 0xe4, offset 0x4db
+ {value: 0x0010, lo: 0x80, hi: 0x99},
+ // Block 0xe5, offset 0x4dc
+ {value: 0x0010, lo: 0x80, hi: 0xae},
+ // Block 0xe6, offset 0x4dd
+ {value: 0x0010, lo: 0x80, hi: 0x83},
+ // Block 0xe7, offset 0x4de
+ {value: 0x0010, lo: 0x80, hi: 0x86},
+ // Block 0xe8, offset 0x4df
+ {value: 0x0010, lo: 0x80, hi: 0x9e},
+ {value: 0x0010, lo: 0xa0, hi: 0xa9},
+ // Block 0xe9, offset 0x4e1
+ {value: 0x0010, lo: 0x90, hi: 0xad},
+ {value: 0x0034, lo: 0xb0, hi: 0xb4},
+ // Block 0xea, offset 0x4e3
+ {value: 0x0010, lo: 0x80, hi: 0xaf},
+ {value: 0x0024, lo: 0xb0, hi: 0xb6},
+ // Block 0xeb, offset 0x4e5
+ {value: 0x0014, lo: 0x80, hi: 0x83},
+ {value: 0x0010, lo: 0x90, hi: 0x99},
+ {value: 0x0010, lo: 0xa3, hi: 0xb7},
+ {value: 0x0010, lo: 0xbd, hi: 0xbf},
+ // Block 0xec, offset 0x4e9
+ {value: 0x0010, lo: 0x80, hi: 0x8f},
+ // Block 0xed, offset 0x4ea
+ {value: 0x0010, lo: 0x80, hi: 0x84},
+ {value: 0x0010, lo: 0x90, hi: 0xbe},
+ // Block 0xee, offset 0x4ec
+ {value: 0x0014, lo: 0x8f, hi: 0x9f},
+ // Block 0xef, offset 0x4ed
+ {value: 0x0014, lo: 0xa0, hi: 0xa1},
+ // Block 0xf0, offset 0x4ee
+ {value: 0x0010, lo: 0x80, hi: 0xaa},
+ {value: 0x0010, lo: 0xb0, hi: 0xbc},
+ // Block 0xf1, offset 0x4f0
+ {value: 0x0010, lo: 0x80, hi: 0x88},
+ {value: 0x0010, lo: 0x90, hi: 0x99},
+ {value: 0x0014, lo: 0x9d, hi: 0x9d},
+ {value: 0x0034, lo: 0x9e, hi: 0x9e},
+ {value: 0x0014, lo: 0xa0, hi: 0xa3},
+ // Block 0xf2, offset 0x4f5
+ {value: 0x0030, lo: 0xa5, hi: 0xa6},
+ {value: 0x0034, lo: 0xa7, hi: 0xa9},
+ {value: 0x0030, lo: 0xad, hi: 0xb2},
+ {value: 0x0014, lo: 0xb3, hi: 0xba},
+ {value: 0x0034, lo: 0xbb, hi: 0xbf},
+ // Block 0xf3, offset 0x4fa
+ {value: 0x0034, lo: 0x80, hi: 0x82},
+ {value: 0x0024, lo: 0x85, hi: 0x89},
+ {value: 0x0034, lo: 0x8a, hi: 0x8b},
+ {value: 0x0024, lo: 0xaa, hi: 0xad},
+ // Block 0xf4, offset 0x4fe
+ {value: 0x0024, lo: 0x82, hi: 0x84},
+ // Block 0xf5, offset 0x4ff
+ {value: 0x0013, lo: 0x80, hi: 0x99},
+ {value: 0x0012, lo: 0x9a, hi: 0xb3},
+ {value: 0x0013, lo: 0xb4, hi: 0xbf},
+ // Block 0xf6, offset 0x502
+ {value: 0x0013, lo: 0x80, hi: 0x8d},
+ {value: 0x0012, lo: 0x8e, hi: 0x94},
+ {value: 0x0012, lo: 0x96, hi: 0xa7},
+ {value: 0x0013, lo: 0xa8, hi: 0xbf},
+ // Block 0xf7, offset 0x506
+ {value: 0x0013, lo: 0x80, hi: 0x81},
+ {value: 0x0012, lo: 0x82, hi: 0x9b},
+ {value: 0x0013, lo: 0x9c, hi: 0x9c},
+ {value: 0x0013, lo: 0x9e, hi: 0x9f},
+ {value: 0x0013, lo: 0xa2, hi: 0xa2},
+ {value: 0x0013, lo: 0xa5, hi: 0xa6},
+ {value: 0x0013, lo: 0xa9, hi: 0xac},
+ {value: 0x0013, lo: 0xae, hi: 0xb5},
+ {value: 0x0012, lo: 0xb6, hi: 0xb9},
+ {value: 0x0012, lo: 0xbb, hi: 0xbb},
+ {value: 0x0012, lo: 0xbd, hi: 0xbf},
+ // Block 0xf8, offset 0x511
+ {value: 0x0012, lo: 0x80, hi: 0x83},
+ {value: 0x0012, lo: 0x85, hi: 0x8f},
+ {value: 0x0013, lo: 0x90, hi: 0xa9},
+ {value: 0x0012, lo: 0xaa, hi: 0xbf},
+ // Block 0xf9, offset 0x515
+ {value: 0x0012, lo: 0x80, hi: 0x83},
+ {value: 0x0013, lo: 0x84, hi: 0x85},
+ {value: 0x0013, lo: 0x87, hi: 0x8a},
+ {value: 0x0013, lo: 0x8d, hi: 0x94},
+ {value: 0x0013, lo: 0x96, hi: 0x9c},
+ {value: 0x0012, lo: 0x9e, hi: 0xb7},
+ {value: 0x0013, lo: 0xb8, hi: 0xb9},
+ {value: 0x0013, lo: 0xbb, hi: 0xbe},
+ // Block 0xfa, offset 0x51d
+ {value: 0x0013, lo: 0x80, hi: 0x84},
+ {value: 0x0013, lo: 0x86, hi: 0x86},
+ {value: 0x0013, lo: 0x8a, hi: 0x90},
+ {value: 0x0012, lo: 0x92, hi: 0xab},
+ {value: 0x0013, lo: 0xac, hi: 0xbf},
+ // Block 0xfb, offset 0x522
+ {value: 0x0013, lo: 0x80, hi: 0x85},
+ {value: 0x0012, lo: 0x86, hi: 0x9f},
+ {value: 0x0013, lo: 0xa0, hi: 0xb9},
+ {value: 0x0012, lo: 0xba, hi: 0xbf},
+ // Block 0xfc, offset 0x526
+ {value: 0x0012, lo: 0x80, hi: 0x93},
+ {value: 0x0013, lo: 0x94, hi: 0xad},
+ {value: 0x0012, lo: 0xae, hi: 0xbf},
+ // Block 0xfd, offset 0x529
+ {value: 0x0012, lo: 0x80, hi: 0x87},
+ {value: 0x0013, lo: 0x88, hi: 0xa1},
+ {value: 0x0012, lo: 0xa2, hi: 0xbb},
+ {value: 0x0013, lo: 0xbc, hi: 0xbf},
+ // Block 0xfe, offset 0x52d
+ {value: 0x0013, lo: 0x80, hi: 0x95},
+ {value: 0x0012, lo: 0x96, hi: 0xaf},
+ {value: 0x0013, lo: 0xb0, hi: 0xbf},
+ // Block 0xff, offset 0x530
+ {value: 0x0013, lo: 0x80, hi: 0x89},
+ {value: 0x0012, lo: 0x8a, hi: 0xa5},
+ {value: 0x0013, lo: 0xa8, hi: 0xbf},
+ // Block 0x100, offset 0x533
+ {value: 0x0013, lo: 0x80, hi: 0x80},
+ {value: 0x0012, lo: 0x82, hi: 0x9a},
+ {value: 0x0012, lo: 0x9c, hi: 0xa1},
+ {value: 0x0013, lo: 0xa2, hi: 0xba},
+ {value: 0x0012, lo: 0xbc, hi: 0xbf},
+ // Block 0x101, offset 0x538
+ {value: 0x0012, lo: 0x80, hi: 0x94},
+ {value: 0x0012, lo: 0x96, hi: 0x9b},
+ {value: 0x0013, lo: 0x9c, hi: 0xb4},
+ {value: 0x0012, lo: 0xb6, hi: 0xbf},
+ // Block 0x102, offset 0x53c
+ {value: 0x0012, lo: 0x80, hi: 0x8e},
+ {value: 0x0012, lo: 0x90, hi: 0x95},
+ {value: 0x0013, lo: 0x96, hi: 0xae},
+ {value: 0x0012, lo: 0xb0, hi: 0xbf},
+ // Block 0x103, offset 0x540
+ {value: 0x0012, lo: 0x80, hi: 0x88},
+ {value: 0x0012, lo: 0x8a, hi: 0x8f},
+ {value: 0x0013, lo: 0x90, hi: 0xa8},
+ {value: 0x0012, lo: 0xaa, hi: 0xbf},
+ // Block 0x104, offset 0x544
+ {value: 0x0012, lo: 0x80, hi: 0x82},
+ {value: 0x0012, lo: 0x84, hi: 0x89},
+ {value: 0x0017, lo: 0x8a, hi: 0x8b},
+ {value: 0x0010, lo: 0x8e, hi: 0xbf},
+ // Block 0x105, offset 0x548
+ {value: 0x0014, lo: 0x80, hi: 0xb6},
+ {value: 0x0014, lo: 0xbb, hi: 0xbf},
+ // Block 0x106, offset 0x54a
+ {value: 0x0014, lo: 0x80, hi: 0xac},
+ {value: 0x0014, lo: 0xb5, hi: 0xb5},
+ // Block 0x107, offset 0x54c
+ {value: 0x0014, lo: 0x84, hi: 0x84},
+ {value: 0x0014, lo: 0x9b, hi: 0x9f},
+ {value: 0x0014, lo: 0xa1, hi: 0xaf},
+ // Block 0x108, offset 0x54f
+ {value: 0x0024, lo: 0x80, hi: 0x86},
+ {value: 0x0024, lo: 0x88, hi: 0x98},
+ {value: 0x0024, lo: 0x9b, hi: 0xa1},
+ {value: 0x0024, lo: 0xa3, hi: 0xa4},
+ {value: 0x0024, lo: 0xa6, hi: 0xaa},
+ // Block 0x109, offset 0x554
+ {value: 0x0010, lo: 0x80, hi: 0x84},
+ {value: 0x0034, lo: 0x90, hi: 0x96},
+ // Block 0x10a, offset 0x556
+ {value: 0xb552, lo: 0x80, hi: 0x81},
+ {value: 0xb852, lo: 0x82, hi: 0x83},
+ {value: 0x0024, lo: 0x84, hi: 0x89},
+ {value: 0x0034, lo: 0x8a, hi: 0x8a},
+ {value: 0x0010, lo: 0x90, hi: 0x99},
+ // Block 0x10b, offset 0x55b
+ {value: 0x0010, lo: 0x80, hi: 0x83},
+ {value: 0x0010, lo: 0x85, hi: 0x9f},
+ {value: 0x0010, lo: 0xa1, hi: 0xa2},
+ {value: 0x0010, lo: 0xa4, hi: 0xa4},
+ {value: 0x0010, lo: 0xa7, hi: 0xa7},
+ {value: 0x0010, lo: 0xa9, hi: 0xb2},
+ {value: 0x0010, lo: 0xb4, hi: 0xb7},
+ {value: 0x0010, lo: 0xb9, hi: 0xb9},
+ {value: 0x0010, lo: 0xbb, hi: 0xbb},
+ // Block 0x10c, offset 0x564
+ {value: 0x0010, lo: 0x80, hi: 0x89},
+ {value: 0x0010, lo: 0x8b, hi: 0x9b},
+ {value: 0x0010, lo: 0xa1, hi: 0xa3},
+ {value: 0x0010, lo: 0xa5, hi: 0xa9},
+ {value: 0x0010, lo: 0xab, hi: 0xbb},
+ // Block 0x10d, offset 0x569
+ {value: 0x0013, lo: 0xb0, hi: 0xbf},
+ // Block 0x10e, offset 0x56a
+ {value: 0x0013, lo: 0x80, hi: 0x89},
+ {value: 0x0013, lo: 0x90, hi: 0xa9},
+ {value: 0x0013, lo: 0xb0, hi: 0xbf},
+ // Block 0x10f, offset 0x56d
+ {value: 0x0013, lo: 0x80, hi: 0x89},
+ // Block 0x110, offset 0x56e
+ {value: 0x0004, lo: 0xbb, hi: 0xbf},
+ // Block 0x111, offset 0x56f
+ {value: 0x0014, lo: 0x81, hi: 0x81},
+ {value: 0x0014, lo: 0xa0, hi: 0xbf},
+ // Block 0x112, offset 0x571
+ {value: 0x0014, lo: 0x80, hi: 0xbf},
+ // Block 0x113, offset 0x572
+ {value: 0x0014, lo: 0x80, hi: 0xaf},
+}
+
+// Total table size 13961 bytes (13KiB); checksum: 4CC48DA3
diff --git a/vendor/golang.org/x/text/cases/tables_test.go b/vendor/golang.org/x/text/cases/tables_test.go
new file mode 100644
index 0000000..6ec6801
--- /dev/null
+++ b/vendor/golang.org/x/text/cases/tables_test.go
@@ -0,0 +1,1158 @@
+// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
+
+package cases
+
+var (
+ caseIgnorable = map[rune]bool{
+ 0x0027: true,
+ 0x002e: true,
+ 0x003a: true,
+ 0x00b7: true,
+ 0x0387: true,
+ 0x05f4: true,
+ 0x2018: true,
+ 0x2019: true,
+ 0x2024: true,
+ 0x2027: true,
+ 0xfe13: true,
+ 0xfe52: true,
+ 0xfe55: true,
+ 0xff07: true,
+ 0xff0e: true,
+ 0xff1a: true,
+ }
+
+ special = map[rune]struct{ toLower, toTitle, toUpper string }{
+ 0x00df: {"ß", "Ss", "SS"},
+ 0x0130: {"i̇", "İ", "İ"},
+ 0xfb00: {"ff", "Ff", "FF"},
+ 0xfb01: {"fi", "Fi", "FI"},
+ 0xfb02: {"fl", "Fl", "FL"},
+ 0xfb03: {"ffi", "Ffi", "FFI"},
+ 0xfb04: {"ffl", "Ffl", "FFL"},
+ 0xfb05: {"ſt", "St", "ST"},
+ 0xfb06: {"st", "St", "ST"},
+ 0x0587: {"և", "Եւ", "ԵՒ"},
+ 0xfb13: {"ﬓ", "Մն", "ՄՆ"},
+ 0xfb14: {"ﬔ", "Մե", "ՄԵ"},
+ 0xfb15: {"ﬕ", "Մի", "ՄԻ"},
+ 0xfb16: {"ﬖ", "Վն", "ՎՆ"},
+ 0xfb17: {"ﬗ", "Մխ", "ՄԽ"},
+ 0x0149: {"ʼn", "ʼN", "ʼN"},
+ 0x0390: {"ΐ", "Ϊ́", "Ϊ́"},
+ 0x03b0: {"ΰ", "Ϋ́", "Ϋ́"},
+ 0x01f0: {"ǰ", "J̌", "J̌"},
+ 0x1e96: {"ẖ", "H̱", "H̱"},
+ 0x1e97: {"ẗ", "T̈", "T̈"},
+ 0x1e98: {"ẘ", "W̊", "W̊"},
+ 0x1e99: {"ẙ", "Y̊", "Y̊"},
+ 0x1e9a: {"ẚ", "Aʾ", "Aʾ"},
+ 0x1f50: {"ὐ", "Υ̓", "Υ̓"},
+ 0x1f52: {"ὒ", "Υ̓̀", "Υ̓̀"},
+ 0x1f54: {"ὔ", "Υ̓́", "Υ̓́"},
+ 0x1f56: {"ὖ", "Υ̓͂", "Υ̓͂"},
+ 0x1fb6: {"ᾶ", "Α͂", "Α͂"},
+ 0x1fc6: {"ῆ", "Η͂", "Η͂"},
+ 0x1fd2: {"ῒ", "Ϊ̀", "Ϊ̀"},
+ 0x1fd3: {"ΐ", "Ϊ́", "Ϊ́"},
+ 0x1fd6: {"ῖ", "Ι͂", "Ι͂"},
+ 0x1fd7: {"ῗ", "Ϊ͂", "Ϊ͂"},
+ 0x1fe2: {"ῢ", "Ϋ̀", "Ϋ̀"},
+ 0x1fe3: {"ΰ", "Ϋ́", "Ϋ́"},
+ 0x1fe4: {"ῤ", "Ρ̓", "Ρ̓"},
+ 0x1fe6: {"ῦ", "Υ͂", "Υ͂"},
+ 0x1fe7: {"ῧ", "Ϋ͂", "Ϋ͂"},
+ 0x1ff6: {"ῶ", "Ω͂", "Ω͂"},
+ 0x1f80: {"ᾀ", "ᾈ", "ἈΙ"},
+ 0x1f81: {"ᾁ", "ᾉ", "ἉΙ"},
+ 0x1f82: {"ᾂ", "ᾊ", "ἊΙ"},
+ 0x1f83: {"ᾃ", "ᾋ", "ἋΙ"},
+ 0x1f84: {"ᾄ", "ᾌ", "ἌΙ"},
+ 0x1f85: {"ᾅ", "ᾍ", "ἍΙ"},
+ 0x1f86: {"ᾆ", "ᾎ", "ἎΙ"},
+ 0x1f87: {"ᾇ", "ᾏ", "ἏΙ"},
+ 0x1f88: {"ᾀ", "ᾈ", "ἈΙ"},
+ 0x1f89: {"ᾁ", "ᾉ", "ἉΙ"},
+ 0x1f8a: {"ᾂ", "ᾊ", "ἊΙ"},
+ 0x1f8b: {"ᾃ", "ᾋ", "ἋΙ"},
+ 0x1f8c: {"ᾄ", "ᾌ", "ἌΙ"},
+ 0x1f8d: {"ᾅ", "ᾍ", "ἍΙ"},
+ 0x1f8e: {"ᾆ", "ᾎ", "ἎΙ"},
+ 0x1f8f: {"ᾇ", "ᾏ", "ἏΙ"},
+ 0x1f90: {"ᾐ", "ᾘ", "ἨΙ"},
+ 0x1f91: {"ᾑ", "ᾙ", "ἩΙ"},
+ 0x1f92: {"ᾒ", "ᾚ", "ἪΙ"},
+ 0x1f93: {"ᾓ", "ᾛ", "ἫΙ"},
+ 0x1f94: {"ᾔ", "ᾜ", "ἬΙ"},
+ 0x1f95: {"ᾕ", "ᾝ", "ἭΙ"},
+ 0x1f96: {"ᾖ", "ᾞ", "ἮΙ"},
+ 0x1f97: {"ᾗ", "ᾟ", "ἯΙ"},
+ 0x1f98: {"ᾐ", "ᾘ", "ἨΙ"},
+ 0x1f99: {"ᾑ", "ᾙ", "ἩΙ"},
+ 0x1f9a: {"ᾒ", "ᾚ", "ἪΙ"},
+ 0x1f9b: {"ᾓ", "ᾛ", "ἫΙ"},
+ 0x1f9c: {"ᾔ", "ᾜ", "ἬΙ"},
+ 0x1f9d: {"ᾕ", "ᾝ", "ἭΙ"},
+ 0x1f9e: {"ᾖ", "ᾞ", "ἮΙ"},
+ 0x1f9f: {"ᾗ", "ᾟ", "ἯΙ"},
+ 0x1fa0: {"ᾠ", "ᾨ", "ὨΙ"},
+ 0x1fa1: {"ᾡ", "ᾩ", "ὩΙ"},
+ 0x1fa2: {"ᾢ", "ᾪ", "ὪΙ"},
+ 0x1fa3: {"ᾣ", "ᾫ", "ὫΙ"},
+ 0x1fa4: {"ᾤ", "ᾬ", "ὬΙ"},
+ 0x1fa5: {"ᾥ", "ᾭ", "ὭΙ"},
+ 0x1fa6: {"ᾦ", "ᾮ", "ὮΙ"},
+ 0x1fa7: {"ᾧ", "ᾯ", "ὯΙ"},
+ 0x1fa8: {"ᾠ", "ᾨ", "ὨΙ"},
+ 0x1fa9: {"ᾡ", "ᾩ", "ὩΙ"},
+ 0x1faa: {"ᾢ", "ᾪ", "ὪΙ"},
+ 0x1fab: {"ᾣ", "ᾫ", "ὫΙ"},
+ 0x1fac: {"ᾤ", "ᾬ", "ὬΙ"},
+ 0x1fad: {"ᾥ", "ᾭ", "ὭΙ"},
+ 0x1fae: {"ᾦ", "ᾮ", "ὮΙ"},
+ 0x1faf: {"ᾧ", "ᾯ", "ὯΙ"},
+ 0x1fb3: {"ᾳ", "ᾼ", "ΑΙ"},
+ 0x1fbc: {"ᾳ", "ᾼ", "ΑΙ"},
+ 0x1fc3: {"ῃ", "ῌ", "ΗΙ"},
+ 0x1fcc: {"ῃ", "ῌ", "ΗΙ"},
+ 0x1ff3: {"ῳ", "ῼ", "ΩΙ"},
+ 0x1ffc: {"ῳ", "ῼ", "ΩΙ"},
+ 0x1fb2: {"ᾲ", "Ὰͅ", "ᾺΙ"},
+ 0x1fb4: {"ᾴ", "Άͅ", "ΆΙ"},
+ 0x1fc2: {"ῂ", "Ὴͅ", "ῊΙ"},
+ 0x1fc4: {"ῄ", "Ήͅ", "ΉΙ"},
+ 0x1ff2: {"ῲ", "Ὼͅ", "ῺΙ"},
+ 0x1ff4: {"ῴ", "Ώͅ", "ΏΙ"},
+ 0x1fb7: {"ᾷ", "ᾼ͂", "Α͂Ι"},
+ 0x1fc7: {"ῇ", "ῌ͂", "Η͂Ι"},
+ 0x1ff7: {"ῷ", "ῼ͂", "Ω͂Ι"},
+ }
+
+ foldMap = map[rune]struct{ simple, full, special string }{
+ 0x0049: {"", "", "ı"},
+ 0x00b5: {"μ", "μ", ""},
+ 0x00df: {"", "ss", ""},
+ 0x0130: {"", "i̇", "i"},
+ 0x0149: {"", "ʼn", ""},
+ 0x017f: {"s", "s", ""},
+ 0x01f0: {"", "ǰ", ""},
+ 0x0345: {"ι", "ι", ""},
+ 0x0390: {"", "ΐ", ""},
+ 0x03b0: {"", "ΰ", ""},
+ 0x03c2: {"σ", "σ", ""},
+ 0x03d0: {"β", "β", ""},
+ 0x03d1: {"θ", "θ", ""},
+ 0x03d5: {"φ", "φ", ""},
+ 0x03d6: {"π", "π", ""},
+ 0x03f0: {"κ", "κ", ""},
+ 0x03f1: {"ρ", "ρ", ""},
+ 0x03f5: {"ε", "ε", ""},
+ 0x0587: {"", "եւ", ""},
+ 0x13f8: {"Ᏸ", "Ᏸ", ""},
+ 0x13f9: {"Ᏹ", "Ᏹ", ""},
+ 0x13fa: {"Ᏺ", "Ᏺ", ""},
+ 0x13fb: {"Ᏻ", "Ᏻ", ""},
+ 0x13fc: {"Ᏼ", "Ᏼ", ""},
+ 0x13fd: {"Ᏽ", "Ᏽ", ""},
+ 0x1c80: {"в", "в", ""},
+ 0x1c81: {"д", "д", ""},
+ 0x1c82: {"о", "о", ""},
+ 0x1c83: {"с", "с", ""},
+ 0x1c84: {"т", "т", ""},
+ 0x1c85: {"т", "т", ""},
+ 0x1c86: {"ъ", "ъ", ""},
+ 0x1c87: {"ѣ", "ѣ", ""},
+ 0x1c88: {"ꙋ", "ꙋ", ""},
+ 0x1e96: {"", "ẖ", ""},
+ 0x1e97: {"", "ẗ", ""},
+ 0x1e98: {"", "ẘ", ""},
+ 0x1e99: {"", "ẙ", ""},
+ 0x1e9a: {"", "aʾ", ""},
+ 0x1e9b: {"ṡ", "ṡ", ""},
+ 0x1e9e: {"", "ss", ""},
+ 0x1f50: {"", "ὐ", ""},
+ 0x1f52: {"", "ὒ", ""},
+ 0x1f54: {"", "ὔ", ""},
+ 0x1f56: {"", "ὖ", ""},
+ 0x1f80: {"", "ἀι", ""},
+ 0x1f81: {"", "ἁι", ""},
+ 0x1f82: {"", "ἂι", ""},
+ 0x1f83: {"", "ἃι", ""},
+ 0x1f84: {"", "ἄι", ""},
+ 0x1f85: {"", "ἅι", ""},
+ 0x1f86: {"", "ἆι", ""},
+ 0x1f87: {"", "ἇι", ""},
+ 0x1f88: {"", "ἀι", ""},
+ 0x1f89: {"", "ἁι", ""},
+ 0x1f8a: {"", "ἂι", ""},
+ 0x1f8b: {"", "ἃι", ""},
+ 0x1f8c: {"", "ἄι", ""},
+ 0x1f8d: {"", "ἅι", ""},
+ 0x1f8e: {"", "ἆι", ""},
+ 0x1f8f: {"", "ἇι", ""},
+ 0x1f90: {"", "ἠι", ""},
+ 0x1f91: {"", "ἡι", ""},
+ 0x1f92: {"", "ἢι", ""},
+ 0x1f93: {"", "ἣι", ""},
+ 0x1f94: {"", "ἤι", ""},
+ 0x1f95: {"", "ἥι", ""},
+ 0x1f96: {"", "ἦι", ""},
+ 0x1f97: {"", "ἧι", ""},
+ 0x1f98: {"", "ἠι", ""},
+ 0x1f99: {"", "ἡι", ""},
+ 0x1f9a: {"", "ἢι", ""},
+ 0x1f9b: {"", "ἣι", ""},
+ 0x1f9c: {"", "ἤι", ""},
+ 0x1f9d: {"", "ἥι", ""},
+ 0x1f9e: {"", "ἦι", ""},
+ 0x1f9f: {"", "ἧι", ""},
+ 0x1fa0: {"", "ὠι", ""},
+ 0x1fa1: {"", "ὡι", ""},
+ 0x1fa2: {"", "ὢι", ""},
+ 0x1fa3: {"", "ὣι", ""},
+ 0x1fa4: {"", "ὤι", ""},
+ 0x1fa5: {"", "ὥι", ""},
+ 0x1fa6: {"", "ὦι", ""},
+ 0x1fa7: {"", "ὧι", ""},
+ 0x1fa8: {"", "ὠι", ""},
+ 0x1fa9: {"", "ὡι", ""},
+ 0x1faa: {"", "ὢι", ""},
+ 0x1fab: {"", "ὣι", ""},
+ 0x1fac: {"", "ὤι", ""},
+ 0x1fad: {"", "ὥι", ""},
+ 0x1fae: {"", "ὦι", ""},
+ 0x1faf: {"", "ὧι", ""},
+ 0x1fb2: {"", "ὰι", ""},
+ 0x1fb3: {"", "αι", ""},
+ 0x1fb4: {"", "άι", ""},
+ 0x1fb6: {"", "ᾶ", ""},
+ 0x1fb7: {"", "ᾶι", ""},
+ 0x1fbc: {"", "αι", ""},
+ 0x1fbe: {"ι", "ι", ""},
+ 0x1fc2: {"", "ὴι", ""},
+ 0x1fc3: {"", "ηι", ""},
+ 0x1fc4: {"", "ήι", ""},
+ 0x1fc6: {"", "ῆ", ""},
+ 0x1fc7: {"", "ῆι", ""},
+ 0x1fcc: {"", "ηι", ""},
+ 0x1fd2: {"", "ῒ", ""},
+ 0x1fd3: {"", "ΐ", ""},
+ 0x1fd6: {"", "ῖ", ""},
+ 0x1fd7: {"", "ῗ", ""},
+ 0x1fe2: {"", "ῢ", ""},
+ 0x1fe3: {"", "ΰ", ""},
+ 0x1fe4: {"", "ῤ", ""},
+ 0x1fe6: {"", "ῦ", ""},
+ 0x1fe7: {"", "ῧ", ""},
+ 0x1ff2: {"", "ὼι", ""},
+ 0x1ff3: {"", "ωι", ""},
+ 0x1ff4: {"", "ώι", ""},
+ 0x1ff6: {"", "ῶ", ""},
+ 0x1ff7: {"", "ῶι", ""},
+ 0x1ffc: {"", "ωι", ""},
+ 0xab70: {"Ꭰ", "Ꭰ", ""},
+ 0xab71: {"Ꭱ", "Ꭱ", ""},
+ 0xab72: {"Ꭲ", "Ꭲ", ""},
+ 0xab73: {"Ꭳ", "Ꭳ", ""},
+ 0xab74: {"Ꭴ", "Ꭴ", ""},
+ 0xab75: {"Ꭵ", "Ꭵ", ""},
+ 0xab76: {"Ꭶ", "Ꭶ", ""},
+ 0xab77: {"Ꭷ", "Ꭷ", ""},
+ 0xab78: {"Ꭸ", "Ꭸ", ""},
+ 0xab79: {"Ꭹ", "Ꭹ", ""},
+ 0xab7a: {"Ꭺ", "Ꭺ", ""},
+ 0xab7b: {"Ꭻ", "Ꭻ", ""},
+ 0xab7c: {"Ꭼ", "Ꭼ", ""},
+ 0xab7d: {"Ꭽ", "Ꭽ", ""},
+ 0xab7e: {"Ꭾ", "Ꭾ", ""},
+ 0xab7f: {"Ꭿ", "Ꭿ", ""},
+ 0xab80: {"Ꮀ", "Ꮀ", ""},
+ 0xab81: {"Ꮁ", "Ꮁ", ""},
+ 0xab82: {"Ꮂ", "Ꮂ", ""},
+ 0xab83: {"Ꮃ", "Ꮃ", ""},
+ 0xab84: {"Ꮄ", "Ꮄ", ""},
+ 0xab85: {"Ꮅ", "Ꮅ", ""},
+ 0xab86: {"Ꮆ", "Ꮆ", ""},
+ 0xab87: {"Ꮇ", "Ꮇ", ""},
+ 0xab88: {"Ꮈ", "Ꮈ", ""},
+ 0xab89: {"Ꮉ", "Ꮉ", ""},
+ 0xab8a: {"Ꮊ", "Ꮊ", ""},
+ 0xab8b: {"Ꮋ", "Ꮋ", ""},
+ 0xab8c: {"Ꮌ", "Ꮌ", ""},
+ 0xab8d: {"Ꮍ", "Ꮍ", ""},
+ 0xab8e: {"Ꮎ", "Ꮎ", ""},
+ 0xab8f: {"Ꮏ", "Ꮏ", ""},
+ 0xab90: {"Ꮐ", "Ꮐ", ""},
+ 0xab91: {"Ꮑ", "Ꮑ", ""},
+ 0xab92: {"Ꮒ", "Ꮒ", ""},
+ 0xab93: {"Ꮓ", "Ꮓ", ""},
+ 0xab94: {"Ꮔ", "Ꮔ", ""},
+ 0xab95: {"Ꮕ", "Ꮕ", ""},
+ 0xab96: {"Ꮖ", "Ꮖ", ""},
+ 0xab97: {"Ꮗ", "Ꮗ", ""},
+ 0xab98: {"Ꮘ", "Ꮘ", ""},
+ 0xab99: {"Ꮙ", "Ꮙ", ""},
+ 0xab9a: {"Ꮚ", "Ꮚ", ""},
+ 0xab9b: {"Ꮛ", "Ꮛ", ""},
+ 0xab9c: {"Ꮜ", "Ꮜ", ""},
+ 0xab9d: {"Ꮝ", "Ꮝ", ""},
+ 0xab9e: {"Ꮞ", "Ꮞ", ""},
+ 0xab9f: {"Ꮟ", "Ꮟ", ""},
+ 0xaba0: {"Ꮠ", "Ꮠ", ""},
+ 0xaba1: {"Ꮡ", "Ꮡ", ""},
+ 0xaba2: {"Ꮢ", "Ꮢ", ""},
+ 0xaba3: {"Ꮣ", "Ꮣ", ""},
+ 0xaba4: {"Ꮤ", "Ꮤ", ""},
+ 0xaba5: {"Ꮥ", "Ꮥ", ""},
+ 0xaba6: {"Ꮦ", "Ꮦ", ""},
+ 0xaba7: {"Ꮧ", "Ꮧ", ""},
+ 0xaba8: {"Ꮨ", "Ꮨ", ""},
+ 0xaba9: {"Ꮩ", "Ꮩ", ""},
+ 0xabaa: {"Ꮪ", "Ꮪ", ""},
+ 0xabab: {"Ꮫ", "Ꮫ", ""},
+ 0xabac: {"Ꮬ", "Ꮬ", ""},
+ 0xabad: {"Ꮭ", "Ꮭ", ""},
+ 0xabae: {"Ꮮ", "Ꮮ", ""},
+ 0xabaf: {"Ꮯ", "Ꮯ", ""},
+ 0xabb0: {"Ꮰ", "Ꮰ", ""},
+ 0xabb1: {"Ꮱ", "Ꮱ", ""},
+ 0xabb2: {"Ꮲ", "Ꮲ", ""},
+ 0xabb3: {"Ꮳ", "Ꮳ", ""},
+ 0xabb4: {"Ꮴ", "Ꮴ", ""},
+ 0xabb5: {"Ꮵ", "Ꮵ", ""},
+ 0xabb6: {"Ꮶ", "Ꮶ", ""},
+ 0xabb7: {"Ꮷ", "Ꮷ", ""},
+ 0xabb8: {"Ꮸ", "Ꮸ", ""},
+ 0xabb9: {"Ꮹ", "Ꮹ", ""},
+ 0xabba: {"Ꮺ", "Ꮺ", ""},
+ 0xabbb: {"Ꮻ", "Ꮻ", ""},
+ 0xabbc: {"Ꮼ", "Ꮼ", ""},
+ 0xabbd: {"Ꮽ", "Ꮽ", ""},
+ 0xabbe: {"Ꮾ", "Ꮾ", ""},
+ 0xabbf: {"Ꮿ", "Ꮿ", ""},
+ 0xfb00: {"", "ff", ""},
+ 0xfb01: {"", "fi", ""},
+ 0xfb02: {"", "fl", ""},
+ 0xfb03: {"", "ffi", ""},
+ 0xfb04: {"", "ffl", ""},
+ 0xfb05: {"", "st", ""},
+ 0xfb06: {"", "st", ""},
+ 0xfb13: {"", "մն", ""},
+ 0xfb14: {"", "մե", ""},
+ 0xfb15: {"", "մի", ""},
+ 0xfb16: {"", "վն", ""},
+ 0xfb17: {"", "մխ", ""},
+ }
+
+ breakProp = []struct{ lo, hi rune }{
+ {0x0, 0x26},
+ {0x28, 0x2d},
+ {0x2f, 0x2f},
+ {0x3b, 0x40},
+ {0x5b, 0x5e},
+ {0x60, 0x60},
+ {0x7b, 0xa9},
+ {0xab, 0xac},
+ {0xae, 0xb4},
+ {0xb6, 0xb6},
+ {0xb8, 0xb9},
+ {0xbb, 0xbf},
+ {0xd7, 0xd7},
+ {0xf7, 0xf7},
+ {0x2d8, 0x2dd},
+ {0x2e5, 0x2eb},
+ {0x375, 0x375},
+ {0x378, 0x379},
+ {0x37e, 0x37e},
+ {0x380, 0x385},
+ {0x38b, 0x38b},
+ {0x38d, 0x38d},
+ {0x3a2, 0x3a2},
+ {0x3f6, 0x3f6},
+ {0x482, 0x482},
+ {0x530, 0x530},
+ {0x557, 0x558},
+ {0x55a, 0x560},
+ {0x588, 0x590},
+ {0x5be, 0x5be},
+ {0x5c0, 0x5c0},
+ {0x5c3, 0x5c3},
+ {0x5c6, 0x5c6},
+ {0x5c8, 0x5cf},
+ {0x5eb, 0x5ef},
+ {0x5f5, 0x5ff},
+ {0x606, 0x60f},
+ {0x61b, 0x61b},
+ {0x61d, 0x61f},
+ {0x66a, 0x66a},
+ {0x66c, 0x66d},
+ {0x6d4, 0x6d4},
+ {0x6de, 0x6de},
+ {0x6e9, 0x6e9},
+ {0x6fd, 0x6fe},
+ {0x700, 0x70e},
+ {0x74b, 0x74c},
+ {0x7b2, 0x7bf},
+ {0x7f6, 0x7f9},
+ {0x7fb, 0x7ff},
+ {0x82e, 0x83f},
+ {0x85c, 0x85f},
+ {0x86b, 0x89f},
+ {0x8b5, 0x8b5},
+ {0x8be, 0x8d3},
+ {0x964, 0x965},
+ {0x970, 0x970},
+ {0x984, 0x984},
+ {0x98d, 0x98e},
+ {0x991, 0x992},
+ {0x9a9, 0x9a9},
+ {0x9b1, 0x9b1},
+ {0x9b3, 0x9b5},
+ {0x9ba, 0x9bb},
+ {0x9c5, 0x9c6},
+ {0x9c9, 0x9ca},
+ {0x9cf, 0x9d6},
+ {0x9d8, 0x9db},
+ {0x9de, 0x9de},
+ {0x9e4, 0x9e5},
+ {0x9f2, 0x9fb},
+ {0x9fd, 0xa00},
+ {0xa04, 0xa04},
+ {0xa0b, 0xa0e},
+ {0xa11, 0xa12},
+ {0xa29, 0xa29},
+ {0xa31, 0xa31},
+ {0xa34, 0xa34},
+ {0xa37, 0xa37},
+ {0xa3a, 0xa3b},
+ {0xa3d, 0xa3d},
+ {0xa43, 0xa46},
+ {0xa49, 0xa4a},
+ {0xa4e, 0xa50},
+ {0xa52, 0xa58},
+ {0xa5d, 0xa5d},
+ {0xa5f, 0xa65},
+ {0xa76, 0xa80},
+ {0xa84, 0xa84},
+ {0xa8e, 0xa8e},
+ {0xa92, 0xa92},
+ {0xaa9, 0xaa9},
+ {0xab1, 0xab1},
+ {0xab4, 0xab4},
+ {0xaba, 0xabb},
+ {0xac6, 0xac6},
+ {0xaca, 0xaca},
+ {0xace, 0xacf},
+ {0xad1, 0xadf},
+ {0xae4, 0xae5},
+ {0xaf0, 0xaf8},
+ {0xb00, 0xb00},
+ {0xb04, 0xb04},
+ {0xb0d, 0xb0e},
+ {0xb11, 0xb12},
+ {0xb29, 0xb29},
+ {0xb31, 0xb31},
+ {0xb34, 0xb34},
+ {0xb3a, 0xb3b},
+ {0xb45, 0xb46},
+ {0xb49, 0xb4a},
+ {0xb4e, 0xb55},
+ {0xb58, 0xb5b},
+ {0xb5e, 0xb5e},
+ {0xb64, 0xb65},
+ {0xb70, 0xb70},
+ {0xb72, 0xb81},
+ {0xb84, 0xb84},
+ {0xb8b, 0xb8d},
+ {0xb91, 0xb91},
+ {0xb96, 0xb98},
+ {0xb9b, 0xb9b},
+ {0xb9d, 0xb9d},
+ {0xba0, 0xba2},
+ {0xba5, 0xba7},
+ {0xbab, 0xbad},
+ {0xbba, 0xbbd},
+ {0xbc3, 0xbc5},
+ {0xbc9, 0xbc9},
+ {0xbce, 0xbcf},
+ {0xbd1, 0xbd6},
+ {0xbd8, 0xbe5},
+ {0xbf0, 0xbff},
+ {0xc04, 0xc04},
+ {0xc0d, 0xc0d},
+ {0xc11, 0xc11},
+ {0xc29, 0xc29},
+ {0xc3a, 0xc3c},
+ {0xc45, 0xc45},
+ {0xc49, 0xc49},
+ {0xc4e, 0xc54},
+ {0xc57, 0xc57},
+ {0xc5b, 0xc5f},
+ {0xc64, 0xc65},
+ {0xc70, 0xc7f},
+ {0xc84, 0xc84},
+ {0xc8d, 0xc8d},
+ {0xc91, 0xc91},
+ {0xca9, 0xca9},
+ {0xcb4, 0xcb4},
+ {0xcba, 0xcbb},
+ {0xcc5, 0xcc5},
+ {0xcc9, 0xcc9},
+ {0xcce, 0xcd4},
+ {0xcd7, 0xcdd},
+ {0xcdf, 0xcdf},
+ {0xce4, 0xce5},
+ {0xcf0, 0xcf0},
+ {0xcf3, 0xcff},
+ {0xd04, 0xd04},
+ {0xd0d, 0xd0d},
+ {0xd11, 0xd11},
+ {0xd45, 0xd45},
+ {0xd49, 0xd49},
+ {0xd4f, 0xd53},
+ {0xd58, 0xd5e},
+ {0xd64, 0xd65},
+ {0xd70, 0xd79},
+ {0xd80, 0xd81},
+ {0xd84, 0xd84},
+ {0xd97, 0xd99},
+ {0xdb2, 0xdb2},
+ {0xdbc, 0xdbc},
+ {0xdbe, 0xdbf},
+ {0xdc7, 0xdc9},
+ {0xdcb, 0xdce},
+ {0xdd5, 0xdd5},
+ {0xdd7, 0xdd7},
+ {0xde0, 0xde5},
+ {0xdf0, 0xdf1},
+ {0xdf4, 0xe30},
+ {0xe32, 0xe33},
+ {0xe3b, 0xe46},
+ {0xe4f, 0xe4f},
+ {0xe5a, 0xeb0},
+ {0xeb2, 0xeb3},
+ {0xeba, 0xeba},
+ {0xebd, 0xec7},
+ {0xece, 0xecf},
+ {0xeda, 0xeff},
+ {0xf01, 0xf17},
+ {0xf1a, 0xf1f},
+ {0xf2a, 0xf34},
+ {0xf36, 0xf36},
+ {0xf38, 0xf38},
+ {0xf3a, 0xf3d},
+ {0xf48, 0xf48},
+ {0xf6d, 0xf70},
+ {0xf85, 0xf85},
+ {0xf98, 0xf98},
+ {0xfbd, 0xfc5},
+ {0xfc7, 0x102a},
+ {0x103f, 0x103f},
+ {0x104a, 0x1055},
+ {0x105a, 0x105d},
+ {0x1061, 0x1061},
+ {0x1065, 0x1066},
+ {0x106e, 0x1070},
+ {0x1075, 0x1081},
+ {0x108e, 0x108e},
+ {0x109e, 0x109f},
+ {0x10c6, 0x10c6},
+ {0x10c8, 0x10cc},
+ {0x10ce, 0x10cf},
+ {0x10fb, 0x10fb},
+ {0x1249, 0x1249},
+ {0x124e, 0x124f},
+ {0x1257, 0x1257},
+ {0x1259, 0x1259},
+ {0x125e, 0x125f},
+ {0x1289, 0x1289},
+ {0x128e, 0x128f},
+ {0x12b1, 0x12b1},
+ {0x12b6, 0x12b7},
+ {0x12bf, 0x12bf},
+ {0x12c1, 0x12c1},
+ {0x12c6, 0x12c7},
+ {0x12d7, 0x12d7},
+ {0x1311, 0x1311},
+ {0x1316, 0x1317},
+ {0x135b, 0x135c},
+ {0x1360, 0x137f},
+ {0x1390, 0x139f},
+ {0x13f6, 0x13f7},
+ {0x13fe, 0x1400},
+ {0x166d, 0x166e},
+ {0x1680, 0x1680},
+ {0x169b, 0x169f},
+ {0x16eb, 0x16ed},
+ {0x16f9, 0x16ff},
+ {0x170d, 0x170d},
+ {0x1715, 0x171f},
+ {0x1735, 0x173f},
+ {0x1754, 0x175f},
+ {0x176d, 0x176d},
+ {0x1771, 0x1771},
+ {0x1774, 0x17b3},
+ {0x17d4, 0x17dc},
+ {0x17de, 0x17df},
+ {0x17ea, 0x180a},
+ {0x180f, 0x180f},
+ {0x181a, 0x181f},
+ {0x1878, 0x187f},
+ {0x18ab, 0x18af},
+ {0x18f6, 0x18ff},
+ {0x191f, 0x191f},
+ {0x192c, 0x192f},
+ {0x193c, 0x1945},
+ {0x1950, 0x19cf},
+ {0x19da, 0x19ff},
+ {0x1a1c, 0x1a54},
+ {0x1a5f, 0x1a5f},
+ {0x1a7d, 0x1a7e},
+ {0x1a8a, 0x1a8f},
+ {0x1a9a, 0x1aaf},
+ {0x1abf, 0x1aff},
+ {0x1b4c, 0x1b4f},
+ {0x1b5a, 0x1b6a},
+ {0x1b74, 0x1b7f},
+ {0x1bf4, 0x1bff},
+ {0x1c38, 0x1c3f},
+ {0x1c4a, 0x1c4c},
+ {0x1c7e, 0x1c7f},
+ {0x1c89, 0x1ccf},
+ {0x1cd3, 0x1cd3},
+ {0x1cfa, 0x1cff},
+ {0x1dfa, 0x1dfa},
+ {0x1f16, 0x1f17},
+ {0x1f1e, 0x1f1f},
+ {0x1f46, 0x1f47},
+ {0x1f4e, 0x1f4f},
+ {0x1f58, 0x1f58},
+ {0x1f5a, 0x1f5a},
+ {0x1f5c, 0x1f5c},
+ {0x1f5e, 0x1f5e},
+ {0x1f7e, 0x1f7f},
+ {0x1fb5, 0x1fb5},
+ {0x1fbd, 0x1fbd},
+ {0x1fbf, 0x1fc1},
+ {0x1fc5, 0x1fc5},
+ {0x1fcd, 0x1fcf},
+ {0x1fd4, 0x1fd5},
+ {0x1fdc, 0x1fdf},
+ {0x1fed, 0x1ff1},
+ {0x1ff5, 0x1ff5},
+ {0x1ffd, 0x200b},
+ {0x2010, 0x2017},
+ {0x201a, 0x2023},
+ {0x2025, 0x2026},
+ {0x2028, 0x2029},
+ {0x2030, 0x203e},
+ {0x2041, 0x2053},
+ {0x2055, 0x205f},
+ {0x2065, 0x2065},
+ {0x2070, 0x2070},
+ {0x2072, 0x207e},
+ {0x2080, 0x208f},
+ {0x209d, 0x20cf},
+ {0x20f1, 0x2101},
+ {0x2103, 0x2106},
+ {0x2108, 0x2109},
+ {0x2114, 0x2114},
+ {0x2116, 0x2118},
+ {0x211e, 0x2123},
+ {0x2125, 0x2125},
+ {0x2127, 0x2127},
+ {0x2129, 0x2129},
+ {0x212e, 0x212e},
+ {0x213a, 0x213b},
+ {0x2140, 0x2144},
+ {0x214a, 0x214d},
+ {0x214f, 0x215f},
+ {0x2189, 0x24b5},
+ {0x24ea, 0x2bff},
+ {0x2c2f, 0x2c2f},
+ {0x2c5f, 0x2c5f},
+ {0x2ce5, 0x2cea},
+ {0x2cf4, 0x2cff},
+ {0x2d26, 0x2d26},
+ {0x2d28, 0x2d2c},
+ {0x2d2e, 0x2d2f},
+ {0x2d68, 0x2d6e},
+ {0x2d70, 0x2d7e},
+ {0x2d97, 0x2d9f},
+ {0x2da7, 0x2da7},
+ {0x2daf, 0x2daf},
+ {0x2db7, 0x2db7},
+ {0x2dbf, 0x2dbf},
+ {0x2dc7, 0x2dc7},
+ {0x2dcf, 0x2dcf},
+ {0x2dd7, 0x2dd7},
+ {0x2ddf, 0x2ddf},
+ {0x2e00, 0x2e2e},
+ {0x2e30, 0x3004},
+ {0x3006, 0x3029},
+ {0x3030, 0x303a},
+ {0x303d, 0x3098},
+ {0x309b, 0x3104},
+ {0x312f, 0x3130},
+ {0x318f, 0x319f},
+ {0x31bb, 0x9fff},
+ {0xa48d, 0xa4cf},
+ {0xa4fe, 0xa4ff},
+ {0xa60d, 0xa60f},
+ {0xa62c, 0xa63f},
+ {0xa673, 0xa673},
+ {0xa67e, 0xa67e},
+ {0xa6f2, 0xa716},
+ {0xa7af, 0xa7af},
+ {0xa7b8, 0xa7f6},
+ {0xa828, 0xa83f},
+ {0xa874, 0xa87f},
+ {0xa8c6, 0xa8cf},
+ {0xa8da, 0xa8df},
+ {0xa8f8, 0xa8fa},
+ {0xa8fc, 0xa8fc},
+ {0xa8fe, 0xa8ff},
+ {0xa92e, 0xa92f},
+ {0xa954, 0xa95f},
+ {0xa97d, 0xa97f},
+ {0xa9c1, 0xa9ce},
+ {0xa9da, 0xa9e4},
+ {0xa9e6, 0xa9ef},
+ {0xa9fa, 0xa9ff},
+ {0xaa37, 0xaa3f},
+ {0xaa4e, 0xaa4f},
+ {0xaa5a, 0xaa7a},
+ {0xaa7e, 0xaaaf},
+ {0xaab1, 0xaab1},
+ {0xaab5, 0xaab6},
+ {0xaab9, 0xaabd},
+ {0xaac0, 0xaac0},
+ {0xaac2, 0xaadf},
+ {0xaaf0, 0xaaf1},
+ {0xaaf7, 0xab00},
+ {0xab07, 0xab08},
+ {0xab0f, 0xab10},
+ {0xab17, 0xab1f},
+ {0xab27, 0xab27},
+ {0xab2f, 0xab2f},
+ {0xab66, 0xab6f},
+ {0xabeb, 0xabeb},
+ {0xabee, 0xabef},
+ {0xabfa, 0xabff},
+ {0xd7a4, 0xd7af},
+ {0xd7c7, 0xd7ca},
+ {0xd7fc, 0xfaff},
+ {0xfb07, 0xfb12},
+ {0xfb18, 0xfb1c},
+ {0xfb29, 0xfb29},
+ {0xfb37, 0xfb37},
+ {0xfb3d, 0xfb3d},
+ {0xfb3f, 0xfb3f},
+ {0xfb42, 0xfb42},
+ {0xfb45, 0xfb45},
+ {0xfbb2, 0xfbd2},
+ {0xfd3e, 0xfd4f},
+ {0xfd90, 0xfd91},
+ {0xfdc8, 0xfdef},
+ {0xfdfc, 0xfdff},
+ {0xfe10, 0xfe12},
+ {0xfe14, 0xfe1f},
+ {0xfe30, 0xfe32},
+ {0xfe35, 0xfe4c},
+ {0xfe50, 0xfe51},
+ {0xfe53, 0xfe54},
+ {0xfe56, 0xfe6f},
+ {0xfe75, 0xfe75},
+ {0xfefd, 0xfefe},
+ {0xff00, 0xff06},
+ {0xff08, 0xff0d},
+ {0xff0f, 0xff19},
+ {0xff1b, 0xff20},
+ {0xff3b, 0xff3e},
+ {0xff40, 0xff40},
+ {0xff5b, 0xff9d},
+ {0xffbf, 0xffc1},
+ {0xffc8, 0xffc9},
+ {0xffd0, 0xffd1},
+ {0xffd8, 0xffd9},
+ {0xffdd, 0xfff8},
+ {0xfffc, 0xffff},
+ {0x1000c, 0x1000c},
+ {0x10027, 0x10027},
+ {0x1003b, 0x1003b},
+ {0x1003e, 0x1003e},
+ {0x1004e, 0x1004f},
+ {0x1005e, 0x1007f},
+ {0x100fb, 0x1013f},
+ {0x10175, 0x101fc},
+ {0x101fe, 0x1027f},
+ {0x1029d, 0x1029f},
+ {0x102d1, 0x102df},
+ {0x102e1, 0x102ff},
+ {0x10320, 0x1032c},
+ {0x1034b, 0x1034f},
+ {0x1037b, 0x1037f},
+ {0x1039e, 0x1039f},
+ {0x103c4, 0x103c7},
+ {0x103d0, 0x103d0},
+ {0x103d6, 0x103ff},
+ {0x1049e, 0x1049f},
+ {0x104aa, 0x104af},
+ {0x104d4, 0x104d7},
+ {0x104fc, 0x104ff},
+ {0x10528, 0x1052f},
+ {0x10564, 0x105ff},
+ {0x10737, 0x1073f},
+ {0x10756, 0x1075f},
+ {0x10768, 0x107ff},
+ {0x10806, 0x10807},
+ {0x10809, 0x10809},
+ {0x10836, 0x10836},
+ {0x10839, 0x1083b},
+ {0x1083d, 0x1083e},
+ {0x10856, 0x1085f},
+ {0x10877, 0x1087f},
+ {0x1089f, 0x108df},
+ {0x108f3, 0x108f3},
+ {0x108f6, 0x108ff},
+ {0x10916, 0x1091f},
+ {0x1093a, 0x1097f},
+ {0x109b8, 0x109bd},
+ {0x109c0, 0x109ff},
+ {0x10a04, 0x10a04},
+ {0x10a07, 0x10a0b},
+ {0x10a14, 0x10a14},
+ {0x10a18, 0x10a18},
+ {0x10a34, 0x10a37},
+ {0x10a3b, 0x10a3e},
+ {0x10a40, 0x10a5f},
+ {0x10a7d, 0x10a7f},
+ {0x10a9d, 0x10abf},
+ {0x10ac8, 0x10ac8},
+ {0x10ae7, 0x10aff},
+ {0x10b36, 0x10b3f},
+ {0x10b56, 0x10b5f},
+ {0x10b73, 0x10b7f},
+ {0x10b92, 0x10bff},
+ {0x10c49, 0x10c7f},
+ {0x10cb3, 0x10cbf},
+ {0x10cf3, 0x10fff},
+ {0x11047, 0x11065},
+ {0x11070, 0x1107e},
+ {0x110bb, 0x110bc},
+ {0x110be, 0x110cf},
+ {0x110e9, 0x110ef},
+ {0x110fa, 0x110ff},
+ {0x11135, 0x11135},
+ {0x11140, 0x1114f},
+ {0x11174, 0x11175},
+ {0x11177, 0x1117f},
+ {0x111c5, 0x111c9},
+ {0x111cd, 0x111cf},
+ {0x111db, 0x111db},
+ {0x111dd, 0x111ff},
+ {0x11212, 0x11212},
+ {0x11238, 0x1123d},
+ {0x1123f, 0x1127f},
+ {0x11287, 0x11287},
+ {0x11289, 0x11289},
+ {0x1128e, 0x1128e},
+ {0x1129e, 0x1129e},
+ {0x112a9, 0x112af},
+ {0x112eb, 0x112ef},
+ {0x112fa, 0x112ff},
+ {0x11304, 0x11304},
+ {0x1130d, 0x1130e},
+ {0x11311, 0x11312},
+ {0x11329, 0x11329},
+ {0x11331, 0x11331},
+ {0x11334, 0x11334},
+ {0x1133a, 0x1133b},
+ {0x11345, 0x11346},
+ {0x11349, 0x1134a},
+ {0x1134e, 0x1134f},
+ {0x11351, 0x11356},
+ {0x11358, 0x1135c},
+ {0x11364, 0x11365},
+ {0x1136d, 0x1136f},
+ {0x11375, 0x113ff},
+ {0x1144b, 0x1144f},
+ {0x1145a, 0x1147f},
+ {0x114c6, 0x114c6},
+ {0x114c8, 0x114cf},
+ {0x114da, 0x1157f},
+ {0x115b6, 0x115b7},
+ {0x115c1, 0x115d7},
+ {0x115de, 0x115ff},
+ {0x11641, 0x11643},
+ {0x11645, 0x1164f},
+ {0x1165a, 0x1167f},
+ {0x116b8, 0x116bf},
+ {0x116ca, 0x1171c},
+ {0x1172c, 0x1172f},
+ {0x1173a, 0x1189f},
+ {0x118ea, 0x118fe},
+ {0x11900, 0x119ff},
+ {0x11a3f, 0x11a46},
+ {0x11a48, 0x11a4f},
+ {0x11a84, 0x11a85},
+ {0x11a9a, 0x11abf},
+ {0x11af9, 0x11bff},
+ {0x11c09, 0x11c09},
+ {0x11c37, 0x11c37},
+ {0x11c41, 0x11c4f},
+ {0x11c5a, 0x11c71},
+ {0x11c90, 0x11c91},
+ {0x11ca8, 0x11ca8},
+ {0x11cb7, 0x11cff},
+ {0x11d07, 0x11d07},
+ {0x11d0a, 0x11d0a},
+ {0x11d37, 0x11d39},
+ {0x11d3b, 0x11d3b},
+ {0x11d3e, 0x11d3e},
+ {0x11d48, 0x11d4f},
+ {0x11d5a, 0x11fff},
+ {0x1239a, 0x123ff},
+ {0x1246f, 0x1247f},
+ {0x12544, 0x12fff},
+ {0x1342f, 0x143ff},
+ {0x14647, 0x167ff},
+ {0x16a39, 0x16a3f},
+ {0x16a5f, 0x16a5f},
+ {0x16a6a, 0x16acf},
+ {0x16aee, 0x16aef},
+ {0x16af5, 0x16aff},
+ {0x16b37, 0x16b3f},
+ {0x16b44, 0x16b4f},
+ {0x16b5a, 0x16b62},
+ {0x16b78, 0x16b7c},
+ {0x16b90, 0x16eff},
+ {0x16f45, 0x16f4f},
+ {0x16f7f, 0x16f8e},
+ {0x16fa0, 0x16fdf},
+ {0x16fe2, 0x1bbff},
+ {0x1bc6b, 0x1bc6f},
+ {0x1bc7d, 0x1bc7f},
+ {0x1bc89, 0x1bc8f},
+ {0x1bc9a, 0x1bc9c},
+ {0x1bc9f, 0x1bc9f},
+ {0x1bca4, 0x1d164},
+ {0x1d16a, 0x1d16c},
+ {0x1d183, 0x1d184},
+ {0x1d18c, 0x1d1a9},
+ {0x1d1ae, 0x1d241},
+ {0x1d245, 0x1d3ff},
+ {0x1d455, 0x1d455},
+ {0x1d49d, 0x1d49d},
+ {0x1d4a0, 0x1d4a1},
+ {0x1d4a3, 0x1d4a4},
+ {0x1d4a7, 0x1d4a8},
+ {0x1d4ad, 0x1d4ad},
+ {0x1d4ba, 0x1d4ba},
+ {0x1d4bc, 0x1d4bc},
+ {0x1d4c4, 0x1d4c4},
+ {0x1d506, 0x1d506},
+ {0x1d50b, 0x1d50c},
+ {0x1d515, 0x1d515},
+ {0x1d51d, 0x1d51d},
+ {0x1d53a, 0x1d53a},
+ {0x1d53f, 0x1d53f},
+ {0x1d545, 0x1d545},
+ {0x1d547, 0x1d549},
+ {0x1d551, 0x1d551},
+ {0x1d6a6, 0x1d6a7},
+ {0x1d6c1, 0x1d6c1},
+ {0x1d6db, 0x1d6db},
+ {0x1d6fb, 0x1d6fb},
+ {0x1d715, 0x1d715},
+ {0x1d735, 0x1d735},
+ {0x1d74f, 0x1d74f},
+ {0x1d76f, 0x1d76f},
+ {0x1d789, 0x1d789},
+ {0x1d7a9, 0x1d7a9},
+ {0x1d7c3, 0x1d7c3},
+ {0x1d7cc, 0x1d7cd},
+ {0x1d800, 0x1d9ff},
+ {0x1da37, 0x1da3a},
+ {0x1da6d, 0x1da74},
+ {0x1da76, 0x1da83},
+ {0x1da85, 0x1da9a},
+ {0x1daa0, 0x1daa0},
+ {0x1dab0, 0x1dfff},
+ {0x1e007, 0x1e007},
+ {0x1e019, 0x1e01a},
+ {0x1e022, 0x1e022},
+ {0x1e025, 0x1e025},
+ {0x1e02b, 0x1e7ff},
+ {0x1e8c5, 0x1e8cf},
+ {0x1e8d7, 0x1e8ff},
+ {0x1e94b, 0x1e94f},
+ {0x1e95a, 0x1edff},
+ {0x1ee04, 0x1ee04},
+ {0x1ee20, 0x1ee20},
+ {0x1ee23, 0x1ee23},
+ {0x1ee25, 0x1ee26},
+ {0x1ee28, 0x1ee28},
+ {0x1ee33, 0x1ee33},
+ {0x1ee38, 0x1ee38},
+ {0x1ee3a, 0x1ee3a},
+ {0x1ee3c, 0x1ee41},
+ {0x1ee43, 0x1ee46},
+ {0x1ee48, 0x1ee48},
+ {0x1ee4a, 0x1ee4a},
+ {0x1ee4c, 0x1ee4c},
+ {0x1ee50, 0x1ee50},
+ {0x1ee53, 0x1ee53},
+ {0x1ee55, 0x1ee56},
+ {0x1ee58, 0x1ee58},
+ {0x1ee5a, 0x1ee5a},
+ {0x1ee5c, 0x1ee5c},
+ {0x1ee5e, 0x1ee5e},
+ {0x1ee60, 0x1ee60},
+ {0x1ee63, 0x1ee63},
+ {0x1ee65, 0x1ee66},
+ {0x1ee6b, 0x1ee6b},
+ {0x1ee73, 0x1ee73},
+ {0x1ee78, 0x1ee78},
+ {0x1ee7d, 0x1ee7d},
+ {0x1ee7f, 0x1ee7f},
+ {0x1ee8a, 0x1ee8a},
+ {0x1ee9c, 0x1eea0},
+ {0x1eea4, 0x1eea4},
+ {0x1eeaa, 0x1eeaa},
+ {0x1eebc, 0x1f12f},
+ {0x1f14a, 0x1f14f},
+ {0x1f16a, 0x1f16f},
+ {0x1f18a, 0x1ffff},
+ }
+
+ breakTest = []string{
+ "AA",
+ "ÄA",
+ "Aa\u2060",
+ "Äa\u2060",
+ "Aa|:",
+ "Äa|:",
+ "Aa|'",
+ "Äa|'",
+ "Aa|'\u2060",
+ "Äa|'\u2060",
+ "Aa|,",
+ "Äa|,",
+ "a\u2060A",
+ "a\u2060̈A",
+ "a\u2060a\u2060",
+ "a\u2060̈a\u2060",
+ "a\u2060a|:",
+ "a\u2060̈a|:",
+ "a\u2060a|'",
+ "a\u2060̈a|'",
+ "a\u2060a|'\u2060",
+ "a\u2060̈a|'\u2060",
+ "a\u2060a|,",
+ "a\u2060̈a|,",
+ "a:A",
+ "a:̈A",
+ "a:a\u2060",
+ "a:̈a\u2060",
+ "a:a|:",
+ "a:̈a|:",
+ "a:a|'",
+ "a:̈a|'",
+ "a:a|'\u2060",
+ "a:̈a|'\u2060",
+ "a:a|,",
+ "a:̈a|,",
+ "a'A",
+ "a'̈A",
+ "a'a\u2060",
+ "a'̈a\u2060",
+ "a'a|:",
+ "a'̈a|:",
+ "a'a|'",
+ "a'̈a|'",
+ "a'a|'\u2060",
+ "a'̈a|'\u2060",
+ "a'a|,",
+ "a'̈a|,",
+ "a'\u2060A",
+ "a'\u2060̈A",
+ "a'\u2060a\u2060",
+ "a'\u2060̈a\u2060",
+ "a'\u2060a|:",
+ "a'\u2060̈a|:",
+ "a'\u2060a|'",
+ "a'\u2060̈a|'",
+ "a'\u2060a|'\u2060",
+ "a'\u2060̈a|'\u2060",
+ "a'\u2060a|,",
+ "a'\u2060̈a|,",
+ "a|,|A",
+ "a|,̈|A",
+ "a|,|a\u2060",
+ "a|,̈|a\u2060",
+ "a|,|a|:",
+ "a|,̈|a|:",
+ "a|,|a|'",
+ "a|,̈|a|'",
+ "a|,|a|'\u2060",
+ "a|,̈|a|'\u2060",
+ "a|,|a|,",
+ "a|,̈|a|,",
+ "AAA",
+ "A:A",
+ "A|:|:|A",
+ "A00A",
+ "A__A",
+ "a|🇦🇧|🇨|b",
+ "a|🇦🇧\u200d|🇨|b",
+ "a|🇦\u200d🇧|🇨|b",
+ "a|🇦🇧|🇨🇩|b",
+ "ä\u200d̈b",
+ "1_a|:|:|a",
+ "1_a|:|.|a",
+ "1_a|:|,|a",
+ "1_a|.|:|a",
+ "1_a|.|.|a",
+ "1_a|.|,|a",
+ "1_a|,|:|a",
+ "1_a|,|.|a",
+ "1_a|,|,|a",
+ "a_a|:|:|1",
+ "a|:|:|a",
+ "a_1|:|:|a",
+ "a_a|:|:|a",
+ "a_a|:|.|1",
+ "a|:|.|a",
+ "a_1|:|.|a",
+ "a_a|:|.|a",
+ "a_a|:|,|1",
+ "a|:|,|a",
+ "a_1|:|,|a",
+ "a_a|:|,|a",
+ "a_a|.|:|1",
+ "a|.|:|a",
+ "a_1|.|:|a",
+ "a_a|.|:|a",
+ "a_a|.|.|1",
+ "a|.|.|a",
+ "a_1|.|.|a",
+ "a_a|.|.|a",
+ "a_a|.|,|1",
+ "a|.|,|a",
+ "a_1|.|,|a",
+ "a_a|.|,|a",
+ "a_a|,|:|1",
+ "a|,|:|a",
+ "a_1|,|:|a",
+ "a_a|,|:|a",
+ "a_a|,|.|1",
+ "a|,|.|a",
+ "a_1|,|.|a",
+ "a_a|,|.|a",
+ "a_a|,|,|1",
+ "a|,|,|a",
+ "a_1|,|,|a",
+ "a_a|,|,|a",
+ }
+)
diff --git a/vendor/golang.org/x/text/cases/trieval.go b/vendor/golang.org/x/text/cases/trieval.go
new file mode 100644
index 0000000..fb221f8
--- /dev/null
+++ b/vendor/golang.org/x/text/cases/trieval.go
@@ -0,0 +1,215 @@
+// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
+
+package cases
+
+// This file contains definitions for interpreting the trie value of the case
+// trie generated by "go run gen*.go". It is shared by both the generator
+// program and the resultant package. Sharing is achieved by the generator
+// copying gen_trieval.go to trieval.go and changing what's above this comment.
+
+// info holds case information for a single rune. It is the value returned
+// by a trie lookup. Most mapping information can be stored in a single 16-bit
+// value. If not, for example when a rune is mapped to multiple runes, the value
+// stores some basic case data and an index into an array with additional data.
+//
+// The per-rune values have the following format:
+//
+// if (exception) {
+// 15..5 unsigned exception index
+// 4 unused
+// } else {
+// 15..8 XOR pattern or index to XOR pattern for case mapping
+// Only 13..8 are used for XOR patterns.
+// 7 inverseFold (fold to upper, not to lower)
+// 6 index: interpret the XOR pattern as an index
+// or isMid if case mode is cIgnorableUncased.
+// 5..4 CCC: zero (normal or break), above or other
+// }
+// 3 exception: interpret this value as an exception index
+// (TODO: is this bit necessary? Probably implied from case mode.)
+// 2..0 case mode
+//
+// For the non-exceptional cases, a rune must be either uncased, lowercase or
+// uppercase. If the rune is cased, the XOR pattern maps either a lowercase
+// rune to uppercase or an uppercase rune to lowercase (applied to the 10
+// least-significant bits of the rune).
+//
+// See the definitions below for a more detailed description of the various
+// bits.
+type info uint16
+
+const (
+ casedMask = 0x0003
+ fullCasedMask = 0x0007
+ ignorableMask = 0x0006
+ ignorableValue = 0x0004
+
+ inverseFoldBit = 1 << 7
+ isMidBit = 1 << 6
+
+ exceptionBit = 1 << 3
+ exceptionShift = 5
+ numExceptionBits = 11
+
+ xorIndexBit = 1 << 6
+ xorShift = 8
+
+ // There is no mapping if all xor bits and the exception bit are zero.
+ hasMappingMask = 0xff80 | exceptionBit
+)
+
+// The case mode bits encodes the case type of a rune. This includes uncased,
+// title, upper and lower case and case ignorable. (For a definition of these
+// terms see Chapter 3 of The Unicode Standard Core Specification.) In some rare
+// cases, a rune can be both cased and case-ignorable. This is encoded by
+// cIgnorableCased. A rune of this type is always lower case. Some runes are
+// cased while not having a mapping.
+//
+// A common pattern for scripts in the Unicode standard is for upper and lower
+// case runes to alternate for increasing rune values (e.g. the accented Latin
+// ranges starting from U+0100 and U+1E00 among others and some Cyrillic
+// characters). We use this property by defining a cXORCase mode, where the case
+// mode (always upper or lower case) is derived from the rune value. As the XOR
+// pattern for case mappings is often identical for successive runes, using
+// cXORCase can result in large series of identical trie values. This, in turn,
+// allows us to better compress the trie blocks.
+const (
+ cUncased info = iota // 000
+ cTitle // 001
+ cLower // 010
+ cUpper // 011
+ cIgnorableUncased // 100
+ cIgnorableCased // 101 // lower case if mappings exist
+ cXORCase // 11x // case is cLower | ((rune&1) ^ x)
+
+ maxCaseMode = cUpper
+)
+
+func (c info) isCased() bool {
+ return c&casedMask != 0
+}
+
+func (c info) isCaseIgnorable() bool {
+ return c&ignorableMask == ignorableValue
+}
+
+func (c info) isNotCasedAndNotCaseIgnorable() bool {
+ return c&fullCasedMask == 0
+}
+
+func (c info) isCaseIgnorableAndNotCased() bool {
+ return c&fullCasedMask == cIgnorableUncased
+}
+
+func (c info) isMid() bool {
+ return c&(fullCasedMask|isMidBit) == isMidBit|cIgnorableUncased
+}
+
+// The case mapping implementation will need to know about various Canonical
+// Combining Class (CCC) values. We encode two of these in the trie value:
+// cccZero (0) and cccAbove (230). If the value is cccOther, it means that
+// CCC(r) > 0, but not 230. A value of cccBreak means that CCC(r) == 0 and that
+// the rune also has the break category Break (see below).
+const (
+ cccBreak info = iota << 4
+ cccZero
+ cccAbove
+ cccOther
+
+ cccMask = cccBreak | cccZero | cccAbove | cccOther
+)
+
+const (
+ starter = 0
+ above = 230
+ iotaSubscript = 240
+)
+
+// The exceptions slice holds data that does not fit in a normal info entry.
+// The entry is pointed to by the exception index in an entry. It has the
+// following format:
+//
+// Header
+// byte 0:
+// 7..6 unused
+// 5..4 CCC type (same bits as entry)
+// 3 unused
+// 2..0 length of fold
+//
+// byte 1:
+// 7..6 unused
+// 5..3 length of 1st mapping of case type
+// 2..0 length of 2nd mapping of case type
+//
+// case 1st 2nd
+// lower -> upper, title
+// upper -> lower, title
+// title -> lower, upper
+//
+// Lengths with the value 0x7 indicate no value and implies no change.
+// A length of 0 indicates a mapping to zero-length string.
+//
+// Body bytes:
+// case folding bytes
+// lowercase mapping bytes
+// uppercase mapping bytes
+// titlecase mapping bytes
+// closure mapping bytes (for NFKC_Casefold). (TODO)
+//
+// Fallbacks:
+// missing fold -> lower
+// missing title -> upper
+// all missing -> original rune
+//
+// exceptions starts with a dummy byte to enforce that there is no zero index
+// value.
+const (
+ lengthMask = 0x07
+ lengthBits = 3
+ noChange = 0
+)
+
+// References to generated trie.
+
+var trie = newCaseTrie(0)
+
+var sparse = sparseBlocks{
+ values: sparseValues[:],
+ offsets: sparseOffsets[:],
+}
+
+// Sparse block lookup code.
+
+// valueRange is an entry in a sparse block.
+type valueRange struct {
+ value uint16
+ lo, hi byte
+}
+
+type sparseBlocks struct {
+ values []valueRange
+ offsets []uint16
+}
+
+// lookup returns the value from values block n for byte b using binary search.
+func (s *sparseBlocks) lookup(n uint32, b byte) uint16 {
+ lo := s.offsets[n]
+ hi := s.offsets[n+1]
+ for lo < hi {
+ m := lo + (hi-lo)/2
+ r := s.values[m]
+ if r.lo <= b && b <= r.hi {
+ return r.value
+ }
+ if b < r.lo {
+ hi = m
+ } else {
+ lo = m + 1
+ }
+ }
+ return 0
+}
+
+// lastRuneForTesting is the last rune used for testing. Everything after this
+// is boring.
+const lastRuneForTesting = rune(0x1FFFF)